統計

分散・共分散の別式を利用してみた

データ\(x_1,x_2,\ldots,x_n\)における分散\(V\)は、\(x_1\)~\(x_n\)の平均を\(\bar{x}\)とすると、\(V=\displaystyle \frac{1}{n} \sum_{i=1}^{n} {\left(x_i-\bar{x}\right)}^2\) と定義されるが、\(V=\overline{x^2}-\bar{x}^2\) (=(2乗の平均)-(平均の2乗))として計算することもできる。

それは、以下で証明することができる。
\[
\begin{eqnarray}
V &=& \displaystyle \frac{1}{n} \sum_{i=1}^{n} {\left(x_i-\bar{x}\right)}^2 = \frac{1}{n} \sum_{i=1}^{n} \left( {x_i}^2 – 2x_i\bar{x} + {\bar{x}}^2 \right) \\
&=& \displaystyle \frac{1}{n} \sum_{i=1}^{n} {x_i}^2 – 2\bar{x} \times \displaystyle \frac{1}{n} \sum_{i=1}^{n}x_i + {\bar{x}}^2 \times \displaystyle \frac{1}{n} \sum_{i=1}^{n} 1 \\
&=& \overline{x^2} – 2\bar{x} \times \bar{x} + {\bar{x}}^2 \times \frac{1}{n} \times n = \overline{x^2} – 2{\bar{x}}^2 + {\bar{x}}^2 = \overline{x^2} – {\bar{x}}^2
\end{eqnarray}
\]

なお、\(V=\displaystyle \frac{1}{n} \sum_{i=1}^{n} {\left(x_i-\bar{x}\right)}^2\) を利用した分散の計算は、以下の記事を参照のこと。

PythonのNumPyライブラリで平均・分散・標準偏差を求めてみた PythonのNumPyライブラリには、入力データとなる多次元配列(ndarray)の平均・分散・標準偏差を求める関数が用意されてい...

また、データ\((x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\)における(標本)共分散\(s_{xy}\)は、\(x_1\)~\(x_n\)の平均を\(\bar{x}\)、\(y_1\)~\(y_n\)の平均を\(\bar{y}\)とすると、 \(s_{xy}=\displaystyle \frac{1}{n}\sum_{i=1}^{n}\left(x_i – \bar{x}\right)\left(y_i – \bar{y}\right) \) と定義されるが、\(s_{xy}=\overline{xy}-\bar{x}\bar{y}\) (=(xyの平均)-(xの平均×yの平均))として計算することもできる。

それは、以下で証明することができる。
\[
\begin{eqnarray}
s_{xy} &=& \displaystyle \frac{1}{n} \sum_{i=1}^{n} \left(x_i – \bar{x}\right)\left(y_i – \bar{y}\right)
= \displaystyle \frac{1}{n} \sum_{i=1}^{n} \left( x_iy_i – \bar{x}y_i – x_i\bar{y} + \bar{x}\bar{y} \right) \\
&=& \displaystyle \frac{1}{n} \sum_{i=1}^{n} x_iy_i – \bar{x} \times \frac{1}{n} \sum_{i=1}^{n}y_i – \bar{y} \times \frac{1}{n} \sum_{i=1}^{n}x_i
+ \bar{x}\bar{y} \times \frac{1}{n} \sum_{i=1}^{n} 1 \\
&=& \overline{xy} – \bar{x}\bar{y} – \bar{y}\bar{x} + \bar{x}\bar{y} \times \frac{1}{n} \times n
= \overline{xy} – 2\bar{x}\bar{y} + \bar{x}\bar{y} = \overline{xy} – \bar{x}\bar{y}
\end{eqnarray}
\]

なお、\(s_{xy}=\displaystyle \frac{1}{n}\sum_{i=1}^{n}\left(x_i – \bar{x}\right)\left(y_i – \bar{y}\right) \) を利用した(標本)共分散の計算は、以下の記事を参照のこと。

2変数の相関の強さを示す共分散や相関係数を計算してみた 2変数の関係は、散布図によって視覚的に表現できる。また、2変数の相関の強さを示す指標に「共分散」や「相関係数」がある。 今回は...

\(V=\overline{x^2}-\bar{x}^2\)、\(s_{xy}=\overline{xy}-\bar{x}\bar{y}\) を利用して分散・(標本)共分散の計算を行うと、以下のようになる。

import numpy as np

# 入力データの読み込み
input_data = np.array([[33,352], [33,324], [34,338], [34,317], [35,341]
                       ,[35,360], [34,339], [32,329], [28,283], [35,372]
                       ,[33,342], [28,262], [32,328], [33,326], [35,354]
                       ,[30,294], [29,275], [32,336], [34,354], [35,368]])

# x座標、y座標の抜き出し
input_data_x = input_data[:, 0]
input_data_y = input_data[:, 1]

# xの分散、yの分散の計算(Numpyモジュールを利用)
input_x_var = np.var(input_data_x)
input_y_var = np.var(input_data_y)
print("*** Numpyモジュールによる分散の計算 ***")
print("xの分散 : " + str(input_x_var))
print("yの分散 : " + str(input_y_var))
print()

# xの分散、yの分散の計算(2乗の平均-平均の2乗を利用)
input_x_var_2 = np.mean(input_data_x**2) - np.mean(input_data_x)**2
input_y_var_2 = np.mean(input_data_y**2) - np.mean(input_data_y)**2
print("*** 2乗の平均-平均の2乗を利用した分散の計算 ***")
print("xの分散 : " + str(input_x_var_2))
print("yの分散 : " + str(input_y_var_2))
print()

# 共分散の計算(共分散行列を利用)
print("*** 共分散行列を利用した共分散の計算 ***")
print("(標本)共分散s_xy : " + str(np.cov(input_data_x, input_data_y, bias=True)[0][1]))
print()

# 共分散の計算(x*yの平均 - xの平均*yの平均を利用)
input_r_xy = 0
input_data_len = input_data_x.size
for i in range(input_data_len):
    input_r_xy += input_data_x[i] * input_data_y[i]
input_r_xy = input_r_xy/input_data_len - np.mean(input_data_x) * np.mean(input_data_y)
print("*** (x*yの平均-xの平均*yの平均)を利用した共分散の計算 ***")
print("(標本)共分散s_xy : " + str(input_r_xy))
公式を利用した分散・共分散の計算

要点まとめ

  • データ\(x_1,x_2,\ldots,x_n\)における分散\(V\)は、\(V=\overline{x^2}-\bar{x}^2\) として計算することもできる。
  • データ\((x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\)における(標本)共分散\(s_{xy}\)は、\(s_{xy}=\overline{xy}-\bar{x}\bar{y}\) として計算することもできる。