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で直感的な可視化
  • 用途に応じた相関係数の種類の選択
  • 欠損値や大きなデータセットへの適切な対処

これらの手法を活用することで、データの特徴をより深く理解し、効果的な分析を行うことができます。