「新しいWebサイトのデザインに変えたら、コンバージョン率は本当に上がったのか?」「世論調査で内閣支持率が50%を下回ったとニュースになったが、統計的に有意な変化なのか?」――このように、ある割合(比率)が特定の値と異なるか、あるいは2つの集団の比率に差があるかを判断する場面は、ビジネスや社会調査で頻繁に登場する。
こうした問題に答える手法が母比率の検定である。Z検定が正規分布の母平均を対象とするのに対し、母比率の検定は二項分布に従うデータを扱う。サンプルサイズが十分大きいとき、中心極限定理によって標本比率は近似的に正規分布に従うため、検定統計量として標準正規分布を利用できる。
本記事では、1つの母比率を基準値と比較する1標本の検定と、2つの母比率の差を検定する2標本の検定の両方を扱う。
1標本の母比率の検定
試行回数 n、成功確率 \theta の二項分布に従う確率変数 X を考える。
与えられた値 \theta_0 に対して、帰無仮説 H_0: \theta = \theta_0 を検定する。成功確率の最尤推定量は標本比率 \hat{\theta} = \dfrac{X}{n} である。
検定統計量
n が十分大きいとき、中心極限定理より \hat{\theta} は近似的に平均 \theta、分散 \dfrac{\theta(1-\theta)}{n} の正規分布に従う。帰無仮説のもとでこれを標準化すると、検定統計量
は近似的に標準正規分布 N(0, 1) に従う。
有意水準 \alpha に対する棄却条件は次の通り。
右側検定 (H_1: \theta > \theta_0):Z \geq z_{\alpha}
左側検定 (H_1: \theta < \theta_0):Z \leq -z_{\alpha}
両側検定 (H_1: \theta \neq \theta_0):|Z| \geq z_{\alpha/2}
正規近似が十分に正確であるためには、n\theta_0 \geq 5 かつ n(1 - \theta_0) \geq 5 が目安とされる。この条件を満たさない場合は、二項分布に直接基づく正確検定(二項検定)を使用する。
計算例:1標本の母比率の検定
ある企業が「当社の顧客満足度は80%である」と主張している。これを検証するために200人の顧客を無作為に調査したところ、150人が「満足」と回答した。この企業の主張は正しいと言えるか、有意水準5%で両側検定を行え。
解答
ステップ1:仮説の設定
ステップ2:標本比率の計算
ステップ3:検定統計量の計算
ステップ4:棄却域との比較
有意水準5%の両側検定では、臨界値は z_{0.025} = 1.96 である。
ステップ5:結論
|Z| = 1.768 は棄却域に入らないので、帰無仮説を棄却しない。有意水準5%では「顧客満足度は80%ではない」とは言えない(P値 = 0.077)。
母比率の信頼区間
検定統計量の分母にある \theta_0 を \hat{\theta} に置き換えた
も n \to \infty のとき標準正規分布に収束することが示される。|u| \leq z_{\alpha/2} を \theta について解くと、信頼係数 1 - \alpha の信頼区間
が得られる。先ほどの例題では
より、\theta の95%信頼区間は [0.690, 0.810] となる。この区間は \theta_0 = 0.80 を含んでおり、帰無仮説が棄却されなかったことと整合する。
母比率の差の検定
次に、2つの母集団の比率が等しいかどうかを検定する問題を考える。Webマーケティングにおける A/Bテストや、2つの治療法の有効率の比較がこれにあたる。
設定
試行回数 n_1、成功確率 \theta_1 の二項分布に従う X_1 と、試行回数 n_2、成功確率 \theta_2 の二項分布に従う X_2 が独立に観測される。帰無仮説 H_0: \theta_1 = \theta_2 の検定を行いたい。ここで帰無仮説における \theta_1 (= \theta_2) の値そのものは指定されていないこと、すなわちこの共通の値は局外パラメータであることに注意する。
方法1:各群の推定値を使用
最尤推定量 \hat{\theta}_i = \dfrac{X_i}{n_i} を用いる。中心極限定理より \hat{\theta}_1 - \hat{\theta}_2 の平均は \theta_1 - \theta_2、分散は \dfrac{\theta_1(1-\theta_1)}{n_1} + \dfrac{\theta_2(1-\theta_2)}{n_2} であるから、帰無仮説のもとで
は近似的に標準正規分布に従う。
方法2:プール推定量を使用
帰無仮説のもとでは \theta_1 = \theta_2 であるから、この共通の値をプール推定量
で推定し、検定統計量を
とする。漸近的には2つの方法は等価である。
検定では帰無仮説 \theta_1 = \theta_2 を前提とするため、プール推定量を用いるのが自然である。一方、\theta_1 - \theta_2 の信頼区間を求める場合は各群の推定値をそのまま用いる。
母比率の差の信頼区間
\theta_1 - \theta_2 の信頼係数 1 - \alpha の信頼区間は
で与えられる。
計算例:母比率の差の検定
ある ECサイトで2つの広告デザイン A, B の効果を比較したい。デザインAを500人に表示したところ135人がクリックし、デザインBを400人に表示したところ80人がクリックした。2つのデザインのクリック率に差があると言えるか、有意水準5%で検定せよ。
解答
ステップ1:仮説の設定
ステップ2:標本比率の計算
ステップ3:プール推定量の計算
ステップ4:検定統計量の計算
ステップ5:棄却域との比較
ステップ6:結論
帰無仮説を棄却する。有意水準5%で「2つのデザインのクリック率には差がある」と結論できる(P値 = 0.014)。デザインAのクリック率がデザインBより高い。
参考として、\theta_1 - \theta_2 の95%信頼区間を方法1(各群の推定値を使用)で求めると
すなわち [0.015, 0.125] であり、0を含まないことからも有意差があることが確認できる。
練習問題
仮説:H_0: \theta = 0.5 vs H_1: \theta \neq 0.5
標本比率:\hat{\theta} = \dfrac{60}{100} = 0.60
検定統計量:
|Z| = 2.000 > 1.96 なので、帰無仮説を棄却する。
結論:有意水準5%で、このコインは公正ではないと言える(P値 = 0.046)。
標本比率:\hat{\theta}_1 = \dfrac{52}{80} = 0.650、\hat{\theta}_2 = \dfrac{45}{90} = 0.500
プール推定量:\hat{\theta}_* = \dfrac{52 + 45}{80 + 90} = \dfrac{97}{170} = 0.5706
標準誤差:
検定統計量:
|Z| = 1.972 > 1.96 なので、帰無仮説を棄却する。
結論:有意水準5%で、2つの薬の有効率には差があると言える(P値 = 0.049)。ただし、P値が0.05にきわめて近いため、結論には慎重を期す必要がある。
まとめ
| 項目 | 1標本 | 2標本 |
|---|---|---|
| 目的 | 比率が基準値と異なるか | 2群の比率に差があるか |
| 帰無仮説 | \theta = \theta_0 | \theta_1 = \theta_2 |
| 検定統計量 | \dfrac{\hat{\theta} - \theta_0}{\sqrt{\theta_0(1-\theta_0)/n}} | \dfrac{\hat{\theta}_1 - \hat{\theta}_2}{\sqrt{(1/n_1 + 1/n_2)\hat{\theta}_*(1-\hat{\theta}_*)}} |
| 帰無仮説下の分布 | 標準正規分布 N(0, 1)(近似) | |
| 臨界値(両側5%) | ±1.96 | |
| 適用条件 | n\theta_0 \geq 5、n(1-\theta_0) \geq 5 | 各群で同様の条件 |
Python実装
SciPyを使って検定統計量とP値を計算できる。なお、statsmodelsの proportions_ztest は1標本の場合に分母で \hat{\theta}(1 - \hat{\theta}) を使うWald統計量を計算するため、本記事のスコア統計量(分母に \theta_0(1 - \theta_0) を使用)とは値がやや異なる点に注意する。
import numpy as np
from scipy import stats
# ========== 1標本の母比率の検定 ==========
print("【1標本の母比率の検定】")
print("H₀: θ = 0.80 vs H₁: θ ≠ 0.80")
n, x, theta_0 = 200, 150, 0.80
theta_hat = x / n
print(f"n = {n}, x = {x}, θ̂ = {theta_hat}")
print()
# スコア検定統計量(分母にθ₀を使用)
z = (theta_hat - theta_0) / np.sqrt(theta_0 * (1 - theta_0) / n)
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
print(f"検定統計量 Z = {z:.4f}")
print(f"P値(両側)= {p_value:.4f}")
# 信頼区間(分母にθ̂を使用)
z_crit = stats.norm.ppf(0.975)
ci_lower = theta_hat - z_crit * np.sqrt(theta_hat * (1 - theta_hat) / n)
ci_upper = theta_hat + z_crit * np.sqrt(theta_hat * (1 - theta_hat) / n)
print(f"95%信頼区間: [{ci_lower:.4f}, {ci_upper:.4f}]")
print(f"結論: 帰無仮説を棄却しない")
print()
print("=" * 50)
print()
# ========== 2標本の母比率の差の検定 ==========
print("【母比率の差の検定】")
print("H₀: θ₁ = θ₂ vs H₁: θ₁ ≠ θ₂")
n1, x1 = 500, 135
n2, x2 = 400, 80
theta1, theta2 = x1 / n1, x2 / n2
print(f"A: n₁ = {n1}, x₁ = {x1}, θ̂₁ = {theta1}")
print(f"B: n₂ = {n2}, x₂ = {x2}, θ̂₂ = {theta2}")
print()
# プール推定量による検定
theta_pool = (x1 + x2) / (n1 + n2)
se_pool = np.sqrt((1/n1 + 1/n2) * theta_pool * (1 - theta_pool))
z_pool = (theta1 - theta2) / se_pool
p_pool = 2 * (1 - stats.norm.cdf(abs(z_pool)))
print(f"プール推定量 θ̂* = {theta_pool:.4f}")
print(f"検定統計量 Z = {z_pool:.4f}")
print(f"P値(両側)= {p_pool:.4f}")
# 差の信頼区間(各群の推定値を使用)
se_ind = np.sqrt(theta1*(1-theta1)/n1 + theta2*(1-theta2)/n2)
diff = theta1 - theta2
ci_l = diff - z_crit * se_ind
ci_u = diff + z_crit * se_ind
print(f"差の95%信頼区間: [{ci_l:.4f}, {ci_u:.4f}]")
print(f"結論: 帰無仮説を棄却(有意差あり)")