📗

推計統計と分散

2023/06/08に公開

推計統計学の続き

こんにちは!わいわわです!
前回は統計学の中でも推計統計を学習しました。
https://zenn.dev/waiwawaiwai/articles/0a2a21cf68f10e

今回はその続きで、主に分散などを取り扱っていきます!

データ全体の散らばりと標本平均の散らばり

標本調査を行う理由は母集団が大きすぎてずべてを調べることができなかったためでしたね。
この場合、母集団のデータの散らばり(分散)を調べることは不可能ですが、
母集団の分散を示す母分散は必ず実在します。
ここでは標本平均の分散と母集団の分散の関係について、学習していきます。

標本平均の分散と母分散の関係を調べる

例)ある作業所において製造した手ぐくりジュース50本の容量を記録したデータ

capacity
187
171
167
174
163
175
196
192
179
185...

50個のデータがあります!
今から「サンプルを5個ずつ取り出し、標本平均を求める」ことを15回繰り返します。
そこから得られた15個の標本平均の分散を求めてみます。

import pandas as pd
import numpy as np

# CSVファイルのデータをデータフレームに読み込む
df = pd.read_csv('measurement.csv')
# 標本平均を格納する配列
sample_mean = np.array([])
# 処理を15回繰り返す
for i in range(15):
    # サンプルサイズを5にしてランダムサンプリングを行う
    # デフォルトのreplace=Falseで復元抽出は行わないようにする
    sample = df.sample(5)
    # 標本平均を求めてsample_meanに追加
    sample_mean = np.append(sample_mean, sample.mean())

# 標本平均の平均
print('標本平均の平均: ', sample_mean.mean())
# 標本平均の分散
print('標本平均の分散: ', sample_mean.var())
# 母集団の平均
print('母集団の平均: ', df['capacity'].mean())
# 母集団の分散
print('母集団の分散: ', df['capacity'].var(ddof=0))

!出力結果!

標本平均の平均:  183.1333333333333
標本平均の分散:  24.8568888888889
母集団の平均:  181.36
母集団の分散:  131.9904
  • df.sample()...データフレームから行・列データをランダムに抽出する
  • ndarray.var()...標本分散を返す
  • df.var()...普遍分散を返す
    などを使用し、求めています。

結果をみてみると、母分散が「131.9904」、標本平均の分散「24.85688」でした。
母分散は標本分散の約5.31倍です。サンプルサイズの5に近いです。
実はここからわかるように以下の式が成り立ちます。
母分散の推測値=サンプルサイズ×標本平均の分散

不偏分散

標本分散の平均は母集団の分散よりも小さな値になるという特性があります。
そこで標本分散の平均と母分散とのズレをなくすため
標本分散に代わって使われるのが普遍分散です。
「偏差平方の合計÷(データの個数-1)」で求めることができます。

同じ手作りジュースの容量のデータで
標本平均の分散と、不偏分散、それぞれの平均を求めて比較します。

import pandas as pd
import numpy as np

# CSVファイルのデータをデータフレームに読み込む
df = pd.read_csv('measurement.csv')
# 標本平均を格納する配列
sample_mean = np.array([])
# 標本平均の分散を格納する配列
sample_svar = np.array([])
# 標本平均の不偏分散を格納する配列
sample_uvar = np.array([])

# 処理を15回繰り返す
for i in range(15):
    # サンプルサイズを20にしてランダムサンプリングを行う
    # デフォルトのreplace=Falseで復元抽出は行わないようにする
    # random_stateを設定して乱数を固定
    sample = df.sample(20, random_state=0)
    # 標本平均を求めてsample_meanに追加
    sample_mean = np.append(sample_mean, sample.mean())
    # 標本平均の分散を求めてsample_svarに追加
    sample_svar = np.append(sample_svar, sample.var(ddof=0))
    # 標本平均の不偏分散を求めてsample_meanに追加
    sample_uvar = np.append(sample_uvar, sample.var(ddof=1))

# 標本の分散の平均
print('標本分散の平均: ', sample_svar.mean())
# 標本の不偏分散の平均
print('標本の不偏分散の平均: ', sample_uvar.mean())
# 母集団の分散
print('母集団の分散: ', df['capacity'].var(ddof=0))

!出力結果!

標本分散の平均:  122.82750000000006
標本の不偏分散の平均:  129.29210526315794
母集団の分散:  131.9904

ここでは20個のサンプルをランダムに抽出しています。

結果を見てみると、標本分散の平均が「122.8275...」、
不偏分散の平均が[129.2921...]となりました。
不偏分散の平均の値は、母分散の「131.9904...」に近い値です。

母集団と標本の関係まとめ

母平均≒標本平均の平均

母分散≒標本の大きさ×標本平均の分散

母分散≒不偏分散の平均

標本の数が多ければ多いほど、母集団とのズレが小さくなります。
できれば何通りかのランダムサンプリングを行って平均を求めることが望ましいです!
このようにして割り出した結果がどれくらいまで母集団のことを言い当てているかは
確率を用いた推定や、検定と呼ばれる統計手法で調べることができます。

所感

今回は推計統計の分散を行いました。
膨大なデータをただ調べるだけではなく、低コストや少ない時間で
効率よく調べていくことも大事ですね!
もちろん正確性は間違いなくです、肝に銘じて学習を進めます!

Discussion