BigQuery MLで作るUplift Modeling
むやみなクーポン配布で利益を削っていませんか?因果推論「Uplift Modeling」を用いて「クーポンを配るべき顧客」だけを特定し、期待利益(ROI)を最大化する手法を実践解説します。BigQuery MLの制約をハックする「物理的リサンプリングによる疑似IPW」の実装テクニックも必見です。
目次
データパイプラインと特徴量エンジニアリング
モデルの予測精度はデータの前処理で決まると言っても過言ではありません。今回のアーキテクチャでは、生データから段階的にデータマートを構築するスタースキーマ構造を採用します。
1.STG層(Staging): マスタデータとトランザクションのクレンジング
2.INT層(Intermediate): ビジネスロジックの適用(LTVパーセンタイル、RFM、リスクフラグの算出)
3.MART層(Mart): 機械学習用・BI可視化用の最終テーブル
特に、単なる属性データだけでなく、「購買停滞リスク」「商品の欠品リスク」といった行動ベースの動的特徴量を組み込んでいる点がポイントです。
Uplift Modelingの実装:T-Learnerと疑似IPWのハック
なぜあえてBigQuery ML(BQML)で実装するのか?
Pythonを用いたVertex AI環境やローカルのJupyter Notebookなど、柔軟なモデリング環境がある中で、なぜあえてBQMLを選択するのでしょうか。それは「Data Gravity(データの重力)」と「MLOpsの容易さ」に圧倒的なメリットがあるからです。
・データ移動コストとセキュリティリスクの排除: 数億行に及ぶトランザクションやログデータは、すでにBigQuery(データウェアハウス)内に存在します。これを機械学習のために外部環境へエクスポートすることは、通信コストの増大やセキュリティリスクに繋がります。BQMLなら、データが置かれた場所でそのまま学習・推論が可能です。
・データパイプラインとのシームレスな統合: dbtやスケジュールされたクエリ(Scheduled Queries)など、既存のSQLベースのデータ処理パイプラインの延長線上に、「MLの学習・推論」を組み込むことができます。
・運用および保守の属人化防止: 別途推論用のAPIサーバーなどを立てる必要がなく、SQLを理解できるデータエンジニアやアナリストであれば、モデルの保守運用を容易に引き継ぐことができます。
このようなビジネス運用上の強力なメリットがあるからこそ、データウェアハウス内で完結するBQMLの活用がモダンなデータ基盤で好まれています。
T-LearnerとIPW(傾向スコア重み付け)
Uplift Modelingの代表的な手法に、介入(クーポン配布)あり・なしの2つのモデルを構築する「T-Learner」があります。しかし、過去の観測データには「クーポンをもらいやすい人・もらいにくい人」という選択バイアス(Selection Bias)が含まれています。
これを補正するために、傾向スコア(Propensity Score)の逆数で重み付けを行う IPW(Inverse Probability Weighting) を適用します。数式で表すと以下のようになります。
\[ W_i = \begin{cases} \frac{1}{P(T_i=1|X_i)} & \text{if } T_i=1 \text{ (介入群)} \\ \frac{1}{1 – P(T_i=1|X_i)} & \text{if } T_i=0 \text{ (統制群)} \end{cases} \]
BigQuery MLの壁と「物理的リサンプリング」による突破
先述の通りBQMLには運用上の絶大なメリットがありますが、一方で技術的な壁にもぶつかります。それは、BQMLのロジスティック回帰(LOGISTIC_REG)が、現時点で任意の重み付けカラム(Weight Column)を直接サポートしていない点です。
そこで今回は、「算出された重みの数だけ、行データを物理的に複製(増幅)する」という力技(疑似IPW)を採用します。実際のSQLの一部を見てみましょう。
-- 1. 傾向スコア(クーポン配布確率)の算出
CREATE OR REPLACE MODEL `ecommerce_project.ml_dataset.propensity_model`
OPTIONS(model_type='LOGISTIC_REG', input_label_cols=['is_treated']) AS
SELECT is_treated, customer_segment, ltv_percentile, past_orders_90d /* ... */
FROM `ecommerce_project.ml_dataset.mart_training_base`;
-- 2. 重みの計算と行の物理的複製(疑似IPW)
CREATE OR REPLACE TABLE `ecommerce_project.ml_dataset.mart_weighted_data` AS
WITH preds AS (
SELECT *, prob AS propensity_score
FROM ML.PREDICT(MODEL `ecommerce_project.ml_dataset.propensity_model`, ...)
),
weighted AS (
SELECT *,
CASE
WHEN is_treated = 1 THEN 1.0 / GREATEST(propensity_score, 0.01)
ELSE 1.0 / GREATEST(1.0 - propensity_score, 0.01)
END AS ipw_weight
FROM preds
)
-- 重みを整数に丸め(最大10倍に制限)、GENERATE_ARRAYで物理的に行を増幅
SELECT * EXCEPT(propensity_score, ipw_weight)
FROM (
SELECT *, CAST(LEAST(ROUND(ipw_weight), 10) AS INT64) AS rep_count
FROM weighted
), UNNEST(GENERATE_ARRAY(1, GREATEST(rep_count, 1))) AS replica_id;この増幅されたデータセットを使って、介入群(Treated)と統制群(Control)それぞれの予測モデルを学習させます。
Qini Curveによるモデル評価
作成したモデルが本当に「効果の高い顧客」を見つけ出せているのか?それを視覚的に評価するのが Qini Curve です。

・横軸: Uplift Score(介入群の予測確率 – 統制群の予測確率)が高い順に並べた顧客のパーセンタイル
・縦軸: 累積のUplift(純増効果)
青い線(モデルの予測)が水色の線(ランダム配布)を大きく上回り、左上に膨らんでいることがわかります。これは、モデルが「クーポンに反応しやすいユーザー」を正確に上位にランク付けできている証拠です。
ROIシミュレーション:結局、どこまで配るのが正解か?
精度の高いモデルができても、ビジネス上の最大の関心事は「利益」です。
クーポン配布には原価(値引きコスト)がかかります。そのため、各ユーザーへの期待利益(Expected Net Value)を以下の数式で定義します。
$$ \begin{aligned} Expected\_Net\_Value &= LTV \times \Big( Uplift\_Score – P(CV|Treated) \times Coupon\_Cost\_Rate \Big) \end{aligned} $$
この期待利益をベースに、上位から順にクーポンを配った場合のシミュレーションを行ったのが以下のグラフです。

- 青色の折れ線(Cumulative Profit): 累積の期待利益
- 水色の棒グラフ(Marginal Profit): 限界利益(ユーザー1人追加ごとの利益増減)
グラフを見ると、上位からクーポンを配布していくと累積利益(青線)は上昇を続けますが、90%付近をピーク(極大値)に下降に転じています。右端の層(棒グラフがマイナスに沈んでいる層)は、「クーポンを配ると逆に利益が赤字になる層」です。
【結論(アクションプラン)】
このシミュレーション結果により、「Uplift Score上位90%のユーザーをターゲットとすることで、ROIを最大化できる」という明確な意思決定が可能になります。残りの10%(マイナス層)は配布対象外(推奨フラグ=0)として除外します。
まとめ
機械学習による予測は、確率や精度を出すまでが仕事ではありません。それを「ビジネスの利益(ROI)とアクション」に変換することで初めて価値を生みます。
1.データウェアハウス内で完結するBQMLのエコシステムを活用し、運用コストを劇的に下げる。
2.Qini Curveでモデルの性能を客観的に評価する。
3.ROIシミュレーションによって、利益が最大化する「損益分岐点」を特定し、自動配信のセグメントを切る。
データ分析チームが「とりあえずA/Bテスト」という思考から脱却し、このようなオフライン検証と期待値シミュレーションを提示できるようになれば、マーケティング施策の確度とスピードは劇的に向上するはずです。
