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


211

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


関連する回答はここにあります。パンダからのヒートマップの作成DataFrame
joelostblom 2018

回答:


291

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

相関プロットの例


1
私は何かが欠けているに違いありません:AttributeError: 'module' object has no attribute 'matshow'
トムラッセル

1
@TomRussellしましたimport matplotlib.pyplot as pltか?
joelostblom

1
やったと思いたい!:-)
トムラッセル

7
プロットに実際の列名を表示する方法を知っていますか?
WebQube 2019年

2
@Cecilia 回転パラメーターを90に
ikbel benabdessamad

182

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

ここに画像の説明を入力してください

これは、JupyterLab Notebookなど、HTMLのレンダリングをサポートするバックエンドに存在する必要があることに注意してください。(暗い背景の自動の明るいテキストは既存のPRからのものであり、最新のリリースバージョンpandas0.23ではありません)。


スタイリング

桁の精度を簡単に制限できます。

corr.style.background_gradient(cmap='coolwarm').set_precision(2)

ここに画像の説明を入力してください

または、注釈なしのマトリックスが望ましい場合は、数字を完全に削除します。

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

ここに画像の説明を入力してください

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


時間比較

私のテストでstyle.background_gradient()は、10x10マトリックスの4倍、10x10マトリックスのplt.matshow()120 倍高速sns.heatmap()でした。残念ながら、それだけではスケーリングできませんplt.matshow()。2つplt.matshow()は100x100マトリックスの場合はほぼ同じ時間がかかり、1000x1000マトリックスの場合は10倍高速です。


保存中

様式化されたデータフレームを保存する方法はいくつかあります。

  • render()メソッドを追加してHTMLを返し、出力をファイルに書き込みます。
  • メソッドを.xslx追加して、条件付きフォーマットでファイルとして保存しますto_excel()
  • imgkitと組み合わせてビットマップを保存する
  • スクリーンショットを撮ります(あまり正式な目的ではありません)。

パンダの更新> = 0.24

を設定することによりaxis=None、列ごとまたは行ごとではなく、マトリックス全体に基づいて色を計算できるようになりました。

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

ここに画像の説明を入力してください


2
画像としてエクスポートする方法があったら、それは素晴らしいことでした!
Kristada673 2018年

1
ありがとう!間違いなく発散パレットが必要です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)
ストール

1
@stallingOne良い点、私は例に負の値を含めるべきではなかったので、後で変更するかもしれません。これを読んでいる人のための参考のために、seabornでカスタムの発散cmapを作成する必要はありません(ただし、上記のコメントの見た目はかなり滑らかに見えます)corr.style.background_gradient(cmap='coolwarm')。また、matplotlibの組み込みの発散cmapを使用することもできます。現在、cmapを特定の値に集中させる方法はありません。これは、異なるcmapを使用する場合に適しています。
joelostblom

1
@rovykoあなたはパンダ> = 0.24.0にいますか?
joelostblom

2
これらのプロットは視覚的に優れていますが、@ Kristada673の質問はかなり関連性があります。どのようにエクスポートしますか?
Erfan、

89

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

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

6
plt.xticks(range(len(corr.columns)), corr.columns, rotation='vertical')x軸上の列名の垂直方向が必要な場合
nishant '18

別のグラフィカルなものですが、aを追加するplt.tight_layout()と長い列名にも役立つ場合があります。
user3017048

86

シーボーンのヒートマップバージョン:

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

9
Seabornヒートマップはファンシーですが、大きなマトリックスではパフォーマンスが低下します。matplotlibのmatshowメソッドははるかに高速です。
anilbey 2017

3
Seabornは、列名から目盛りラベルを自動的に推測できます。
Tulio Casagrande 2018年

80

シーボーンからヒートマップを描画するか、パンダから散布行列を描画することにより、フィーチャ間の関係を観察できます。

散布図:

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)

出力は、機能の相関マップになります。つまり、以下の例を参照してください。

ここに画像の説明を入力してください

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

高相関のPdoducts:
  1. 食料品と洗剤。
中程度の相関関係を持つ製品:
  1. 牛乳と食料品
  2. 牛乳と洗剤_紙
相関の低い製品:
  1. 牛乳とデリ
  2. 冷凍で新鮮。
  3. 冷凍とデリ。

ペアプロットから:ペアプロットまたは散布行列から同じ関係のセットを観察できます。しかし、これらから、データが正常に配布されているかどうかがわかります。

ここに画像の説明を入力してください

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


3
私はそれが.plではなく.plt(これがmatplotlibを参照している場合)である必要があると思います
ghukill

2
@ghukill必ずしも必要ではありません。彼はそれを次のように呼んだかもしれませんfrom matplotlib import pyplot as pl
Jeru Luke

相関プロットで常に-1から+1までの相関の境界を設定する方法
debaonline4u

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

5

あなたがデータフレームであるならば、あなたdfは単に使うことができます:

import matplotlib.pyplot as plt
import seaborn as sns

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

3

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

2

完全を期すために、最も簡単な解決策は、私が知っているseaborn 1が使用している場合は、後半に2019のようJupyterを

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

1

他の方法と一緒に、すべての場合の散布図を与えるpairplotを持つことも良いです-

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)

0

相関行列を形成します。私の場合、zdfは相関行列を実行する必要があるデータフレームです。

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を画像ファイルに変換します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.