📌
信頼区間をシミュレーションしてみた。
はじめに
統計における信頼区間は、母集団のパラメータ(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セット
まとめ
記事に掲載する時に実行した結果は91回と少なかったですが、テスト中はほぼ95回で推移していました。ということで、理論どおり100回のサンプリングのうち95回程度が区間内が母平均に収まっています。
参考
P133
Discussion