- ホーム
- コラム
- YDC Labコラム
- データ解析ならPythonが最高!第4回

データ解析ならPythonが最高!第4回
Lab研究員 北山
相関(共分散、相関係数)
株価の推移など、経時変化を見るためにトレンドグラフがよく使われます。
次のグラフは銘柄A, B, Cの株価の毎月の終値をトレンドグラフにしたものです。
A と値動きが似ているのは B と C のどちらでしょうか。
グラフを見ると、AとB よりも AとC の値動きが似ていることがわかります。
このとき、相関係数と呼ばれる指標を求めると、次のようになりました。
AとBの相関係数: 0.00
AとCの相関係数: 0.86
よく似た値動きをしているAとCは 相関係数が大きい 、つまり相関が強い、ということがわかります。
散布図にすると相関がよくわかります。
相関係数が大きいAとCは、左下から右上に向かう帯状に分布していることがわかります。
このように、一方が大きくなると、それに伴い他方も大きくなるような関係を相関といいます。
一方が大きくなると他方も大きく、一方が小さくなると他方も小さくなるような関係を正の相関といい、
一方が大きくなると他方は小さく、一方が小さくなると他方は大きくなるような関係を負の相関といいます。
相関の強さ、弱さを表す指標が相関係数です。
相関係数は -1 から 1の範囲をとり、プラス値は正の相関、マイナス値は負の相関です。
相関係数の絶対値が大きいほど相関が強いことを意味します。
共分散
相関係数の前に、2種類のデータの関係を示す指標に「共分散」と呼ばれるものがあります。
右上と左下の象限にデータが多く集まっていると共分散はプラス方向に、左上と右下の領域にデータが多く集まっていると共分散はマイナス方向になります。データが全体に散らばっていると、プラスとマイナスが打ち消しあって、共分散はゼロに近づきます。
相関係数
共分散は標本値のスケールの影響で値の大小が変動するため、共分散を見ただけでは相関が強いのか弱いのか判断できません。
そこで値の範囲が -1 ~ 1 になるように次式で共分散を規格化したものが相関係数です。
Pythonで共分散と相関係数
Pythonで次の身長と体重の共分散と相関係数を求めます。
(身長と体重の共分散)
import numpy as np
# 身長
x = np.array([[170.], [151.], [168.]])
# 体重
y = np.array([[80.], [50.], [65.]])
# 標本数
n = x.shape[0]
# 平均
xbar = np.mean(x, axis=0)
ybar = np.mean(y, axis=0)
# 偏差
a = x - xbar
b = y - ybar
# 偏差積和
ab = a.T.dot(b)
# 偏差平方和
aa = a.T.dot(a)
bb = b.T.dot(b)
# 共分散
Sxy = ab / n
# 相関係数
r_xy = ab /( np.sqrt(aa) * np.sqrt(bb) )
print('偏差 x')
print(a)
print('偏差 y')
print(b)
print('偏差積和 xy')
print(ab)
print('偏差平方和 xx')
print(aa)
print('偏差平方和 yy')
print(bb)
print('共分散')
print(Sxy)
print('相関係数')
print(r_xy)
(実行結果)
偏差 x
[[ 7.]
[-12.]
[ 5.]]
偏差 y
[[ 15.]
[-15.]
[ 0.]]
偏差積和 xy
[[ 285.]]
偏差平方和 xx
[[ 218.]]
偏差平方和 yy
[[ 450.]]
共分散
[[ 95.]]
相関係数
[[ 0.90993497]]
標準得点の共分散
あらかじめ標本を標準化しておくと、その共分散は相関係数に一致します。
標準得点から相関係数(つまり標準得点の共分散)を求めます。
(前のコードの続き)
from scipy import stats
# 標準得点
zx = stats.zscore(x, axis=0, ddof=0)
zy = stats.zscore(y, axis=0, ddof=0)
# 相関係数(=標準得点の共分散)
r_xy = zx.T.dot(zy) / n
print('相関係数')
print(r_xy)
(実行結果)
相関係数
[[ 0.90993497]]
(補足)標準得点の平均はゼロなので、標準得点の偏差は標準得点と同じです。
今回はここまで。