使用熊猫的相关矩阵

Gau*_*ngh 175 python data-visualization matplotlib information-visualization pandas

我有一个具有大量功能的数据集,因此分析相关矩阵变得非常困难.我想绘制一个相关矩阵,我们可以使用dataframe.corr()pandas库中的函数.是否有任何内置函数由pandas库提供以绘制此矩阵?

jrj*_*rjc 238

您可以使用pyplot.matshow()matplotlib:

import matplotlib.pyplot as plt

plt.matshow(dataframe.corr())
plt.show()
Run Code Online (Sandbox Code Playgroud)

  • 您知道如何在绘图上显示实际的列名吗? (5认同)
  • 如果列名比这些长,x 标签看起来会有点偏离,在我的例子中,这很令人困惑,因为它们看起来移动了一个刻度。将 `ha="left"` 添加到 `plt.xticks` 调用解决了这个问题,以防万一有人也遇到这个问题:) /sf/ask/2003112121/ 中描述-matplotlib 中的刻度标签 (4认同)
  • @Cecilia 我通过将 **rotation** 参数更改为 **90** 解决了这个问题 (2认同)

joe*_*lom 131

如果您的主要目标是可视化相关矩阵,而不是创建绘图本身,方便的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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,这需要在支持呈现HTML的后端,例如JupyterLab Notebook.(深色背景上的自动亮文本来自现有PR而不是最新发布的版本,pandas0.23).


造型

您可以轻松限制数字精度:

corr.style.background_gradient(cmap='coolwarm').set_precision(2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您更喜欢没有注释的矩阵,请完全删除数字:

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

在此输入图像描述

样式文档还包括更高级样式的说明,例如如何更改鼠标指针悬停在其上的单元格的显示.要保存输出,您可以通过附加render()方法返回HTML ,然后将其写入文件(或者仅为不太正式的目的截取屏幕截图).


时间比较

在我的测试中,比10x10矩阵快style.background_gradient()4倍,速度快plt.matshow()120 倍sns.heatmap().不幸的是,它的扩展性不如plt.matshow():两者对于100x100矩阵大约需要相同的时间,而plt.matshow()对于1000x1000矩阵则要快10倍.

  • 如果有一种方法可以导出为图像,那就太好了! (2认同)
  • 谢谢!你肯定需要一个发散调色板 ```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)``` (2认同)
  • 这些图在视觉上很棒,但@Kristada673 问题非常相关,您将如何导出它们? (2认同)

Apo*_*tus 86

尝试此函数,该函数还显示相关矩阵的变量名称:

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);
Run Code Online (Sandbox Code Playgroud)

  • 如果要在x轴上垂直排列列名,则使用`plt.xticks(range(len(corr.columns)),corr.columns,rotation ='vertical')` (5认同)

raf*_*lle 83

Seaborn的热图版本:

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)
Run Code Online (Sandbox Code Playgroud)

  • Seaborn热图很有意思,但它在大型矩阵上表现不佳.matplotlib的matshow方法要快得多. (9认同)
  • Seaborn可以自动推断列名称中的ticklabels. (3认同)

pha*_*rma 73

您可以通过从seaborn绘制热图或从pandas绘制散射矩阵来观察要素之间的关系.

散点矩阵:

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');
Run Code Online (Sandbox Code Playgroud)

如果你想要想象每个特征的偏斜 - 使用seaborn pairplots.

sns.pairplot(dataframe)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

输出将是特征的相关图.即见下面的例子.

在此输入图像描述

杂货和洗涤剂之间的相关性很高.同理:

具有高相关性的Pdoducts:
  1. 杂货和洗涤剂.
具有中等相关性的产品:
  1. 牛奶和杂货
  2. 牛奶和洗涤剂_便宜
相关性低的产品:
  1. 牛奶和熟食店
  2. 冷冻和新鲜.
  3. 冷冻和熟食.

从Pairplots:你可以从pairplots或scatter矩阵中观察到同一组关系.但是从这些我们可以说数据是否正常分布.

在此输入图像描述

注意:以上是从数据中获取的相同图表,用于绘制热图.

  • 我认为它应该是.plt而不是.pl(如果这是指matplotlib) (2认同)
  • @ghukill不必要。他本来可以将其称为“从matplotlib import pyplot as pl”。 (2认同)

Mar*_*cin 17

为完整起见,如果有人使用Jupyter,我在 2019 年底知道的最简单的解决方案是seaborn

import seaborn as sns
sns.heatmap(dataframe.corr())
Run Code Online (Sandbox Code Playgroud)


I_A*_*ary 11

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

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Har*_*vey 10

如果你的数据框是df你可以简单地使用:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以从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()
Run Code Online (Sandbox Code Playgroud)


Ham*_*mza 6

惊讶地发现没有人提到功能更强大、交互性更强且更易于使用的替代品。

A)您可以使用情节:

  1. 只需两行,你就会得到:

  2. 互动性,

  3. 平滑的尺度,

  4. 基于整个数据框而不是单个列的颜色,

  5. 轴上的列名和行索引,

  6. 放大,

  7. 平移,

  8. 内置一键式将其另存为 PNG 格式的功能,

  9. 自动缩放,

  10. 悬停对比,

  11. 气泡显示值,因此热图看起来仍然不错,您可以在任何地方看到值:

import plotly.express as px
fig = px.imshow(df.corr())
fig.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

B) 您也可以使用散景:

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

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Sha*_*raj 5

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()
Run Code Online (Sandbox Code Playgroud)