web-dev-qa-db-ja.com

パンダを使って相関行列をプロットする

膨大な数の機能を持つデータセットがあるので、相関行列を分析することは非常に困難になりました。私は私たちがパンダライブラリからdataframe.corr()関数を使って得た相関行列をプロットしたいです。この行列をプロットするためにパンダライブラリが提供する組み込み関数はありますか?

130
Gaurav Singh

matplotlibから pyplot.matshow() を使用できます。

import matplotlib.pyplot as plt

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

相関行列の変数名も表示するこの関数を試してください。

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

Seabornのヒートマップ版

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

プロット自体を作成するのではなく、相関行列を視覚化することが主な目的である場合、便利な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

これはJupyterLab NotebookのようなHTMLのレンダリングをサポートするバックエンドにある必要があることに注意してください。 (暗い背景上の自動の明るいテキストは既存の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

スタイリングのドキュメントには、マウスポインタが置かれているセルの表示を変更する方法など、より高度なスタイルの説明も含まれています。出力を保存するには、render()メソッドを追加してHTMLを返し、それをファイルに書き込むことができます(または、形式的でない目的のために単にスクリーンショットを撮る)。


時間比較

私のテストでは、10x10の行列で、style.background_gradient()plt.matshow()より4倍速く、sns.heatmap()より120倍速くなっていました。残念ながら、plt.matshow()のように拡大縮小することはできません。100x100のマトリックスでは2つの時間がほぼ同じになり、1000x1000のマトリックスではplt.matshow()の速度が10倍速くなります。


パンダが更新されました> = 0.24

axis=Noneを設定することで、列ごとや行ごとではなく、行列全体に基づいて色を計算することが可能になりました。

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

enter image description here

73
joelostblom

あなたは、海鳥からヒートマップを描くか、パンダから散布図を描くことによって、特徴間の関係を観察することができます。

散布図マトリックス:

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)

出力はフィーチャの相関マップになります。すなわち、以下の例を見てください。

enter image description here

食料品と洗剤の間の相関は高いです。同様に:

  1. 食料品と洗剤。
  1. 牛乳と食料品
  2. 牛乳と洗剤_紙
  1. 牛乳とデリ
  2. 冷凍フレッシュ。
  3. 冷凍とデリ.

ペアプロットから:ペアプロットまたは散布図から同じ一連の関係を観察できます。しかし、これらのことから、データが正規分布かどうかがわかります。

enter image description here

注:上記はヒートマップを描画するために使用されるデータから取得したものと同じグラフです。

60
phanindravarma

あなたはmatplotlibからimshow()メソッドを使用することができます

import pandas as pd
import matplotlib.pyplot as plt
matplotlib.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()
4

データフレームがdfの場合、単純に使用できます:

import matplotlib.pyplot as plt
import seaborn as sns

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