>開発>python>[Pythonで数学]共分散と相関係数

共分散

共分散は、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])

数学

記事を読んでいただきありがとうございました。

Page Top