小売のA/Bテストを購買率と利益で評価する|ベイズ推定とブートストラップの例

顧客5,000人・30店舗のダミーデータでは、購買率差は+5.7ポイントでも、クーポン控除後粗利の差は全体でマイナスでした。顧客層ごとの違いと、購買率のベイズ推定・利益差のブートストラップを確認します。

購買率が上がっても採算が悪化する例を、150円クーポンの人工データで作りました。

A/Bテストで何を評価するか

今回は、クーポンを配布する施策群と、配布しない対照群に店舗を無作為に割り付けるA/Bテストを想定しました。購買率と顧客あたり粗利は、どちらも割付対象の全顧客を分母とし、顧客を等しく重み付けして集計します。

購買率の変化と値引き後の粗利差を組み合わせて読みます。粗利差で配布の採算を考え、購買率差からその内訳を追うためです。

人工データの生成条件

小売チェーンを想定し、乱数シード42でデータを生成しました。私は購買率だけで採否を決めると判断が変わるよう、施策群の購入額も低く設定しました。

  • 顧客数は5,000人で、新規30%、既存一般50%、既存優良20%の確率で顧客層を生成しました。
  • 店舗数は30店舗で、施策群15店、対照群15店に割り付けました。
  • 施策は150円クーポンの配布で、施策群の購入者全員に適用しました。
  • 日次データは別に生成した2025年10月1日〜12月29日の90日分で、曜日・天候・月末効果を含みます。

全体平均だけでは、誰に効いたかが分からない

クーポンがなくても購入する割合は、顧客層によって異なります。今回は新規・既存一般・既存優良を分け、各層の購買率を集計しました。

全体の購買率は対照群32.6%、施策群38.3%で、差は+5.7ポイントでした。

顧客層購買率差
全体+5.7ポイント
新規+12.0ポイント
既存一般+2.9ポイント
既存優良+4.4ポイント

顧客の購入を独立と仮定した全体のカイ二乗検定ではp<0.001でした。対照群2,512人中820人、施策群2,488人中954人の購入有無を比較しました。店舗ごとの購買率を等しい重みで平均すると、小さな店舗の顧客の重みが相対的に大きくなり、評価対象が変わります。

日次売上では変動と店舗規模差を分ける

日次売上は、顧客5,000人の購買・粗利とは対応しない、独立した補足例です。週末が平日の1.3倍、雨の日が0.8倍、25日以降が1.15倍になる設定で、両群に共通して作用します。

施策による売上増加率は2%に設定しました。店舗ごと・日ごとの乗法ノイズの標準偏差は12%です。独立なノイズを等しい重みで平均する概算では、一群15店舗の平均に残るノイズの標準偏差は12%÷√15で約3%になります。

日次売上推移の生データと移動平均
上段は各群15店舗の平均日次売上、下段は当日を含む直近7日の移動平均です。

曜日・天候・月末効果は両群に共通するため、同日の群平均の比では相殺されます。売上の群間差には、店舗規模差と店舗ごと・日ごとのノイズも含まれます。

施策店の平均客数は対照店より約8%多くなっています。生成時の基準客数の店舗平均は施策群189.5人/日、対照群174.7人/日で、対照群を分母とした差は約8.4%です。無作為に割り付けても、15店舗ずつでは規模の偏りが残りました。

移動平均には店舗規模差が残ります 7日移動平均は日々の変動をならすために使います。隣り合う点には同じ日の売上が含まれるので、独立した観測として検定する用途には使いません。

有意差が出ても、利益が出ているとは限らない

粗利は、顧客あたりのクーポン控除後粗利を指します。

顧客層購買率差クーポン控除後粗利差/顧客
新規+12.0ポイント+46円
既存一般+2.9ポイント−44円
既存優良+4.4ポイント−101円
全体+5.7ポイント−31円

粗利差は施策群から対照群を引いた値です。施策群の購入者は値引き前粗利から150円を一度だけ引き、非購入者は0円としています。配信費・運用費や税を含む純利益とは区別します。

全体値には各群の実際の顧客層構成を使いました。生成時の30%・50%・20%は層を抽出する確率で、両群の構成比にはずれがあります。

新規は対照群722人、施策群742人で、購買率は順に13.99%、26.01%、粗利は125.07円、170.96円でした。既存一般は対照群1,299人、施策群1,254人で、購買率は35.72%、38.60%、粗利は450.69円、406.41円です。

既存優良は対照群491人、施策群492人で、購買率は順に51.93%、56.30%、粗利は1,046.12円、945.06円でした。全体は対照群2,512人、施策群2,488人で、購買率は32.64%、38.34%、粗利は473.48円、442.71円です。差の計算には丸め前の平均値を使いました。

生成時の値引き前購入額の平均は、新規2,800円、既存一般4,200円、既存優良6,500円です。施策群ではそれぞれ50円、150円、300円低く設定し、粗利率は30%としました。この粗利差には、購買率だけでなく購入額の変化と150円のクーポン費用も含まれます。

各顧客層の購買率をp、購入者あたりの値引き前粗利をmとすると、顧客あたり粗利差はp_T×(m_T−150)−p_C×m_Cです。Tは施策群、Cは対照群を表します。

顧客単位のブートストラップによる95%区間は、新規が+13〜+77円でした。既存一般は−91〜+1円、既存優良は−227〜+22円で、独立な顧客を仮定した探索では、新規だけが区間全体で0を上回っています。各群・各顧客層の観測人数を保って顧客を復元抽出し、20,000回の平均粗利差の2.5・97.5パーセンタイルを区間の端点としました。

セグメント別の購買率差と粗利差。エラーバーは顧客ブートストラップの 95% 区間。粗利が区間ごと正なのは新規(+13〜+77 円)のみ
顧客層別の購買率差と粗利差です。エラーバーは顧客単位のブートストラップによる95%区間を示します。

既存優良は、クーポンなしの購買確率を55%に設定した層です。

追加の実験で確かめたいこと

  • 新規顧客に限定して配布した場合も、粗利差が正になるかを調べたいと考えています。
  • 100円への減額も試したい条件です。値引き費用と購買率の改善幅がともに変わるため、粗利で比べます。
  • 再来店後の粗利まで含めて、初回の値引きを回収できるかも追います。

ベイズ推定で購買率の不確実性を表す

施策群の購買率が対照群を上回る事後確率を求めるため、ベイズ推定を使いました。粗利差は観測された金額を再抽出するブートストラップで区間を求め、購入と金額で方法を分けています。

ベイズ推定の基本的な考え方

ベイズ推定では、事前分布を観測データで更新して事後分布を求めます。今回は両群の購買率を分布として表し、施策群が対照群を上回る確率を計算しました。

投資判断に使う確率と費用

購買率の事後分布から分かるのは、購入する割合の不確実性です。

知りたいこと頻度論による分析ベイズ推定
施策は効いたか効果の推定値・信頼区間・p値を報告購買率差が正である事後確率を計算
効果はどのくらいか点推定と信頼区間事後分布として確率的に表現
投資判断に使えるか効果の推定値と区間に、損失や実施費用を合わせて判断利益の事後分布があれば、損失や実施費用も含めて判断できる
テスト途中で判断したい固定標本の検定を反復するなら多重性を調整。逐次検定も選択肢事後分布を逐次更新できる。停止判断は別途設計
データが少ない場合推定できるが、標本数が少ないと区間が広くなりやすい事前情報を反映できるが、少数データでは事前分布の影響が強くなる

今回の購買率と粗利差の推定結果

購買率の事後分布をセグメント別に見る

各群・各顧客層の中では、顧客が共通の確率で独立に購入するモデルを使いました。購入有無はベルヌーイ分布、購入人数は二項分布で表せます。生成時の購買確率も群と顧客層ごとに共通で、購入有無に店舗固有の効果は入れていません。主解析はこの独立モデルに合わせています。事前分布は購買率0〜1を等しく扱うBeta(1,1)としました。対象者n人のうちy人が購入したとき、事後分布はBeta(1+y,1+n−y)になります。

ベイズ推定による購買率の事後分布
顧客層別の購買率事後分布は、灰が対照群、青が施策群です。新規では分布がほぼ分離し、既存一般と既存優良では重なっています。

両群の事後分布から200,000組の購買率を独立に抽出して比較しました。施策群が対照群を上回る割合は、新規でほぼ100%、既存一般で約93%、既存優良で約91%でした。

既存優良では、購買率差が0以下の領域に約9%の事後確率が残ります。購入が増える方向に事後分布が寄っていても、表の粗利差は負だからです。

粗利差をブートストラップで評価する

全顧客の粗利差は、各群の顧客を重複ありで再抽出するブートストラップで評価しました。抽出人数は対照群2,512人、施策群2,488人に固定し、平均差を20,000回計算しています。表のパーセンタイル区間は、再計算した差の中央95%を残した範囲です。

クーポン控除後粗利差のブートストラップ結果
ブートストラップ中央値約−31円/顧客
95%パーセンタイル区間約−70〜+9円/顧客
再標本化した差が正になった割合約6%

約6%は、20,000回の再標本化で平均粗利差が正になった回数を、全反復回数で割った割合です。利益改善の事後確率としては使いません。

区間は0をまたぎますが、このシミュレーションでは粗利差の点推定が負であることを基準に、全顧客配布を見送る判断です。

補助解析として、各群15店舗ずつを復元抽出した粗利差の95%区間は約−67〜+2円でした。顧客単位の区間とともに、損失側から小幅な改善までを含んでいます。

モデルを広げる場合の条件

  • 今回のベイズ計算では、顧客層ごとの購買率を推定しました。
  • 次に追加するなら購入額を含む粗利モデルです。粗利改善額の基準を超える事後確率で判断したいからです。
  • 今回は層ごとに独立に更新しました。顧客層を細分化するなら、層間で情報を共有する階層モデルを検討します。
  • 途中で採否を決める設計なら、期待損失に基づく停止基準と最大期間を先に置きます。

この集計をBIとLLMで扱うなら

この分析をBIやLLMで扱う際の集計単位は顧客です。購入明細だけを分母にすると非購入者が落ち、今回評価した粗利とは別の指標になるためです。

集計と推定を区別する

BIの画面には購買率、粗利、対象顧客数を併記する設計にします。顧客層別の集計と日次売上は、分母も時間の単位も違うため、別の表示として扱います。

問いBIツール統計モデル
購買率差と不確実性はどの程度か単純集計だけでは区間を評価できない推定値・信頼区間・p値、または事後分布を計算
曜日・天候の影響を除いた施策効果は回帰などの分析機能・外部連携を使用回帰モデルで外部要因を調整
次回施策の増分利益が正になる確率は何%か確率モデルの推定結果を表示配布人数・期間・費用を定め、将来の購買・購入額を含む事後予測分布から算出
新規への限定配布の採算顧客層別の粗利と実施費用を表示顧客層別の粗利推定と実施費用を組み合わせる

区間推定は分析コードから取り込み、集計値と組み合わせる設計を考えています。購入者あたりの金額と、非購入者を含む顧客あたりの金額は、画面上でも分母が分かる名前にします。

非購入者と値引きの処理をそろえる

LLMに今回の計算を依頼するなら、入力には顧客ごとの購入・粗利と店舗の割付情報を含めます。計算を照合する箇所は、非購入者を分母に含めたか、施策群の購入者だけに値引きを一度適用したか、割付どおりに集計したかです。

購入者全員への値引きを計算に入れます 今回の設定では、追加で購入した顧客だけに値引く計算にするとクーポン費用を過小評価します。

次の実験で変える設計

配布対象を先に新規へ絞る

同じデータで配布対象を選ぶと収益性の評価にも選択の偏りが入るため、新規限定で別の実験を組みます。

施策前の情報を割付に使う

施策で変わった購入行動を割付や調整に使うと、測りたい効果まで取り除くためです。店舗をまたぐ顧客移動やクーポン共有は、同じ店舗内の相関とは別に扱います。

利用明細から粗利を計算する

実店舗で粗利を計算するなら、クーポン利用率、複数回の購入、返品を反映します。今回の購入者全員に150円を適用する設定から、実際の利用明細に基づく控除へ変える設計です。採算には配信費や運用費も加えます。

採用基準を金額で決める

採用基準は、最低限欲しい粗利改善額と許容できる下振れ額です。改善額が小さければ、正の効果でも実施費用を回収できないためです。

終了後の購買も追う

値引き中の購入は、その後の買い控えに置き換わる可能性があります。観測期間は商品の通常の購買間隔に合わせて決めます。

分析の視点購買率から読むこと粗利・店舗・時間を加えて読むこと
効果の見方全体平均の差セグメント別・店舗別の効果分解
外部要因施策前の店舗規模差を区別できない施策前の売上や店舗規模を調整に使う
評価指標購買率・売上クーポン控除後粗利と実施費用、再来店後の粗利
計算結果の読み方購買率の群間差に対するカイ二乗検定でp<0.001粗利差の顧客単位ブートストラップで正の差が出た割合は約6%
時間軸テスト期間のみ施策期間と終了後の再来店・買い控え

まとめ

  • 配布対象は実験前に新規顧客へ限定します。
  • 店舗規模と施策前売上を割付に使います。
  • 主要指標は、非購入者を含むクーポン控除後粗利です。
  • 施策終了後も再来店と値引きなしの購買を追う設計にします。
  • 停止基準と店舗単位の区間推定方法は、結果を見る前に決めます。

定義・計算方法の確認先