0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

相関係数 (correlation coefficient)

・共分散を標準化したのが相関係数
・共分散のとりうる値(最小値~最大値)を計算し、-1~1の範囲にすることで、2変数間の相関の強さを比較することができる。

では共分散の最小値と最大値をどう考えるのか見ていきましょう。

共分散が最大最小となるときは、下記のような場合だというのはなんとなくイメージできるかと思います。
相関関係が最大最小.png
相関関係が最大ということは、片方の値が決まれば必然的にもう片方の値が決まるということです。このときデータは一直線で結ぶことができ、以下のようになったとします。これは正の相関があるといえます。このとき、共分散は最大になります。

直線.png

仮に上図の直線が𝑦=𝑎𝑥+𝑏とすると、共分散の式はどのようになるか考えてみましょう。

\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()

結果
スクリーンショット 2024-05-11 21.26.40.png

相関行列を描画する
・ sns.heatmap(df.corr())

sns.heatmap(df.corr())

結果
スクリーンショット 2024-05-11 21.29.29.png

実行すると、df.corr()を色で表現した形で可視化することができます。
また、下記を実行すると、数値も表に表示することができます。

sns.heatmap(df.corr(), cmap='coolwarm', annot=True)

スクリーンショット 2024-05-11 21.33.33.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?