Pythonを使用したABテストの実施の流れと前提になる統計学の知識

# 概要
この記事では、Pythonを使用した[ABテスト](https://ja.wikipedia.org/wiki/A/B%E3%83%86%E3%82%B9%E3%83%88)の実施の流れと前提になる統計学の知識について書く。
# 前提
## Webメディア
- ユーザーと店舗が存在するWebメディア。ex. 食べログ
- ユーザーはデバイスのIDによって識別される。ex. デバイスID:789836968368はAさんを表す。
- 店舗は店舗IDによって識別される。ex. 店舗ID:519836968368はa店を表す。
## データ
こんな[データ](https://docs.google.com/spreadsheets/d/1eh94UFiSOvbWZc7ohlyzf0K_RusJ8ROEL0al_LjgS8M/edit#gid=216039574&range=A1:D10001)があるとする。
- device_idはデバイスID
- shop_idは店舗ID
- groupは1がA群（施策を打った群）、0がB群（施策を打っていない群）。
- cv_flgはcvすれば1、そうでなければ0
- ユーザー・店舗間のCVは[独立](https://bellcurve.jp/statistics/course/6347.html)である。
    - この状態は、例えば以下のような事象が独立であるような状況である。
    - ユーザーAさんがa店をCVする。
    - ユーザーAさんがb店にCVする
    - ユーザーBさんがa店にCVする。
# 課題
- groupごと（A群B群ごとの）のCV数を比較して、施策を打った群でCV数が多かったのか、同じぐらいか、少なかったのかを特定したい。
- もし多かったのであれば、有効な施策として認識し、必要なタイミングで打ちたい。
# 分析方針
- A群・ユーザー・店舗数あたりCV数とB群・ユーザー・店舗数あたりCV数を比較して、その差が統計的に有意であるかどうかを判断したい。
- ~あたりCV数は比率であるため、2つの[母比率の差の検定](https://bellcurve.jp/statistics/course/18227.html)を使用したい。
# 2つの母比率の差の検定は使用できるのか?
- 2つの母比率の差の検定が前提としているのは、shop_id・device_id単位でのcv_flgがベルヌーイ母集団から得られたサンプルであること。
## ベルヌーイ母集団
- ベルヌーイ確率変数による集合。
- ベルヌーイ確率変数とは、0か1を取る変数でかつ1を取る確率がp、0を取る確率が1-pであるような変数のこと。
- この変数が互いに独立であるような集合がベルヌーイ母集団。
## cv_flgの集合はベルヌーイ母集団か?
- ユーザー・店舗間のCVは独立であると仮定しているので、ベルヌーイ母集団。
- note: 実際には、あるユーザーAがある店舗aをCVするなら、bもCVするという事象や、あるユーザーAがある店舗aをCVするなら、あるユーザーBもある店舗aをCVするといったように、ユーザー・店舗間のCVは相関するケース、即ち独立でないケースが多い。
# どんな仮説を立てると良いのか?
- 帰無仮説
    - A群・ユーザー・店舗数あたりCV数をp1、B群・ユーザー・店舗数あたりCV数をp2とおき、それらが等しくないとする。
- 対立仮説
    - それらが等しい。
# 検定統計量・その分布は?
- 2つの母比率の差の検定は平均値の差の検定と同様のプロセス。参考:[統計学 改訂版](https://www.yuhikaku.co.jp/books/detail/9784641053809)
- この検定においては、A群・B群の分布が以下に従うと仮定する。参考:[正規性の確認](https://bellcurve.jp/statistics/course/12931.html)
    - A群の母分布~N(μ_A, σ^2)
    - B群の母分布~N(μ_B, σ^2)
    - このとき、共通な分散σ^2はS^2と推定する。
- 検定統計量は以下のようになる。
- T = (XA平均 - XB平均) / (S√(1/m) + (1/n))
- 参考:[4.平均値の差の検定(2標本のｔ検定)](https://www.aoni.waseda.jp/abek/document/t-test.html#:~:text=%E3%81%93%E3%81%A1%E3%82%89%E3%82%92%E5%8F%82%E7%85%A7-,4.%E5%B9%B3%E5%9D%87%E5%80%A4%E3%81%AE%E5%B7%AE%E3%81%AE%E6%A4%9C%E5%AE%9A(2%E6%A8%99%E6%9C%AC%E3%81%AE%EF%BD%94%E6%A4%9C%E5%AE%9A),-%E3%82%B9%E3%83%81%E3%83%A5%E3%83%BC%E3%83%87%E3%83%B3%E3%83%88%E3%81%AEt)
- mはA群のサンプルサイズ、nはB群のサンプルサイズ。
# 母比率の差の検定統計量・その分布は?
- 平均の差の検定に考えてきたが、元々は母比率の差の検定。
- ベルヌーイ確率変数の分散S^2は以下。
- S^2 = p(1-p) 参考:[ベルヌーイ分布](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E5%88%86%E5%B8%83)
- pを以下のように推定する。
- p^ = (ΣXA + ΣXB) / (m + n)
- とすると母比率の差の検定統計量は以下のようになる。
- Z = (XA平均 - XB平均) / √p^(1-p^)√(1/m) + (1/n)
- 参考:[比率の検定・独立性の検定](https://www.aoni.waseda.jp/abek/document/chi-test.html)
- Zの分布は観測個数が十分大きければ、帰無仮説の下で標準正規分布に従うことがわかっている。参考:[サンプルサイズの設計と検出力分析](https://bellcurve.jp/statistics/course/12769.html)
# どう統計的に判断するか?
1. 帰無仮説を確認する ex. p1 = p2
1. 有意水準を定める ex. α = 0.05
1. Zを計算する
1. Zが棄却域に含まれるかどうかを確認する
1. 含まれていればp1 = p2ではない、即ちp1 > p2で施策は有効と判断できる。
1. 含まれていなければp1 = p2ではない、即ちp1 > p2で施策は有効と判断できる。
# Pythonでどのように実装する?
## [データ](https://docs.google.com/spreadsheets/d/1eh94UFiSOvbWZc7ohlyzf0K_RusJ8ROEL0al_LjgS8M/edit#gid=0)
## 実装
- [データ準備](https://github.com/atsushimemet/proportions_ztest/blob/main/notebook/device_shop_cross_join.ipynb)
- [検定](https://github.com/atsushimemet/proportions_ztest/blob/main/notebook/proportions_ztest.ipynb)
# 参考資料
- [統計的仮説検定における効果量の概念と必要サンプルサイズの算出](https://note.com/dd_techblog/n/n73eca35106c7)