Матрица корреляции участков с использованием панд

212

У меня есть набор данных с огромным количеством функций, поэтому анализ матрицы корреляции стал очень трудным. Я хочу построить корреляционную матрицу, которую мы получаем, используя dataframe.corr()функцию из библиотеки панд. Есть ли встроенная функция, предоставляемая библиотекой панд для построения этой матрицы?

Гаурав Сингх
источник
Соответствующие ответы можно найти здесь. Создание тепловой
карты

Ответы:

293

Вы можете использовать pyplot.matshow() от matplotlib:

import matplotlib.pyplot as plt

plt.matshow(dataframe.corr())
plt.show()

Редактировать:

В комментариях был запрос как поменять метки оси. Вот роскошная версия, которая нарисована на большем размере фигуры, имеет метки осей, соответствующие рамке данных, и легенду цветовой шкалы для интерпретации цветовой шкалы.

Я включаю, как отрегулировать размер и вращение надписей, и я использую пропорции, чтобы цветовая полоса и основная фигура выглядели одинаково.

f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.shape[1]), df.columns, fontsize=14, rotation=45)
plt.yticks(range(df.shape[1]), df.columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title('Correlation Matrix', fontsize=16);

пример корреляционного графика

jrjc
источник
1
Должно быть, я что-то упустил:AttributeError: 'module' object has no attribute 'matshow'
Том Рассел
1
@TomRussell Ты сделал import matplotlib.pyplot as plt?
Joelostblom
1
Я хотел бы думать, что я сделал! :-)
Том Рассел
7
Вы знаете, как отобразить фактические названия столбцов на графике?
WebQube
2
@Cecilia Я решил эту проблему, изменив параметр вращения на 90
ikbel benab
182

Если вашей главной целью является визуализация матрицы корреляции, а не создание графика как такового, удобные pandas варианты стилей являются жизнеспособным встроенным решением:

import pandas as pd
import numpy as np

rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')
# 'RdBu_r' & 'BrBG' are other good diverging colormaps

введите описание изображения здесь

Обратите внимание, что это должно быть в бэкэнде, поддерживающем рендеринг HTML, таком как Блокнот JupyterLab. (Автоматический светлый текст на темном фоне взят из существующего PR, а не из последней выпущенной версии, pandas0.23).


стайлинг

Вы можете легко ограничить точность цифр:

corr.style.background_gradient(cmap='coolwarm').set_precision(2)

введите описание изображения здесь

Или вообще избавьтесь от цифр, если вы предпочитаете матрицу без аннотаций:

corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})

введите описание изображения здесь

Документация по стилю также содержит инструкции по более сложным стилям, например, как изменить отображение ячейки, над которой находится указатель мыши. Чтобы сохранить вывод, вы можете вернуть HTML, добавив render()метод, а затем записать его в файл (или просто сделать снимок экрана для менее формальных целей).


Сравнение времени

В моем тестировании он style.background_gradient()был в 4 раза быстрее plt.matshow()и в 120 раз быстрее, чем sns.heatmap()с матрицей 10х10. К сожалению, она не масштабируется так же хорошо plt.matshow(): обе матрицы занимают примерно одинаковое время для матрицы 100x100 и plt.matshow()в 10 раз быстрее для матрицы 1000x1000.


Сохранение

Есть несколько возможных способов сохранить стилизованный фрейм данных:


Обновление для панд> = 0,24

Установив axis=None, теперь можно вычислять цвета на основе всей матрицы, а не на столбец или на строку:

corr.style.background_gradient(cmap='coolwarm', axis=None)

введите описание изображения здесь

joelostblom
источник
2
Если бы был способ экспорта в виде изображения, это было бы здорово!
Kristada673
1
Спасибо! Вам определенно нужна расходящаяся палитраimport seaborn as sns corr = df.corr() cm = sns.light_palette("green", as_cmap=True) cm = sns.diverging_palette(220, 20, sep=20, as_cmap=True) corr.style.background_gradient(cmap=cm).set_precision(2)
stallingOne
1
@stallOne Хороший вопрос, я не должен был включать отрицательные значения в примере, я мог бы изменить это позже. Просто для справки для людей, читающих это, вам не нужно создавать пользовательские расходящиеся cmap с seaborn (хотя тот, что в приведенном выше комментарии выглядит довольно привлекательно), вы также можете использовать встроенные расходящиеся cmaps из matplotlib, например corr.style.background_gradient(cmap='coolwarm'). В настоящее время нет способа центрировать карту по конкретному значению, что может быть хорошей идеей для расходящихся карт.
Joelostblom
1
@rovyko Ты на пандах> = 0.24.0?
Joelostblom
2
Эти графики визуально хороши, но вопрос @ Kristada673 весьма актуален, как бы вы их экспортировали?
Erfan
89

Попробуйте эту функцию, которая также отображает имена переменных для матрицы корреляции:

def plot_corr(df,size=10):
    '''Function plots a graphical correlation matrix for each pair of columns in the dataframe.

    Input:
        df: pandas DataFrame
        size: vertical and horizontal size of the plot'''

    corr = df.corr()
    fig, ax = plt.subplots(figsize=(size, size))
    ax.matshow(corr)
    plt.xticks(range(len(corr.columns)), corr.columns);
    plt.yticks(range(len(corr.columns)), corr.columns);
Apogentus
источник
6
plt.xticks(range(len(corr.columns)), corr.columns, rotation='vertical')если вы хотите вертикальную ориентацию имен столбцов по оси х
nishant
Еще одна графическая вещь, но добавление plt.tight_layout()может также быть полезным для длинных имен столбцов.
user3017048
86

Тепловая карта Seaborn:

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)
rafaelvalle
источник
9
Тепловая карта Seaborn необычна, но она плохо работает на больших матрицах. matshow метод matplotlib намного быстрее.
anilbey
3
Seaborn может автоматически выводить метки из имен столбцов.
Тулио Касагранде
80

Вы можете наблюдать взаимосвязь между объектами, либо рисуя тепловую карту из морских пятен или матрицу рассеяния из панд.

Матрица рассеяния:

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');

Если вы хотите визуализировать и асимметрию каждой функции - используйте парные участки морского происхождения.

sns.pairplot(dataframe)

Тепловая карта Sns:

import seaborn as sns

f, ax = pl.subplots(figsize=(10, 8))
corr = dataframe.corr()
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
            square=True, ax=ax)

Результатом будет карта корреляции объектов. то есть см. пример ниже.

введите описание изображения здесь

Корреляция между продуктом и моющими средствами высока. Так же:

Продукты с высокой корреляцией:
  1. Бакалея и моющие средства.
Продукты со средней корреляцией:
  1. Молоко и Бакалея
  2. Молоко и моющие средства_Бумага
Продукты с низкой корреляцией:
  1. Молоко и гастроном
  2. Замороженный и Свежий.
  3. Замороженные и гастрономические.

Из парных графиков: Вы можете наблюдать тот же набор отношений из парных графиков или матрицы рассеяния. Но из этого мы можем сказать, являются ли данные нормально распределенными или нет.

введите описание изображения здесь

Примечание. Выше приведен тот же график, взятый из данных, которые используются для построения тепловой карты.

phanindravarma
источник
3
Я думаю, что это должно быть .plt, а не .pl (если это относится к matplotlib)
ghukill
2
@ghukill Не обязательно. Он мог бы from matplotlib import pyplot as pl
Джеру Луки
как установить границу корреляции между -1 и +1 всегда, в сюжете корреляции
debaonline4u
7

Вы можете использовать метод imshow () из matplotlib

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')

plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation='nearest')
plt.colorbar()
tick_marks = [i for i in range(len(X.columns))]
plt.xticks(tick_marks, X.columns, rotation='vertical')
plt.yticks(tick_marks, X.columns)
plt.show()
Khandelwal-Маник
источник
5

Если вы используете dataframe, dfвы можете просто использовать:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)
Харви
источник
3

Графика statmodels также дает хороший вид на матрицу корреляции

import statsmodels.api as sm
import matplotlib.pyplot as plt

corr = dataframe.corr()
sm.graphics.plot_corr(corr, xnames=list(corr.columns))
plt.show()
Шахриар Мирадж
источник
3

Для полноты, самое простое из известных мне решений с seaborn на конец 2019 года, если кто-то использует Jupyter :

import seaborn as sns
sns.heatmap(dataframe.corr())
Marcin
источник
1

Наряду с другими методами также хорошо иметь парный график, который даст график рассеяния для всех случаев:

import pandas as pd
import numpy as np
import seaborn as sns
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
sns.pairplot(df)
Нишант Тяги
источник
0

Матрица корреляции формы, в моем случае zdf - это датафрейм, который мне нужен для выполнения матрицы корреляции.

corrMatrix =zdf.corr()
corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
html = corrMatrix.style.background_gradient(cmap='RdBu').set_precision(2).render()

# Writing the output to a html file.
with open('test.html', 'w') as f:
   print('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-widthinitial-scale=1.0"><title>Document</title></head><style>table{word-break: break-all;}</style><body>' + html+'</body></html>', file=f)

Тогда мы можем сделать скриншот. или конвертировать HTML в файл изображения.

smsivaprakaash
источник