「2つの変数に関連があるか」を調べるとき、最もよく使われるのはピアソンの積率相関係数である。しかし、データが順位(順序尺度)であったり、外れ値の影響を受けにくい指標が欲しい場合には、順位相関係数が有効である。
代表的な順位相関係数には2つある。1つは1904年にイギリスの心理学者チャールズ・スピアマン(Charles Spearman, 1863–1945)が提案したスピアマンの順位相関係数であり、もう1つは1938年にイギリスの統計学者モーリス・ケンドール(Maurice Kendall, 1907–1983)が提案したケンドールの順位相関係数である。スピアマンは心理学における知能研究の過程でこの指標を考案し、ケンドールはそれとは異なる「一致・不一致」の考え方に基づく新しい指標を導入した。
両者はいずれも -1 から 1 の値をとるが、同じデータに対して一般に異なる値を返す。本記事では両者の定義・計算方法・違いを具体例で解説する。
スピアマンの順位相関係数
定義
2次元データ (x_i, y_i) \; (i = 1, 2, \ldots, n) がともに順位データ(順序尺度)である場合、スピアマンの順位相関係数(Spearman correlation coefficient)r_s は、ピアソンの積率相関係数と同じ計算を順位データに適用したものである。順位であることを利用すると、次の簡潔な式で表せる。
ここで x_i, y_i はそれぞれ第 i 番目のデータの順位であり、d_i = x_i - y_i は順位の差である。
計算例
7人の生徒の英語と数学の成績順位が以下のように得られた。
| 生徒 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 英語 x_i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 数学 y_i | 2 | 1 | 4 | 3 | 5 | 7 | 6 |
| d_i = x_i - y_i | −1 | 1 | −1 | 1 | 0 | −1 | 1 |
| d_i^2 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
r_s \approx 0.893 であり、英語と数学の成績順位には強い正の相関がある。
ケンドールの順位相関係数
定義
ケンドールの順位相関係数(Kendall rank correlation coefficient)r_k は、すべてのペアについて「一致しているか(concordant)」「不一致か(discordant)」を数える方法に基づく。
2組のデータ (x_i, y_i) と (x_j, y_j) \; (i < j) に対して、(x_i - x_j)(y_i - y_j) > 0 となる組の数を P(一致)、(x_i - x_j)(y_i - y_j) < 0 となる組の数を Q(不一致)とする。
つまり、x と y の順位の大小関係が一致しているペアと逆転しているペアの差を、全ペア数で割ったものである。
計算例
先ほどと同じデータでケンドールの順位相関係数を計算する。全ペア数は \dfrac{7 \times 6}{2} = 21 である。
たとえば生徒1と生徒2について、(x_1 - x_2)(y_1 - y_2) = (1 - 2)(2 - 1) = (-1)(1) = -1 < 0 なので不一致(discordant)である。このようにすべての {}_7C_2 = 21 ペアを調べると、一致 P = 18、不一致 Q = 3 となる。
同じデータに対して r_s \approx 0.893、r_k \approx 0.714 と異なる値になる。これは2つの指標が異なる性質を測っているためであり、一般に |r_k| \leq |r_s| となる傾向がある。
スピアマンとケンドールの比較
| スピアマン r_s | ケンドール r_k | |
|---|---|---|
| 発表年 | 1904年 | 1938年 |
| 計算の考え方 | 順位の差の2乗和 | 一致・不一致ペアの数 |
| ピアソン相関との関係 | 順位データに対するピアソン相関そのもの | 独自の定義 |
| 値の傾向 | 一般に |r_k| より大きい | 一般に |r_s| より小さい |
| 完全一致時 | r_s = 1 | r_k = 1 |
| 完全逆順時 | r_s = -1 | r_k = -1 |
どちらを使うべきかについて決定的な基準はないが、ケンドールの r_k は確率的な解釈(ランダムに選んだペアが一致する確率と不一致の確率の差)が明快であるという利点がある。一方、スピアマンの r_s はピアソン相関の自然な拡張であり、計算が容易で直感的に理解しやすい。
実データから順位を付ける場合
データが元から順位でない場合は、まず各変数を順位に変換してから計算する。タイ(同じ値)がある場合は、ウィルコクソンの順位和検定と同様に平均順位を割り当てる。
7人の身長(cm)と体重(kg)のデータが以下のように得られた。
| 身長 | 165 | 170 | 158 | 175 | 162 | 180 | 168 |
|---|---|---|---|---|---|---|---|
| 体重 | 62 | 70 | 55 | 68 | 58 | 80 | 72 |
まず順位に変換する。
| 身長順位 x_i | 3 | 5 | 1 | 6 | 2 | 7 | 4 |
|---|---|---|---|---|---|---|---|
| 体重順位 y_i | 3 | 5 | 1 | 4 | 2 | 7 | 6 |
| d_i^2 | 0 | 0 | 0 | 4 | 0 | 0 | 4 |
身長と体重には強い正の順位相関がある。
練習問題
| 作品 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 審査員A x_i | 1 | 2 | 3 | 4 | 5 | 6 |
| 審査員B y_i | 3 | 1 | 2 | 6 | 4 | 5 |
スピアマン:
| d_i | −2 | 1 | 1 | −2 | 1 | 1 |
|---|---|---|---|---|---|---|
| d_i^2 | 4 | 1 | 1 | 4 | 1 | 1 |
\sum d_i^2 = 12
ケンドール:
全ペア数 \dfrac{6 \times 5}{2} = 15。すべてのペアを調べると、一致 P = 11、不一致 Q = 4 である。
まとめ
| 項目 | スピアマン r_s | ケンドール r_k |
|---|---|---|
| 定義 | 1 - \dfrac{6 \sum d_i^2}{n(n^2 - 1)} | \dfrac{P - Q}{n(n-1)/2} |
| 値の範囲 | -1 \leq r_s \leq 1 | -1 \leq r_k \leq 1 |
| 用途 | 順位データの相関、外れ値に頑健な相関分析 | |
| パラメトリック版 | ピアソンの積率相関係数 | |
Python実装
import numpy as np
from scipy import stats
# === 順位データの場合 ===
x = np.array([1, 2, 3, 4, 5, 6, 7]) # 英語の順位
y = np.array([2, 1, 4, 3, 5, 7, 6]) # 数学の順位
print("=== 順位相関係数 ===")
print(f"x(英語): {x}")
print(f"y(数学): {y}")
print()
# スピアマン
rs, p_rs = stats.spearmanr(x, y)
print(f"スピアマン: r_s = {rs:.4f} (P値 = {p_rs:.4f})")
# ケンドール
rk, p_rk = stats.kendalltau(x, y)
print(f"ケンドール: r_k = {rk:.4f} (P値 = {p_rk:.4f})")
print()
# === 実データから順位を自動計算 ===
print("=== 実データからの計算 ===")
height = np.array([165, 170, 158, 175, 162, 180, 168])
weight = np.array([62, 70, 55, 68, 58, 80, 72])
print(f"身長: {height}")
print(f"体重: {weight}")
# spearmanr/kendalltau は自動的に順位を計算する
rs2, p_rs2 = stats.spearmanr(height, weight)
rk2, p_rk2 = stats.kendalltau(height, weight)
print(f"スピアマン: r_s = {rs2:.4f} (P値 = {p_rs2:.4f})")
print(f"ケンドール: r_k = {rk2:.4f} (P値 = {p_rk2:.4f})")
print()
# ピアソン相関との比較
rp, p_rp = stats.pearsonr(height, weight)
print(f"ピアソン: r = {rp:.4f} (P値 = {p_rp:.4f})")