共分散
共分散は、2つの情報を比較する際に用いられる。例えば、算数の点数と英語の点数の2組のデータの関係を数値として表し、数学の点数が高いと英語の点数が高いのか、英語の点数が低いと数学の点数は低いのか、それとも数学の点数と英語の点数に関係はないのか、などを分析できる。
標本x、標本yを共分散で考えると下記のように表すことができます。
標本x | 標本y | 共分散 |
xが大きい | yが大きい | + |
xが大きい | yが小さい | – |
xが小さい | yが大きい | – |
xが小さい | yが小さい | + |
共分散では\(\displaystyle (x_i – \bar{x})(y_i – \bar{y}) \)のように、\(\displaystyle x \)と\(\displaystyle y \)のそれぞれの要素の値と平均値の差、つまり偏差を乗算します。
標本平均x : \(\displaystyle \bar{x} = \frac{1}{n} \sum_{i=1}^{n}x_i\)
標本平均y : \(\displaystyle \bar{y} = \frac{1}{n} \sum_{i=1}^{n}y_i\)
共分散 : \(\displaystyle Cov_{x, y} = \frac{1}{n} \sum_{i=1}^n (x_i – \bar{x})(y_i – \bar{y}) \)
Pythonで共分散を求める
数学と英語のテストの点数の共分散を求めてみる。ここで、母集団から一部のデータだけを抽出すると、共分散が母集団より小さくなる傾向があるため、\(\displaystyle \frac{1}{n} \)としていたところを\(\displaystyle \frac{1}{n-1} \)として値を大きめにする。
共分散 : \(\displaystyle Cov_{x, y} = \frac{1}{n-1} \sum_{i=1}^n (x_i – \bar{x})(y_i – \bar{y}) \)
# 数学の点数
x = [36, 46, 75, 56, 65, 56, 35]
# 英語の点数
y = [36, 47, 67, 78, 55, 43, 32]
# 標本平均
x_mean = np.mean(x)
y_mean = np.mean(y)
# 標本の要素数
n = len(x)
# 共分散
c = 0.0
for i in range(n):
# xとyの要素の値と平均値の差分を乗算する
c += (x[i] - x_mean) * (y[i] - y_mean)
print(c / (n - 1))
180.38095238095238
numpyのcov関数でも共分散を求めることができる。
import numpy as np
# 数学の点数
x = [36, 46, 75, 56, 65, 56, 35]
# 英語の点数
y = [36, 47, 67, 78, 55, 43, 32]
# 数学の点数と数学の点数の共分散
print(np.cov(x,y)[0][0])
# 数学の点数と英語の点数の共分散
print(np.cov(x,y)[0][1])
# 英語の点数と英語の点数の共分散
print(np.cov(x,y)[1][1])
217.90476190476193
180.38095238095235
277.80952380952385
相関係数
相関係数は2つのデータを比較し、1.0に近づけば近づくほど2つのデータは正の相関が、-1.0に近づけば近づくほど負の相関が、0に近づけば近づくほど相関がない、というように相関の強さを表します。よって、値は-1.0から1.0の範囲を取ります。また、相関係数は「共分散」を「xとyの標準偏差の積」で除算することで求められます。
相関係数 : \(\displaystyle \frac{ \frac{1}{n} \sum_{i=1}^n (x_i – \bar{x})(y_i – \bar{y}) }{ \sqrt{\sum_{i=1}^n (x_i – \bar{x})^2} \sqrt{\sum_{i=1}^n (y_i – \bar{y})^2} } = \frac{Cov_{x, y}}{\sigma_x \sigma_y}\)
標準偏差x : \(\displaystyle \sigma_x = \sqrt{ \frac{1}{n} \sum_{i=1}^{n} (x_i – \mu_x)^2} \)
標準偏差y : \(\displaystyle \sigma_y = \sqrt{ \frac{1}{n} \sum_{i=1}^{n} (y_i – \mu_y)^2} \)
※\(\displaystyle \mu \)は、相加平均です。
Pythonで相関係数を求める
共分散で使った数学と英語の点数の相関係数を求めてみる。
import numpy as np
# 数学の点数
x = [36, 46, 75, 56, 65, 56, 35]
# 英語の点数
y = [36, 47, 67, 78, 55, 43, 32]
# 共分散
cov_xy = np.cov(x, y)[0][1]
# xとyの標準偏差
sd_x = np.std(x, ddof=1)
sd_y = np.std(y, ddof=1)
#相関係数
corr = cov_xy / (sd_x * sd_y)
print(corr)
0.7331346568863304
numpyのcorr関数で相関係数を求めることもできる。
import numpy as np
# 数学の点数
x = [36, 46, 75, 56, 65, 56, 35]
# 英語の点数
y = [36, 47, 67, 78, 55, 43, 32]
print(np.corrcoef(x, y)[0][1])
0.7331346568863304
また、scioyのpearsonr関数でも求めることができる。
from scipy.stats import pearsonr
# 数学の点数
x = [36, 46, 75, 56, 65, 56, 35]
# 英語の点数
y = [36, 47, 67, 78, 55, 43, 32]
print(pearsonr(x, y)[0])
記事を読んでいただきありがとうございました。