Pandasで相関係数を計算してヒートマップで可視化する方法【完全ガイド】
データ分析において、変数間の関係性を理解することは非常に重要です。Pandasを使用してDataFrameの各列間の相関係数を算出し、ヒートマップで視覚的に表現する方法を詳しく解説します。
相関係数とは
相関係数は、2つの変数間の線形関係の強さと方向を示す統計指標です。値は-1から1の範囲で、以下のような意味を持ちます:
- 1に近い:強い正の相関(一方が増加すると他方も増加)
- 0に近い:相関なし(線形関係がない)
- -1に近い:強い負の相関(一方が増加すると他方は減少)
基本的な相関係数の計算
サンプルデータの準備
import pandas as pd
import numpy as np
# サンプルデータを作成
np.random.seed(42)
data = {
'売上': [100, 150, 200, 180, 220],
'広告費': [10, 15, 25, 20, 30],
'気温': [25, 28, 32, 30, 35],
'来店者数': [50, 75, 100, 90, 110]
}
df = pd.DataFrame(data)
print(df)
corr()メソッドによる相関係数の計算
# 相関係数行列を計算
correlation_matrix = df.corr()
print(correlation_matrix)
Pandasのcorr()メソッドは、DataFrameの数値列間の相関係数を自動的に計算し、相関行列として返します。デフォルトではピアソンの相関係数が使用されます。
相関係数の種類と指定方法
ピアソンの相関係数(デフォルト)
# ピアソンの相関係数(線形関係)
pearson_corr = df.corr(method='pearson')
スピアマンの順位相関係数
# スピアマンの順位相関係数(単調関係)
spearman_corr = df.corr(method='spearman')
ケンドールの順位相関係数
# ケンドールのタウ係数
kendall_corr = df.corr(method='kendall')
ヒートマップによる可視化
Seabornを使用したヒートマップ
import seaborn as sns
import matplotlib.pyplot as plt
# 日本語フォント設定
plt.rcParams['font.family'] = 'DejaVu Sans'
# ヒートマップの作成
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix,
annot=True, # 数値を表示
cmap='coolwarm', # カラーマップ
center=0, # 中心値
square=True) # 正方形のセル
plt.title('相関係数ヒートマップ')
plt.show()
カスタマイズされたヒートマップ
# より詳細なカスタマイズ
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix,
annot=True,
fmt='.2f', # 小数点以下2桁
cmap='RdYlBu_r', # 別のカラーマップ
vmin=-1, vmax=1, # 値の範囲
linewidths=0.5, # セル間の線
cbar_kws={'shrink': 0.8})
plt.title('詳細な相関係数ヒートマップ', fontsize=16)
plt.tight_layout()
plt.show()
実践的な応用例
大きなデータセットでの相関分析
# より大きなサンプルデータ
np.random.seed(123)
large_data = pd.DataFrame({
'A': np.random.randn(100),
'B': np.random.randn(100),
'C': np.random.randn(100),
'D': np.random.randn(100),
'E': np.random.randn(100)
})
# 相関が強いペアを見つける
large_corr = large_data.corr()
閾値による相関の抽出
# 強い相関(絶対値0.7以上)を抽出
def find_high_correlation(corr_matrix, threshold=0.7):
high_corr = []
for i in range(len(corr_matrix.columns)):
for j in range(i+1, len(corr_matrix.columns)):
corr_val = corr_matrix.iloc[i, j]
if abs(corr_val) >= threshold:
high_corr.append({
'var1': corr_matrix.columns[i],
'var2': corr_matrix.columns[j],
'correlation': corr_val
})
return pd.DataFrame(high_corr)
high_corr_pairs = find_high_correlation(correlation_matrix)
print(high_corr_pairs)
欠損値がある場合の対処法
欠損値を含むデータの相関計算
# 欠損値を含むデータ
data_with_nan = df.copy()
data_with_nan.loc[1, '売上'] = np.nan
data_with_nan.loc[3, '広告費'] = np.nan
# デフォルトでは利用可能なペアのみで計算
corr_with_nan = data_with_nan.corr()
最小観測数の指定
# 最小観測数を指定
corr_min_periods = data_with_nan.corr(min_periods=3)
パフォーマンス最適化のヒント
大きなデータセットの処理
# 数値列のみを選択して処理速度を向上
numeric_df = df.select_dtypes(include=[np.number])
corr_numeric = numeric_df.corr()
メモリ効率的な計算
# チャンク処理での相関計算(大きなデータセット用)
def chunk_correlation(df, chunk_size=1000):
if len(df) <= chunk_size:
return df.corr()
# 大きなデータセットの場合の処理
return df.sample(n=chunk_size).corr()
まとめ
Pandasの相関係数計算とヒートマップ可視化により、データの関係性を効率的に把握できます。重要なポイントは以下の通りです:
corr()メソッドで簡単に相関係数を計算- Seabornのheatmapで直感的な可視化
- 用途に応じた相関係数の種類の選択
- 欠損値や大きなデータセットへの適切な対処
これらの手法を活用することで、データの特徴をより深く理解し、効果的な分析を行うことができます。

