バンディット最適化
トンプソン抽出
A/B テストは「事前計画した期間が終わるまで両方を均等に見せ続ける」設計です。事業として悩ましいのは、明らかに劣る案にもユーザーの 1/n を割り当て続けるところ。3 つの LP 案を A/B/C テストするとき、明らかに劣る C 案にもユーザーの 1/3 を 30 日間割り当てる損失を、毎回そのまま受け入れて良いかは事業判断になります。
バンディットアルゴリズムは、テストを止めずに「今どれを見せるか」を統計的に切り替えていく適応的最適化の枠組みです。序盤の不確実なうちは均等に試し、確信がついた案により多くトラフィックを回す動きをするため、A/B より早く・損失少なく改善できます。
A/B は期間が終わってから「どっちが勝ち」を判定する道具。バンディットは「観測しながら、勝っていそうな案により多くトラフィックを回す」道具です。劣る案にも均等に流す A/B の損失を減らせるのがバンディットの利点で、実装の主力は トンプソン抽出。LP やバナーの常時最適化に向きます。
- 案(バンディット用語で「腕/arm」):複数の選択肢のひとつ。A/B/C テストの A・B・C に相当。LP・バナー・タイトルの案など。
- 探索/活用:未知の案も試すのが探索、いま勝っている案に寄せるのが活用。バンディットはこの 2 つを自動で切り替える。
- イプシロン貪欲法(ε-greedy/イプシロン グリーディ):10% くらいの確率でランダムに試し、残り 90% で勝ち案を見せる、ごくシンプルな動き。
- 信頼上限法(UCB1):「平均が高そう or 試行が少なくて自信がない」案を選ぶ。パラメータがほぼ要らない。
- トンプソン抽出(Thompson Sampling):各案に「勝ち確率の事後分布」を持たせ、毎回そこから 1 サンプル引いて最大の案を選ぶ。実装が短く性能も高い。
01.まず結論:A/B は『何が良いか』、バンディットは『今どれを見せるか』
A/B テストとバンディットは、見かけ上どちらも「複数案から選ぶ」道具ですが、設計思想が違います。両者の違いを 1 枚に整理すると次の通りです。
| 観点 | A/B テスト | バンディット |
|---|---|---|
| 目的 | 案 A と案 B の差を統計的に確定させる(因果推定) | テスト期間中の累積報酬を最大化する(逐次最適化) |
| トラフィック配分 | 事前に固定(例:50:50)。期間中は変えない | 観測のたびに動的に変える |
| 終わり方 | 事前計算したサンプルサイズに達したら終了 | 終わらせず常時運用も可。終わらせるなら停止規則を定義 |
| 向く場面 | 意思決定の根拠を社内・論文に残したい / 仮説検証 | 本番運用で損失を抑えながら改善 / 多数のバリアントから選ぶ |
| 弱み | 劣る案にも均等に流すコスト | 因果効果の点推定がブレやすい / 解釈が難しい |
本記事では、最もシンプルな ε-greedy から始めて、不確実性を陽に扱う UCB1、ベイズ的な トンプソン抽出、文脈情報を入れる Contextual Bandit までを順に整理します。
02.バンディットとは|概念と『いつ有効か』
バンディットは「複数の選択肢(案)から、毎回どれを見せれば長い目で得が大きいか」を、観測しながら自動で決める枠組みです。スロットマシン(one-armed bandit)の台選びになぞらえて名付けられています。やっていることはシンプルで、勝っている案には多く・自信のない案にもときどき試行を回す、これだけ。
いつ有効か|A/B より早く・損失少なく改善できる 4 つの場面
| シナリオ | なぜバンディットが有利か |
|---|---|
| 案数が多い(4〜10 案以上) | A/B はバリアントが増えるほど必要サンプルが指数的に増える。バンディットは劣る案への配分を自動で減らすため、少サンプルでも勝者収束が早い |
| 案の寿命が短い(数日〜2 週間) | A/B は事前計画期間まで均等配分を維持する設計。寿命の短いバナーやキャンペーンでは、判定時点で案が消えていることがある |
| 報酬が即時に出る(CTR、CVR、クリック) | バンディットは観測のたびに配分を更新する。報酬発生から配分更新までの遅延が短いほど、累積報酬の最大化が効く |
| トラフィックが少ない(少サンプル環境) | A/B では検出力 0.8 を達成できない場面でも、バンディットは『明らかに勝っている案により多く回す』運用が可能 |
図:4 戦略の累積報酬の比較(時間 × 累積報酬、最大 100 = 理論最良)
上の点線が「常に最良案を選び続けた場合」の理論最良。これに対し、純粋活用(グリーディ)は早めに諦めて頭打ち、ε-greedy(イプシロン グリーディ)は最後まで 10% 探索で傾きが落ち、UCB1・トンプソン抽出は序盤の探索を経て理論最良に肉薄する。曲線は概念図で、実値は案数と真の CVR で変わる。
純粋活用:初手で運悪く負け案に張り付くと t=20 以降ほぼ横ばい(30 前後で固定)。ε-greedy:常に 10% を劣る案に流すため、最後まで 65% 程度で頭打ち。UCB1 / トンプソン抽出:序盤に短い探索期間を置いたあと、最良案に寄せて加速し、理論最良に 8〜10 ポイントまで近づく。
03.ε-greedy(イプシロン グリーディ)|最もシンプルな探索-活用バランス
いつ使うか:理解の入口に使う最小構成。本番運用には向きません(劣る案にも常時 ε ぶん流し続けるため)。
動き:ε(例:0.1)の確率でランダムに案を引き、残り(1−ε)の確率でいま勝っている案を引く、それだけ。30 行ほどで書けます。
ε を 0.1 のような固定値にすると、最後まで 10% のトラフィックを劣る案にも流し続けることになります。時間とともに ε を小さくする工夫(decaying ε-greedy)もありますが、減衰スケジュールの設計が必要になります。最初から探索-活用を自動で切り替える UCB1 や トンプソン抽出 を使う方が運用が楽です。
04.UCB1|不確実性が大きい案を優先探索
いつ使うか:パラメータ調整がほぼ要らないので、トラフィック量が事前に読めないときの安全策に。
動き:各案に「平均報酬」と「自信のなさ(試行回数が少ないほど大きい)」の合計スコアを出し、毎回スコア最大の案を選びます。試行が少ない案ほど自信のなさが大きく加算されるので、自然と一度は試される設計です。
報酬が 0/1 でない連続値や、遅延報酬・トレンドが変わる非定常環境では、UCB-V・UCB-Tuned・Sliding-Window UCB といった拡張版に置き換えが必要です。
05.トンプソン抽出|ベイズで案ごとに信念を持つ
いつ使うか:実装が短く性能も高いので、本番運用の第一候補として使います。
動き:各案に「勝ち確率の事後分布(観測データを反映した信念)」を持たせ、毎回そこから 1 サンプルずつ引いて、最大値が出た案を選びます。十分試行した案は分布が尖って活用、試行が少ない案は分布が広くて偶然大きな値が出やすく自然に探索される、という探索-活用の切り替えが 1 つのルールで成立します。Yahoo・Microsoft・LinkedIn・Netflix などで本番採用されている枯れた手法です。
やる手順|5 ステップで本番に近い形が回る
実装の流れは次の 5 ステップに圧縮できます。学習と運用が同時進行するため、別途「学習期間」を切り出す必要はありません。
| ステップ | やること | 実装のポイント |
|---|---|---|
| 01 | 案(バリアント)を 2〜5 個用意する | LP の見出し違い・CTA コピー違い・バナーのクリエイティブ違いなど、CTR / CVR で比較できる単位で切る |
| 02 | 各案に α=1, β=1 を初期値で設定 | Beta(1, 1) は一様分布(どの案も先入観なしのフラットな状態)。新規バリアントを途中で追加するときも同じ初期値で混ぜる |
| 03 | ユーザーが来たら、各案の Beta から 1 サンプル抽出 → 最大値の案を表示 | numpy の rng.beta(alpha, beta_) を 1 行呼ぶだけ。argmax で勝った案のインデックスを取る |
| 04 | 結果(クリック / CV)を観測したら α か β に +1 | 成功なら α ← α + 1、失敗なら β ← β + 1。観測ログから集計バッチで更新でも構わない |
| 05 | これを毎リクエスト繰り返す(学習と運用が同時進行) | 別途『学習期間』を確保する必要なし。十分な試行数が積まれた案ほど分布が尖り、自動で活用に寄っていく |
ベルヌーイ報酬(クリック / 非クリック、CV / 非 CV)なら、各案に Beta(α, β) を持たせて、成功なら α に +1、失敗なら β に +1、と数えるだけで信念が自動更新されます。理屈は要らず、+1 ルールを覚えれば実装に進めます。
図:トンプソン抽出の事後分布と 1 回ぶんのサンプリング
案 A=Beta(20, 80)、案 B=Beta(30, 70)、案 C=Beta(5, 15)。案 C は試行回数が少ないため山が広い(不確実性が高い)。トンプソン抽出は 各分布から 1 サンプルずつ引き、最大値が出た案 を選ぶ。この回は C のサンプルが 0.40 で最大なので C が選ばれ、結果(成功 / 失敗)に応じて α, β が +1 され、次の回ではより尖った分布に更新される。
ベルヌーイ報酬(クリックされた / されなかった)の場合、事後分布は Beta(α, β) の閉形式で書け、観測のたびに α ← α + 報酬 / β ← β + (1 − 報酬) と +1 するだけで更新できる。実装が短く、性能が UCB1 と同等以上に出ることが多いのがトンプソン抽出の強みです。
# トンプソン抽出の実装(ベルヌーイ報酬)
import numpy as np
from scipy.stats import beta
rng = np.random.default_rng(42)
true_rates = np.array([0.20, 0.30, 0.25])
n_arms = len(true_rates)
T = 1000
alpha = np.ones(n_arms) # 事前分布 Beta(1, 1)
beta_ = np.ones(n_arms)
history = []
for t in range(T):
# 各案の事後分布から 1 サンプルずつ引く
samples = rng.beta(alpha, beta_)
a = int(np.argmax(samples)) # 最大のサンプルが出た案を選ぶ
r = 1.0 if rng.random() < true_rates[a] else 0.0
alpha[a] += r
beta_[a] += (1 - r)
history.append(a)
print("事後分布の平均 (= 推定 CVR):", alpha / (alpha + beta_))
print("各案の試行回数:", alpha + beta_ - 2) # α0=β0=1 を引く
# 連続値報酬(売上など)の場合は Beta ではなく
# Normal-Inverse-Gamma などの共役事前分布を使う試行回数が少ない案は事後分布の山が広く、サンプリングのたびに大きな値も小さな値も出ます。最大値を取るルールなので、「未知の案がたまたま高い値を出した → 試してみる」が自動で起きます。逆に十分試行した案は分布が尖り、サンプル値は平均近傍にしか出ないので活用に寄ります。1 回 1 サンプルしか引かない ので実装も短く、パラメータチューニングがほぼ要らないのがトンプソン抽出の強みです。
ここまでは「どのユーザーにも同じ案を見せる」前提でした。実務で「業種・流入経路・既訪問回数で最良の案が違いそう」という場面では、文脈ベクトル x を入力に取る 文脈付きバンディット(Contextual Bandit)に拡張します。代表は LinUCB(線形信頼上限、Yahoo のニュース推薦で著名)と 線形トンプソン抽出。文脈の次元 d は数百以内に抑え、オフライン評価(IPS / Doubly Robust)でログから候補ポリシーを検証する仕組みも合わせて整える、というのが運用の最低ラインです。属性で出し分ける価値が事前に明らかでない限り、まずは文脈なしのバンディットで改善幅を確認するのが安全です。
06.A/B テストにバンディットを組み込む 3 つのパターン
実務でいちばん知りたいのは「結局、A/B テストとバンディットをどう組み合わせるか」です。よくある運用パターンは次の 3 つに整理できます。
図:A/B テストとバンディットのトラフィック配分の違い
A/B は事前計画した期間まで 50/50 を維持。バンディットは観測した結果に応じて勝ち案(B)の比率が自動で上がる。劣る案 A への露出が時間とともに減るのがバンディットの「探索コスト削減」の正体。
| パターン | 使う場面 | 具体的な事業シーン | 進め方 | 向く面 |
|---|---|---|---|---|
| 01. A/B 卒業 → 常時最適化 | 主要 LP・フォームなど採用が決まっている画面で、引き続き文言バリアントを試したい | 主要 LP の CTA コピーで A/B 後の常時最適化 | 1) A/B テストで因果効果を確定 → 2) 勝者を採用 → 3) 2〜3 種類の文言バリアントをトンプソン抽出で常時ローテーション | 因果効果のエビデンスとローテーションの両立 |
| 02. トラフィック少なくて A/B が組めない | BtoB 小規模サイト・新規キャンペーンなど、サンプルサイズの確保が難しい | 月間 1,000 セッション以下の BtoB サイトでの LP テスト | 1) 案を 2〜3 に絞り、文脈なしのトンプソン抽出を最初から本番投入 → 2) 探索コストを最小化しつつ、累積報酬を最大化 | サンプル不足下での意思決定 |
| 03. バリアント数が多すぎる/頻繁に入れ替わる | バナー・レコメンド・タイトル A/B/C/D/E… の多バリアント、案の寿命が短い場面 | 20 種類のバナーを動的にローテーション | 1) 全バリアントを案として登録 → 2) トンプソン抽出が自動で配分 → 3) 新バリアント追加時は α=1, β=1 の初期値で混ぜる | 多案の動的最適化 |
手順は次のとおりです。(1) A/B テストで因果効果を確認(サンプルサイズ・MDE・検定は A/B テスト設計の基礎 を参照)。(2) 勝者を本番採用。(3) 採用後に、勝者ベースの文言・配色違いを 2〜3 種類用意し、トンプソン抽出で常時ローテーションを開始します。(4) 30 日ごとに新バリアントを追加(α=1, β=1 の初期値で)、長期間最下位が固定された案は除外。これで「明確に勝った案 + 周辺バリアントの動的探索」を同時に走らせられます。
バンディットの累積トラフィックにカイ二乗検定や t 検定を直接かけると、配分が動的に変わっているため、独立サンプル前提が崩れて偽陽性が膨らみます。「案 B が勝った」と社内意思決定で使いたい場合は、バンディット運用と並行で 固定配分の検証期間(例:2 週間 50/50)を設けるか、そもそも A/B テスト後にバンディットを回す順番にすることをおすすめします。
- 意思決定の性質:因果効果を社内に残したい → A/B。本番運用で累積報酬を最大化したい → バンディット
- 案の数と寿命:2〜3 案を時間をかけて確定 → A/B。多数のバリアントから動的に選ぶ・案が短寿命 → バンディット
- 報酬の遅延:報酬発生が遅くても OK → A/B。即時報酬(CTR・CVR) → バンディット
- ガードレール:明確な勝者判定が必要(プライシング・契約変更) → A/B。劣る案も最低限の確率で残せる → バンディット
上の s-05 のトンプソン抽出の実装はそのまま 30 行に収まり、numpy + scipy だけで動きます。LP の 2 案を毎日 100 セッションで回す前提で、A/B の 50:50 固定とトンプソン抽出を比較すると、勝ち案 CVR 3% / 劣る案 CVR 2% のとき、30 日後の累積 CV はトンプソン抽出のほうがおよそ 10〜15 件多くなります(劣る案への露出が時間とともに自動で減るため)。まずはこのコードを 1 つの LP に当てて、α と β の推移を毎日眺めるところから始めるのが、いちばん近道です。
自前で numpy 実装まで踏み込まなくても、バンディット(多くはトンプソン抽出)を内包した既製のツールがあります。代表的な選択肢は以下のとおりです。
- Optimizely(Stats Accelerator):A/B テストツール大手。多腕バンディットによる動的配分機能を持つ。
- VWO(Smart Optimization):マルチアームバンディットモードを切り替えで有効化できる。中小サイト向きの価格帯。
- Adobe Target(Auto-Allocate / Auto-Target):トンプソン抽出ベースの自動配分。Auto-Target は文脈付きバンディット相当。
- AB Tasty:Dynamic Traffic Allocation で勝ち案への自動配分。
- Statsig / Eppo / LaunchDarkly:データチーム向けの実験基盤。フィーチャーフラグ + バンディット運用が組める。
- Firebase A/B Testing:モバイルアプリ向け。Google が裏でバンディット系の最適化も提供。
- Vowpal Wabbit(OSS):Microsoft 発の機械学習ライブラリ。文脈付きバンディットの本格実装で広く使われている。
- Open Bandit Pipeline(OSS、ZOZO):日本発のバンディット・オフライン評価のための Python フレームワーク。研究用途で人気。
- numpy + scipy(自前実装):本記事のコード例 30 行で動く最小構成。1 つの LP・1 つのバナーから試すならこれが最速。
選ぶ基準は 「既に使っている A/B テスト基盤に乗せられるか」。Optimizely・VWO・Adobe Target をすでに導入済みなら、設定切り替えだけで動かせます。データチームが社内に居て柔軟に運用したいなら Statsig / Eppo、低トラフィックの 1 ページから試したいなら numpy 自前実装、というのが現実的な使い分けです。
07.よくある質問(FAQ)
A/Bテストとバンディットはどう使い分けますか?
因果効果を社内意思決定に残したい・プライシングなど致命的な判断・統計的有意性が要件、のときは A/B テストが向きます。本番運用で累積報酬を最大化したい・案が頻繁に入れ替わる・多数バリアントから動的に選びたい、のときはバンディットが向きます。両者は二者択一ではなく、主要 LP では A/B で因果を確定 → 採用後にトンプソン抽出で 2〜3 案を常時ローテーション するハイブリッドが現実的です。バナーやレコメンドのように案が短寿命な表示面は最初からバンディットで構いません。
トンプソン抽出は数学が難しそうですが実装も難しいですか?
ベイズという言葉に身構えがちですが、ベルヌーイ報酬(クリックされた / されなかった)に限れば実装は驚くほど短く済みます。各案の事後分布が Beta(α, β) という閉形式で書けるため、観測のたびに α ← α + 報酬、β ← β + (1 − 報酬) と +1 するだけで更新できます。毎回各案の Beta からサンプリングして最大が出た案を選ぶだけで、numpy + scipy なら 30 行程度。連続値報酬や Contextual に拡張する段階で初めて、共役事前分布の選び方や近似推論を考えれば十分です。
バンディットでも統計的有意性は確認すべきですか?
意思決定の根拠として統計的有意性が必要なら、バンディットの累積ログにそのままカイ二乗・t 検定をかけるのは避けます。配分が動的に変わっているため独立サンプル前提が崩れ、偽陽性率が名目の数倍に跳ね上がります。どうしても有意性を確認したいときは、(a) バンディット運用の前後に 固定配分の A/B 期間 を別途設ける、(b) IPS や Doubly Robust 推定 のような Off-policy 評価で補正する、のいずれかが現実的です。累積報酬の最大化が目的ならそもそも p 値で議論する必要はなく、事後分布の信頼区間で十分に説明できます。
CV が遅れて発生する(遅延報酬)場合はどうすればよいですか?
BtoB の資料請求や購入 CV のように、クリック後 7〜30 日で報酬が確定するケースは、生のバンディットの想定(即時報酬)から外れます。実務的な対処は 3 つあります。(a) クリック直後の 暫定報酬(ページ遷移・スクロール・フォーム表示)と、コンバージョン窓内の 確定報酬 を二重に持ち、暫定で逐次更新しつつ夜間バッチで確定値に置き換える。(b) 観測窓(例:CV 窓 14 日)を切り、窓を抜けたぶんだけまとめて事後分布を更新する。(c) Off-policy 評価で IPS(Inverse Propensity Scoring)の重み付けを使い、過去ログから遅延込みの期待報酬を推定する。いずれも実装はやや重くなるので、最初は暫定報酬での更新と確定報酬での補正の二段構えが取り回し良いです。
トラフィックが少ないサイトでバンディットは使えますか?
小規模サイトほどバンディットの相対的なメリットは大きくなります。劣る案にも均等に流す A/B の探索コスト を削れるためです。ただし、少サンプル環境では (a) 案数を 2〜3 に絞る、(b) 文脈なしのトンプソン抽出から始める、(c) Contextual に踏み込むのは月間 10 万 PV 以上になってから、という制約を守るのが安全です。月数百セッション規模の BtoB サイトであれば、A/B テスト自体が成立しないことが多いので、バンディットで「明確に勝っている案により多く回す」運用が現実的な選択肢になります。
08.まとめ
バンディットアルゴリズムは「テスト途中で今どれを見せるかを切り替える」適応的最適化の枠組みです。ε-greedy は短く書けて入口にはなるものの長期運用には不向き、UCB1 はパラメータほぼ無しで実用に耐え、トンプソン抽出 は実装も短く性能も高く、Beta(α, β) を α ← α + 1 / β ← β + 1 で更新するだけで動きます。
本番運用で 累積報酬を最大化したい・案が頻繁に入れ替わる・多数バリアントから選びたい、というケースはバンディットが向きます。一方で 因果効果を社内に残したい・プライシングなど致命的判断・統計的有意性が必須、というケースは A/B テストが向きます。最初はトンプソン抽出の 30 行の実装から触ってみて、必要になったら Contextual に拡張するのが取り回し良い進め方です。
A/Bテスト設計の基礎
MDE・サンプルサイズ・検定の使い分けを整理しています。
予測モデル評価
F1・ROC-AUC・MAE などの評価指標を整理しています。
因果推論の実務
DID・傾向スコア・RDD で観察データから因果効果を推定する手法を整理しています。
データ分析アルゴリズム全体図
類似度・一致度・予測モデル評価の3カテゴリで指標を整理した総合解説です。
バンディット導入と LP 最適化の伴走支援をご相談ください
トンプソン抽出・Contextual Bandit を使った LP / バナー / レコメンドの常時最適化、A/B テストとのハイブリッド運用設計、実験プラットフォーム選定までの伴走支援を行っています。お気軽にお問い合わせください。

