「それってあなたの感想ですよね？」～スプレッドシートでできる、A/Bテストの評価～


<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/fb898326-bc0c-d017-5a49-c5c3ff59bf7c.png' width=512>

## 読者ターゲット
- A/B テストの存在は知っている
- 効果検証が大事だと思っている
- スプレッドシートで検定したい

## これは何か
こんにちは。プロダクトマネージャーの門脇です。
みなさんは、
### 「施策Aと施策B、どちらが効果あるんだろう？」
と悩んだことはありませんか？例えば、
- 営業や採用のDMの文章はどっちのパターンが効果あるんだろう
- 広告はどっちのクリエイティブが効果あったんだろう

みたいな悩みです。いわゆる「A/Bテスト」という手法が利用されるやつです。

世間には、RやPythonを利用した検証手法が溢れていますし、私自身どちらも利用したことがあります。
が、今回は、スプレッドシート上で検定まで行ってみたいなと思い、やってみました。

### 今回のケース
- 以下のようにスプレッドシート上にまとめられたデータ
- 2つの手法が試され、それぞれのサンプルがコンバージョン（CV）あり、なし、のステータスを持つ
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/a089eda6-2afc-8338-d1db-28e3e55f5f05.png' width=512>



## 0. 検定とは
ざっくりいうと、「収集されたデータの差は偶然なのか、必然なのか？」を決めるための手法です

例えば、AとB、2つのパターンで作られたウェブサイトがあるとします
```
A に来た人2人のうち、1人が申し込み
B に来た人1人のうち、0人が申し込み
```

という状態だったとき、
「今後はAという方法でやればうまくいく！！Bを辞めて、Aだけやっていこう！！！」
としていいのでしょうか。


```
A に来た人100人のうち、80人が申し込み
B に来た人100人のうち、0人が申し込み
```

今度はどうでしょうか？なんかAのほうが良さそうですよね。
Bは辞めたほうが良さそうです。

では
```
A：100人のうち、20人が申し込み
B：100人のうち、13人が申し込み
```

の場合はどうでしょう...？
よくわからないですよね。。。

でも実際仕事していると、こんなことばかりではないでしょうか？

お察しの通り、検定を用いれば「観測されたデータの差が偶然なのか？」決めることができます。

## 1. 検定手法を決めよう
目的やデータの状態によって、取るべき手法が異なります
検定手法については非常にたくさんの方が解説してくださっています
（出典：[フローチャート](https://toukei.sozaiya-san.jp/basic_stats0) ）
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/16a3b81e-796e-f154-3acf-2646e09ed241.png' width=512>




今回は

- 「申し込んだ」「申し込まなかった」の割合の差が重要
- 対応なし（[※](http://d1.gmobb.jp/dcmydm7tk8jnp/ssp3.html)）

なので、
#### 「フィッシャー正確確率検定」
を採用します。（「カイ二乗検定」ではない理由は... [コクラン・ルール](https://biolab.sakura.ne.jp/statistics-5-percent.html))


## 2. 「正確確率検定」をやっていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/ce338649-2939-700e-1f92-e9834a75a7c2.png)
出典：[フィッシャーの正確確率検定](https://bellcurve.jp/statistics/course/23950.html)

こちらに従って、
1. 観測表を作る
2. 計算式に当てはめてPを求める
3. Pが0.05（有意水準）以下になるか見る

という流れで進めます。例えば、先の例であれば

|       | CVあり | CVなし | TOTAL | 
| ----- | ------ | ------ | ----- | 
| A     | 20     | 80     | 100   | 
| B     | 13     | 87     | 100   | 
| TOTAL | 33     | 167    | 200   | 

と表が作れるので、これに従ってPを求めます

#### スプレッドシートでやるには少し工夫が必要
最後の難関です。
スプレッドシートだと、途中の計算結果が大きくなりすぎてしまうと、エラーが起きます。
階乗の計算はFact()関数で出来ますが、残念ながらFact(170)までしか対応していません。
また、単にN=170以上のデータが扱えないというだけでなく、例えばfact(100)xfact(100)も数字がでかすぎるのでエラーになります。

これに対応するための計算の工夫はいくつかありますが、[単にこちらのサイト](http://aoki2.si.gunma-u.ac.jp/exact/fisher/getpar.html)などを利用するのがいい気がします

これによってP値を導き出し、これが<0.05であれば、「差がある」と言えることになります。
ちなみに私の場合、「差がない」という結果になったので、AもBも、もう少し継続して検証する、という意思決定になりました。もう少しして差がでなければ、もっと差が生まれそうな、大胆なことをやっていくだけです。


## 最後に
最も貴重な資源は時間であり、時間を最も有効に使うための手段は、仮説と検証だと考えています。
運や直感は大切ですが、それだけでは再現性がありません。
再現性とは成功確率そのものです。仮説検証に数時間の手間を取るだけで成功確率を上げ、自分やチームの失敗と疲弊を防げるのであれば、これを利用しない手はないかと思います。

# 参考

[【まとめ】統計解析。何からはじめて何をどうすればいい？レベル・目的に合わせて紹介](https://toukei.sozaiya-san.jp/basic_stats0)
[統計学の基準値の由来：5%有意水準，カイ二乗検定，相関係数の出典と引用](https://biolab.sakura.ne.jp/statistics-5-percent.html)
[フィッシャーの正確確率検定](https://bellcurve.jp/statistics/course/23950.html)
[両側検定と片側検定](https://bellcurve.jp/statistics/course/9319.html)
[Google Apps Scriptでスプレッドシートのカスタム関数を作る方法](https://tonari-it.com/gas-spreadsheet-user-function/)