相関係数は、2 つの変数の関係の強さを 1 つの数で要約する指標である。目的やデータ特性に応じて、線形関係を測る Pearson 相関係数、順位の単調関係を見る Spearman / Kendall 相関係数を使い分ける。

何を測るかと何を測らないか、を最初に押さえておくと運用上の落とし穴を避けられる。相関係数が高い = 良い予測ができる、ではない。相関係数が高い = 因果関係がある、でもない。標準化PCA、特徴量選択、EDA(探索的データ分析)の起点として広く使われるが、解釈にはいくつかの注意点がある。

共分散と相関係数

相関係数の土台となる量が共分散(covariance)である。共分散は 分散 を 2 変数に拡張したものとして定義され、2 変数を同時に観測したときの 同時分布 を要約する量と見ることもできる。

  • 定義: cov(X, Y) = E[(X - mu_x)(Y - mu_y)]
  • mu_xmu_y はそれぞれ XY平均
  • 自己共分散: cov(X, X) = Var(X)(1 変数の分散と一致)

共分散は「2 変数が同じ方向に動くか・逆方向に動くか」を表す量で、正なら同方向、負なら逆方向、0 なら無相関の傾向を示す。ただし共分散には決定的な弱点がある: 単位とスケールに依存するX がメートル、Y がキログラムなら、共分散の単位は「メートル × キログラム」になり、絶対値の大きさを他のペアと比較しても意味が無い。

そこで共分散を両者の標準偏差 で割って正規化したものが相関係数である。

  • Pearson 相関: r = cov(X, Y) / (sigma_x * sigma_y)

正規化により r は -1 から +1 の範囲に収まり、単位やスケールに依存しない無次元量になる。これが「相関係数を共分散の代わりに使う」最大の理由と言える。

Pearson 相関係数の意味

Pearson 相関係数(Pearson correlation, r)は、2 変数の 線形 な関係の強さを表す。

  • r = +1: 完全な正の線形関係(散布図が右上がりの直線)
  • r = -1: 完全な負の線形関係(散布図が右下がりの直線)
  • r = 0: 線形関係が無い(散布図がランダム、または非線形に並んでいる)

r の絶対値の目安として、0.7 以上で強い相関、0.4〜0.7 で中程度、0.4 未満で弱い相関 と慣習的に呼ばれることが多いが、サンプル数や目的によって判断は変わる。サンプル数が大きい(n > 1000)と統計的有意な相関でも実用上は弱いことがあり、逆にサンプルが少ない(n < 30)と高相関でも偶然の可能性がある。


前提・注意

  • 線形関係しか捉えられない(非線形関係は r が小さくても、ゼロでも存在しうる)
  • 外れ値に引っ張られやすい(数件の極端な値で相関の符号すら変わる)
  • 相関は因果関係ではない(第三の要因による疑似相関の可能性)
  • 連続値変数を前提とする(カテゴリ変数の場合は別の指標を使う)

相関係数の落とし穴

相関係数は誤読されやすい指標で、特に次の 3 つは判断軸として頭に入れておきたい。

1. 相関係数 ≠ 予測精度

r = 0.8 の特徴量があったとしても、その単独で目的変数を高精度に予測できるとは限らない。線形回帰での決定係数 R² = r² = 0.64 程度で、分散の 64% は説明できるが残り 36% は別要因。さらに、外れ値が支配的だと「数値上は高相関でも本質的な予測力は無い」現象も起きる。判断軸: 相関は関係の強さで、予測精度はモデルと特徴量全体の選び方で決まる別の話。

2. 相関係数 ≠ 因果関係

「アイスクリームの売上と溺死事故件数には正の相関がある」「靴のサイズと読解力には正の相関がある」のような有名な例がある通り、相関は因果を示さない。共通の第三因子(前者は気温、後者は年齢)が両方を動かしている場合、二変数の相関は高くなるが、片方を増減させても他方は動かない。判断軸: 因果を主張するなら介入実験、操作変数法、DAG、傾向スコアマッチング などの因果推論の枠組みが必要。

3. 相関 0 ≠ 関係が無い

Pearson 相関は線形性しか測らないので、r = 0 でも強い非線形関係があり得る。

  • y = x² のようなパラボラ関係: r ≈ 0 だが完全に決定論的
  • y = sin(x) のような周期関係: r ≈ 0 だが完全に決定論的
  • 円形のクラスタや U 字型の関係も同様

非線形を含めた関係を検出したい場合は、Spearman / Kendall(単調性)、相互情報量(mutual information、非線形を含む一般的な依存性)、距離相関(distance correlation)などを併用する。判断軸: Pearson が 0 でも、散布図を必ず描いて非線形構造の有無を目視する。


利点

  • 解釈が直感的(符号と大きさで関係の方向と強さが分かる)
  • 計算が軽く、相関行列で多変量の関係を一度に俯瞰できる
  • 単位やスケールに依存しない無次元量
  • 線形回帰の と直接対応(R² = r²)するので、線形モデルの説明力の目安にもなる

欠点

  • 非線形関係を見逃しやすい(落とし穴 3)
  • 外れ値の影響が大きい(少数の極端な値で相関が変わる)
  • 線形性以外の依存構造は捉えられない
  • 因果関係を示すことはできない(落とし穴 2)
  • カテゴリ変数や順序尺度には直接使えない(Spearman / Kendall や Cramér’s V などで代替)

Spearman / Kendall の相関

Pearson が「値そのものの線形関係」を見るのに対し、Spearman や Kendall は「順位(ランク)の関係」を見る相関係数。

  • Spearman 相関: 各値を順位に変換して Pearson を計算する。単調関係(一直線ではないが、増える/減るが一貫する関係)に強い。
  • Kendall 相関: データの順序の一致/不一致(順序対)に基づく相関。外れ値に比較的強く、サンプルが小さい場合に安定しやすい。

使い分けの目安は次の通り。

  • 線形関係が前提なら Pearson
  • 単調関係が前提、外れ値が多いなら Spearman
  • 順位の一致を厳密に見たい、サンプルが小さいなら Kendall

Python での実例


Pearson

線形関係の例。正相関/相関なし/負相関の3パターンを並べて比較する。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)
n = 200

x1 = rng.normal(size=n)
y1 = 0.8 * x1 + rng.normal(scale=0.4, size=n)

x2 = rng.normal(size=n)
y2 = rng.normal(size=n)

x3 = rng.normal(size=n)
y3 = -0.8 * x3 + rng.normal(scale=0.4, size=n)

fig, axes = plt.subplots(1, 3, figsize=(9, 3), sharex=True, sharey=True)
axes[0].scatter(x1, y1, s=10, alpha=0.7)
axes[0].set_title("Positive")
axes[1].scatter(x2, y2, s=10, alpha=0.7)
axes[1].set_title("None")
axes[2].scatter(x3, y3, s=10, alpha=0.7)
axes[2].set_title("Negative")
fig.suptitle("Pearson Correlation Examples")
plt.tight_layout()
plt.show()

出力:

correlation_scatter


Spearman / Kendall

単調関係(非線形)の例。Pearson だと弱く見えるが、順位の関係は強いケースを想定している。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)
n = 200
x = rng.normal(size=n)
y = x ** 3 + rng.normal(scale=1.0, size=n)

plt.scatter(x, y, s=10, alpha=0.7)
plt.title("Monotonic (nonlinear) scatter")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()

出力:

correlation_spearman_kendall

Anscombe の 4 つのデータ: 同じ r でも形は全然違う

統計学者 Frank Anscombe が 1973 年に作った有名な例として、平均・分散・相関係数がすべて等しい 4 つのデータセットを並べた「Anscombe の四つ組(Anscombe’s quartet)」がある。

# Anscombe's quartet: r ≈ 0.816 が 4 つとも共通
# I: きれいな線形、II: 完全な曲線、III: 1 点だけ外れる線形、IV: 1 点が全てを決める
plt.savefig("correlation_anscombe.svg", bbox_inches="tight")

同じ相関係数を持つ 4 つの全く異なる散布図

4 つの散布図はすべて r ≈ 0.816、回帰直線(赤い破線)の傾きも同じである。にもかかわらず、

  • I: 本当に線形関係(相関係数を信じてよい)
  • II: 完全な放物線(線形モデルでは表現できない)
  • III: ほぼ完全な線形 + 1 つの外れ値(外れ値を除けば r はもっと大きい)
  • IV: x が 1 点だけ違うところに集中。その 1 点が傾きを決めている

という形をしている。「相関係数 1 つで関係を判断するな、必ず散布図を描け」というのがこの図の教訓で、機械学習で特徴量を選ぶときの相関行列を見る場面でも同じ警句が効く。

相関行列の可視化: 多変量の関係を一望する

特徴量が多くなると、ペアワイズの相関を表で見るより heatmap で見る方が圧倒的に速い。

from sklearn.datasets import load_iris
df = load_iris(as_frame=True).frame.iloc[:, :4]
corr = df.corr()
plt.imshow(corr, cmap="RdBu_r", vmin=-1, vmax=1)
plt.savefig("correlation_matrix_heatmap.svg", bbox_inches="tight")

iris データセットの 4 特徴量の相関行列ヒートマップ

iris の 4 特徴量(萼片・花弁の長さ・幅)の相関行列で、赤が正の相関・青が負の相関・色の濃さが強さを表す。petal length と petal width の相関が 0.96 と極めて高く、これは「事実上同じ情報」と見ることができる。線形モデルや距離ベースのモデルでは 多重共線性 の原因になるため、片方を落とすか PCA で集約する判断材料になる。

実務では seaborn.heatmap を使うのが楽だが、matplotlib.imshow + text の組み合わせでも十分な可視化が作れる。相関行列は EDA の最初の 5 分で必ず描くべき図のひとつと考えられる。


数学での使いどころ

  • 共分散行列の要約として相関行列を使う(多くは Pearson)
  • 変数間の冗長性や多重共線性の確認(線形関係なら Pearson が基本)
  • データの構造理解(単調関係が疑われる場合は Spearman / Kendall が有効)

機械学習での使いどころ

  • 特徴量間の相関が高い場合の特徴選択(線形関係なら Pearson、単調関係なら Spearman / Kendall を見る)
  • PCA や線形モデルの前処理としての確認(相関構造を掴み、標準化や次元削減の必要性を判断する)
  • EDA での仮説づくり(外れ値や歪みが強い場合は順位相関のほうが安定)

適さないケース

  • 曲線的な関係が本質なデータ(例: 二次関数)
  • 外れ値が多いデータ
  • 因果推論を目的とする分析