Pythonで実装する推測統計①(統計量)|スクラッチ実装で理解する基礎統計 #4

f:id:lib-arts:20190419173312p:plain

上記のシリーズで機械学習アルゴリズムの実装を行っているのですが、他の内容もできればということで同様のイメージで基礎統計を実装していければと思います。
#1、#2では記述統計、#3では確率モデルを取り扱いました。

#4ではここから推測統計につなげていくにあたって統計量について取り扱います。
以下目次になります。
 
1. 推測統計、統計的推測とは
2. 統計量とは
3. 各統計量のPythonでの実装
4. まとめ

 

1. 推測統計、統計的推測とは
推測統計や統計的推測は#1、#2で取り扱った記述統計をベースにより考察を深めた考え方です。
記述統計は与えられたデータを元に考察を行っていましたが、推測統計では得られたデータを確率的に実現されたものであるとした上で、平均\overline{x}=\frac{1}{n}\sum_{i=1}^nx_{i}や分散S^2=\frac{1}{n}\sum_{i=1}^n(x_{i}-\overline{x})^2の各種の指標を統計的に分析します。
推測統計においては、手中のデータを母集団から抽出された標本とみなすという前提が重要な前提となっています。例えばアンケート結果一つ取っても、全てのサンプルを列挙することはできず、手元に得られているデータは全体の一部分になります。この時に、手元のデータを全体の集合(母集団)からランダムサンプリングされた結果だと考えることで、モデル化を行います。
長々とした説明だと逆にわかりにくくなるので、以下用語を取りまとめます。

・母集団
-> 全体の集合のこと。統計的推測によって標本から推測される。(確率変数の実現値)

・標本
-> 手元に得られたデータのこと。母集団からランダム抽出されたと考える。(もっと言うなら母集団の確率分布から抽出されたと考えると良い)

・母平均(population mean)/母分散(population variable)
-> 母集団の確率分布における平均や分散の値。

・標本平均(sample mean)/標本分散(sample variable)
-> 得られたデータにおける平均と分散。それぞれ母平均、母分散の近似値とみなせる。標本分散は\frac{n}{n-1}S^2のように補正された不偏標本分散を用いることが多い。このような不偏標本分散が用いられる理由は、データが少ない際に標本分散は過小評価されていると考えられるためである。

 

2. 統計量とは
標本X_{1},X_{2},X_{3},...,X_{n}の関数T(X_{1},X_{2},....,X_{n})を統計量(statistic)と言います。統計量の例としては、標本平均、標本分散、不偏標本分散、標本標準偏差などです。
統計量も確率変数であるから分布を持ち、統計量の分布を標本分布(sampling distribution)と言います。1節と同様に長々と書くとわかりづらくなってしまうので、以下箇条書きの形式でまとめます。

・標本平均の平均と分散
-> 母平均μ、母分散σ^2を持つ母集団分布からの無作為標本X_{1}、...X_{n}においては、E(\overline{x})=μV(\overline{X}=\frac{σ^2}{n})が成立する。
-> これを解釈すると、サンプルの平均を考えると、平均の標本平均はの期待値は母平均に一致し、平均の標本分散はサンプル数の分だけ元々の分散よりも小さくなると言うことである。

・カイ2乗分布
-> Z_{1},Z_{2},...Z_{n}は互いに独立に標準正規分布N(0,1)に従うとすると、この時の2乗和である\sum_{i=1}^kZ_{i}^2は自由度kのx^2(カイ2乗)分布(chi-square distributionに従う。

・スチューデントのt分布
-> 母平均の信頼区間を出す際に通常の統計的推測だとσ^2が含まれるが、これを実際に計算し用いるためにはσ^2が既知であることが前提となっている。この際に未知のσ^2を不偏標本分散のs^2で置き換えた値をt比と呼び、この分布のことをt分布と呼んでいる。

 

3. 各統計量のPythonでの実装
ここまで解説が多く、イメージがつきにくかったと思いますので、3節では実際に統計量をPythonで実装してイメージを掴めるようにできればと思います。まずは実際にデータを用意しましょうということで、下記のコードを実行いただければと思います。

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

np.random.seed(87655678)
plt.subplot(211)
a = norm.rvs(size=50)
plt.hist(a,10)
plt.subplot(212)
b = norm.rvs(size=5000)
plt.hist(b,10)
plt.show()

上記を実行すると下記のようになります。

f:id:lib-arts:20190421141013p:plain

正規分布から50個と5000個のサンプリングを行い、そのヒストグラムを可視化しています。サンプル数を変えて比較できるように、二パターンのデータを生成してみました。
以下では上記で生成したデータを元に、統計量の計算を行っていきます。まずは、標本平均と標本分散の計算を行っていきます。

def calc_cov(x1,x2):
    shift_x1 = x1-np.mean(x1)
    shift_x2 = x2-np.mean(x2)
    res = np.sum(shift_x1*shift_x2)/x1.shape[0]
    return res

print(np.mean(a))
print(calc_cov(a,a))
print("=======")
print(np.mean(b))
print(calc_cov(b,b))

 上記の実行結果は下記のようになります。(ソースが若干異なるのははてなの注釈で判断されたため書き直しています。)f:id:lib-arts:20190421141651p:plain

また、不偏標本分散を計算すると下記になります。

print(calc_cov(a,a)*50/49)
print(calc_cov(b,b)*5000/4999)

実行結果は下記です。

f:id:lib-arts:20190421142204p:plain
サンプルが少ない方が分散の補正の影響を受けていることがわかります。


4. まとめ
#4では統計量について色々と補足説明や実装の確認を行ってきました。
#5では、区間推定について取り扱っていければと思います。