👨‍🏫

その信頼区間(エラーバー)、本当に信頼できますか?~統計学におけるサンプルサイズの重要性~

2023/12/24に公開

TL;DR

経験的に信頼性の高い区間推定には最低 30 のサンプルが推奨されていますが、母集団が正規分布に従う場合はそれよりも少ないサンプル数でも十分な場合があります。しかし、指数分布のように非対称性の高い分布では、より多くのサンプルが必要となる傾向があります。


DALL·Eにより生成

はじめに

こんにちは。エンジニアチームの小林です。
本記事は SimpleForm Advent Calendar 2023 の 24 日目の記事です。

最近では、便利なライブラリのおかげで、stats.t.ppf(0.975, df=sample_size-1) のような単一のコマンドで信頼区間(エラーバー)を簡単に算出できるようになりました。しかし、その背後にある理論を深く理解せずに、単にライブラリを利用しているケースも少なくないのではないでしょうか?今回は、この信頼区間の背景にある理論と仮定の妥当性を、シミュレーションを通じて検証してみたいと思います。

信頼区間とは?

例えば、ウェブサイト内の特定要素のクリック率を分析する際、平均値を計算することが一般的です。これは標本平均を用いて母平均を推定する方法です。しかし、単一の平均値だけではデータの不確実性や変動を完全には捉えられません。そこで、信頼区間が有用です。信頼区間とは、統計的手法を用いて得られる範囲で、もし同じ手法を多数回繰り返すならば、得られる信頼区間の特定の割合(例えば95%)が真の母平均を含むだろうという意味です。これにより、データのばらつきや不確実性を考慮した、より信頼性の高い母平均の推定が可能になります。ただし、この区間推定を行うには、「サンプル数が十分で、標本平均の分布が正規分布とみなせる[1]」という仮定が必要です。この仮定の妥当性について様々な母集団分布やサンプルサイズで検証しました。

検証方法

標本平均の95%信頼区間とは、標本を抽出して区間推定を 100 回行った場合、そのうち約 95 回は母平均が区間内に存在すると予測される範囲を意味します。この信頼区間の性質を、異なるサンプル数や母分布でのシミュレーションによって評価することを目指します。
以下の図は、標準正規分布 N(0,1) からのサンプル数 10 による区間推定を 100 回行った結果です[2]。ほとんどのケースで真の平均(0)を含んでいますが、赤色で示された 8 回の試行では真の平均を含んでいません。95%信頼区間では、95 回の含有を期待するところですが、このシミュレーションでは 92 回しか含まれていないことが観察されます。この結果から、サンプル数や母分布が信頼区間の性質に与える影響を確認することが、今回の検証の主な目的です。

コード
# エラーバー付きで95%信頼区間をプロットする関数(true_meanが含まれるかに応じて色分け)
def plot_confidence_intervals(sample_size, distribution, true_mean, num_trials=100):
    for i in range(num_trials):
        sample = distribution(sample_size)
        mean = np.mean(sample)
        se = stats.sem(sample)
        t_statistic = stats.t.ppf(0.975, df=sample_size-1)
        lower_bound = mean - t_statistic * se
        upper_bound = mean + t_statistic * se

        # true_meanが含まれるかに応じて色を変える
        color = 'green' if lower_bound <= true_mean <= upper_bound else 'red'

        # エラーバーをプロット
        plt.errorbar(i, mean, yerr=[[mean - lower_bound], [upper_bound - mean]], fmt='o', color=color, ecolor=color)

    plt.figure(figsize=(12, 7))
    # 真の平均をプロット
    plt.axhline(y=true_mean, color='blue', linestyle='--', label=f'真の平均: {true_mean}')

    plt.xlabel('試行')
    plt.ylabel('標本平均 + 95%信頼区間')
    plt.title(f'サンプル数 {sample_size} の95%信頼区間の算出を100回実行')
    plt.xticks([])
    plt.legend()
    plt.savefig('exmple.png')
    plt.show()

# サンプルサイズ10での正規分布に基づく95%信頼区間をプロット
plot_confidence_intervals(10, lambda size: np.random.normal(0, 1, size), 0)

実際の検証では、区間推定を1000回繰り返し、標準正規分布 N(0,1) に加え、分布の非対称性が顕著な指数分布 Ex(1) も比較対象として検証します[3]

検証結果と考察

下の図は、サンプルサイズが増えるについて、正規分布からのサンプルに基づく95%信頼区間が真の平均値を含む頻度が高まることを示しています。小さなサンプルサイズでは信頼区間が95%の期待値に達していないことが見られますが、サンプルサイズが大きくなるにつれて、信頼区間が真の平均値を含む頻度が増加し、理論値に近づいていることが確認できます。
一方で、非対称な指数分布においては、サンプルサイズが小さいときに信頼区間が真の平均値を含む頻度が特に低くなっています。しかしながら、サンプルサイズを増やすことでこの頻度が向上し、正規分布の場合と同様に、より大きなサンプルサイズでは信頼区間が真の平均値を含む確率が95%に接近しています。これはサンプル数の増加に伴い、標本平均の分布が正規分布に近似できるようになり正確な区間推定が可能になったためと考えられます。
この結果から、信頼区間の推定においてサンプルサイズが重要であり、また分布の形状が信頼区間の精度に影響を与える可能性があることが示されています。

コード
import numpy as np
import scipy.stats as stats


# 指定されたサンプルサイズと分布で95%の信頼区間を計算し、真の値が含まれるかをチェック
def simulate_confidence_intervals(sample_size, distribution, true_mean, num_trials=1000):
    within_confidence_interval = 0

    for _ in range(num_trials):
        # 指定された分布からサンプルを取得
        sample = distribution(sample_size)
        se = stats.sem(sample)  # 標準誤差
        t_statistic = stats.t.ppf(0.975, df=sample_size-1)  # t統計量 (95%信頼区間の上限)

        # 95%信頼区間の計算
        confidence_interval = (sample.mean() - t_statistic * se, sample.mean() + t_statistic * se)
        
        # 真の平均が信頼区間内にあるかのチェック
        if confidence_interval[0] <= true_mean <= confidence_interval[1]:
            within_confidence_interval += 1

    return within_confidence_interval


# 異なるサンプルサイズでのシミュレーション
sample_sizes = [3, 10, 100, 1_000, 10_000]

# 正規分布の結果
normal_distribution_results = [
    simulate_confidence_intervals(n, lambda size: np.random.normal(0, 1, size), 0)
    for n in sample_sizes
]

# 指数分布の結果
non_normal_distribution_results = [
    simulate_confidence_intervals(n, lambda size: np.random.exponential(1, size), 1)
    for n in sample_sizes
]

plt.figure(figsize=(12, 7))
plt.semilogx(sample_sizes, normal_distribution_results, label='正規分布', marker='o')
plt.semilogx(sample_sizes, non_normal_distribution_results, label='指数分布', marker='x')
plt.xlabel('サンプルサイズ', fontsize=20)
plt.ylabel('95%信頼区間内の回数 (1000回中)', fontsize=20)
plt.title('異なるサンプルサイズでの95%信頼区間の精度', fontsize=22)
plt.axhline(y=950, color='red', linestyle='--')
plt.legend()
plt.grid(True, which="both", ls="--")
plt.savefig('result.png')
plt.show()

宣伝

本記事をお読みいただきましてありがとうございました。明日以降の弊社のアドベントカレンダーもどうぞよろしくお願いいたします。また、Open Data Labという団体にて、大規模言語モデル入門・輪読会 #2 の開催しておりますので、そちらも併せてご確認いただければ幸いです。

大規模言語モデル入門・輪読会 #2

シンプルフォーム株式会社 の全ての求人一覧

SimpleForm 採用お問い合わせフォーム

SimpleForm カジュアル面談お申込みフォーム

脚注
  1. サンプル数を増やせば、任意の母分布で標本平均の分布が正規分布に分布収束することが理論的にわかっており、中心極限定理と呼ばれます。 ↩︎

  2. 本分析では母分散が未知であるため、t 統計量を利用した信頼区間を算出しています。t 分布は母分散が未知の場合に標本平均の信頼区間を推定するために使用され、正規分布に比べて裾が厚い特性を持ちます。これにより、推定の不確実性がより適切に反映されます。さらに詳しい情報については、「現代数理統計学の基礎」などの統計学の参考書を参照してください。 ↩︎

  3. 指数分布は歪度(分布の非対称性)が正の非対称分布であり、この特性は中心極限定理においてサンプルの平均が正規分布に収束するために必要なサンプルサイズに影響を与える可能性があります。歪度が顕著な分布では、中心極限定理が成り立つためのサンプルサイズがより大きくなると予想され、今回はその仮定を検証することを目的としています。 ↩︎

Discussion