活用テクニック2026年4月1日

相関分析の完全ガイド — Pearson・Spearman・相互情報量・Cramér's Vを使い分ける

特徴量間の関係を正しく測る方法を解説します。線形相関だけでなく、非線形・カテゴリ変数間の関連性まで、4つの指標の使い分けとQastでの自動分析を紹介します。

Qast の相関分析ダッシュボード。相関マトリクスヒートマップが表示されている。

相関分析は、2つの変数がどの程度「一緒に動くか」を数値化する手法です。機械学習では、特徴量間の関係を把握してモデルの安定性を高めたり、冗長な特徴量を除外したりするために欠かせません。しかし「相関」にはさまざまな種類があり、データの性質によって使い分ける必要があります。この記事では、Pearson 相関・Spearman 順位相関・相互情報量・Cramér's V の4つの指標を軸に、相関分析の全体像と実践的な使い方を解説します。

相関分析とは — なぜ重要なのか

相関分析は、2つの変数の間に統計的な関係があるかどうかを調べるプロセスです。たとえば「広告費を増やすと売上が伸びるか」「気温が上がるとアイスクリームの販売量が増えるか」といった疑問に答えるための基本的な手法です。機械学習においては、特徴量間の強い相関(多重共線性)がモデルの不安定性や解釈性の低下を引き起こすため、学習前にデータの相関構造を把握しておくことが極めて重要です。

相関の強さは一般に -1 から +1 の範囲(または 0 から 1 の範囲)で表されます。+1 に近いほど強い正の相関(一方が増えるともう一方も増える)、-1 に近いほど強い負の相関(一方が増えるともう一方は減る)、0 に近いほど関係が弱いことを意味します。

Pearson の相関係数 — 線形関係を測る王道

Pearson の積率相関係数は、2つの連続変数間の「線形な」関係の強さを測る指標です。値は -1 から +1 の範囲を取り、2変数が完全に直線的な関係にあるとき ±1 になります。最も広く使われている相関指標ですが、線形関係のみを検出するという制約があります。つまり、U字型やサイン曲線のような非線形な関係がある場合、Pearson 相関は0に近い値を返してしまいます。

Pearson 相関の前提条件は、(1) 両変数が連続値であること、(2) 両変数が概ね正規分布に従うこと、(3) 関係が線形であること、(4) 外れ値が少ないこと、の4つです。これらの前提が崩れると、Pearson 相関の値は信頼できません。

python
import pandas as pd
import numpy as np
from scipy import stats

# サンプルデータの作成
np.random.seed(42)
df = pd.DataFrame({
    "広告費": np.random.uniform(100, 1000, 200),
    "売上": np.random.uniform(500, 5000, 200),
})
# 線形関係を追加(ノイズ付き)
df["売上"] = df["広告費"] * 3.5 + np.random.normal(0, 200, 200)

# Pearson 相関係数の計算
r, p_value = stats.pearsonr(df["広告費"], df["売上"])
print(f"Pearson r = {r:.4f}, p-value = {p_value:.2e}")

# 相関マトリクスの作成
corr_matrix = df.corr(method="pearson")
print(corr_matrix)

Pearson 相関は外れ値に非常に敏感です。たった1つの外れ値が相関係数を大きく変えてしまうことがあります。データに外れ値が含まれる可能性がある場合は、まず散布図で視覚的に確認し、必要に応じて Spearman 相関を併用しましょう。

Spearman の順位相関 — 単調関係を捉えるロバストな指標

Spearman の順位相関係数は、データを順位(ランク)に変換してから Pearson 相関を計算する手法です。順位に基づくため、外れ値の影響を受けにくく、線形でなくても「単調な関係」(一方が増えれば他方も一貫して増える/減る)を検出できます。たとえば、年収と幸福度が対数的な関係(年収が上がるほど幸福度は上がるが、上昇幅は徐々に小さくなる)にある場合、Pearson 相関よりも Spearman 相関の方が高い値を示します。

Spearman 相関は、順序尺度のデータ(例:アンケートの5段階評価)にも適用可能です。正規分布の仮定を必要としないノンパラメトリック手法であるため、データの分布を気にせず使える汎用性の高い指標です。

  1. 1

    Pearson を使う場面

    両変数が連続値で正規分布に近く、散布図で直線的な関係が確認できる場合。外れ値が少ないクリーンなデータに最適です。

  2. 2

    Spearman を使う場面

    データに外れ値が含まれる場合、分布が正規でない場合、または単調だが非線形な関係を捉えたい場合。順序尺度データにも使えます。

  3. 3

    両方を比較する意味

    Pearson と Spearman の値が大きく異なる場合、非線形な関係や外れ値の存在を示唆します。Qast では両指標を自動的に並べて表示するため、乖離を一目で確認できます。

相互情報量 — 非線形関係も漏らさず検出する

相互情報量(Mutual Information, MI)は、情報理論に基づく指標で、2つの変数間の「あらゆる種類の依存関係」を検出できます。Pearson は線形、Spearman は単調な関係に限定されますが、MI は U 字型・円形・周期的など、どんな形の関係でも捉えることができます。値は 0 以上で、0 は完全に独立(無関係)、値が大きいほど強い依存関係があることを意味します。

MI の計算には、連続変数の場合は k 近傍法によるノンパラメトリック推定が、離散変数の場合は同時確率分布からの直接計算が用いられます。scikit-learn では mutual_info_regression(回帰タスク)と mutual_info_classif(分類タスク)が利用可能です。

python
from sklearn.feature_selection import mutual_info_regression
import numpy as np
import pandas as pd

np.random.seed(42)
X = np.random.uniform(-3, 3, (500, 1))

# 線形関係
y_linear = 2 * X[:, 0] + np.random.normal(0, 0.5, 500)
# 非線形(二次)関係
y_quad = X[:, 0] ** 2 + np.random.normal(0, 0.5, 500)
# 無関係
y_random = np.random.normal(0, 1, 500)

# 相互情報量の計算
mi_linear = mutual_info_regression(X, y_linear, random_state=42)[0]
mi_quad = mutual_info_regression(X, y_quad, random_state=42)[0]
mi_random = mutual_info_regression(X, y_random, random_state=42)[0]

print(f"線形関係の MI:  {mi_linear:.4f}")   # 高い値
print(f"二次関係の MI:  {mi_quad:.4f}")      # 高い値(非線形でも検出)
print(f"無関係の MI:    {mi_random:.4f}")    # 0 に近い値

相互情報量は方向性(正の相関か負の相関か)を持ちません。また、値のスケールが Pearson 相関のように -1〜+1 に標準化されていないため、絶対値の大小だけで「強い」「弱い」と判断するのではなく、他の特徴量ペアとの相対比較で解釈しましょう。

Cramér's V — カテゴリ変数同士の関連性を測る

数値変数間の相関は Pearson や Spearman で測れますが、カテゴリ変数同士(例:性別と購買チャネル、地域と商品カテゴリ)の関連性はどう測ればよいでしょうか。Cramér's V は、カイ二乗統計量を基に計算されるカテゴリ変数間の関連度指標で、0(完全に独立)から 1(完全に関連)の範囲を取ります。

Cramér's V は、クロス集計表(分割表)のサイズに影響されにくいよう正規化されており、異なるサイズの分割表間でも比較可能です。一般に、V < 0.1 は弱い関連、0.1 ≤ V < 0.3 は中程度、V ≥ 0.3 は強い関連と解釈されます。

python
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency

def cramers_v(x: pd.Series, y: pd.Series) -> float:
    """2つのカテゴリ変数間の Cramér's V を計算する。"""
    contingency = pd.crosstab(x, y)
    chi2, _, _, _ = chi2_contingency(contingency)
    n = contingency.sum().sum()
    r, k = contingency.shape
    # バイアス補正付き Cramér's V
    phi2 = max(0, chi2 / n - (k - 1) * (r - 1) / (n - 1))
    r_corr = r - (r - 1) ** 2 / (n - 1)
    k_corr = k - (k - 1) ** 2 / (n - 1)
    return np.sqrt(phi2 / min(k_corr - 1, r_corr - 1))

# サンプルデータ
df = pd.DataFrame({
    "性別": np.random.choice(["男性", "女性"], 500),
    "購買チャネル": np.random.choice(["店舗", "EC", "アプリ"], 500),
})
v = cramers_v(df["性別"], df["購買チャネル"])
print(f"Cramér's V = {v:.4f}")

相関マトリクスヒートマップ — 全体像を俯瞰する

相関マトリクスは、すべての変数ペアの相関係数を行列形式にまとめたものです。ヒートマップとして可視化することで、どの変数ペアが強く相関しているかを一目で把握できます。Qast では、数値変数には Pearson/Spearman、カテゴリ変数には Cramér's V、混合型には相互情報量を自動的に選択し、統合的な相関マトリクスを生成します。

ヒートマップを読む際のポイントは、(1) 対角線はすべて 1.0(自分自身との相関)なので無視する、(2) 色が濃いセル(絶対値が大きい)に注目する、(3) 強い相関がある変数ペアは多重共線性の候補としてマークする、の3点です。

VIF(分散拡大要因)で多重共線性を検出する

多重共線性(マルチコリニアリティ)とは、複数の説明変数が互いに強く相関している状態のことです。多重共線性が存在すると、回帰モデルの係数が不安定になり、特徴量の影響を正しく解釈できなくなります。VIF(Variance Inflation Factor、分散拡大要因)は、各特徴量が他の特徴量によってどの程度説明できるかを数値化した指標で、値が大きいほど多重共線性の疑いが強くなります。

VIF = 1 は他の特徴量と全く相関がないことを意味し、VIF > 5 は注意が必要、VIF > 10 は深刻な多重共線性が疑われます。Qast は各数値特徴量の VIF を自動計算し、閾値を超えた特徴量をハイライトで警告します。

python
import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor

# VIF の計算
def calc_vif(df: pd.DataFrame) -> pd.DataFrame:
    """各特徴量の VIF を計算する。"""
    vif_data = pd.DataFrame()
    vif_data["特徴量"] = df.columns
    vif_data["VIF"] = [
        variance_inflation_factor(df.values, i)
        for i in range(df.shape[1])
    ]
    return vif_data.sort_values("VIF", ascending=False)

# サンプルデータ
np.random.seed(42)
x1 = np.random.normal(0, 1, 200)
x2 = x1 * 0.9 + np.random.normal(0, 0.3, 200)  # x1 と強い相関
x3 = np.random.normal(0, 1, 200)                 # 独立

df = pd.DataFrame({"x1": x1, "x2": x2, "x3": x3})
print(calc_vif(df))
# x1, x2 の VIF は高い値(多重共線性あり)
# x3 の VIF は 1 に近い(独立)
  1. 1

    VIF が高い特徴量を発見したら

    VIF > 10 の特徴量ペアを特定し、ドメイン知識に基づいてどちらかを除外するか、PCA で合成変数を作成します。

  2. 2

    相関マトリクスと VIF の併用

    相関マトリクスはペアワイズの相関を示しますが、VIF は1つの特徴量と「残り全部」の関係を評価します。3変数以上の複合的な多重共線性は VIF でないと検出できません。

  3. 3

    Qast での自動検出

    Qast は相関マトリクスと VIF を自動計算し、多重共線性のリスクがある特徴量ペアを警告として表示します。学習ジョブ作成時に除外候補として参考にできます。

相関係数の解釈の目安

相関係数の「強さ」の解釈は分野によって異なりますが、一般的な目安は以下のとおりです。|r| < 0.2 は「ほぼ無相関」、0.2 ≤ |r| < 0.4 は「弱い相関」、0.4 ≤ |r| < 0.7 は「中程度の相関」、0.7 ≤ |r| は「強い相関」です。ただし、これはあくまでも目安であり、サンプルサイズやドメインによって基準は変わります。たとえば、物理学の実験データでは r = 0.9 でも「弱い」と見なされることがありますし、心理学の調査データでは r = 0.3 でも「意味のある相関」と解釈されます。

相関分析の落とし穴 — 相関と因果は違う

相関分析で最も重要な注意点は「相関があること」と「因果関係があること」は全く別だということです。有名な例として、「アイスクリームの売上」と「水難事故の件数」には強い正の相関がありますが、アイスクリームが水難事故を引き起こしているわけではありません。両方とも「気温」という共通の要因(交絡因子)によって変動しているだけです。

機械学習では、相関関係を特徴量選択の手がかりとして利用しますが、因果推論には別のアプローチ(A/Bテスト、因果推論フレームワークなど)が必要です。相関分析の結果を「AがBの原因である」と解釈しないよう注意しましょう。

  1. 1

    疑似相関(Spurious Correlation)

    第三の変数(交絡因子)が存在することで、本来無関係な2変数に相関が生じる現象です。偏相関分析で交絡因子の影響を除去できます。

  2. 2

    逆因果

    「AがBの原因」と思っていたが、実は「BがAの原因」だったというケースです。時系列データでの因果方向の判断には Granger 因果性検定などが使われます。

Qast の相関分析ダッシュボード

Qast の EDA 機能では、CSV をアップロードするだけで相関分析が自動実行されます。数値変数間には Pearson 相関と Spearman 相関の両方、カテゴリ変数間には Cramér's V、数値とカテゴリの混合ペアには相互情報量が自動的に適用され、統合的な相関マトリクスヒートマップが生成されます。さらに、VIF が閾値を超えた特徴量は警告アイコン付きで表示されるため、多重共線性の問題を即座に把握できます。

ヒートマップのセルをクリックすると、該当する変数ペアの散布図(数値×数値の場合)や箱ひげ図(数値×カテゴリの場合)がポップアップ表示され、相関の「形」を視覚的に確認できます。プログラミング知識がなくても、データの相関構造を直感的に理解できるのが Qast の強みです。

まとめ — 4つの相関指標の使い分け

相関分析は EDA の中核をなす手法です。Pearson は線形関係、Spearman は単調関係、相互情報量は任意の非線形関係、Cramér's V はカテゴリ変数間の関連性を測定します。1つの指標だけに頼るのではなく、データの性質に応じて複数の指標を組み合わせることで、変数間の関係をより正確に把握できます。Qast はこれらの計算をすべて自動化し、統合的なダッシュボードで提供するため、データサイエンスの初学者でも高度な相関分析を手軽に実施できます。

相関分析は特徴量選択の第一歩です。強い相関が見つかったら、次は「二変量分析」で変数ペアの関係をより詳細に深掘りし、「特徴量関連性分析」で冗長な特徴量グループの整理に進みましょう。Qast ではこれらの分析がすべて連携しています。

Qast を導入してみませんか?

導入のご相談やデモのご依頼は、お気軽にお問い合わせください。