【因果推論】uplift modeling(アップリフトモデリング)について

こんにちは、青の統計学です。

今回は、アップリフトモデリングについて解説していきます。

これはマーケティングや広告などの分野で、特定のアクション(例えば、プロモーションやキャンペーン)が個々の顧客やユーザーに与える影響を予測するための手法です。

このモデルのモチベーションになるのは、アクションがその人にどれだけの「追加的な影響」を与えるかを予測することにあります。

uplift modeling

Uplift modelingは、介入(例えばマーケティングキャンペーン)を受けたグループと受けなかったグループの間の反応の差をモデル化します。

この「差」は、介入によってもたらされる追加の影響、または「アップリフト」と呼ばれます

アップリフトモデルは、特定の介入が個々の行動に与える影響を予測するために使用される、統計学および機械学習の手法の一つです。

マーケティングの分野で顧客の行動変容を予測するために用いられることが多いですが、その応用範囲は医療、公共政策、金融など多岐にわたります。

本コンテンツでは、アップリフトモデリングの基本原理、重要な数学的概念、そして因果推論との関連に焦点を当てて詳細に解説します。

アップリフトスコアの定義と目的

モデルの核心は、「介入がなされた場合とされなかった場合の行動の差」、すなわちアップリフトを定量的に評価することにあります。

この手法は、伝統的な予測モデルとは異なり、個々の対象に対する介入の効果そのものを予測する点に特徴があります。

これにより、リソースを最も効果的に配分する方法を特定し、介入の最適化を図ることが可能となります。

アップリフトスコアは、次のように定義されます。

$$uplift score = P(Y=1|,X,T=1)-P(Y=1|X,T=0)$$

ここで、\(Y\) は対象の行動変化(例えば、商品購入の有無)、\(X\)は対象の特徴量(例えば、年齢や購入履歴)、\(T\)は介入の有無(1 が介入あり、0 が介入なし)を表します。

この式は、介入が与えられた場合と与えられなかった場合で、目的の行動変化が起こる確率の差を示しています。

因果推論との関わりと数理的アプローチ

アップリフトモデリングは因果推論の枠組みの中で考えられます。

因果推論は、特定の原因(介入)が結果(行動変化)に与える影響を評価することを目的としています。

アップリフトモデリングでは、個々の対象に対する特定の介入の効果を、確率的な観点から推定しています。

因果推論の基本的な考え方から理解したい方は、以下のコンテンツをご覧ください。

数学的背景

基本的には統計的な手法と機械学習アルゴリズムが組み合わされています。

アップリフトモデルの基礎となるのは、以下のような確率モデルの構築です。

$$P(Y|X,T)=f(X,T)$$

ここで、\(f\)はデータから学習される関数であり、\(X\)と \(T\)に依存して \(Y\) の確率を推定します。

アップリフトモデルには、様々な手法が存在します。

以下にその中の代表的なものを挙げます

差分アプローチ

介入群と対照群を別々にモデル化し、その予測結果の差分をアップリフトスコアとして使用します。

$$uplift score = P(Y=1|,X,T=1)-P(Y=1|X,T=0)$$

先ほど記述したスコアと同じですね!

交互効果モデル

このアプローチでは、介入の有無が特徴量の影響に与える交互作用をモデリングします。

$$P(Y|X,T)=f(X)+g(X)×T$$

ここで、\(f(X)\)は介入なしの場合の出力、\(g(X)×T\)は介入の効果を示します。

実装上の考慮事項

さて、実務観点だと気になるのがモデルの実装についてです。

1. データセットの前処理

アップリフトモデリングの精度は、使用するデータセットの質に大きく依存します。

データの前処理には以下のようなステップが含まれます。

  • データの正規化: 特徴量間のスケールの不均衡を修正するため、データを正規化します。これには、最小最大スケーリングやZスコア正規化などがあります。
  • 欠損値の処理: 欠損値の扱い方は、その特性に応じて異なります。単純な代入、統計的手法、またはモデルベースの手法が用いられることがあります。
  • 特徴量の選択と変換: 効果的な特徴量の選択は、モデルの性能に大きな影響を与えます。主成分分析(PCA)、線形判別分析(LDA)などの次元削減技術が有効です。

2. モデルの評価方法

モデルの評価は、その性能を客観的に判断するために不可欠です。アップリフトモデルの評価には、以下のような指標が用いられます。

  • アップリフトカーブ: 予測されたアップリフトスコアに基づき、様々な閾値での結果を評価します。
  • Qini係数: 介入効果をランダムな介入と比較し、モデルの有効性を定量的に評価します。
  • 平均処置効果(ATE): 介入群と対照群間の平均的な効果差を計測します。

code

ここでは仮想データを使ったシミュレーションをしています。

基本的な機械学習モデリングと同じ流れで実装できます。

ランダムフォレストについては以下のコンテンツをご覧ください。

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# 架空のデータセットの生成
np.random.seed(42)
data_size = 1000
features = np.random.rand(data_size, 5)
treatment = np.random.binomial(1, 0.5, data_size)
outcome = (np.sum(features, axis=1) + treatment * np.random.uniform(0.5, 1.5, data_size)) > 2.5

data = pd.DataFrame(features, columns=['feature_{}'.format(i) for i in range(5)])
data['treatment'] = treatment
data['outcome'] = outcome.astype(int)

# データセットをトレーニングセットとテストセットに分割
X = data.drop('outcome', axis=1)
y = data['outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# ランダムフォレストモデルの構築
model_treatment = RandomForestClassifier(random_state=42)
model_control = RandomForestClassifier(random_state=42)

# 介入群と対照群でモデルを別々に訓練
model_treatment.fit(X_train[X_train['treatment'] == 1], y_train[X_train['treatment'] == 1])
model_control.fit(X_train[X_train['treatment'] == 0], y_train[X_train['treatment'] == 0])

# テストデータでの予測
preds_treatment = model_treatment.predict_proba(X_test)[:, 1]
preds_control = model_control.predict_proba(X_test)[:, 1]

# アップリフトスコアの計算
uplift_score = preds_treatment - preds_control

# アップリフトスコアの表示(最初の10個のスコア)
print(uplift_score[:10])

FOLLOW ME !