見出し画像

標本分散と不偏分散についてシミュレーションしてみた

分析屋の藤島です。

標本分散と不偏分散はデータのばらつき、区間推定、分布の理解によく使われています。ただ、どちらを使えばよいのか分からない方が多いのではないでしょうか。
今回は数式を一切用いず標本分散と不偏分散を簡単に説明して、シミュレーションの結果をもとにどちらを使えばよいのか検討したいと思います!

ぜひ、最後までお読みください!


1.標本分散とは

標本分散は、与えられたデータセットの各データと平均値との差の二乗和の平均を標本数(n)で割ったものです。母集団に比べて標本数が少ない時には、母分散よりも標本分散が小さくなってしまいます。

2.不偏分散とは

一方、不偏分散は標本分散が母分散に等しくなるように補正したものです。不偏分散は標本分散に対して(n-1)で割ることで補正を行うことで、母集団の分散をより正確に推定することが可能です。

3.Pythonによるシミュレーション

今回はhttp://data-science.tokyo/ed/edj1-1-2-3.htmlの記事を参考に、標準正規分布から1万個のデータを生成して、各サンプルサイズごとに標本分散と不偏分散の計算を1000回行い、箱ひげ図を用いて可視化しました。

コードは下記の通りです。

import numpy as np
import matplotlib.pyplot as plt

# 平均0、標準偏差1の標準正規分布から1万個のデータを生成
data = np.random.normal(loc=0, scale=1, size=10000)
# 異なるサンプルサイズのリスト
sample_sizes = [5, 10, 20, 30, 50, 75, 100]  

# 標準分散を格納するリスト
std_variances = []  
# 不偏分散を格納するリスト
unbiased_variances = []

# 異なるサンプルサイズごとにシミュレーションを実行
for size in sample_sizes:
    # 各サンプルサイズごとの標準分散を一時的に格納するリスト
    std_vars = []
    # 各サンプルサイズごとの不偏分散を一時的に格納するリスト
    unbiased_vars = []
   
    # 1000回のシミュレーションを実行
    for _ in range(1000):
        # サンプルを非復元抽出
        sample = np.random.choice(data, size=size, replace=False)
        # 標準分散を計算
        std_var = np.var(sample)
        # 不偏分散を計算(自由度を考慮)
        unbiased_var = np.var(sample, ddof=1)
       
        # 標準分散を一時的なリストに追加
        std_vars.append(std_var)
        # 不偏分散を一時的なリストに追加
        unbiased_vars.append(unbiased_var)

    # 各サンプルサイズごとの標準分散のリストを格納リストに追加
    std_variances.append(std_vars)
    # 各サンプルサイズごとの不偏分散のリストを格納リストに追加
    unbiased_variances.append(unbiased_vars)

# 標準分散の平均値を計算
std_means = [np.mean(var) for var in std_variances]
# 不偏分散の平均値を計算
unbiased_means = [np.mean(var) for var in unbiased_variances]  

# 箱ひげ図の描画
plt.figure(figsize=(10, 6))
plt.boxplot(std_variances, positions=np.arange(len(sample_sizes)), widths=0.3, patch_artist=True, boxprops=dict(facecolor='skyblue'))
plt.boxplot(unbiased_variances, positions=np.arange(len(sample_sizes)) + 0.4, widths=0.3, patch_artist=True, boxprops=dict(facecolor='lightgreen'))
plt.scatter(np.arange(len(sample_sizes)), std_means, color='blue', marker='o', label='Std Variance Mean')
plt.scatter(np.arange(len(sample_sizes)) + 0.4, unbiased_means, color='green', marker='o', label='Unbiased Variance Mean')

# x軸のラベル
plt.xlabel('Sample Size')
# y軸のラベル
plt.ylabel('Variance')
# グラフのタイトル
plt.title('Standard Variance vs Unbiased Variance for Different Sample Sizes')
# x軸の目盛りの設定
plt.xticks(np.arange(len(sample_sizes)) + 0.2, sample_sizes)
# 凡例の表示
plt.legend()
# グリッドの表示
plt.grid(True)
# レイアウトの調整
plt.tight_layout()
# グラフの表示
plt.show()

# 各サンプルサイズごとの平均値のサマリーをデータフレームにまとめる
summary_data = {'Sample Size': sample_sizes, 'Mean of Std Variance': std_means, 'Mean of Unbiased Variance': unbiased_means}
summary_df = pd.DataFrame(summary_data)

# 表形式で出力
print(summary_df)

出力結果は下記の通りです。

図1:各サンプルサイズごとの標本分散と不偏分散の箱ひげ図
図2:各サンプルサイズごとの標本分散と不偏分散の平均値

図1よりサンプルサイズが30よりも大きくなると、標本分散と不偏分散との差があまり見られなくなることが分かりました。
また図2より標本分散においてサンプルサイズが20よりも大きくなると、標準正規分布の分散にほぼ近い値を取ります。
さらにサンプルサイズが20より小さい場合、標本分散と不偏分散との差はあまり大きくはないことが分かりました。

4.まとめ

シミュレーションした結果から、特に不偏分散を使う理由がなければ基本的に標本分散を使って問題ないと考えています。
また、シミュレーションするにあたって参考にした記事には、「実務においてnとn-1との違いで何か不都合が生じたわけではない」と述べられていました。

ちなみに今回のシミュレーションにおいてサンプルサイズやシミュレーション回数を変えてみました。標本分散と不偏分散の平均値が1より大きくなったり小さくなったりしたものの、標本分散と不偏分散との差については今回のシミュレーションの結果通りでした。


ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!

【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。

【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。

【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。

【SES】
SESサービスも行っております。