Pythonを用いた記述統計のプログラミング 〜平均、分散、共分散、相関係数、共分散行列〜

数式だけの解説ではわかりにくい場合もあると思われるので、統計学の手法や関連する概念をPythonのプログラミングで表現します。当記事では記述統計を取扱う際に出てくる平均、分散、共分散、相関係数、共分散行列などの手法に関して取り扱いました。

・Pythonを用いた統計学のプログラミングまとめ
https://www.hello-statisticians.com/stat_program

平均・分散

平均

$$
\large
\begin{align}
\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i
\end{align}
$$

上記の数式は、下記のようにPythonで表すことができる。

import numpy as np

x = np.array([3., 7., 4., 6., 5.])
print(np.mean(x))

・実行結果

> print(np.mean(x))
5.0

分散

$V[X]=E[(X-E[X])^2]$を元に計算

$$
\large
\begin{align}
S^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i-\bar{x})^2
\end{align}
$$

上記の数式は、下記のようにPythonで表すことができる。

import numpy as np

x = np.array([3., 7., 4., 6., 5.])
print(np.sum((x-np.mean(x))**2)/(x.shape[0]))

・実行結果

> print(np.sum((x-np.mean(x))**2)/(x.shape[0]))
2.0

$V[X]=E[X^2]-E[X]^2$を元に計算

$$
\large
\begin{align}
S^2 = \frac{1}{n} \sum_{i=1}^{n} x_i^2 – \bar{x}^2
\end{align}
$$

上記の数式は、下記のようにPythonで表すことができる。

import numpy as np

x = np.array([3., 7., 4., 6., 5.])
print(np.sum(x**2)/(x.shape[0])-np.mean(x)**2)

・実行結果

> print(np.sum(x**2)/(x.shape[0])-np.mean(x)**2)
2.0

ここで用いた数式の導出は下記で行なった。

共分散・相関係数

共分散

$\mathrm{Cov}[X,Y]=E[(X-E[X])(Y-E[Y])]$を元に計算

$$
\large
\begin{align}
S_{XY} = \frac{1}{n} \sum_{i=1}^{n} (x_i-\bar{x})(y_i-\bar{y})
\end{align}
$$

上記の数式は、下記のようにPythonで表すことができる。

import numpy as np

x = np.array([3., 7., 4., 6., 5.])
y = np.array([3.1, 7.1, 3.9, 5.9, 5.])

print(np.dot(x-np.mean(x),y-np.mean(y))/(x.shape[0]))
print(np.sum((x-np.mean(x))*(y-np.mean(y)))/(x.shape[0]))

・実行結果

> print(np.dot(x-np.mean(x),y-np.mean(y))/(x.shape[0]))
2.0
> print(np.sum((x-np.mean(x))*(y-np.mean(y)))/(x.shape[0]))
2.0

np.dotを用いて内積を計算する方法と、ベクトルの要素ごとの積にnp.sumを適用する方法の主に二通りの実装ができる。

$\mathrm{Cov}[X,Y]=E[XY]-E[X]E[Y]$を元に計算

$$
\large
\begin{align}
S^2 = \frac{1}{n} \sum_{i=1}^{n} x_iy_i – \bar{x}\bar{y}
\end{align}
$$

上記の数式は、下記のようにPythonで表すことができる。

import numpy as np

x = np.array([3., 7., 4., 6., 5.])
y = np.array([3.1, 7.1, 3.9, 5.9, 5.])

print(np.sum(x*y)/(x.shape[0])-np.mean(x)*np.mean(y))
print(np.dot(x,y)/(x.shape[0])-np.mean(x)*np.mean(y))

・実行結果

> print(np.sum(x*y)/(x.shape[0])-np.mean(x)*np.mean(y))
2.0
> print(np.dot(x,y)/(x.shape[0])-np.mean(x)*np.mean(y))
2.0

ここで用いた数式の導出は下記で行なった。

共分散行列

下記で作成を行った。

相関係数

$$
\large
\begin{align}
r_{XY} = \frac{\displaystyle \sum_{i=1}^{n} (x_i-\bar{x})(y_i-\bar{y})}{\displaystyle \sqrt{\sum_{i=1}^{n} (x_i-\bar{x})^2} \sqrt{\sum_{i=1}^{n} (y_i-\bar{y})^2}}
\end{align}
$$

上記の数式は、下記のようにPythonで表すことができる。

import numpy as np

x = np.array([3., 7., 4., 6., 5.])
y = np.array([3.1, 7.1, 3.9, 5.9, 5.])

r = np.dot(x-np.mean(x),y-np.mean(y))/np.sqrt(np.dot(x-np.mean(x),x-np.mean(x))*np.dot(y-np.mean(y),y-np.mean(y)))

print(r)

・実行結果

> print(r)
0.99800598007

相関行列

下記で作成を行った。