Juliaによる統計的仮説検定 （p-value）とベイズABテスト

# TL;DR

A/Bテストの結果を統計的仮説検定（p値）とベイズ的アプローチ（事後分布）で比較しました。

比較郡同士のサンプルサイズを同じにした実験で無情報事前分布を利用した場合、**Aの事後分布とBの事後分布を比較する行為は統計的仮説検定と一致することが確認できました**（数式的な説明は今回は省いていますが、事後分布が正規分布に近似できる状態のため、全く同じ問題を解いていると考えられるためです）。

さらに、ベイズ的アプローチの場合は事前分布の選択が結果に影響するため、事前分布の設定には注意が必要であり結果の解釈が難しい可能性があることに触れました。

コードはこちらです。

https://github.com/makinzm/comparison-ab-test-on-julia/tree/main

# はじめに：A/Bテストとは

A/Bテストは、新しい施策（B案）が既存の施策（A案）に比べて、より高い成果（例：コンバージョン率、クリック率など）をもたらすかどうかを比較検証する手法です。ウェブサイトやアプリの改善、広告・プロモーションの効果測定、UI変更の有効性確認などでよく使われます。

一般的な流れとしては、ユーザをランダムにAとBの2群（もしくはそれ以上）に割り当て、一定期間のデータを集めた上で、両群の成果を統計的に比較します。そのときに統計的手法として代表的なのが「統計的仮説検定（通常のp値による検定など）」と「ベイズ的手法（事後分布を用いた確率的比較）」です。

- [A/Bテスト - Wikipedia](https://ja.wikipedia.org/wiki/A/B%E3%83%86%E3%82%B9%E3%83%88)

# 今回の実験例



実験では以下のような条件でA/Bテストデータが得られたとします。

- グループA: サンプル数 nA = 1000、成功数 successA = 120
- グループB: サンプル数 nB = 1000、成功数 successB = 110

これは、たとえばあるWebページAとBをそれぞれ1000人ずつに見せて、Aでは120人が望ましい行動（購入やクリックなど）をしたのに対し、Bでは110人がそれを行った、といった状況を表します。

AとBの「成功率」を計算すると  
- pA = 120 / 1000 = 0.12  
- pB = 110 / 1000 = 0.11

AはBよりもわずかに良さそうですが、この差は「統計的に有意」なのでしょうか？ そして確率的にAがBより優れていると言えるのでしょうか？


# 統計的仮説検定：p値と有意性検定

## 概要

統計的仮説検定は、「もし本当は差がない（帰無仮説：AとBより失敗する）としたら、これくらいの差はどれだけ稀に起きるのか？」をp値を使って評価します。p値が一定以下（例えば0.05未満）であれば「有意な差がある」と判断するのが一般的です。

- [p値 - Wikipedia](https://ja.wikipedia.org/wiki/P%E5%80%A4)

今回の例では、Z検定という方法を用いてp値が計算されました。その結果は以下のとおりです。

- 検定統計量 Z ≈ 0.7765
- p値 ≈ 0.2416

---

- [Z-test - Wikipedia](https://en.wikipedia.org/wiki/Z-test)

## 解釈

p値がおよそ0.24ということは、「AとBに真の差がないと仮定したとき、これくらいの観測された差（約0.01の差）が出る確率は約24%もある」ということを意味します。これはまったく珍しくないことなので、AとBの差が統計的に有意とは言えず、「AがBより良い」と断定する根拠には乏しい結果となります。

**メリット**
- 手続きが明快で、古くから使われている標準的な手法です。意思決定において「有意/非有意」でバシッと区切りたいときは便利です。

**デメリット**
- p値は「差がない」という仮定に基づいて差の大きさの稀さを示すもので、実務で知りたい「この結果が実際どれくらいAがBより優れている可能性があるか？」には直接答えません。
- p値はサンプルサイズや観測条件に強く依存し、解釈を誤ると誤った結論に至りやすいです（例：p-hackingなど）。

:::note info
p-hackingについては以下の資料が参考になります。

1. y0さんの記事：[Anti-p-hacking: どのように誤った統計的結論を回避するか、あるいは、誤りを受け入れるか？](https://zenn.dev/y0/articles/52e56058b8c07b)
1. [Head, Megan L., et al. "The extent and consequences of p-hacking in science." PLoS biology 13.3 (2015): e1002106.](https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.1002106&)

:::

# ベイズ的アプローチ：事後分布の比較

## 概要

一方、ベイズ的アプローチでは、事前分布（**A/B両群の真の成功率についての事前の信念**のようなもの）を定め、それに観測データを組み合わせることで事後分布を得ます。今回の例では、AとBの成功率をそれぞれBeta分布（事前はBeta(1,1)、つまり一様分布）でモデル化し、観測された成功数から事後分布をMCMCで推定します。そして、比較群同士の事後分布からサンプリングをし、どちらの方が値が大きくなるか比較しました。この手法を巷では、ベイズABテストと呼ぶこともあるようです。

:::note info

ベイズABテストについては以下の資料が参考になります。
- [Beginner’s guide to Bayesian AB testing | by Ibtesam Ahmed | Medium](https://medium.com/@ibtesamahmex/beginners-guide-to-bayesian-ab-testing-22f40988d5e6)
- 秋月さん [ABテスト効果検証 -Bayesian Testing- | MoT Lab (GO Inc. Engineering Blog)](https://lab.mo-t.com/blog/AB-test-effect)
- ak_iyamaさん [ベイジアンABテストってありなの? / Is Bayesian AB Testing Truly Effective? - Speaker Deck](https://speakerdeck.com/ak_iyama/b-testing-truly-effective)
- birdwatcherさん [ベイジアンABテストとABテストを比較してみる #統計学 - Qiita](https://qiita.com/birdwatcher/items/88bde66ccc2cd8ed59cd)
:::

**実行コード**  
コードはJulia言語とTuringパッケージを使い、`ab_model`というモデルを定義しています。このモデルは  
```julia
pA ~ Beta(1,1)
pB ~ Beta(1,1)
successA ~ Binomial(nA, pA)
successB ~ Binomial(nB, pB)
```  
という形で、AとBの成功率をベータ分布からサンプルし、観測データ（Binomial分布）を介して更新します。サンプリング後に得られる`posterior_samples`から`pA`と`pB`の分布を推定します。

詳細は[こちら](https://github.com/makinzm/comparison-ab-test-on-julia/blob/main/bayesian_test.jl)

## 結果

ベイズ的な解析結果は以下のようになりました。

- 平均事後推定値: mean pA ≈ 0.1208, mean pB ≈ 0.1107
- 「pA > pBとなる確率」 ≈ 0.7765 (約77.65%)
    - MCMCでのサンプリングがランダムのため、イテレーションの順番によってこの確率は変動することに注意してください。
- 比較：p-valueは 0.24です。

![事後分布の比較](https://raw.githubusercontent.com/makinzm/comparison-ab-test-on-julia/refs/heads/main/results/posterior_diff.png)

## サンプルサイズを変えた場合

追加実験として、Aのサンプルサイズを少なくした場合にも同様の解析を行いました。

モチベーションとして、ABテストを行う場合、極端にAのサンプルサイズが小さい場合は、Bの成功率が高くてもAの成功率が高く見えることがあるため、注意が必要です。

事後分布の比較がサンプルサイズにどのように影響するかを確認したいと感じました。

:::note info

サンプルサイズが小さい場合、統計的仮説検定、特にZ検定をできる条件下がそろっていない可能性があります。そのため、比較としてp値を記載していますが、参考程度に見ていただければとおまいます。


詳細な条件については、以下の記事が参考になると思います。

- [ｚ検定の概要と手順・結果の見方 :: 【公式】株式会社アイスタット｜統計分析研究所](https://istat.co.jp/sk_commentary/t-test/z-test)
- [検定に必要なサンプルサイズ算出方法とは【原理だけ知ってればOK】 | シグマアイ-仕事で使える統計を-](https://sigma-eye.com/2018/11/14/sample-size-calculation/)

:::

### Aのサンプルサイズを100にした場合

その結果は以下の通りです（詳細なコードの変更は[こちら](https://github.com/makinzm/comparison-ab-test-on-julia/pull/1/files)）。

- グループA: サンプル数 nA = 100、成功数 successA = 12
- グループB: サンプル数 nB = 1000、成功数 successB = 110

MCMCのサンプリングを比較したところ、Aの成功率がBより高い確率は約68.6%となりました（比較：p-valueは 0.38です。）
事後分布の様子は以下の通りです。

![事後分布の比較（サンプルサイズ変更）](https://raw.githubusercontent.com/makinzm/comparison-ab-test-on-julia/refs/heads/compare/a-100-b-1000/results/posterior_diff.png)。

### Aのサンプルサイズを10にした場合

その結果は以下の通りです（詳細なコードの変更は[こちら](https://github.com/makinzm/comparison-ab-test-on-julia/pull/2/files)）。

- グループA: サンプル数 nA = 10、成功数 successA = 2
- グループB: サンプル数 nB = 1000、成功数 successB = 110

この場合は、MCMCのサンプリングを比較したところ、Aの成功率がBより高い確率は約87.7%となりました（比較：p-valueは 0.18です）。
事後分布の様子は以下の通りです。

![事後分布の比較（サンプルサイズ変更）](https://raw.githubusercontent.com/makinzm/comparison-ab-test-on-julia/refs/heads/compare/a-10-b-1000/results/posterior_diff.png)

### Aのサンプルサイズを10のまま、事前分布を極端に0に寄せたものに変更した場合

今までの例は、AとBの事前分布をBeta(1,1)としていましたが、Aの事前分布をBeta(0.1,100)に変更した場合の結果も確認しました。(詳細なコードの変更は[こちら](https://github.com/makinzm/comparison-ab-test-on-julia/pull/3))

Aの成功率がBより高い確率は約0.0%（比較：p-valueは 0.18です）となり、事後分布の様子は以下の通りです。

![事後分布の比較（事前分布変更）](https://raw.githubusercontent.com/makinzm/comparison-ab-test-on-julia/refs/heads/change/priori/results/posterior_diff.png)

## 解釈

サンプルサイズが等しい場合には、事後分布の比較から「Aの真の成功率がBより高い」確率が約78%ほどあると解釈できます。一方、統計的仮説検定ではp値=0.24と出て「特に有意な差は認められない」と解釈できていました。

:::note alert
ただ、この事後分布の比較結果は（1-p値）とほぼ一致することに注意してください。

[Xのポスト](https://x.com/genkuroki/status/1869270981744996630?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1869270996165005541%7Ctwgr%5Ed0aa8c25bad94ef15bedff8237fdcbd761d52401%7Ctwcon%5Es2_&ref_url=https%3A%2F%2Fqiita.com%2Fdrafts%2F7c4be44dc54d7df3582b%2Fedit)で黒木さんが言及されているように無情報の事前分布を利用した場合は、事後分布の比較とｐ値の結果がほぼ一致することが言及されており、私の実験でも確認できました。

:::

**つまり事前分布をどう設計するかによって、結論が変わるため事前分布の設計が極めて重要です。**

**メリット**
- 事前分布を明示的に置くことで、過去の知識や期待をモデルに反映できます。
- MCMCなどで事後分布が得られるため、結果の不確実性を直接分布として捉え、視覚化も容易です。

**デメリット**
- 事前分布の選択が結果に影響するため、事前分布をどう設定するかで議論が生じることがあります（**一様分布などの無情報事前分布も使えるが、統計的仮説検定と同じ結論を得る可能性がある**）。
- 統計的仮説検定に比べ、計算コストがかかります。
- **事前分布の設定がより重要になり、結果を解釈しづらい可能性があります。**

# 補足

## なぜp値と事後分布の比較の結果が類似するのか

事後分布の比較の確率とp値について一致した例を確認しましたが、こちらについてはなぜ発生したのでしょうか。背後にある数学的背景はなんなのでしょうか。おそらく、事後分布が正規分布に近似できているためだと考えております。

事後分布が正規分布に近似できるケースは、正則理論と呼ばれており最尤推定量が漸近正規性を持つ特殊ケースにあることが知られています。詳細は、[渡辺 澄夫(2012) ベイズ統計の理論と方法 | コロナ社](https://www.coronasha.co.jp/np/isbn/9784339024623/)が参考になると思います。

（渡辺先生のこちらの本では統計的仮説検定には触れられていないと記憶しています。ただ、こちらの記載の内容を理解すると今回のケースは正規分布に近似できる状態であるとわかり、それは統計的仮説検定でも有名な正規分布同士の比較に関する問題に帰着でき、事後分布の比較結果はt検定やz検定の内容と一致すると考ることができると思います。）

## 事前分布の決め方について

周辺尤度を最大化するような情報量規準が使える可能性もあると考えています。

詳細はsBICやWBICなどで検索していただければと思います。

ただ、サンプルサイズが有限であるため一概に情報量規準を用いたから正しいかというとそんなことはない気がしています。

## 事後分布の比較方法について

今回は事後分布のサンプリングの結果をそのまま流用しましたが、ウィルコクソンの順位和検定などのノンパラ手法の検定をしたほうが正しい検定が行える可能性があることに注意してください。