母比率の信頼区間ではなく、母比率の差の信頼区間。
母比率の差とは
ここでは詳しい説明は省略。
下記サイトがわかりやすい。
なぜ求めたいのか
業務で「カイ二乗検定」や「母比率の差の検定」を行うことがしばしば。
有意差があるかという結論に注目するのはもちろん大事だけども、それに着目しているだけだと、効果量やバラツキ等が捉えづらい。
もう少し直感的にわかるようにしよう!という流れ。
母比率の信頼区間はライブラリで求められるようだけど、母比率の差の信頼区間はどうやらないみたい(1分調べ)。
Pythonで母比率の95%信頼区間を区間推定し、妥当なサンプルサイズを決定する方法
計算式も複雑ではないので、さくっと実装する。
計算式
(\hat{p_1} - \hat{p_2}) - z_\frac{\alpha}{2} \times \sqrt{\frac{\hat{p_1}(1 - \hat{p_1})}{n_1} + \frac{\hat{p_2}(1 - \hat{p_2})}{n_2}} \leq \hat{p_1} - \hat{p_2} \leq \\ (\hat{p_1} - \hat{p_2}) + z_\frac{\alpha}{2} \times \sqrt{\frac{\hat{p_1}(1 - \hat{p_1})}{n_1} + \frac{\hat{p_2}(1 - \hat{p_2})}{n_2}}
詳しい説明は先に紹介したサイトで解説している。
左式をlower bound、右式をupper boundと言ったりする。
lower boundとupper boundが0を跨いでなければ、有意な差があるといえる。
95%信頼区間の求め方とは?有意差との関連や1.96の意味と計算式まで
ソースコード
動きゃええやん教なので、雑なのはご愛敬。
2×2のクロス集計表をcsvで食べさせるイメージ。
購入 | 未購入 | |
---|---|---|
男 | 50 | 100 |
女 | 40 | 120 |
main.py
import csv
import numpy as np
# パラメータ
z = 1.96
# テストデータ読み込み
with open('test.csv') as f:
reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
d = [row for row in reader]
# 母比率を算出
p = [d[0][0]/sum(d[0]), d[1][0]/sum(d[1])]
# 95%信頼区間を算出
lb = (p[0]- p[1]) - z * np.sqrt(p[0] * (1 - p[0]) / sum(d[0]) + p[1] * (1 - p[1]) / sum(d[1]))
ub = (p[0]- p[1]) + z * np.sqrt(p[0] * (1 - p[0]) / sum(d[0]) + p[1] * (1 - p[1]) / sum(d[1]))
# 結果を出力
print('母比率の差の95%信頼区間: {:.3f} <= p1 - p2 <= {:.3f}'.format(lb, ub))
おわりに
ニッチだったかもしれないけど、便利なはず...。