新薬の効果を調べる臨床試験では、すべての患者を対象にすることは不可能なため、一部の患者で試験を行う。その結果は「有効率50%(95%信頼区間:40%〜60%)」のように報告される。この「40%〜60%」が信頼区間だ。
標本から母集団のパラメータを推定する方法には、1つの値を推定する点推定と、範囲で推定する区間推定がある。「有効率50%」が点推定、「40%〜60%」が区間推定である。点推定だけでは推定の精度がわからないが、区間推定では「どの程度の確からしさで、どの範囲に真の値があるか」を示すことができる。
本記事では、区間推定の基本的な考え方と、母平均の信頼区間を導出する方法を解説する。正規分布とt分布の知識があると理解しやすい。
区間推定とは
区間推定(interval estimation)とは、未知のパラメータ \theta の値を、1つの値ではなく区間 (L, U) として推定する方法である。
点推定では「母平均は50」のように1つの値を推定するが、標本によって推定値は変動する。区間推定では「母平均は46から54の間にある」のように範囲で示し、推定の不確実性を表現できる。
信頼区間と信頼率
区間推定で得られる区間を信頼区間(confidence interval)という。信頼区間 (L, U) が真のパラメータ \theta を含む確率を信頼率(confidence level)または信頼係数(confidence coefficient)という。
ここで 1 - \alpha が信頼率である。\alpha = 0.05 のとき信頼率は 0.95(95%)となり、このとき得られる区間を 95%信頼区間という。
95%信頼区間とは「同じ方法で標本を取り直して信頼区間を計算することを繰り返すと、そのうち95%が真のパラメータを含む」という意味である。1回の推定で得られた区間が真の値を含むかどうかは確定的であり、「95%の確率で含む」わけではない点に注意。
信頼区間の上限と下限を信頼限界(confidence limit)という。
母平均の信頼区間(分散既知の場合)
母集団が正規分布 N(\mu, \sigma^2) に従い、母分散 \sigma^2 が既知の場合を考える。母平均 \mu の信頼区間を求めたい。
導出
この母集団から独立に抽出した標本 X_1, X_2, \ldots, X_n の標本平均を \bar{X} とする。標本平均は N\left(\mu, \dfrac{\sigma^2}{n}\right) に従うので、標準化した統計量
は標準正規分布 N(0, 1) に従う。標準正規分布の上側 \dfrac{\alpha}{2} 点を z_{\alpha/2} とすると
が成り立つ。Z の定義を代入して \mu について整理すると
95%信頼区間の場合は \alpha = 0.05 なので z_{0.025} = 1.96 を用いる。
計算例
ある工場で生産される製品の重量は N(\mu, 10^2) に従うことがわかっている。25個の製品をサンプリングしたところ、平均重量は 50g だった。母平均 \mu の 95%信頼区間を求める。
\bar{x} = 50、\sigma = 10、n = 25、z_{0.025} = 1.96 より
95%信頼区間は (46.08, 53.92) となる。
母平均の信頼区間(分散未知の場合)
実際の問題では、母分散 \sigma^2 がわかっていないことが多い。この場合、\sigma を標本標準偏差 s で置き換えるが、統計量の分布が変わる点に注意が必要である。
t分布を使う理由
母分散が既知の場合、Z = \dfrac{\bar{X} - \mu}{\sigma / \sqrt{n}} は標準正規分布に従った。しかし、\sigma を標本標準偏差 s で置き換えた統計量
は、自由度 n-1 のt分布に従う。t分布は正規分布より裾が重く、サンプルサイズが小さいほどその傾向が強い。
導出
自由度 n-1 のt分布の上側 \dfrac{\alpha}{2} 点を t_{\alpha/2}(n-1) とすると
\mu について整理すると
ここで s は不偏分散の平方根(n-1 で割る標本標準偏差)である。
分散既知の場合は正規分布の分位点 z_{\alpha/2} を使い、分散未知の場合はt分布の分位点 t_{\alpha/2}(n-1) を使う。サンプルサイズが大きくなると t分布は正規分布に近づくため、n \ge 30 では近似的に正規分布を使うこともある。
計算例
16人の学生のテスト点数を調べたところ、標本平均 65点、標本標準偏差 8点だった。母平均の 95%信頼区間を求める。
\bar{x} = 65、s = 8、n = 16、自由度 15 のt分布で t_{0.025}(15) = 2.131 より
95%信頼区間は (60.74, 69.26) となる。
信頼率と区間幅の関係
信頼区間の幅は、信頼率、分散、サンプルサイズによって決まる。分散既知の場合、区間幅は
となる。ここから以下のことがわかる。
- 信頼率を上げると(\alpha を小さく)→ z_{\alpha/2} が大きくなり → 区間幅が広がる
- サンプルサイズを増やすと → \sqrt{n} が大きくなり → 区間幅が狭まる
- 母分散が大きいと → 区間幅が広がる
信頼率を高くすると「真の値を含む確率」は上がるが、区間が広くなり推定の精度は下がる。このトレードオフがある。同じ信頼率で区間幅を狭くしたい場合は、サンプルサイズを増やす必要がある。
練習問題
\sigma = 4、n = 36、\bar{x} = 24、z_{0.025} = 1.96
\bar{x} = 0.52、s = 0.08、n = 10
区間幅 = 2 \times 1.96 \times \dfrac{5}{\sqrt{n}} \le 2 を解く。
したがって、n \ge 97 が必要。
まとめ
| 項目 | 説明 |
|---|---|
| 区間推定 | パラメータを区間として推定する方法 |
| 信頼区間 | 推定されたパラメータの範囲 |
| 信頼率 | 信頼区間が真の値を含む確率(例: 95%) |
| ケース | 母平均の信頼区間 |
|---|---|
| 分散既知 | \bar{X} \pm z_{\alpha/2} \dfrac{\sigma}{\sqrt{n}} |
| 分散未知 | \bar{X} \pm t_{\alpha/2}(n-1) \dfrac{s}{\sqrt{n}} |
Python実装
SciPyを使って信頼区間を計算する方法と、シミュレーションで信頼区間の意味を確認する。
import numpy as np
from scipy import stats
# === 信頼区間の計算例 ===
# 例1: 分散既知の場合
x_bar = 50
sigma = 10
n = 25
alpha = 0.05
z = stats.norm.ppf(1 - alpha/2) # z_0.025 = 1.96
se = sigma / np.sqrt(n)
ci_lower = x_bar - z * se
ci_upper = x_bar + z * se
print("=== 分散既知の場合 ===")
print(f"標本平均: {x_bar}, σ = {sigma}, n = {n}")
print(f"95%信頼区間: ({ci_lower:.2f}, {ci_upper:.2f})")
print()
# 例2: 分散未知の場合(t分布)
x_bar2 = 65
s = 8
n2 = 16
df = n2 - 1
t = stats.t.ppf(1 - alpha/2, df) # t_0.025(15)
se2 = s / np.sqrt(n2)
ci_lower2 = x_bar2 - t * se2
ci_upper2 = x_bar2 + t * se2
print("=== 分散未知の場合(t分布) ===")
print(f"標本平均: {x_bar2}, s = {s}, n = {n2}")
print(f"t_0.025({df}) = {t:.4f}")
print(f"95%信頼区間: ({ci_lower2:.2f}, {ci_upper2:.2f})")
print()
# === シミュレーション: 95%信頼区間の意味 ===
np.random.seed(42)
true_mu = 100 # 真の母平均
true_sigma = 15
n_sample = 20
n_sim = 1000
count_contain = 0
for _ in range(n_sim):
# 標本を抽出
data = np.random.normal(true_mu, true_sigma, n_sample)
sample_mean = data.mean()
sample_std = data.std(ddof=1)
# t分布で信頼区間を計算
t_val = stats.t.ppf(0.975, n_sample - 1)
margin = t_val * sample_std / np.sqrt(n_sample)
ci_low = sample_mean - margin
ci_high = sample_mean + margin
# 真の値を含むかチェック
if ci_low <= true_mu <= ci_high:
count_contain += 1
print("=== シミュレーション結果 ===")
print(f"真の母平均: μ = {true_mu}")
print(f"試行回数: {n_sim}")
print(f"信頼区間が真の値を含んだ回数: {count_contain}")
print(f"割合: {count_contain/n_sim*100:.1f}%")
print("(理論値: 95%)")
シミュレーションの結果、1000回の試行のうち約95%で信頼区間が真の母平均を含んでいる。これが「95%信頼区間」の意味である。