統計解析の基本となる「標本分散」や「不偏分散」は、Pythonで容易に出力可能です。
本記事では、そんなPython基礎となるデータ分散について、詳しくご説明します。
データ分散
データ分散(variance)とは、データの標準偏差の自乗です。
データのバラつきを表す標本分散は、下式で示される通り、平均値からの偏差の2乗の平均です。
データにバラつきがない場合(すべてのデータが同じ値の場合)、分散は0になります。
\(\sigma ^{2}=\dfrac{1}{n}\sum ^{n}_{i=1}\left( x_{i}-\mu \right) ^{2}\)
実装(平均と分散)
まずは、データの平均と分散を求める関数の実装例を、以下にご紹介します。
#input
#平均値を計算する関数
def cal_mean(data):
S = sum(data)
N = len(data)
M = S/N
return M
#偏差を計算する関数
def cal_diff(data):
M = cal_mean(data)
d = []
for i in data:
#append関数でdにリスト追加
d.append(i-M)
return d
def cal_variance(data):
d = cal_diff(data)
D = []
for j in d:
#append関数でDにリスト追加
D.append(j**2)
SD = sum(D)
V = SD/len(data)
return V
実装した関数にデータを入力して、分散を出力してみます。
#input
data = [1,2,3,4,5]
V = cal_variance(data)
print(data,"の分散:{}".format(V))
#output
[1, 2, 3, 4, 5] の分散:2.0
データ数を10000個に増やして検証してみます。
NumPyの正規分布乱数を使用してデータを作成し、分散を出力してみます。
#input
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
x = np.random.normal(5000,2000,10000)
data = x.astype(np.int64)
fig = plt.figure()
A = fig.add_subplot(111)
A.set_title("histogram",fontsize=18)
A.set_xlabel("data",fontsize = 14)
A.set_ylabel("frequency",fontsize = 14)
A.set_xlim(0,10000)
A.hist(data,range=(0,10000),color="lime")
plt.show()
作成した10000個のデータのヒストグラムは上グラフになりました。
この膨大なデータの分散も、以下のように容易に出力できます。
#output
[8528 5800 6957 ... 6033 4934 7596] の分散:3901001.520
statistics.pvariance()
statisticsモジュールのstatistics.pvariance()を使用すると、データ分散を計算できます。
以下に例をご紹介します。
#input
from statistics import pvariance as variance
data = [11,22,33,44,55]
V = variance(data)
print(data,"の分散:{}".format(V))
#output
[11, 22, 33, 44, 55] の分散:242
statistics.variance()
statisticsモジュールのstatistics.variance()を使用すると、データの不偏分散を計算できます。
不偏分散とは、下式に示されるように、\(n\)でなく\(n-1\)で除した分散のことです。
\(\sigma ^{2}=\dfrac{1}{n-1}\sum ^{n}_{i=1}\left( x_{i}-\mu \right) ^{2}\)
データ標本が属している母集団全体を考えたときの分散推定値を表しています。
statistics.variance()の使用例を、以下にご紹介します。
#input
from statistics import variance as variance
data = [11,22,33,44,55]
V = variance(data)
print(data,"の分散:{}".format(V))
#output
[11, 22, 33, 44, 55] の分散:302.5
numpy.var()
NumPyのnumpy.var()を使用すると、配列データの分散を計算できます。
使用例を以下にご紹介します。
#input
import numpy as np
data = np.array([[111,222,333],
[444,555,666],
[777,888,999]])
V1 = np.var(data)
V2 = np.var(data,axis=0)
V3 = np.var(data,axis=1)
print("全データの分散:{}".format(V1))
print("列データの分散:{}".format(V2))
print("行データの分散:{}".format(V3))
#output
全データの分散:82140.0
列データの分散:[73926. 73926. 73926.]
行データの分散:[8214. 8214. 8214.]
numpy.nanvar()
NumPyのnumpy.nanvar()は、上でご紹介したnumpy.var()に加えて、nanデータを除外して計算できる関数です。
使用例を以下にご紹介します。
#input
import numpy as np
data = np.array([[111 ,np.nan ,333],
[np.nan ,555 ,666],
[777 ,888 ,np.nan]])
V1 = np.nanvar(data)
V2 = np.nanvar(data,axis=0)
V3 = np.nanvar(data,axis=1)
print("全データの分散:{}".format(V1))
print("列データの分散:{}".format(V2))
print("行データの分散:{}".format(V3))
#output
全データの分散:69819.0
列データの分散:[110889. 27722.25 27722.25]
行データの分散:[12321. 3080.25 3080.25]
まとめ
この記事では、Python基礎となるデータ分散について、ご説明しました。
本記事を参考に、ぜひデータを変えて試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!