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

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

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

4b9b3361

Ответ 1

Вы можете использовать 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);

correlation plot example

Ответ 2

Если вашей главной целью является визуализация матрицы корреляции, а не создание графика как такового, удобные варианты стилей 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

enter image description here

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


стайлинг

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

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

enter image description here

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

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

enter image description here

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


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

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


экономия

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


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

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

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

enter image description here

Ответ 3

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

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

Ответ 4

Версия для теплоносителя морского судна:

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)

Ответ 5

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

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

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)

Вывод будет корреляционной картой функций. т.е. см. приведенный ниже пример.

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

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

Pdoducts с высокой корреляцией:
  • Бакалея и моющие средства.
Продукты со средней корреляцией:
  • Молоко и бакалейные товары
  • Молоко и моющие средства_Папка
Продукты с низкой корреляцией:
  • Молоко и Дели
  • Замороженные и свежие.
  • Замороженные и гастрономы.

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

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

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

Ответ 6

Вы можете использовать метод 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()

Ответ 7

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

import matplotlib.pyplot as plt
import seaborn as sns

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

Ответ 8

Графика 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()