数式だけの解説ではわかりにくい場合もあると思われるので、統計学の手法や関連する概念をPythonのプログラミングで表現します。当記事では記述統計を取扱う際に出てくる平均、分散、共分散、相関係数、共分散行列などの手法に関して取り扱いました。
・Pythonを用いた統計学のプログラミングまとめ
https://www.hello-statisticians.com/stat_program
Contents
平均・分散
平均
$$
\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
相関行列
下記で作成を行った。