はじめに
相関係数とは
2つの確率変数の間にある線形な関係の強弱を測る指標である。相関係数は無次元量で、−1以上1以下の実数に値をとる。相関係数が正のとき確率変数には正の相関が、負のとき確率変数には負の相関があるという。また相関係数が0のとき確率変数は無相関であるという。
(wikipediaより)
次の表のように項目1~4に対し、要素1~4のデータが得られたときの要素間の相関係数を求める。
| 要素1 | 要素2 | 要素3 | 要素4 | |
|---|---|---|---|---|
| 項目1 | 12 | 28 | 16 | 40 |
| 項目2 | 38 | 35 | 3 | 73 |
| 項目3 | 28 | 55 | 27 | 83 |
| 項目4 | 76 | 93 | 17 | 169 |
結果
| 要素1 | 要素2 | 要素3 | 要素4 | |
|---|---|---|---|---|
| 要素1 | 1.00 | |||
| 要素2 | 0.69 | 1.00 | ||
| 要素3 | 0.08 | 0.46 | 1.00 | |
| 要素4 | 0.77 | 0.78 | 0.30 | 1.00 |
例えば、要素1は要素2と要素4に対して正の相関があると言える。また、要素1と要素3は無相関といえる。
計算方法
要素1と要素2の相関係数は次の計算式より得られる。これを上の表が埋まるように計算を繰り返す。
相関係数 = 共分散 ÷ (要素1の標準偏差 × 要素2の標準偏差)
Pythonによる実装
1.まず、データをnumpy配列として登録する。
2.次に関数を設定する。3つの関数のうち1つ目は平均、中央値、分散、標準偏差を求めるもので、statisticsのライブラリを使用すると、平均、中央値、分散、標準偏差を簡単に算出することができる。※今回は蛇足。2つ目は共分散を求めるもの、3つ目は相関係数を求めるもの。
3.3つ目の関数に要素同士の組み合わせを代入して対応した相関係数を算出する。
from statistics import mean, median, variance, stdev
import numpy as np
a = np.array([12,38,28,50,76])
b = np.array([28,35,55,87,93])
c = np.array([16,3,27,37,17])
d = np.array([40,73,83,137,169])
def ans(n):
global median,variance,stdev
m = mean(n)
median = median(n)
variance = variance(n)
stdev = stdev(n)
print('平均:{0:.2f}'.format(m))
print('中央値:{0:.2f}'.format(median))
print('分散:{0:.2f}'.format(variance))
print('標準偏差:{0:.2f}'.format(stdev))
return
def covar(n,m):
m1 = mean(n)
m2 = mean(m)
n1 = n - m1
n2 = m - m2
n3 = n1 * n2
n4 = mean(n3)
print('共分散:{0:.2f}'.format(n4))
return n4
def cor(n,m):
i = covar(n,m)
j = stdev(n)
k = stdev(m)
cor = i / (j * k)
print('相関係数:{0:.2f}'.format(cor))
return
cor(a,b)
cor(a,c)
cor(a,d)
cor(b,c)
cor(b,d)
cor(c,d)
出力
共分散:493.00
相関係数:0.69
共分散:24.00
相関係数:0.08
共分散:958.00
相関係数:0.77
共分散:175.00
相関係数:0.46
共分散:1191.00
相関係数:0.78
共分散:200.00
相関係数:0.30
参考文献
- Qiita:Pythonで平均、中央値、最頻値、分散、標準偏差を計算する
- 柴田淳著『みんなのPython 第4版』(2016)
- 松本 健太郎著『データサイエンス「超」入門』(2018)
訂正
ans関数のglobal文とretun文を削除。
print文にf-stringを適用。
from statistics import mean, median, variance, stdev
import numpy as np
a = np.array([12,38,28,50,76])
b = np.array([28,35,55,87,93])
c = np.array([16,3,27,37,17])
d = np.array([40,73,83,137,169])
def ans(n): <--
m = mean(n)
median = median(n)
variance = variance(n)
stdev = stdev(n)
print(f'平均:{m:.2f}') <--
print(f'中央値:{median:.2f}') <--
print(f'分散:{variance:.2f}') <--
<--
def covar(n,m):
m1 = mean(n)
m2 = mean(m)
n1 = n - m1
n2 = m - m2
n3 = n1 * n2
n4 = mean(n3)
print(f'共分散:{n4:.2f}') <--
return n4
def cor(n,m):
i = covar(n,m)
j = stdev(n)
k = stdev(m)
cor = i / (j * k)
print(f'相関係数:{cor:.2f}') <--
return