相関係数 (correlation coefficient)
・共分散を標準化したのが相関係数
・共分散のとりうる値(最小値~最大値)を計算し、-1~1の範囲にすることで、2変数間の相関の強さを比較することができる。
では共分散の最小値と最大値をどう考えるのか見ていきましょう。
共分散が最大最小となるときは、下記のような場合だというのはなんとなくイメージできるかと思います。
相関関係が最大ということは、片方の値が決まれば必然的にもう片方の値が決まるということです。このときデータは一直線で結ぶことができ、以下のようになったとします。これは正の相関があるといえます。このとき、共分散は最大になります。
仮に上図の直線が𝑦=𝑎𝑥+𝑏とすると、共分散の式はどのようになるか考えてみましょう。
\begin{align}
y_i & = ax_i + b \\
\bar{y} & = a\bar{x} + b
\end{align}
として、共分散に代入して計算する
\begin{equation}
\begin{split}
s_{xy} & = \frac{1}{n}\sum^n_{i=1}(x_i-\bar{x})(y_i-\bar{y}) \\
& = \frac{1}{n}\sum^n_{i=1}(x_i-\bar{x})(ax_i+b-(a\bar{x}+b)) \\
& = \frac{a}{n}\sum^n_{i=1}(x_i-\bar{x})^2 \\
& = as^2_x
\end{split}
\end{equation}
$y=ax+b$のとき、標準偏差$s_y$は$as_x$となるので(線形変換)、共分散の最大値は
as^2_x=\frac{s_y}{s_x}s^2_x = s_xs_y
となり、正の相関のとき、$s_{xy}=s_x𝑠_𝑦$となることがわかります。
これと同様に負の相関のとき、仮に直線の式をy=-ax+bとするとaが負になることから
s_{xy} = -s_xs_y
となることがわかります。
つまり、共分散$s_{xy}$は$−s_xs_y$から$s_xs_y$の値を取るということです。
-s_xs_y \leq s_{xy} \leq s_xs_y
このままだと値の尺度によって共分散のとりうる値がまちまちなので、共分散同士で値を比較するのは難しいです。
そこで、それぞれの辺に$\frac{1}{s_xs_y}$を掛けて取りうる値を-1〜1にします。
-1\leq \frac{s_{xy}}{s_xs_y} \leq 1
この$\frac{s_{xy}}{s_xs_y}$が相関係数 (correlation coefficient)と呼ばれる指標です。
相関係数は-1から1までの値をとり、完全な正の相関のときに1、 完全な負の相関のときに-1となり、無相関のときに0となります。
相関行列(correlation matrix)
・複数の変数間の相関係数を行列にしたもの
・変数が多くなると行列で捉えた方が便利(拡張性がある)
・対角要素は1になる
共分散行列
S=
\begin{pmatrix}
s_{11} & s_{12} & \dots & s_{1n} \\
s_{21} & s_{22} & \dots & s_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
s_{n1} & s_{n2} & \dots & s_{nn}
\end{pmatrix}
相関行列
R=
\begin{pmatrix}
1 & r_{12} & \dots & r_{1n} \\
r_{21} & 1 \dots & r_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
r_{n1} & r_{n2} & \dots & 1
\end{pmatrix}
Pythonで実践
相関行列を求める
・ np.corrcoef(xarray, yarray)
・ np.corrcoef(array)
・ df.corr()
import numpy as np
import seaborn as sns
# データ準備
df = sns.load_dataset('tips')
df['tip_rate'] = df['tip'] / df['total_bill']
np.corrcoef(df['total_bill'], df['tip'])
結果
array([[1. , 0.67573411],
[0.67573411, 1. ]])
array = np.stack([df['total_bill'], df['tip'], df['size']], axis=0)
np.corrcoef(array)
結果
array([[1. , 0.67573411, 0.59831513],
[0.67573411, 1. , 0.48929878],
[0.59831513, 0.48929878, 1. ]])
df.corr()
相関行列を描画する
・ sns.heatmap(df.corr())
sns.heatmap(df.corr())
実行すると、df.corr()を色で表現した形で可視化することができます。
また、下記を実行すると、数値も表に表示することができます。
sns.heatmap(df.corr(), cmap='coolwarm', annot=True)