世論調査で「内閣支持率は43%」と報道されるとき、この数字は標本から計算された標本比率である。真の支持率(母比率)はどの範囲にあると考えられるだろうか?
母平均の信頼区間では母平均の信頼区間を、分散の区間推定では母分散の信頼区間を扱った。本記事では、母比率(母集団における「成功」の割合)の信頼区間を導出する。さらに、複数カテゴリがある場合の多項分布における各比率と、比率の差の信頼区間についても解説する。
母比率の区間推定
母比率 p の母集団から n 個の標本を抽出し、そのうち X 個が「成功」であったとする。このとき X は二項分布 \text{Bin}(n, p) に従う。
正規近似による導出
標本比率を \hat{p} = \dfrac{X}{n} とする。中心極限定理により、n が十分大きいとき、\hat{p} は近似的に正規分布に従う:
したがって、統計量
は近似的に標準正規分布 N(0, 1) に従う。信頼区間を構成するには、未知の p を標本比率 \hat{p} で置き換えた
を用いる。P(-1.96 \le Z \le 1.96) = 0.95 より、p について整理すると
一般に、信頼率 1 - \alpha の信頼区間は
となる。ここで \sqrt{\dfrac{\hat{p}(1-\hat{p})}{n}} は標本比率の標準誤差(standard error)である。
正規近似が妥当となる目安として、n\hat{p} \ge 5 かつ n(1-\hat{p}) \ge 5 が用いられることが多い。\hat{p} が0や1に近い場合や n が小さい場合は、二項分布の正確な信頼区間(Clopper-Pearson法など)を使うべきである。
計算例
200人にアンケートを行い、70人が「賛成」と回答した。母比率(母集団で賛成する人の割合)の95%信頼区間を求める。
n = 200、x = 70 より、標本比率は \hat{p} = \dfrac{70}{200} = 0.35 である。
母比率の95%信頼区間は (0.284, 0.416)、すなわち約28%〜42%となる。
多項分布の信頼区間
結果が2つ以上のカテゴリに分かれる場合、多項分布を用いる。k 個のカテゴリがあり、カテゴリ i が生起する確率を p_i(\sum_{i=1}^{k} p_i = 1)とする。
n 回の試行でカテゴリ i が N_i 回生起したとき、(N_1, N_2, \ldots, N_k) は多項分布に従う。
各カテゴリの比率の信頼区間
特定のカテゴリ i に着目すると、「カテゴリ i が生起するか否か」の2値となり、N_i は二項分布 \text{Bin}(n, p_i) に従う。したがって、各 p_i の信頼区間は母比率の場合と同じ公式で求められる:
ただし \hat{p}_i = \dfrac{N_i}{n}
計算例
400人に好きな季節を聞いたところ、春160人、夏120人、秋80人、冬40人だった。各季節の母比率の95%信頼区間を求める。
| 季節 | 人数 | \hat{p}_i | 標準誤差 | 95%信頼区間 |
|---|---|---|---|---|
| 春 | 160 | 0.400 | 0.0245 | (0.352, 0.448) |
| 夏 | 120 | 0.300 | 0.0229 | (0.255, 0.345) |
| 秋 | 80 | 0.200 | 0.0200 | (0.161, 0.239) |
| 冬 | 40 | 0.100 | 0.0150 | (0.071, 0.129) |
比率の差の信頼区間
多項分布において、2つのカテゴリの比率の差 p_1 - p_2 の信頼区間を求めたい場合がある。例えば「春が好きな人と夏が好きな人の割合の差」などである。
共分散の考慮
多項分布では、カテゴリ間に負の相関がある。あるカテゴリの度数が増えれば、他のカテゴリの度数は減るためである。N_1 と N_2 の共分散は
となる。したがって、\hat{p}_1 - \hat{p}_2 の分散は
となる。共分散が負なので、差の分散は各分散の和より大きくなる点に注意。
計算例
先ほどの季節の例で、「春が好きな人の割合」と「夏が好きな人の割合」の差の95%信頼区間を求める。
\hat{p}_1 = 0.40、\hat{p}_2 = 0.30、n = 400 より
95%信頼区間は (0.019, 0.181) となる。この区間は0を含まないため、春と夏の選好には有意な差があると言える。
多項分布では同じ n 人から複数カテゴリを観測するため、カテゴリ間に負の相関がある。一方、独立な2つの母集団からそれぞれ標本を抽出して比率を比較する場合は、共分散項がなくなる。目的に応じて適切な公式を使い分ける必要がある。
必要サンプルサイズの設計
信頼区間の幅を特定の値以下にするために必要なサンプルサイズを求めることができる。信頼区間の幅は
である。\hat{p}(1-\hat{p}) は \hat{p} = 0.5 のとき最大値 0.25 をとる。事前に p の値がわからない場合は、最も保守的な p = 0.5 を仮定して計算する。
区間幅を w 以下にしたい場合、必要サンプルサイズは
で求められる。p = 0.5、95%信頼区間、区間幅 4%(0.04)の場合:
約2400人のサンプルが必要となる。
練習問題
n = 300、x = 120、\hat{p} = 0.40
事前情報がない場合は p = 0.5(最も保守的)を仮定する。
2401人以上のサンプルが必要。
\hat{p}_A = 0.36、\hat{p}_B = 0.24、n = 500
95%信頼区間は (0.053, 0.187)。0を含まないので、AとBの選好には有意な差がある。
まとめ
| 推定対象 | 95%信頼区間 |
|---|---|
| 母比率 p | \hat{p} \pm 1.96\sqrt{\dfrac{\hat{p}(1-\hat{p})}{n}} |
| 比率の差 p_1 - p_2 (多項分布) |
(\hat{p}_1 - \hat{p}_2) \pm 1.96\sqrt{\dfrac{\hat{p}_1(1-\hat{p}_1) + \hat{p}_2(1-\hat{p}_2) + 2\hat{p}_1\hat{p}_2}{n}} |
| 項目 | 説明 |
|---|---|
| 正規近似の条件 | n\hat{p} \ge 5 かつ n(1-\hat{p}) \ge 5 |
| 最大の標準誤差 | p = 0.5 のとき |
| 多項分布の共分散 | 負の値(-np_ip_j) |
Python実装
母比率と比率の差の信頼区間を計算する。
import numpy as np
from scipy import stats
def proportion_ci(x, n, alpha=0.05):
"""母比率の信頼区間(正規近似)
Parameters:
x: 成功数
n: 試行数
alpha: 有意水準(デフォルト0.05で95%信頼区間)
Returns:
(下限, 上限)のタプル
"""
p_hat = x / n
z = stats.norm.ppf(1 - alpha/2)
se = np.sqrt(p_hat * (1 - p_hat) / n)
return (p_hat - z * se, p_hat + z * se)
def proportion_diff_ci(n1, n2, n, alpha=0.05):
"""多項分布における比率の差の信頼区間
Parameters:
n1, n2: カテゴリ1, 2の度数
n: 総度数
alpha: 有意水準
Returns:
(下限, 上限)のタプル
"""
p1, p2 = n1/n, n2/n
diff = p1 - p2
z = stats.norm.ppf(1 - alpha/2)
# 共分散を考慮した分散
var = (p1*(1-p1) + p2*(1-p2) + 2*p1*p2) / n
se = np.sqrt(var)
return (diff - z * se, diff + z * se)
# === 計算例 ===
print("=== 母比率の信頼区間 ===")
# 例1: n=200, x=70
ci = proportion_ci(70, 200)
print(f"n=200, x=70 (p̂=0.35)")
print(f" 95%信頼区間: ({ci[0]:.3f}, {ci[1]:.3f})")
print()
# 例2: n=500, x=240
ci2 = proportion_ci(240, 500)
print(f"n=500, x=240 (p̂=0.48)")
print(f" 95%信頼区間: ({ci2[0]:.3f}, {ci2[1]:.3f})")
print()
print("=== 多項分布の各比率 ===")
# 季節の例: n=400
n = 400
seasons = {'春': 160, '夏': 120, '秋': 80, '冬': 40}
for season, count in seasons.items():
ci = proportion_ci(count, n)
print(f" {season}: {count}/400 = {count/n:.3f}, 95%CI: ({ci[0]:.3f}, {ci[1]:.3f})")
print()
print("=== 比率の差の信頼区間 ===")
# 春 vs 夏
ci_diff = proportion_diff_ci(160, 120, 400)
print(f"春(0.40) - 夏(0.30) = 0.10")
print(f" 95%信頼区間: ({ci_diff[0]:.3f}, {ci_diff[1]:.3f})")
if ci_diff[0] > 0 or ci_diff[1] < 0:
print(" → 0を含まない: 有意な差あり")
else:
print(" → 0を含む: 有意な差なし")
print()
print("=== 必要サンプルサイズ ===")
# 区間幅4%、p=0.5の場合
width = 0.04
p = 0.5
z = 1.96
n_required = (2 * z / width) ** 2 * p * (1 - p)
print(f"区間幅 {width*100:.0f}%、p=0.5 の場合")
print(f" 必要サンプルサイズ: {int(np.ceil(n_required))}")