ヘロログ
統計学

スピアマンとケンドールの順位相関係数

「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 は、ピアソンの積率相関係数と同じ計算を順位データに適用したものである。順位であることを利用すると、次の簡潔な式で表せる。

r_s = 1 - \dfrac{6 \displaystyle\sum_{i=1}^{n} (x_i - y_i)^2}{n(n^2 - 1)}

ここで 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 = 1 - \dfrac{6 \times 6}{7 \times (49 - 1)} = 1 - \dfrac{36}{336} = 1 - \dfrac{3}{28} \approx 0.893

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(不一致)とする。

r_k = \dfrac{P - Q}{\dfrac{n(n-1)}{2}}

つまり、xy の順位の大小関係が一致しているペアと逆転しているペアの差を、全ペア数で割ったものである。

計算例

先ほどと同じデータでケンドールの順位相関係数を計算する。全ペア数は \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_k = \dfrac{18 - 3}{21} = \dfrac{15}{21} = \dfrac{5}{7} \approx 0.714

同じデータに対して r_s \approx 0.893r_k \approx 0.714 と異なる値になる。これは2つの指標が異なる性質を測っているためであり、一般に |r_k| \leq |r_s| となる傾向がある。

スピアマンとケンドールの比較

2つの順位相関係数の違い
スピアマン 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
r_s = 1 - \dfrac{6 \times 8}{7 \times 48} = 1 - \dfrac{48}{336} = 1 - \dfrac{1}{7} \approx 0.857

身長と体重には強い正の順位相関がある。

練習問題

問1. 6人の審査員A, Bが、6つの作品に対して以下の順位を付けた。スピアマンの順位相関係数とケンドールの順位相関係数をそれぞれ求めよ。
作品 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

r_s = 1 - \dfrac{6 \times 12}{6 \times 35} = 1 - \dfrac{72}{210} = 1 - \dfrac{12}{35} \approx 0.657

ケンドール:

全ペア数 \dfrac{6 \times 5}{2} = 15。すべてのペアを調べると、一致 P = 11、不一致 Q = 4 である。

r_k = \dfrac{11 - 4}{15} = \dfrac{7}{15} \approx 0.467

まとめ

項目 スピアマン 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実装

rank_correlation.py
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})")
=== 順位相関係数 === x(英語): [1 2 3 4 5 6 7] y(数学): [2 1 4 3 5 7 6] スピアマン: r_s = 0.8929 (P値 = 0.0068) ケンドール: r_k = 0.7143 (P値 = 0.0302) === 実データからの計算 === 身長: [165 170 158 175 162 180 168] 体重: [62 70 55 68 58 80 72] スピアマン: r_s = 0.8571 (P値 = 0.0137) ケンドール: r_k = 0.7143 (P値 = 0.0302) ピアソン: r = 0.9145 (P値 = 0.0039)