У меня есть набор данных с огромным количеством функций, поэтому анализ корреляционной матрицы стал очень сложным. Я хочу построить матрицу корреляции, которую мы получаем с помощью функции dataframe.corr()
из библиотеки pandas. Есть ли встроенная функция, предоставляемая библиотекой pandas для построения этой матрицы?
Матрица корреляции участков с использованием панд
Ответ 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);
Ответ 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
Обратите внимание, что это должно быть в бэкэнде, поддерживающем рендеринг HTML, таком как Блокнот JupyterLab. (Автоматический светлый текст на темном фоне взят из существующего PR, а не из последней выпущенной версии, pandas
0.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()
и в sns.heatmap()
быстрее, чем sns.heatmap()
с матрицей 10x10. К сожалению, он не масштабируется так же хорошо, как и plt.matshow()
: для матрицы 100x100 они занимают примерно одинаковое время, а для матрицы plt.matshow()
работает в 10 раз быстрее.
экономия
Есть несколько возможных способов сохранить стилизованный фрейм данных:
- Верните HTML, добавив метод
render()
а затем запишите результат в файл. - Сохраните как файл
.xslx
с условным форматированием, добавив методto_excel()
. - Объединить с imgkit, чтобы сохранить растровое изображение
- Сделайте скриншот (для менее формальных целей).
Обновление для панд> = 0,24
Установив axis=None
, теперь можно вычислять цвета на основе всей матрицы, а не для столбца или строки:
corr.style.background_gradient(cmap='coolwarm', axis=None)
Ответ 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()