名義尺度の相関係数#
クラメールのV(Cramer’s V) あるいは クラメールの連関係数(Cramer’s coefficient of association) と呼ばれる指標
\[
V=\sqrt{\frac{\chi^2}{n \times \min (r-1, c-1)}}
\]
はクロス集計表における行と列の関連性の強さ(独立性の弱さ)を示す指標。 \(0 \leq V \leq 1\)の値をとり、\(1\)に近いほど関連が強い。
import numpy as np
from scipy.stats import chi2_contingency
# クロス集計表(例:性別と購買の関係)
# 行:性別(男性, 女性)、列:購買した, 購買してない
data = np.array([
[30, 10], # 男性
[20, 40] # 女性
])
chi2, p, dof, expected = chi2_contingency(data)
print(f"""
カイ二乗統計量 (χ²): {chi2:.3f}
p-value: {p:.3f}
自由度: {dof}
期待度数:
{expected}
""")
カイ二乗統計量 (χ²): 15.042
p-value: 0.000
自由度: 1
期待度数:
[[20. 20.]
[30. 30.]]
result = chi2_contingency(data)
chi2 = result.statistic
n = data.sum()
min_dim = min(data.shape) - 1 # k - 1
cramers_v = (chi2 / (n * min_dim)) ** 0.5
print(f"クラメールのV: {cramers_v:.3f}")
クラメールのV: 0.388
比較#
連続変数を閾値で切って離散化したケース(Polychoric相関係数が想定するデータ生成過程)だとどうか。
データは標準正規分布から得られたとする
離散化してクロス表にするとこのような感じ。(y軸が散布図とは逆向きな点に注意)
| x | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| y | |||||
| 0 | 3 | 4 | 3 | 3 | 0 |
| 1 | 11 | 29 | 26 | 6 | 3 |
| 2 | 5 | 22 | 47 | 41 | 7 |
| 3 | 0 | 9 | 23 | 34 | 9 |
| 4 | 0 | 0 | 3 | 4 | 8 |
上の例だとこのような結果になる
Polychoric: 0.506
Cramer's V: 0.991
Pearson: 0.460
Spearman: 0.455
Kendall: 0.394
いろいろなカテゴリ数で比較
Cramer’s Vはこういった状況だとカテゴリ数に依存してバイアスが入る様子