📌

信頼区間をシミュレーションしてみた。

2025/02/15に公開

はじめに

統計における信頼区間は、母集団のパラメータ(ex:平均)が特定の確率で含まれる範囲を示します。
信頼区間の説明について例えば、95%信頼区間(2σ)は、100回サンプリングしたうち95回が母平均が含まれる範囲だと説明されます。
Pythonコードで実行してシミュレーションを通じて結果を確認してみます。

コード
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

# パラメータ設定
mean = 0
std = 1
sample_size = 30
num_samples = 100

# 母集団から100回サンプリングして信頼区間を計算
contains_mean = 0
intervals = []

for _ in range(num_samples):  # 指定された回数(num_samples)だけサンプリングを繰り返す
    # 母集団(正規分布)からサンプルを抽出
    sample = np.random.normal(loc=mean, scale=std, size=sample_size)
    # 抽出したサンプルの平均値を計算
    sample_mean = np.mean(sample)
    
    # 標本標準偏差を計算(不偏標準偏差: ddof=1)
    sample_std = np.std(sample, ddof=1)
    
    # 点推定で95%信頼区間(片側2.5%)を計算
    margin_of_error = stats.t.ppf(0.975, df=sample_size - 1) * (sample_std / np.sqrt(sample_size))
    
    # 信頼区間の下限・上限を計算
    ci_lower = sample_mean - margin_of_error
    ci_upper = sample_mean + margin_of_error
    
    # 信頼区間をリストに追加
    intervals.append((ci_lower, ci_upper))
    
    # 母平均(mean)が信頼区間内に含まれるかを判定
    if ci_lower <= mean <= ci_upper:
        contains_mean += 1  # 含まれていればカウントを増やす


# 結果表示
print(f"100回中、母平均({mean})が信頼区間に含まれた回数: {contains_mean}回")
print(f"信頼区間に含まれた割合: {contains_mean/num_samples:.2%}")

# 信頼区間を可視化
plt.figure(figsize=(10, 6))
for i, (lower, upper) in enumerate(intervals):
    color = 'blue' if lower <= mean <= upper else 'red'
    plt.plot([i, i], [lower, upper], color=color, marker="o", markersize=5)

plt.axhline(y=mean, color='green', linestyle='--', label="母平均")
plt.title("95%信頼区間のシミュレーション")
plt.xlabel("サンプルインデックス")
plt.ylabel("信頼区間")
plt.legend()
plt.show()

実行結果

100回中、母平均(0)が信頼区間に含まれた回数: 91回
信頼区間に含まれた割合: 91.00%

実行結果

さらに100回

上記、100回を1セットとして100セットやってみました。

100セットの全てで平均が含まれた回数: 95.11回
95回以上の成功回数: 65回 / 100セット

さらに100回

まとめ

記事に掲載する時に実行した結果は91回と少なかったですが、テスト中はほぼ95回で推移していました。ということで、理論どおり100回のサンプリングのうち95回程度が区間内が母平均に収まっています。

参考

P133
https://www.stat.go.jp/dss/pdf/programming/231223teach.pdf

Discussion