Матрица корреляции участков с использованием панд
У меня есть набор данных с огромным количеством функций, поэтому анализ корреляционной матрицы стал очень сложным. Я хочу построить матрицу корреляции, которую мы получаем с помощью функции 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);
![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()