利用Pandas绘制相关矩阵

rjzwgtxy  于 2022-09-21  发布在  其他
关注(0)|答案(17)|浏览(225)

我有一个包含大量特征的数据集,因此分析相关矩阵变得非常困难。我想画一个相关矩阵,它是我们使用Pandas图书馆的dataframe.corr()函数得到的。Pandas图书馆有没有内置的函数来绘制这个矩阵?

rwqw0loc

rwqw0loc1#

您可以使用matplotlib中的imshow()方法

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

ylamdve62#

corrmatrix = df.corr()
corrmatrix *= np.tri(*corrmatrix.values.shape, k=-1).T
corrmatrix = corrmatrix.stack().sort_values(ascending = False).reset_index()
corrmatrix.columns = ['Признак 1', 'Признак 2', 'Корреляция']
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
drop_columns = corrmatrix[(corrmatrix['Корреляция'] >= 0.82) + (corrmatrix['Корреляция'] <= -0.7)]['Признак 2']
df.drop(drop_columns, axis=1, inplace=True)
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
xhv8bpkk

xhv8bpkk3#

请检查以下可读代码

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(36, 26))
heatmap = sns.heatmap(df.corr(), vmin=-1, vmax=1, annot=True)
heatmap.set_title('Correlation Heatmap', fontdict={'fontsize':12}, pad=12)```

  [1]: https://i.stack.imgur.com/I5SeR.png
snz8szmq

snz8szmq4#

您可以使用海运中的heatmap()查看关联b/w不同功能:

import matplot.pyplot as plt
import seaborn as sns

co_matrics=dataframe.corr()
plot.figure(figsize=(15,20))
sns.heatmap(co_matrix, square=True, cbar_kws={"shrink": .5})
sg2wtvxw

sg2wtvxw5#

我更喜欢使用Ploly,因为它是更具互动性的图表,更容易理解。您可以使用以下代码片段。

import plotly.express as px

def plotly_corr_plot(df,w,h):
    fig = px.imshow(df.corr())
    fig.update_layout(
        autosize=False,
        width=w,
        height=h,)
    fig.show()
kqlmhetl

kqlmhetl6#

形成相关矩阵,在我的例子中,ZDF是我需要执行相关矩阵的 Dataframe 。

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转换为图像文件。

xcitsw88

xcitsw887#

与其他方法一起,使用配对图也很好,它将给出所有情况的散点图-

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

x7yiwoj48#

统计模型图形还提供了关联矩阵的良好视图

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

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

ovfsdjhp9#

我认为有很多好的答案,但我将这个答案添加到那些需要处理特定专栏并展示不同情节的人。

import numpy as np
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt

rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(18, 18))
df= df.iloc[: , [3,4,5,6,7,8,9,10,11,12,13,14,17]].copy()
corr = df.corr()
plt.figure(figsize=(11,8))
sns.heatmap(corr, cmap="Greens",annot=True)
plt.show()
q9rjltbz

q9rjltbz10#

您可以使用matplotlib中的pyplot.matshow()

import matplotlib.pyplot as plt

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

编辑:

在评论中,有一个关于如何更改轴刻度标签的请求。这是一个豪华版本,绘制在更大的图形尺寸上,具有与 Dataframe 匹配的轴标签,以及用于解释色标的色条图例。

我包括如何调整标签的大小和旋转,我使用了一个图形比例,使颜色条和主要图形出来的高度相同。

编辑2:由于df.corr()方法忽略非数字列,因此在定义x和y标签时应使用.select_dtypes(['number']),以避免标签发生不必要的移动(包括在下面的代码中)。

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

izkcnapc11#

如果您的 Dataframe 是df,则只需使用:

import matplotlib.pyplot as plt
import seaborn as sns

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

yqyhoc1h12#

惊讶地发现,没有人提到更有能力、更具互动性和更容易使用的替代方案。

A)可以有情节地使用:

1.只需两行,您就会得到:
1.互动性,
1.平滑比例,
1.基于整个 Dataframe 而不是单个列的颜色,
1.轴上的列名和行索引,
1.放大,
1.平底锅,
1.内置的一键保存为PNG格式的能力,
1.弹性伸缩;
1.比较悬停,
1.显示数值的气泡,因此热图看起来仍然很好,您可以在任何您想要的地方看到数值:

import plotly.express as px
fig = px.imshow(df.corr())
fig.show()

B)也可以使用Bokeh:

所有相同的功能,但有一点麻烦。但是,如果你不想选择密谋加入,并且仍然想要所有这些东西,那么仍然值得一试:

from bokeh.plotting import figure, show, output_notebook
from bokeh.models import ColumnDataSource, LinearColorMapper
from bokeh.transform import transform
output_notebook()
colors = ['#d7191c', '#fdae61', '#ffffbf', '#a6d96a', '#1a9641']
TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"
data = df.corr().stack().rename("value").reset_index()
p = figure(x_range=list(df.columns), y_range=list(df.index), tools=TOOLS, toolbar_location='below',
           tooltips=[('Row, Column', '@level_0 x @level_1'), ('value', '@value')], height = 500, width = 500)

p.rect(x="level_1", y="level_0", width=1, height=1,
       source=data,
       fill_color={'field': 'value', 'transform': LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max())},
       line_color=None)
color_bar = ColorBar(color_mapper=LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max()), major_label_text_font_size="7px",
                     ticker=BasicTicker(desired_num_ticks=len(colors)),
                     formatter=PrintfTickFormatter(format="%f"),
                     label_standoff=6, border_line_color=None, location=(0, 0))
p.add_layout(color_bar, 'right')

show(p)
mu0hgdu0

mu0hgdu013#

为了完整起见,截至2019年末,我所知道的最简单的seaborn解决方案是,如果使用Jupyter

import seaborn as sns
sns.heatmap(dataframe.corr())
ax6ht2ek

ax6ht2ek14#

您可以通过从海运绘制热图或从Pandas绘制散布矩阵来观察特征之间的关系。

散点矩阵:

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.牛奶和杂货
1.牛奶和洗涤剂_纸张
关联度较低的产品:

1.牛奶和熟食店
1.冷冻和新鲜。
1.冷冻和熟食。

从平面图:您可以从配对图或散点矩阵中观察到相同的关系集。但从这些我们可以判断数据是否服从正态分布。

注:上图是取自数据的相同图表,用于绘制热图。

euoag5mw

euoag5mw15#

试试这个函数,它还会显示相关矩阵的变量名:

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)

相关问题