カイ二乗検定とベイジアンA/Bテスト

ここでは A/Bテストの基本の解説から、カイ二乗検定の解説、さらにカイ二乗検定のメタアナリシスを解説し、ベイジアンA/Bテストにも触れて見たいと思います。

# 1. A/Bテストとは
あるパーソナライズされた動線改善や機能、視覚効果など二つのパターン用意し、同様のユーザーを半分づつに振り分けて「どちらの方がより高いCTR、CVRを得られるか」を検証する方法です。

Control group（対照群、統制群）とTreatment group（介入群、処置群）の２群の差を確認していきます。

# 2. カイ二乗検定
## 2-1. 期待度数と観測度数
例えば、ウェブサイトのデザインを検討するためのABテストを実施していて、以下のようなデータが得られたとします。

表2-1

|       |ボタン押した|押さなかった |合計   |
|:------|:--------|:--------|:----:|
|デザイン1|70       |180       |250|
|デザイン2|30       |120       |150|
|合計    |100      |300       |400|

デザイン1がいいのか、デザイン2がいいのか、あるいは「どちらでもいい」のか、どう判定すればいいでしょうか？

## 2-2. 仮説を検討してみる
二つのデザインに差があるのかどうかを検証するにあたって、比較検定の際の流れは以下になります。

1. まず、帰無仮説「差はない」を立てる
2. 次に、帰無仮説を採択するか、棄却するかを決める
3. 帰無仮説を採択した場合は、「差はない」と結論する
4. 帰無仮説を棄却した場合は、対立仮説を採択し、「差はないとはいえない、つまり差はある」と結論する

帰無仮説として「ボタンの押されやすさに差はない」という仮説を立てます。
「両デザインともまったく同じ割合でボタンが押される」としたときの、押した人数をだしてみましょう。そこで、帰無仮説による人数と実際の人数がそれほど変わらなければ、帰無仮説を採択し、差はないと結論することになります。

## 2-3. 期待度数を計算する
両デザインで、ボタンの押されやすさが同じ割合とします。

表2-2

|       |ボタン押した|押さなかった |合計   |
|:------|:--------|:--------|:----:|
|デザイン1|?       |?       |250|
|デザイン2|?       |?       |150|
|合計    |100      |300       |400|

上の表のように合計押下人数だけをみると、それぞれのデザインの合計押下人数の割合は、
デザイン1　：　250/400=5/8
デザイン2　：　150/400=3/8 　になります。

ですから、同じ割合でデザイン1、２のボタン押下人数はそれぞれ
デザイン1　：　100×5/8=62.5
デザイン2　：　100×3/8=37.5 　になります。

なので、ボタンを押さなかった人数は
デザイン1　：　300×5/8=187.5
デザイン2　：　300×3/8=112.5 　になります。

表2-3

|       |ボタン押した|押さなかった |合計   |
|:------|:--------|:--------|:----:|
|デザイン1|62.5     |187.5    |250|
|デザイン2|37.5     |112.5    |150|
|合計    |100      |300      |400|

この値を「**期待度数**」と呼びます。これは、帰無仮説、つまり「両者の割合に差がない」が成立したときに、期待される度数ということです。
しかし、実際の度数を「**観測度数**」と呼びます。つまり、実際に観測された度数ということです。

## 2-4. データと期待度数との差を求める
元データと期待度数の違いを、以下の式を使って計算します。

```math
  \frac{(元データ−期待度数)^2}{期待度数}  

```
これをカイ２乗値と呼びます。カイというのは、ギリシャ文字で「χ」と書きます。

例えばデザイン1のボタンを押した人数はこうなっていました。
元データ：70人、期待度数：62.5人

よって、以下のように計算できます。

```math
　\frac{(70−62.5)^2}{262.5}=0.9
```

これをすべて計算したら、以下の表のようになります。

期待度数との差の表

|          |ボタン押した|押さなかった|
|:---------|:--------|:----:|
|デザイン1   |0.9      |0.3|
|デザイン2   |1.5      |0.5|

## 2-5. χ二乗値を求める
χ二乗値は、上で計算した表の中身を足し合わせるだけです。

0.9+0.3+1.5+0.5=3.2
というわけで、3.2となりました。

カイ２乗値＝（（（観測度数－期待度数）の２乗）÷期待度数）の総和

この式からわかることは、

- 期待度数と観測度数が完全に一致すれば、カイ２乗値はゼロになる
- 逆に、不一致（ずれ）が大きくなれば、カイ２乗値は大きな値になる

ということです。

期待度数は「**もし関係が無かったら、きっとこうなるだろうという回数**」のことです。なので、**χ二乗値が大きければ「デザインの違いとボタンの押されやすさには関係がありそうだ」とみなすことができる**わけです。

## 2-6. カイ２乗分布
横軸にカイ２乗値を取り、縦軸に確率密度を取ると、次のようなカイ２乗分布が描けます。
![chi2.jpg](https://qiita-image-store.s3.amazonaws.com/0/199265/9227181b-64d4-ae95-591a-904f6cfaff9e.jpeg)

確率密度というのは、たとえば横軸3のところで切った右側の面積が「カイ２乗値が3以上になる確率」になるように決めたものです。

これを見ると、カイ２乗値がゼロに近づくほど、急激に確率が大きくなっていくことかわかります。逆にカイ２乗値が大きくなると、確率は非常に小さくなることがわかります。

また、一般的に、行と列がある二次元の表の場合は、
自由度＝（行の数－1）×（列の数－1）
となります。この例では自由度は1のカイ２乗分布に従っているとみなせます。

## 2-7. χ二乗値をp値に変換する
χ二乗値が大きければ「デザインの違いと押されやすさには関係がありそうだ」とみなすことができることがわかりました。
次の問題は「χ二乗値がいくらであれば、大きいと判断できるか」という基準を定めることです。
そこで、「統計的仮説検定」という枠組みが使われます。

χ二乗値を計算すると、p値と呼ばれる値に変換できます。
χ二乗値が大きくなれば、p値は小さくなります。
そして、p値は基準が定まっています。p値は0.05を下回れば小さいとみなす、と伝統的に決まっています。

というわけで、

1. χ二乗値をp値に変換する
2. χ二乗値が大きければ、p値は小さくなる
3. p値が0.05を下回るくらい小さければ、χ二乗値は十分大きいといえる

上記の3ステップを踏むことで、χ二乗値の大小判定ができます。

この例では、p値=0.074であり、0.05を上回ってしまいました。
このときは「デザインの違いと押されやすさには、有意な関係があるとは言えない」ということになります。

## 2-8． χ二乗検定の考え方
まとめると、χ二乗検定では、以下のステップを踏んで検定を行います。

1. データをクロス集計表にまとめる
2. 期待度数（もし関係が無かったら、きっとこうなるだろうという回数）を求める
3. データと期待度数との差を求める（この差が大きければ、関係ありとみなせそう）
4. χ二乗値を求める
5. χ二乗値をp値に変換する
6. p値を解釈する

# 3. カイ二乗検定のメタアナリシス
次に、「あるデザイン改善を4つの異なるeコマースサイトで行った」ケースを想定します。単一のABテストの判定は、上記で見てきたカイ二乗検定で判定可能ですが、4つの eコマースサイトは独立した事業者であるため、統一したアクセス解析はできないと仮定すと、別の手段を検討する必要が生じます。

そこで、ここでは**カイ二乗検定のメタアナリシス**を導入します。
また、ここでは介入が統計的に有意な差が出るかどうかをRを利用してカイ二乗検定で検証します。

## 3-1. 解析サンプル
ここでは、アクセス解析の結果からいわゆる2×2分割表として以下の集計データが得られたとします。

サイトA

|     |非CV|CV|
|:---:|:---:|:---:|
|改善なし|250|125|
|改善あり|300|180|

サイトB

|     |非CV|CV|
|:---:|:---:|:---:|
|改善なし|1500|650|
|改善あり|1200|620|

サイトC

|     |非CV|CV|
|:---:|:---:|:---:|
|改善なし|600|300|
|改善あり|550|310|

サイトD

|     |非CV|CV|
|:---:|:---:|:---:|
|改善なし|2200|1050|
|改善あり|1300|700|

## 3-2. データ作成
まずは行列データとして作成

```python
d1= matrix(c(250,125,300,180),ncol=2,byrow=T)
d2 = matrix(c(1500,650,1200,620),ncol=2,byrow=T)
d3 = matrix(c(600,300,550,310),ncol=2,byrow=T)
d4 = matrix(c(2200,1050,1300,700),ncol=2,byrow=T)
d1
```

<img width="74" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/199265/a91b2bcf-1c0a-62cb-1d8b-676d0513f553.png">

```python
d2
```

<img width="70" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/199265/e9f74e33-250f-e158-d838-0b2eb321f7c0.png">

```python
d3
```

<img width="66" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/199265/1e7fc0c2-7841-2c35-557e-b215fdc1f8b1.png">

```python
d4
```

<img width="78" alt="04.png" src="https://qiita-image-store.s3.amazonaws.com/0/199265/9dc1d33e-ce98-0aee-5284-7215cd56daf5.png">

## 3-3. カイ二乗検定
一般に2×2分割表で表せるデータに対する効果検証の類は
「独立性の検定」即ちカイ二乗検定で行うことができます.

```python
chisq.test(d1)
```

Pearson's Chi-squared test with Yates' continuity correction

data:  d1
X-squared = 1.4164, df = 1, p-value = 0.234

```python
chisq.test(d2)
```

Pearson's Chi-squared test with Yates' continuity correction

data:  d2
X-squared = 6.4822, df = 1, p-value = 0.0109

```python
chisq.test(d3)
```

Pearson's Chi-squared test with Yates' continuity correction

data:  d3
X-squared = 1.3122, df = 1, p-value = 0.252

```python
chisq.test(d4)
```

Pearson's Chi-squared test with Yates' continuity correction

data:  d4
X-squared = 3.9182, df = 1, p-value = 0.04777

### カイ二乗検定の考察
d1 p値＝0.234
d２ p値＝0.0109
d３ p値＝0.252
d４ p値＝0.04777
有意水準p < 0.05とした場合、
サイトAは有意でない、Bは有意、Cは有意でない、Dは有意
という結果になります。

これでは「改善が有効だったか否か」は分かっても、全体として本当に動線改善の効果があったかどうかは何とも言えません。

## 3-4. Cochran-Mantel-Haenszel 検定

異なる時間または場所で繰り返された2×2テーブルのデータがある場合は、
**Cochran-Mantel-Haenszel検定**(以下、CMH検定)を使用します.

前提：独立した2×2のテーブルが複数あること
リピート全体で一定の割合の比率があるかどうかを教えてくれます.

このように2×2の独立性テストで4つの数字にラベルを付けます。
　a　　b
　c　　d
と（a + b + c + d）= nとすると、**Cochran-Mantel-Haenszel検定統計量**の式を次のように書くことができます.

```math
\chi_{MH} = \frac{([\sum_i (  a - \frac{ (a + b)(a + c) }{n} ) ] - 0.5)^2 }{ \sum_i ( \frac{(a + b)(a + c)(b + d)(c + d)}{n^3-n^2} )}
```

分子は、1つのセル（ a ）の観測値と帰無仮説 （a+b）（a+c）/n の期待値との差の絶対値を含むので、分子は偏差の平方和観測値と期待値の間にあります.

**どのように2×2テーブルを配置するかは関係ありません。**4つの値のいずれかをaとして使用できます.連続性補正として0.5を引いています.分母には​​、二乗差の分散の推定値が含まれています.

- 検定統計量 χMH は、観察されたと期待値との差が大きくなるにつれて大きくなる
- 自由度1のカイ二乗分布である。
- CMH検定の式は、異なる出典によって異なる形で示されていますが、それらはすべて代数的に同等.
- ここで示した式には、連続性補正（分子で0.5を引く）が含まれています。これにより、P値がより正確になるはず.

```{r}
e1<-function(x){
      x[1,1]-(x[1,1]+x[1,2])*(x[1,1]+x[2,1])/sum(x)
}
e2<-function(x){
     ((x[1,1]+x[1,2])*(x[1,1]+x[2,1])*(x[1,2]+x[2,2])*(x[2,1]+x[2,2]))/(sum(x)^3-sum(x)^2)
}

numerator = ((e1(d1)+e1(d2)+e1(d3)+e1(d4))-0.5)^2
denominator = (e2(d1)+e2(d2)+e2(d3)+e2(d4))
chi2 = numerator / denominator
```

Rで計算するには、全確率1からpchisqを引きます。

```{r}
degree = 1 # 自由度1のカイ二乗分布
1-pchisq(chi2,degree)
```

0.000298872675311923

この例では、有意水準をp < 0.05に置く限りは
「4サイト共通の改善の効果は有意に見られる」
と言える.

## 3-5. metafor パッケージによる検定
CRAN
https://cran.r-project.org/
には{metafor}というメタアナリシスに特化したパッケージがあります.

rma.mh関数で、簡単にCMH 検定testの計算ができます.

```{r}
install.packages('metafor')
library(metafor)
rma.mh(c(d1[1,1],d2[1,1],d3[1,1],d4[1,1]),
       c(d1[1,2],d2[1,2],d3[1,2],d4[1,2]),
       c(d1[2,1],d2[2,1],d3[2,1],d4[2,1]),
       c(d1[2,2],d2[2,2],d3[2,2],d4[2,2]))
```

Fixed-Effects Model (k = 4)

Test for Heterogeneity: 
Q(df = 3) = 0.4987, p-val = 0.9192

Model Results (log scale):

estimate      se    zval    pval   ci.lb   ci.ub
  0.1437  0.0395  3.6361  0.0003  0.0662  0.2212

Model Results (OR scale):

estimate   ci.lb   ci.ub
  1.1546  1.0685  1.2476

Cochran-Mantel-Haenszel Test:    CMH = 13.0774, df = 1, p-val = 0.0003
Tarone's Test for Heterogeneity: X^2 =  0.4987, df = 3, p-val = 0.9192

### rma.mh 実行結果の考察
Cochran-Mantel-Haenszel Test:の欄を確認すると、

CMH = 13.0774, 
df(degree of freedom:自由度) = 1
p-val = 0.0003< 0.05 となり「効果は有意に見られる」ことを確認できます。

そもそもこのようなメタアナリシスを行って良いかどうかの指標にもなります。
heterogeneityのチェックもできます。以下ではこのheterogeneityについて見ていきます。

## 3-6. 異質性 (heterogeneity)
異質性(heterogeneity)とは、簡単に言えばメタ解析の結果のバラつき具合のこと

Test for Heterogeneity: 
Q(df = 3) = 0.4987, p-val = 0.9192
コクランのQ検定はp値が小さいほど異質性が高いとみなされます。

## 参考文献
[1]Cochran–Mantel–Haenszel test for repeated tests of independence
http://www.biostathandbook.com/cmh.html

[2]Rで実践する統計的検定の初歩
http://www.atmarkit.co.jp/ait/articles/1008/04/news090_2.html

[3]CRAN - The Comprehensive R Archive Network
https://cran.r-project.org/

[4]メタ解析の異質性(heterogeneity)について知る　
https://ameblo.jp/intelligent-pharmacist/entry-12123408452.html

[5]メタ・アナリシスの入門
https://www.slideshare.net/YoshihikoKunisato/ss-37490113

[6]明日から読めるメタ・アナリシス
https://www.slideshare.net/okumurayasuyuki/meta-analysis-okumura