統計・データ分析A/Bテスト

A/Bテストの基本を初心者向けに解説:p値と有意水準でわかる「効果があった」の判断

「ボタンの色を変えたらクリック率が上がった気がする」——Web施策の効果を、感覚ではなく数字で判断したいと思ったことはありませんか。そこで使うのがA/Bテストです。

この記事でわかること

  • A/Bテストとは何か(2パターンを比べて優劣を判断する考え方)
  • p値と有意水準の読み方(「効果があった」と言ってよい基準)
  • 初心者がやりがちな失敗(覗き見・サンプル不足)

専門用語は最小限にして、実務でそのまま使える形で説明します。


A/Bテストとは

A/Bテストは、ユーザーを2グループにランダムに分け、それぞれに異なるパターン(AとB)を見せて、成果指標(クリック率・購入率など)を比較する手法です。ランダムに分けることで「たまたま優良顧客が偏った」といった偏りを打ち消し、パターンの違いだけを比較できます。

たとえば申し込みボタンを「今すぐ始める(A)」と「無料で試す(B)」で出し分け、どちらのクリック率が高いかを見ます。

「効果があった」はどう判断する? p値と有意水準

A が 5.0%、B が 5.4% だったとして、この 0.4% の差は本物でしょうか。それとも単なる偶然でしょうか。これを判断するのが仮説検定です。

  • 帰無仮説:AとBに差はない(0.4%はたまたま)
  • p値:「差がない」と仮定したとき、観測された差以上が偶然に起きる確率
  • 有意水準:判断の基準。慣例的に 0.05(5%)を使う

p値が有意水準を下回れば(例: p < 0.05)、「偶然でこれほどの差が出るのは考えにくい=効果があった」と判断します。

p値解釈(有意水準0.05のとき)
0.01有意。効果があったと判断してよい
0.04有意(ぎりぎり)。ただし過信は禁物
0.20有意でない。差は偶然の範囲

Python で2群の比率を検定する

2つのコンバージョン率を比較する最も簡単な方法のひとつが、カイ二乗検定です。

from scipy.stats import chi2_contingency

# 行: A / B、列: コンバージョンした人数 / しなかった人数
table = [
    [50, 950],   # A: 1000人中50人がCV(5.0%)
    [54, 946],   # B: 1000人中54人がCV(5.4%)
]

chi2, p, dof, expected = chi2_contingency(table)
print(f"p値 = {p:.3f}")
# p値 = 0.699 → 有意でない(この差は偶然の範囲)

この例では p = 0.699 なので、「BのほうがCV率が高い」とは言えません。差を検出するには、もっと多くのサンプルが必要です。

初心者がやりがちな失敗

1. サンプルが少なすぎる

数十人ずつでは、よほど大きな差でないと有意になりません。事前に必要サンプルサイズを見積もりましょう。

2. 途中で何度も覗いて「有意になった瞬間」に止める

テスト中に繰り返しp値を確認し、たまたま p < 0.05 になった時点で打ち切るのは偽陽性を大量に生みます。期間とサンプル数は事前に決めて固定してください。

3. 有意でない=「差がないことの証明」だと思う

p > 0.05 は「差があるとは言えない」であって「差がないと証明された」ではありません。


よくある質問

Q. 有意水準はなぜ0.05なの?

A. 慣例です。厳密さが求められる場面では0.01を使うこともあります。ビジネス判断では、効果の大きさ(実質的な差)も合わせて見るのが実務的です。

Q. p値が小さければ効果も大きいの?

A. いいえ。p値は「差の有無の確からしさ」であって「差の大きさ」ではありません。効果量(何%改善したか)は別に確認します。


まとめ

  1. A/Bテストは2パターンをランダムに出し分けて成果を比較する手法
  2. 「効果があった」の判断はp値と有意水準(通常0.05)で行う
  3. p < 0.05 なら有意、そうでなければ「差があるとは言えない」
  4. 期間とサンプル数は事前に固定し、途中で覗いて止めない
  5. 有意性(p値)と効果量(改善幅)は別物なので両方見る

frural ではA/Bテストの設計から統計的な効果検証までを支援しています。「この施策、本当に効果あった?」を数字で確かめたい方はお気軽にご相談ください。