【分析】異なる変数尺度同士の関係を数値化する

# 本記事の目的
本記事では色々な尺度間において２変数間の関係を表す際にどのような手法を用いることが可能なのか理解していただければと思います。
特に順序尺度や名義尺度の相関はあまりデータサイエンス初学者向け書籍で触れられてないと思うので計算方法まで記載しました。

# 変数尺度とは？
データを取り扱っているとよく量的データとか質的データという言葉を耳にします。
これはデータの尺度水準のことであり、さらに以下の４区分に整理されます。
|量的 or 質的|尺度|意味|例|
|:----|:----:|:----|:----|
|質的|名義尺度|分類するための名称であり、大小関係が存在しない|性別、血液型、地域名など|
|質的|順序尺度|前後の差に意味はないが大小関係が存在する|1位・2位・3位、1番・2番・3番、体調が良い・体調は普通・体調が悪いなど|
|量的|間隔尺度|0という値が相対的な意味しか持たない<br>（気温0度は「気温が存在しない」ことを意味しない）|気温、テストの点数など|
|量的|比率尺度|0という値が絶対的な意味を持つ<br>（質量0gは「質量が存在しない」ことを意味している）|質量、身長、体重、距離など|

# 尺度別の相関関係
以下に可視化する際の例と相関関係を数値化する際の指標を記載する。
||名義尺度|順序尺度|間隔尺度|比率尺度|
|:----:|:----:|:----:|:----:|:----:|
|名義尺度|クラメールの連関係数||||
|順序尺度|コクラン・アーミテージ検定※|スピアマンの順位相関係数|||
|間隔尺度|相関比|スピアマンの順位相関係数|ピアソンの積率相関係数||
|比率尺度|相関比|スピアマンの順位相関係数|ピアソンの積率相関係数|ピアソンの積率相関係数|

※数値化ではなく、順序尺度と名義尺度に関連があるか検定を行う

# サンプルデータ
本記事では以下のサンプルデータを疑似的に作成し使用していきます。
とある高校に２クラスしかない学年があり、生徒のパーソナルなデータと体育祭の徒競走順位、アンケートで取得した学業満足度、進学有無を記載しました。
|クラス|性別|身長(m)|体重(kg)|徒競走順位|学業の満足度※|進学有無|
|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
|Aクラス|男|1.65|50.52|3|3|Yes|
|Aクラス|男|1.54|49.87|2|2|Yes|
|Bクラス|女|1.75|60.04|6|1|Yes|
|Bクラス|女|1.80|62.23|7|3|Yes|
|Aクラス|女|1.77|78.02|8|1|No|
|Aクラス|男|1.59|51.98|1|1|No|
|Bクラス|女|1.81|61.19|10|3|Yes|
|Bクラス|女|1.79|60.00|4|2|No|
|Aクラス|男|1.57|52.21|5|1|No|
|Bクラス|男|1.59|58.09|9|3|Yes|

※学業の満足度　1：満足ではない　2：普通　3：満足である

## ピアソンの積率相関係数
量的データ同士の相関はお馴染みのピアソンの積率相関係数で相関関係を数値化します。
※相関係数の強さは執筆者によって異なる場合があるので、あまり言及しておりません。
```
# 身長と体重のピアソンの積率相関係数
from scipy.stats import pearsonr
corr , pvalue = pearsonr(df['身長(m)'],df['体重(kg)'])
print('ピアソンの積率相関係数:{0} p値:{1}'.format(round(corr,3),round(pvalue,3)))

ピアソンの積率相関係数:0.69 p値:0.027
```

## スピアマンの順位相関係数/ケンドールの順位相関係数
質的データ（順序尺度）と質的データ（順序尺度）、質的データ（順序尺度）と量的データはスピアマン又はケンドールの順位相関係数で相関関係を数値化します。
※相関係数の強さは執筆者によって異なる場合があるので、あまり言及しておりません。
```
# 身長と徒競走順位のスピアマンの順位相関係数
corr , pvalue = spearmanr(df['身長(m)'],df['徒競走順位'])
print('スピアマンの順位相関係数:{0} p値:{1}'.format(round(corr,3),round(pvalue,3)))

スピアマンの順位相関係数:0.565 p値:0.089
```

## 相関比
質的データの名義尺度と量的データの相関は相関比を算出し、相関関係を数値化します。
※相関比の強さは執筆者によって異なる場合があるので、あまり言及しておりません。

相関比の算出や解釈は以下のサイト記載の内容がわかりやすいです。
https://toukeigaku-jouhou.info/2018/08/17/correlation-ratio/
https://istat.co.jp/sk_commentary/correlation_ratio

#### 相関比の算出
相関比はピアソンやスピアマンに比べ、データサイエンス初級者向けの参考書では記載されていないケースが多いように感じますが、算出式はシンプルなので記載しました。
相関比 = 級間変動 / 全変動
級間変動 = 全変動 - 級内変動
全変動　・・・名義尺度の区別なく算出した量的データの偏差平方和のこと
級内変動・・・名義尺度ごとに算出した量的データの偏差平方和の合計値のこと

```
# 性別と身長の相関比
x = df['性別']
y = df['身長(m)']

# 全変動を計算
all_var = ((y - y.mean()) ** 2).sum()

# 級内変動を計算
intra_class_var = sum([((y[x == i] - y[ x== i].mean()) ** 2).sum() for i in np.unique(x)])

# 級間変動を計算
inter_class_var = all_var - intra_class_var

# 相関比を算出
corr = inter_class_var / all_var
print('相関比:{}'.format(round(corr,3)))

相関比:0.916
```
相関比の強さですが0.5以上あると強い相関があると判断できそうなので、性別と身長には強い相関があると言えそうです。

## クラメールの連関係数
質的データの名義尺度と名義尺度の相関はクラメールの連関係数を算出し、相関関係を数値化します。
※係数の強さは執筆者によって異なる場合があるので、あまり言及しておりません。

#### クラメールの連関係数の算出
相関比と同様にデータサイエンス初級者向けの参考書では記載されていないケースが多いように感じますが、算出式はシンプルなので記載しました。

手順１：クロス集計表を作成し観測度数を計算
手順２：期待度数を計算
手順３：((観測度数ー期待度数)²)/期待度数　を計算し、その総和（検定統計量Χ²）を求める
```math
 \chi^2= \frac{(観測度数-期待度数)^2}{期待度数}
```
手順４：手順１～３の結果からクラメールの連関係数Vを計算
```math
 V= \sqrt{\frac{\chi^2}{n(k-1)}}\\
\chi^2：手順３で計算した検定統計量\\
n：サンプルサイズ\\
k：クロス集計表の行数と列数のうち小さい方の値
```

データサンプルを使って順に計算していきます。

##### 手順１：クロス集計表を作成し観測度数を計算
||Aクラス|Bクラス|合計|
|:----:|:----:|:----:|:----:|
|女|1|4|5|
|男|4|1|5|
|合計|5|5|10|

##### 手順２：期待度数を計算
||Aクラス|Bクラス|合計|
|:----:|:----:|:----:|:----:|
|女|2.5|2.5|5|
|男|2.5|2.5|5|
|合計|5|5|10|

##### 手順３：((観測度数ー期待度数)²)/期待度数　を計算
||Aクラス|Bクラス|
|:----:|:----:|:----:|
|女|0.9|0.9|
|男|0.9|0.9|

```math
\begin{align}
 \chi^2&= 0.9 + 0.9 + 0.9 + 0.9\\
&=3.6
\end{align}
```

##### 手順４：手順１～３の結果からクラメールの連関係数を計算
```math
\begin{align}
 V&= \sqrt{\frac{3.6}{10}}\\
&=0.6
\end{align}
```
クラメールの連関係数の強さですが0.5以上あると強い関連があると判断できそうなので、クラスと性別には強い関連があると言えそうです。

##### 補足：要因（クラスと性別）が独立か検定を行う
帰無仮説：クラスと性別に関連はなく独立したものである
対立仮説：クラスと性別に関連がある

手順３の結果より
```math
\chi^2=3.6
```
自由度(行-1)(列-1)のカイ二乗分布に従うため、自由度は(2-1)(2-1)=1です。
有意水準5%で検定するとして、カイ二乗分布表から自由度1の上側5%点におけるカイ二乗値は3.84であるため、棄却域にないことから帰無仮説を棄却できないことになります。

## コクラン・アーミテージ検定
質的データの名義尺度と順序尺度の相関については算出方法の記載をあまり見つけられませんでしたが、順序データの順序傾向に伴う2値データとの関連があるかどうか検定を行う方法を見つけたので記載します。学業満足度が高いと進学率が増加する傾向にあるか見るため、回帰直線の傾きが0であるか、残差が0であるかを検定します。

帰無仮説：傾きが0である
対立仮説：傾きが0でない
※上記は傾きの検定結果

以下のリンク先を参考
https://bellcurve.jp/statistics/course/26872.html
https://cochineal19.hatenablog.com/entry/2020/12/13/003731

#### コクラン・アーミテージ検定実施手順

手順１：p,w,Sxx,Syy,Sxyの計算
```math
\begin{align}
 p&= \frac{対象の度数}{全体の度数}\\
 \omega&= \frac{1}{p(1-p)}\\
 \bar{x}&= \frac{順序スコアの合計値}{全体の度数}\\
 Sxx&= \sum_{i=1}^{k}n_i\omega(x_i-\bar{x})^2\\
 Syy&= \sum_{i=1}^{k}n_i\omega(p_i-p)^2\\
 Sxy&= \sum_{i=1}^{k}n_i\omega(x_i-\bar{x})(p_i-p)
\end{align}
```

手順２：χ²slope,χ²residual,χ²totalの計算
```math
\begin{align}
 \chi^2_{slope}&= \frac{Sxy^2}{Sxx}\\
\chi^2_{total}&= Syy\\
\chi^2_{residual}&= \chi^2_{total}-\chi^2_{slope}
\end{align}
```

手順３：カイ二乗検定を実施

データサンプルを使って順に計算していきます。

##### クロス集計表の作成
観測度数
||進学しない|進学する|合計|
|:----:|:----:|:----:|:----:|
|1:満足ではない|3|1|4|
|2:普通|1|1|2|
|3:満足である|0|4|4|
|合計|4|6|10|

割合
||進学しない|進学する|合計|
|:----:|:----:|:----:|:----:|
|1:満足ではない|0.75|0.25|1.00|
|2:普通|0.50|0.50|1.00|
|3:満足である|0|1.00|1.00|

##### 手順１：p,w,Sxx,Syy,Sxyの計算
```math
\begin{align}
 p&= \frac{6}{10}\\
&=0.6\\

\omega&= \frac{1}{0.6(1-0.6)}\\
&=4.17\\

 \bar{x}&= \frac{1×4+2×2+3×4}{10}\\
&=2\\

Sxx&= 4×4.17×(1-2)^2 + 2×4.17×(2-2)^2 + 3×4.17×(3-2)^2\\
&=33.36\\

Syy&= 4×4.17×(0.25-0.6)^2 + 2×4.17×(0.5-0.6)^2 + 3×4.17×(1-0.6)^2\\
&=4.80\\

Sxy&= 4×4.17×(1-2)(0.25-0.6) + 2×4.17×(2-2)(0.5-0.6) + 3×4.17×(3-2)(1-0.6)\\
&=12.51
\end{align}
```

##### 手順２：χ²slope,χ²residual,χ²totalの計算
```math
\begin{align}
 \chi^2_{slope}&= \frac{12.51}{33.36}=4.69\\
\chi^2_{total}&= 4.80\\
\chi^2_{residual}&= 4.80-4.69=0.11
\end{align}
```

##### 手順３：カイ二乗検定を実施
算出したカイ二乗値の自由度は以下より計算する。kは順序尺度の最大値。
χ²slope：自由度1
χ²residual：自由度k-2

有意水準5%で検定した結果を以下に記載します。
||カイ二乗値|自由度|検定結果|
|:----:|:----:|:----:|:----:|
|χ²slope|4.69|1|帰無仮説を棄却する（有意である）|
|χ²residual|0.11|1|帰無仮説を棄却しない（有意でない）|

傾き（χ²slope）が有意であることから、学業満足度と進学率に傾向がありそうです。
また、残差（χ²residual）が非有意であることも回帰直線からのずれが小さく、直線関係で表せてそうです。