Графічна кореляційна матриця за допомогою панд


212

У мене є набір даних з величезною кількістю функцій, тому аналізу кореляційної матриці стало дуже складно. Я хочу побудувати матрицю кореляції, яку ми отримуємо за допомогою dataframe.corr()функції з бібліотеки панд. Чи є якась вбудована функція, що надається бібліотекою панд для побудови цієї матриці?


Відповідні відповіді можна знайти тут Створення теплової карти від панд DataFrame
joelostblom

Відповіді:


292

Ви можете використовувати 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);

приклад кореляційного сюжету


1
Мені, мабуть, чогось не вистачає:AttributeError: 'module' object has no attribute 'matshow'
Том Расселл

1
@TomRussell Ви робили import matplotlib.pyplot as plt?
joelostblom

1
Мені б хотілося подумати, що я зробив! :-)
Том Рассел

7
чи знаєте ви, як відображати фактичні назви стовпців на графіку?
WebQube

2
@Cecilia Я вирішив цю проблему, змінивши параметр обертання на 90
ikbel benabdessamad

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 Notebook. (Автоматичний світлий текст на темному тлі походить від існуючого 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()з матрицею 10x10. На жаль, він не масштабується так plt.matshow(): двоє займають приблизно один і той же час для матриці 100x100, і plt.matshow()на 10 разів швидше для матриці 1000x1000.


Збереження

Існує кілька можливих способів збереження стилізованого кадру даних:

  • Поверніть HTML, додавши render()метод, а потім запишіть вихід у файл.
  • Збережіть як .xslxфайл із умовним форматуванням, додавши to_excel()метод.
  • Поєднайте з imgkit, щоб зберегти растрову карту
  • Зробіть знімок екрана (для менш формальних цілей).

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

Встановивши axis=None, тепер можна обчислити кольори на основі всієї матриці, а не на стовпчику чи рядку:

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

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


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)
зупинка

1
@stallingOne Добре, я не повинен включати в приклад негативні значення, я можу це змінити пізніше. Для ознайомлення з людьми, які читають це, вам не потрібно створювати власну розбіжну cmap з новонародженим (хоча той, що в коментарі вище виглядає досить гладко), ви також можете використовувати вбудовані розбіжні cmaps від matplotlib, наприклад corr.style.background_gradient(cmap='coolwarm'). В даний час немає способу зосередити cmap на конкретне значення, що може бути хорошою ідеєю для розбіжних cmaps.
joelostblom

1
@rovyko Ви на пандах> = 0,24,0?
joelostblom

2
Ці сюжети візуально чудові, але питання @ Kristada673 досить актуальне, як би ви їх експортували?
Ерфан

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);

6
plt.xticks(range(len(corr.columns)), corr.columns, rotation='vertical')якщо ви хочете вертикальної орієнтації назв стовпців на осі x
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)

9
Теплова карта Seaborn - це фантазія, але вона працює погано на великих матрицях. метод matshow matplotlib набагато швидший.
anilbey

3
Seaborn може автоматично зробити висновок мітки з імен стовпців.
Туліо Касагранде

80

Ви можете спостерігати за відношенням між ознаками, малюючи теплову карту від новонароджених або розкидаючи матрицю від панд.

Матриця розсіювання:

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

Якщо ви хочете також візуалізувати нахил кожної функції, використовуйте парні пристрої для новонароджених.

sns.pairplot(dataframe)

Sns Heatmap:

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. Заморожені та гастрономи.

З парних пар: Ви можете спостерігати однаковий набір відносин з парних чи матриць розсіювання. Але з цього можна сказати, що нормально розподіляються дані чи ні.

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

Примітка. Наведене вище - це той самий графік, узятий із даних, який використовується для складання теплової карти.


3
Я думаю, що це має бути .plt not .pl (якщо це стосується matplotlib)
ghukill

2
@ghukill Не обов'язково. Він міг назвати це якfrom matplotlib import pyplot as pl
Jeru Luke

як встановити межу кореляції між -1 до +1 завжди, у
графіку

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()

5

Якщо у вас є кадр даних, dfви можете просто використовувати:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)

3

графіка статмоделей також дає хороший вигляд кореляційної матриці

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

corr = dataframe.corr()
sm.graphics.plot_corr(corr, xnames=list(corr.columns))
plt.show()


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 у файл зображення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.