相関行列のヒートマップ
DataFrame.corr()で相関行列を計算し、sns.heatmapで色分けされたヒートマップとして可視化します。
「相関行列のヒートマップ」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
相関行列とは
相関行列は正方行列で、(i, j) の要素に列 i と列 j のPearson 相関係数が格納されます。値は -1(完全な負の線形相関)から +1(完全な正の相関)の範囲で、0 は線形関係がないことを意味します。対角成分は常に 1 です(変数はそれ自身と完全に相関するためです)。相関行列は、モデルを構築する前に、どの変数が同じように変化するかを理解するための第一歩です。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Compute correlation matrix for numeric columns
tips = sns.load_dataset('tips')
corr = tips[['total_bill', 'tip', 'size']].corr()
print(corr.round(2))相関行列の計算
DataFrame.corr()を呼び出すと、すべての数値列についてペアごとの Pearson 相関を計算できます。method パラメーターで計算する相関の種類を指定します。'pearson'(デフォルト、線形)、'spearman'(順位に基づき、外れ値や非線形の単調関係に頑健)、または 'kendall'です。偏りの大きい金融データやカウントデータでは、Pearson より Spearman のほうが有用な情報を与えることがよくあります。
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
numeric = tips.select_dtypes(include='number')
# Pearson vs Spearman
pearson = numeric.corr(method='pearson')
spearman = numeric.corr(method='spearman')
print('Pearson:')
print(pearson.round(2))
print('\nSpearman:')
print(spearman.round(2))sns.heatmap による基本的なヒートマップ
sns.heatmap(data)は2次元配列または DataFrame を受け取り、色のグリッドとして描画します。それぞれのセルの色が数値を表します。相関行列に適用すると、通常は暖色(赤)が正の相関、寒色(青)が負の相関を表します。annot=Trueパラメーターを指定すると各セル内に数値が表示されるため、相関ヒートマップを正確に読み取るうえで不可欠です。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
sns.heatmap(corr, annot=True, fmt='.2f')
plt.title('Correlation Heatmap — Tips Dataset')
plt.tight_layout()
plt.show()適切なカラーマップの選択
相関行列には、必ず 0 を中心とする発散型カラーマップを使用します。cmap='coolwarm'、'RdBu_r'、または 'vlag'などです。これらのマップは、正の値と負の値にそれぞれ異なる色を割り当て、0 を中立的な中間点として表します。相関データに対しては、逐次型カラーマップ('Blues' など)は避けてください。正の相関と負の相関を視覚的に区別できなくなるためです。vmin=-1, vmax=1を設定して、色のスケールを相関の全範囲に固定します。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
sns.heatmap(
corr,
annot=True,
fmt='.2f',
cmap='coolwarm',
vmin=-1,
vmax=1,
center=0
)
plt.title('Correlation Heatmap with Diverging Palette')
plt.tight_layout()
plt.show()上三角部分のマスキング
相関行列は対称(corr[i,j] == corr[j,i])なので、両方の半分を表示するのは冗長です。np.triuを使って上三角部分のマスクを作成し、sns.heatmapのmask=に渡します。これによりセル数が半分になり、プロットがすっきりして読みやすくなります。対角成分(すべて 1.0)も情報を持たないため、マスクできます。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
# Mask the upper triangle (including diagonal)
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(
corr,
mask=mask,
annot=True,
fmt='.2f',
cmap='coolwarm',
vmin=-1,
vmax=1
)
plt.title('Lower-Triangle Correlation Heatmap')
plt.tight_layout()
plt.show()注釈とセルサイズのカスタマイズ
fmt=で注釈の形式を制御できます(小数点以下2桁なら '.2f'など)。フォントサイズはannot_kws={'size': 10}で指定します。linewidthsパラメーターを使うとセル間に細い線が追加され、大きな行列でもグリッドを読みやすくできます。square=Trueを使うと、図のサイズにかかわらずセルを正方形にでき、ヒートマップをすっきりとバランスよく見せられます。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Load a wider dataset for a more interesting heatmap
penguins = sns.load_dataset('penguins').select_dtypes('number')
corr = penguins.corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(
corr,
mask=mask,
annot=True,
fmt='.2f',
cmap='vlag',
vmin=-1,
vmax=1,
linewidths=0.5,
square=True,
annot_kws={'size': 10}
)
plt.title('Penguins Correlation Matrix')
plt.tight_layout()
plt.show()clustermap によるクラスタリング
sns.clustermap()は階層的クラスタリングを使って行と列を並べ替え、相関パターンが似ている変数をまとめます。これにより、大きな行列の中で相関のある特徴量のブロックを見つけやすくなります。上部と左側の軸に表示されるデンドログラムは、クラスタリングの木構造を示します。相関に基づくクラスタリングでは、method='ward'とmetric='euclidean'を妥当なデフォルトとして使用できます。
import seaborn as sns
import matplotlib.pyplot as plt
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()
sns.clustermap(
corr,
cmap='coolwarm',
vmin=-1,
vmax=1,
annot=True,
fmt='.2f',
figsize=(6, 6)
)
plt.suptitle('Clustered Correlation Matrix', y=1.02)
plt.show()ピボットテーブルデータのヒートマップ
ヒートマップは相関行列に限られません。任意の2次元数値テーブルで、色による値の表現が役立ちます。よくあるパターンは、ピボットテーブル(例: 曜日と時間帯ごとのチップの平均)を作成し、それをヒートマップとして可視化することです。密集した数値の表を、ひと目で確認できる色のグリッドに変換できるため、最大値と最小値を視覚的にすぐ見つけられます。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
tips = sns.load_dataset('tips')
# Pivot: average bill by day and time
pivot = tips.pivot_table(
values='total_bill',
index='day',
columns='time',
aggfunc='mean'
)
sns.heatmap(pivot, annot=True, fmt='.1f', cmap='YlOrRd')
plt.title('Average Bill by Day and Time')
plt.tight_layout()
plt.show()相関値の解釈
相関を解釈するときは、次の大まかな基準を使用します。|r| < 0.2 = 無視できる程度、0.2-0.4 = 弱い、0.4-0.6 = 中程度、0.6-0.8 = 強い、> 0.8 = 非常に強い。ただし、相関から因果関係はわかりません。また、第三の交絡変数によって偶然相関している見せかけの相関である可能性もあります。数値による相関分析は必ず散布図と組み合わせ、関係が実際に線形であり、外れ値によって生じたものではないことを確認してください。
import pandas as pd
import seaborn as sns
# Find the most correlated pairs
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()
# Unstack to get pairs, remove self-correlations, sort
pairs = (corr
.unstack()
.reset_index()
.rename(columns={'level_0': 'var1', 'level_1': 'var2', 0: 'r'})
.query('var1 != var2')
.assign(abs_r=lambda df: df['r'].abs())
.sort_values('abs_r', ascending=False)
.drop_duplicates(subset='abs_r')
)
print(pairs.head(6).to_string(index=False))大規模データセットのヒートマップ: 部分抽出
列数の多い DataFrame では、相関行列全体のヒートマップは読みにくくなります。よりよい方法は、|r| がしきい値(例: 0.5)を超えるペアだけを表示するよう相関行列をフィルタリングするか、目的変数と最も強く相関する特徴量だけを選択することです。また、分野ごとに部分抽出することもできます。たとえば、ビジネスデータセットで金融指標間の相関と業務指標間の相関を分けて描画します。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Show only features with |r| > 0.4 with any other feature
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()
# Filter columns that have at least one high correlation (excluding diagonal)
high_corr = (corr.abs() > 0.4).any(axis=1)
filtered = corr.loc[high_corr, high_corr]
mask = np.triu(np.ones_like(filtered, dtype=bool))
sns.heatmap(filtered, mask=mask, annot=True,
fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)
plt.title('High-Correlation Subset')
plt.tight_layout()
plt.show()ヒートマップのファイルへの保存
ヒートマップはレポートやプレゼンテーションに含めることがよくあります。ヒートマップを作成した後にplt.savefig('filename.png', dpi=150, bbox_inches='tight')を呼び出すと、保存できます。bbox_inches='tight'引数により、軸ラベルが切り取られるのを防げます。PDF レポートの場合はformat='pdf'を使用します。sns.clustermapを使う場合、図は返されたオブジェクトに保存されます。g = sns.clustermap(...); g.savefig('plot.png')のように記述します。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
fig, ax = plt.subplots(figsize=(6, 5))
sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
cmap='coolwarm', vmin=-1, vmax=1,
linewidths=0.5, ax=ax)
ax.set_title('Correlation Heatmap')
# Save to file
plt.savefig('/tmp/correlation_heatmap.png', dpi=150, bbox_inches='tight')
plt.close()
print('Saved to /tmp/correlation_heatmap.png')クイックチェック
このレッスンで学んだ相関ヒートマップについて、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、DataFrame.corr()がペアごとの相関を計算すること、sns.heatmapが発散型カラーマップと注釈を使って相関を色のグリッドとして描画すること、そして上三角部分をマスクすると重複を除けることを学びました。次は、あらゆる新しいデータセットを調査するための体系的なチェックリストである、完全な探索的データ分析(EDA)パイプラインについて学びます。
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「相関行列のヒートマップ」レッスンは無料ですか?
はい。「相関行列のヒートマップ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「相関行列のヒートマップ」で何を学びますか?
DataFrame.corr()で相関行列を計算し、sns.heatmapで色分けされたヒートマップとして可視化します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「相関行列のヒートマップ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。