Table of Contents
順位相関係数
順位相関係数とは順位に基づく相関係数で, SpearmanやKendallの相関係数が代表的なものとして挙げられます. 順序構造についての相関係数を見たい場面の一例として,
- 統計/機械学習モデル開発プロジェクトにおいてモデルが追う評価指標とプロジェクトKPIで適切に相関しているか?
- モデル精度が改善したらプロジェクトKPIが改善する構造になっているか?
を判定したいケースが考えられます. 順序相関がしているならば少なくとも必要条件を満たす評価指標が設定されており, 満たしていないならばモデルの評価指標をプロジェクトKPIの観点から見直すべきという意思決定となります.
Spearmanの相関係数
問題設定
大きさnの組標本 $(x_1, y_i), i\in{1, 2, \cdots, n}$ が与えられたとします. $x$についての標本順序統計量を
\[x_{(1)} < x_{(2)} < \cdots < x_{(n)}\]と定義し, 標本順位を$R_{xi}$ を定義します. また, 対応する $y$の標本順位を $R_{yi}$とおき, $(R_{xi}, R_{yi})$という標本組にデータを変換します.
\[\bigg(\begin{array}{c} -0.6\\ 0.02 \end{array}\bigg), \bigg(\begin{array}{c} 0.5\\ 0.36 \end{array}\bigg), \bigg(\begin{array}{c} -0.22\\ 0.67 \end{array}\bigg), \bigg(\begin{array}{c} 0.29\\ 1.43 \end{array}\bigg), \bigg(\begin{array}{c} 0.25\\ 1.71 \end{array}\bigg)\]例
と組標本が与えられた場合, 一旦 $x$についてソートし, 順位について返還し次のようなデータに変換します
\[\bigg(\begin{array}{c} 1\\ 1 \end{array}\bigg), \bigg(\begin{array}{c} 2\\ 3 \end{array}\bigg), \bigg(\begin{array}{c} 3\\ 5 \end{array}\bigg), \bigg(\begin{array}{c} 4\\ 4 \end{array}\bigg), \bigg(\begin{array}{c} 5\\ 2 \end{array}\bigg)\]Spearmanの相関係数の定義
Def: Spearmanの相関係数
Spearmanの相関係数, $\hat\rho_s$は以下のように定義されます
\[\begin{align*} \hat\rho_s &= \frac{\frac{1}{n}\sum_{i=1}^nR_{yi}(R_{xi} - \frac{n+1}{2})}{\frac{1}{12}(n^2-1)}\\ &\text{where }\hat\rho_s \in [-1, 1] \end{align*}\]ここで, $(n+1)/2$は$R_{xi}$の標本平均, $(n^2-1)/12$は分散と覚えると理解しやすい.
また, 上述の式を変形させて
\[\hat\rho_s = 1 - \frac{6\sum_{i=1}^n(R_{xi}-R_{yi})^2}{n(n^2-1)}\]と順位差分 $R_{xi}-R_{yi}$の平方で表現することも可能.
REMARKS
上述の定義から順位性飲みに着目しているので, 順位関係を変化させない平方根変換や対数変換といった単調増加変数変換を実施しても Spearman相関係数の値は変化しません.
性質: Outlier Robust
Spearman相関係数は順位に基づく相関係数なので, 単調増加の関係のある変数間についての尺度として用いることに適しています. また, Pearson相関係数と比べOutlier Robustであり, 以下その特徴をPythonで確認します.
Scottish Hill Racesデータの読み込みとPlot
Scottish Hill Runners Associationはhill raceのコース条件(コース名Race
, km換算のclimb
やdistance
)と男女のレコードタイム(timeW
, timeM
)のデータを提供しています. このデータを使って, コース条件とレコードタイムのPearson相関係数とSpearman相関係数を確認してみます.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#%%
# cannot use polars because the separator is not a single-byte chr
# see https://stackoverflow.com/questions/73040753/how-can-i-use-s-as-a-seperator-in-polars
# import polars as pl
import pandas as pd
import seaborn as sns
# display setting
pd.options.display.precision = 3
#データ読み込み
df = pd.read_csv("http://stat4ds.rwth-aachen.de/data/ScotsRaces.dat",
sep="\s+")
sns.pairplot(df)
Pearson相関係数の計算
1
2
3
4
5
6
7
8
9
10
11
12
#%%
# Pearson Correlation
df.corr()
#%%
# Outlier removed Correlation
alpha = 0.025
numeric_col = ['distance', 'climb', 'timeM', 'timeW']
df_fixed = df[(df.loc[:,numeric_col] >= df.loc[:,numeric_col].quantile(alpha)) &
(df.loc[:,numeric_col] <= df.loc[:,numeric_col].quantile(1 - alpha))]
df_fixed.corr()
Peason相関係数 | distance | climb | timeM | timeW |
---|---|---|---|---|
distance | 1.000 | 0.514 | 0.963 | 0.956 |
climb | 0.514 | 1.000 | 0.672 | 0.685 |
timeM | 0.963 | 0.672 | 1.000 | 0.996 |
timeW | 0.956 | 0.685 | 0.996 | 1.000 |
Outlier除去 Peason相関係数 |
distance | climb | timeM | timeW |
---|---|---|---|---|
distance | 1.000 | 0.711 | 0.935 | 0.922 |
climb | 0.711 | 1.000 | 0.810 | 0.804 |
timeM | 0.935 | 0.810 | 1.000 | 0.992 |
timeW | 0.922 | 0.804 | 0.992 | 1.000 |
(timeW
, climb
)は $0.685$と $0.804$ と上下2.5%のOutlierの結果によって大きく変わることがわかります.
Spearman相関係数の計算
1
2
3
4
5
6
#%%
# Spearman
df.corr(method='spearman')
# Outlier removed Spearman
df_fixed.corr(method='spearman')
Spearman相関係数 | distance | climb | timeM | timeW |
---|---|---|---|---|
distance | 1.000 | 0.757 | 0.944 | 0.937 |
climb | 0.757 | 1.000 | 0.857 | 0.850 |
timeM | 0.944 | 0.857 | 1.000 | 0.994 |
timeW | 0.937 | 0.850 | 0.994 | 1.000 |
Outlier除去 Spearman相関係数 |
distance | climb | timeM | timeW |
---|---|---|---|---|
distance | 1.000 | 0.737 | 0.933 | 0.920 |
climb | 0.737 | 1.000 | 0.821 | 0.817 |
timeM | 0.933 | 0.821 | 1.000 | 0.992 |
timeW | 0.920 | 0.817 | 0.992 | 1.000 |
(timeW
, climb
)は $0.850$と $0.817$とoutlierの除去の有無にかかわらず似たような数値を出力しており, Pearson相関係数に比べOutlier Robustであることが確認できます.
References
前処理関係
(注意:GitHub Accountが必要となります)