ClaudeにA/Bテストの有意差を検定させる手順 — LP・広告の判定
LPや広告クリエイティブのA/Bテスト結果を、Claudeのコード実行でz検定・カイ二乗検定にかけて有意差を判定する手順です。必要サンプルサイズの逆算と、判定を誤らせる落とし穴も扱います。
LPのA案とB案でコンバージョン率が3.0%と3.9%だった。この差は本物か、偶然のぶれか。答えは、コンバージョン数と母数を2組そろえて、2群の比率の検定にかければ出ます。Claudeのコード実行を使えば、この検定をPythonで実際に走らせ、p値と信頼区間、さらに「あと何件集めれば足りるか」まで一度に返させられます。
ここで押さえたいのは、Claudeに「有意差はありますか」と文章で聞くだけでは足りないことです。計算は暗算させず、コードを書いて実行させ、その結果を読む。この記事では、その依頼文、検定の選び方、結果の読み方、誤判定を招く落とし穴を順に扱います。
Claudeに検定を任せてよいのはどこまでか
任せられるのは計算です。検定の手順は決まっていて、コードに落とせます。任せられないのは、テスト設計そのものが妥当かどうかの判断です。ランダムに振り分けたか、期間中に別の施策を同時に打っていないか、といった事実は、データを渡さない限りClaudeには見えません。
Claudeがコードを実行するのは、計算やデータ分析が役に立つ場面です。公式のコード実行ツールの説明では、桁の大きい計算やデータ分析、明示的な「実行して」の依頼が挙がっています。単純な算数や既知の事実だけの質問では、コードを走らせず直接答えます。境界にある依頼は「コードを実行して確認して」と明示すると、確実に走ります。
| 作業 | Claudeに向くか | 理由 |
|---|---|---|
| z検定・カイ二乗検定の実行 | Claudeに向くか向く | 理由手順が決まっており、コードで再現できる |
| p値と信頼区間の算出 | Claudeに向くか向く | 理由ライブラリの標準機能で足りる |
| 必要サンプルサイズの逆算 | Claudeに向くか向く | 理由検出したい差を数字で渡せば計算できる |
| 振り分けが無作為だったかの保証 | Claudeに向くか向かない | 理由配信設定側の事実で、データからは断定できない |
| 勝ち案を全面採用するかの意思決定 | Claudeに向くか向かない | 理由売上インパクトや運用負荷など事業側の判断が入る |
事前に用意するデータと有効化の確認
必要なのは、A案・B案それぞれの母数(表示数、訪問数、配信数)と、成果の件数(コンバージョン数、クリック数)の4つの数字です。広告クリエイティブならクリック率(CTR)の比較なので、母数はインプレッション、成果はクリックになります。
claude.aiでコードを実行させるには、設定でコード実行を有効にします。公式の案内では、コード実行とファイル作成はFree・Pro・Max・Team・Enterpriseの全プランで、Web・Claude Desktop・モバイルから使えます。Free・Pro・Maxはデフォルトで有効で、Team・Enterpriseも組織単位で既定は有効です。組織オーナーが無効にしている場合は、個人の設定では使えません。
- Free / Pro / Max: 設定のCapabilitiesで「Code execution and file creation」をオンにする
- Team / Enterprise: 組織オーナーがOrganization settingsのCapabilitiesで切り替える
今回の検定は追加パッケージを入れずに済みます。API経由のコード実行ツールでは、サンドボックスにPython 3.11とscipy・statsmodels・pandasなどが最初から入っており、実行環境はインターネットに出られません。z検定も検出力の計算も、この標準のライブラリだけで完結します。
z検定とカイ二乗検定を渡して有意差を出す
依頼文には4つの数字と、使ってほしい検定、出してほしい指標を入れます。次の形が基本です。
LPのA/Bテストの結果です。コードを書いて実行し、検定してください。
A案: 訪問数 4000 / コンバージョン 120
B案: 訪問数 4000 / コンバージョン 156
やってほしいこと:
1. 2群の比率のz検定(両側、有意水準5%)でp値を出す
2. 同じデータでカイ二乗検定もして、結果が一致するか確認する
3. B-Aの差の95%信頼区間を出す
4. 使ったコードと、各数値をそのまま載せるClaudeが書くコードは、次の形になります。以下は手元で実行して値を確かめた例で、Claudeの出力をそのまま貼ったものではありません。
import numpy as np
from scipy.stats import chi2_contingency
from statsmodels.stats.proportion import proportions_ztest
conv = np.array([120, 156]) # コンバージョン数 (A, B)
n = np.array([4000, 4000]) # 母数 (A, B)
# 2群の比率のz検定(両側)
z, p = proportions_ztest(conv, n)
print(f"z = {z:.3f}, p = {p:.4f}")
# 2x2の分割表でカイ二乗検定(連続性補正なし)
table = np.array([[120, 4000 - 120],
[156, 4000 - 156]])
chi2, p_chi, _, _ = chi2_contingency(table, correction=False)
print(f"chi2 = {chi2:.3f}, p = {p_chi:.4f}")
# 差の95%信頼区間(正規近似)
pa, pb = conv / n
se = np.sqrt(pa * (1 - pa) / n[0] + pb * (1 - pb) / n[1])
diff = pb - pa
print(f"diff = {diff:.4f}, 95%CI = [{diff - 1.96*se:.4f}, {diff + 1.96*se:.4f}]")このデータでは、zは約-2.205、pは約0.0274です。カイ二乗値は約4.863で、pはz検定と同じ約0.0274になります。A案は3.0%、B案は3.9%で、差は0.9ポイント、95%信頼区間は約0.10〜1.70ポイントです。
zの符号が負なのは、引数の1番目(A案)から2番目(B案)を引く向きだからです。B案のほうが高いという結論は変わりません。
z検定とカイ二乗検定は同じ結論になる
2×2の分割表では、カイ二乗値はzの二乗に等しくなります。今回の値で確かめると、2.205の二乗は約4.863で一致します。どちらを使っても同じp値になるため、「どちらが正しいか」は迷いどころではありません。
差が出るのは連続性補正(Yatesの補正)をかけた場合です。chi2_contingencyは既定で補正をかけ、同じデータでもpが約0.0320になります。補正なしのz検定と数字が食い違ったとき、Claudeがどちらの設定で計算したのか。依頼文に「補正なし」と書いておけば、そこで食い違わなくなります。
サンプルサイズは足りているのか
p値が0.05を下回っても、サンプルが少ないと結論が不安定です。逆に、有意にならなかったのは「差がない」のではなく「見分けるには足りなかった」だけの場合があります。そこで、検出したい差を先に決め、必要な母数を逆算させます。
ベースのCVRは3.0%です。B案で3.9%(0.9ポイント上昇)を
有意水準5%・検出力80%で検出するには、各案何件の訪問が必要ですか。
コードで計算して、使った関数と引数も見せてください。from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize
effect = proportion_effectsize(0.039, 0.030)
n_per_arm = NormalIndPower().solve_power(
effect_size=effect, alpha=0.05, power=0.8, ratio=1
)
print(round(n_per_arm)) # 約6428この条件では各案およそ6,430件の訪問が要ります。手元の4,000件ずつでは、0.9ポイントの差を80%の確率で拾うには足りない計算です。つまり今回のp=0.027は、有意ではあっても、件数の面では余裕のない判定です。
小さな差ほど必要な件数は急に増えます。ベース3.0%に対して相対10%の改善(3.3%)を検出するには、同じ条件で各案およそ53,000件です。「少しでも良くなればいい」と検出したい差を小さく置くと、現実のトラフィックでは終わらないテストになります。
| 検出したい差 | 各案の必要件数(有意水準5%・検出力80%) |
|---|---|
| 3.0% → 3.9%(0.9ポイント) | 各案の必要件数(有意水準5%・検出力80%)約6,430件 |
| 3.0% → 3.3%(相対10%) | 各案の必要件数(有意水準5%・検出力80%)約53,180件 |
広告クリエイティブのCTR比較に使う
広告のクリエイティブ比較も、構造は同じです。母数がインプレッション、成果がクリックに変わるだけで、A案とB案の2群の比率を比べる問題になります。ただしCTRは1%前後の低い値になりがちで、母数は数万〜数十万に膨らみます。件数が大きいと、実務上ほとんど意味のない小さな差でも有意になります。
そこで、依頼文に「有意かどうか」だけでなく「差の大きさ」を書きます。
クリエイティブAとBのCTRを比較してください。
A: インプレッション 120000 / クリック 960
B: インプレッション 118000 / クリック 1062
z検定のp値、差の95%信頼区間、相対的な改善率を出してください。
差が統計的に有意でも、CTRの差が0.05ポイント未満なら
「有意だが実務上は小さい」と明記してください。「実務上の最小差」を先に決めておくと、判定を機械的に返してもらえます。閾値の数字はClaudeが決めるのではなく、運用側が渡します。
母数がそろっていない配信はどう扱うか
上の例のように、AとBでインプレッション数が違っても、2群の比率の検定は使えます。比率で比べているためです。ただし配信を最初から均等に振り分ける設計だったのに、実績が大きく偏っているなら、テスト設計側の問題を疑います(次節)。
判定を誤らせる4つの落とし穴
検定の計算はコードで正確に出ます。誤るとすれば、計算の外側です。
途中経過を見て止めてしまう
毎日p値を確認して「有意になったところで停止する」と、実際には差がないのに有意と判定する確率が有意水準の5%より大きくなります。最初に必要件数(または期間)を決め、そこに達するまで結論を出さない。Claudeに途中経過を渡すときも「これは中間のデータです。判定はしないでください」と書いておくと、早すぎる結論を避けられます。
案が3つ以上あるのに検定を並べる
A・B・Cの3案でペアごとに検定すると、比較が3回になり、少なくとも1つが偶然有意になる確率が上がります。この多重比較には、有意水準を比較回数で割るBonferroni補正などがあります。依頼文には「案が3つあります。多重比較を補正してください」と、補正の手法名まで書くと、手法が揃います。
振り分けの偏りに気づかない
均等に振り分けたはずなのに、AとBの母数が大きく違うときは、計測の欠落や配信の不具合が疑われます。A/Bテストの世界ではこれをサンプル比率のずれ(SRM)と呼びます。カイ二乗検定で「想定の比率どおりに振り分けられていたか」を確かめられます。
from scipy.stats import chisquare
observed = [4000, 3820] # 各案の実際の母数
expected = [sum(observed) / 2] * 2
stat, p = chisquare(observed, f_exp=expected)
print(f"p = {p:.4f}") # 小さいなら振り分けの偏りを疑うこのpが極端に小さいときは、コンバージョン率の検定に進む前に、計測タグや配信設定の確認を先にします。
比率でない指標に比率の検定を使う
購入金額や滞在時間のように連続値の指標は、コンバージョンのような「0か1か」ではありません。2群の平均を比べるt検定や、ブートストラップが候補になります。依頼文には、指標の種類を必ず書いてください。書かないと、Claudeは渡された数字の形から検定を推測することになります。
依頼文のテンプレートと運用のコツ
毎回ゼロから書く必要はありません。次のテンプレートを保存しておき、数字だけ差し替えると、判定の手順がそろいます。
A/Bテストの統計判定をしてください。コードを実行し、コードと数値を載せること。
【データ】
- 指標の種類: 比率(コンバージョン率 / クリック率)
- A案: 母数 ___ / 成果 ___
- B案: 母数 ___ / 成果 ___
【条件】
- 有意水準5%、両側検定、連続性補正なし
- 実務上意味のある最小差: ___ ポイント
- 案が3つ以上のときは多重比較を補正する
【出力】
1. z検定のp値 2. 差の95%信頼区間 3. 必要サンプルサイズの充足判定
4. 「勝ち」「負け」「判定不能(件数不足)」のどれかと、その根拠結果の数字を鵜呑みにしない工夫も、依頼文に組み込めます。「同じ検定を別の方法(カイ二乗検定)でも走らせて一致を確認して」と書けば、コードの取り違えに気づけます。使った関数と引数を出させておけば、あとから第三者が同じ計算を再現できます。
数字が大きいCSVは、ファイルで渡す
日別・クリエイティブ別の生データが多いときは、CSVをアップロードしてもかまいません。ファイルの読み込みと集計の基本はClaude CSV分析の使い方で扱っています。公式の案内では、アップロード・ダウンロードとも1ファイル30MBが上限です。ファイルを使ったコード実行は、通常のチャットより利用枠の消費が大きくなる点も、公式に書かれています。
APIで自社ツールに組み込むとき
日次のレポートを自動化したいなら、コード実行ツールをAPIに指定します。ツール定義はtypeとnameの2つで、追加のパラメータはありません。
curl --fail-with-body -sS https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5-5",
"max_tokens": 4096,
"messages": [{
"role": "user",
"content": "A案 4000訪問/120CV、B案 4000訪問/156CV。コードを実行して2群の比率のz検定をし、p値と95%信頼区間を出して。"
}],
"tools": [{
"type": "code_execution_20250825",
"name": "code_execution"
}]
}'料金はコード実行の時間で数えられます。ウェブ検索・Web Fetchを併用しない場合、最小課金は5分で、1組織あたり月1,550時間の無料枠を超えた分が1コンテナー・1時間あたり0.05ドルです。無料になる条件の詳細はコード実行ツールが無料になる条件にまとめています。A/Bテストの検定1回の計算量は小さいので、料金の主役は入出力のトークンです。
結果を読むときの見方
Claudeが返す結論は、次の3つの状態に整理して読むと迷いません。
| 状態 | 見るもの | 読み方 |
|---|---|---|
| 有意で、差も実務上の最小差以上 | 見るものp値、信頼区間の下限 | 読み方勝ち案として採用を検討できる |
| 有意だが、差が最小差未満 | 見るもの信頼区間の幅 | 読み方統計的には差があるが、施策を入れ替える価値は薄い |
| 有意でない | 見るもの必要件数に対する到達率 | 読み方差がないのか、件数が足りないのかを分けて考える |
有意でない結果は、必要件数に達していれば「差は小さい」、達していなければ「判定不能」です。この2つを混ぜると、有望な案を早々に捨てることになります。
検定の背景にある考え方、たとえば標準誤差の出し方や検出力分析の意味は、モデル評価の統計的手法とはで、別の題材を使って説明しています。数字そのものを別の計算で確かめたいときは、Claudeで論文の統計値を生データと照合して検証するの手順が使えます。
Claudeに任せた検定を検算する
コード実行の結果でも、検算の習慣は残します。手元で確かめる方法は3つあります。
- 使った関数名と引数を出させ、統計ライブラリの標準的な使い方と合っているか見る
- z検定とカイ二乗検定の両方を走らせ、p値が一致するか確認する
- 手元のPythonやスプレッドシートで、同じ4つの数字から再計算する
キャンペーン全体の効果測定と予算配分をまとめて見たいときは、Claudeでキャンペーンの効果測定と予算再配分をする手順が入口になります。この記事はその前段で、個々のテストの勝ち負けを統計で確定させる部分にあたります。
まとめ
Claudeに有意差を判定させるコツは、文章で聞かずコードを実行させ、4つの数字と検定の条件を明示して渡すことです。2×2の比率ならz検定とカイ二乗検定は同じp値になり、連続性補正の有無だけが食い違いの原因になります。
p値だけで結論を出さず、信頼区間で差の大きさを見て、必要サンプルサイズに達しているかを合わせて確認します。途中で止めない、案が増えたら補正する、振り分けの偏りを先に確かめる。この3点を依頼文に書いておくと、Claudeの返す判定が実務で使える形になります。