膨大な数の機能を持つデータセットがあるので、相関行列を分析することは非常に困難になりました。私は私たちがパンダライブラリからdataframe.corr()
関数を使って得た相関行列をプロットしたいです。この行列をプロットするためにパンダライブラリが提供する組み込み関数はありますか?
matplotlib
から pyplot.matshow()
を使用できます。
import matplotlib.pyplot as plt
plt.matshow(dataframe.corr())
plt.show()
相関行列の変数名も表示するこの関数を試してください。
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);
Seabornのヒートマップ版
import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
プロット自体を作成するのではなく、相関行列を視覚化することが主な目的である場合、便利な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からのものであり、最新リリース版ではない、pandas
0.23)。
数字の精度を簡単に制限できます。
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
注釈なしで行列を好む場合は、数字を完全に削除します。
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
スタイリングのドキュメントには、マウスポインタが置かれているセルの表示を変更する方法など、より高度なスタイルの説明も含まれています。出力を保存するには、render()
メソッドを追加してHTMLを返し、それをファイルに書き込むことができます(または、形式的でない目的のために単にスクリーンショットを撮る)。
私のテストでは、10x10の行列で、style.background_gradient()
はplt.matshow()
より4倍速く、sns.heatmap()
より120倍速くなっていました。残念ながら、plt.matshow()
のように拡大縮小することはできません。100x100のマトリックスでは2つの時間がほぼ同じになり、1000x1000のマトリックスではplt.matshow()
の速度が10倍速くなります。
axis=None
を設定することで、列ごとや行ごとではなく、行列全体に基づいて色を計算することが可能になりました。
corr.style.background_gradient(cmap='coolwarm', axis=None)
あなたは、海鳥からヒートマップを描くか、パンダから散布図を描くことによって、特徴間の関係を観察することができます。
散布図マトリックス:
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)
出力はフィーチャの相関マップになります。すなわち、以下の例を見てください。
食料品と洗剤の間の相関は高いです。同様に:
ペアプロットから:ペアプロットまたは散布図から同じ一連の関係を観察できます。しかし、これらのことから、データが正規分布かどうかがわかります。
注:上記はヒートマップを描画するために使用されるデータから取得したものと同じグラフです。
あなたは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()
データフレームがdf
の場合、単純に使用できます:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)