2024 年 3 月 7 日の時点で、Google はMeridianと呼ばれる新しい公式ベイジアン MMM バージョンをリリースしました。 Meridian は現在、一部の広告主向けに限定的に提供されています。詳細については、このサイトにアクセスするか、Google 担当者にお問い合わせください。 Meridian が一般提供されると、LMMM バージョンは廃止されます。
ドキュメント • はじめに • 理論 • 入門 • 参考文献 • コミュニティのスポットライト
マーケティング ミックス モデリング (MMM) は、広告主が広告の効果を測定し、メディア チャネル全体での予算配分の決定を通知するために使用されます。集約されたデータに基づく測定により、アトリビューション モデリングに影響を与える可能性のある最近のエコシステムの変化 (一部はプライバシーに関連するもの) の影響を受けないだけでなく、オンライン チャネルとオフライン チャネル間の比較が可能になります。 MMM を使用すると、次のことが可能になります。
MMM にベイジアン アプローチを採用すると、広告主は以前の情報をモデリングに統合できるため、次のことが可能になります。
LightweightMMM パッケージ (Numpyro と JAX を使用して構築) は、データを適切にスケーリングし、モデルを評価し、予算配分を最適化し、現場で使用される一般的なグラフをプロットする機能を提供することで、広告主がベイジアン MMM モデルを簡単に構築できるようにします。
MMM は、他の要因を制御しながら、メディア チャネルのアクティビティと売上の関係を定量化します。簡略化したモデルの概要を以下に示します。完全なモデルはモデルのドキュメントに記載されています。 MMM は通常、週次レベルの観察を使用して実行されます (たとえば、KPI は週ごとの売上など) が、日次レベルで実行することもできます。
ここで、 kpi は通常、期間ごとの売上高または金額を指します。
LightweightMMM は、国家レベルで集約されたデータ (標準アプローチ) または地域レベルで集約されたデータ (準国家階層アプローチ) を使用して実行できます。
全国レベル (標準的なアプローチ)。このアプローチは、利用可能なデータが国レベルでのみ集計されている場合に適切です (たとえば、KPI は期間ごとの全国売上高である可能性があります)。これは MMM で使用される最も一般的な形式です。
地理レベル (準国家階層的アプローチ)。このアプローチは、データを準国家レベルで集計できる場合に適しています (たとえば、KPI は国内の各州の期間ごとの売上である可能性があります)。このアプローチでは、モデルに適合させるためにより多くのデータ ポイントが使用されるため、標準的なアプローチと比較してより正確な結果が得られます。可能であれば、米国などの大規模な国では準国家レベルのモデルを使用することをお勧めします。
販売に対するメディア チャネルの影響には、時間の経過とともにゆっくりと減少する遅効性の影響がある可能性があります。当社の強力なベイジアン MMM モデル アーキテクチャは、この効果を捉えるように設計されており、3 つの異なるアプローチを提供します。 3 つのアプローチをすべて比較し、最も効果的なアプローチを使用することをお勧めします。最も効果的なアプローチは、通常、サンプル外の適合が最も優れているアプローチ (生成された出力の 1 つ) です。これら 3 つのアプローチの機能形式は以下で簡単に説明されており、モデルのドキュメントに完全に表現されています。
Lightweight_mmm をインストールする推奨される方法は、PyPi を使用することです。
pip install --upgrade pip
pip install lightweight_mmm
最新の、若干安定性の低いバージョンを使用したい場合は、github からインストールできます。
pip install --upgrade git+https://github.com/google/lightweight_mmm.git
Google Colab を使用している場合は、インストール後に必ずランタイムを再起動してください。
ここではシミュレートされたデータを使用しますが、この時点でデータがクリーン化されていることを前提としています。必要なデータは次のとおりです。
# Let's assume we have the following datasets with the following shapes (we use
the `simulate_dummy_data` function in utils for this example ):
media_data , extra_features , target , costs = utils . simulate_dummy_data (
data_size = 160 ,
n_media_channels = 3 ,
n_extra_features = 2 ,
geos = 5 ) # Or geos=1 for national model
スケーリングはちょっとした技術であり、入力データが小規模な場合にはベイジアン手法がうまく機能します。変数の中心を 0 にすべきではありません。売上とメディアの下限は 0 でなければなりません。
y
y / jnp.mean(y)
としてスケーリングできます。media
X_m / jnp.mean(X_m, axis=0)
としてスケーリングできます。これは、新しい列の平均が 1 になることを意味します。広く使用されているスケーラーがユースケースに適合しない場合に備えて、乗算と除算のスケーリングを適用できるCustomScaler
を提供します。モデルをフィッティングする前に、それに応じてデータをスケーリングします。以下は、このCustomScaler
の使用例です。
# Simple split of the data based on time.
split_point = data_size - data_size // 10
media_data_train = media_data [: split_point , :]
target_train = target [: split_point ]
extra_features_train = extra_features [: split_point , :]
extra_features_test = extra_features [ split_point :, :]
# Scale data
media_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
extra_features_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
target_scaler = preprocessing . CustomScaler (
divide_operation = jnp . mean )
# scale cost up by N since fit() will divide it by number of time periods
cost_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
media_data_train = media_scaler . fit_transform ( media_data_train )
extra_features_train = extra_features_scaler . fit_transform (
extra_features_train )
target_train = target_scaler . fit_transform ( target_train )
costs = cost_scaler . fit_transform ( unscaled_costs )
変数に多くの 0 が含まれる場合は、ゼロ以外の値の平均によってスケーリングすることもできます。たとえば、ラムダ関数を使用してこれを行うことができます: lambda x: jnp.mean(x[x > 0])
。コストのスケーリングにも同じことが当てはまります。
このモデルには、メディア データ、追加機能、チャネルごとの各メディア ユニットのコスト、およびターゲットが必要です。使用するサンプルの数とチェーンの数を渡すこともできます。
複数のチェーンを並行して実行するには、ユーザーはnumpyro.set_host_device_count
チェーンの数または使用可能な CPU の数に設定する必要があります。
以下の例を参照してください。
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 )
モデル内のプリアを変更したい場合は (常に指定しているメディア プリアを除く)、 custom_priors
を使用して変更できます。
# See detailed explanation on custom priors in our documentation.
custom_priors = { "intercept" : numpyro . distributions . Uniform ( 1 , 5 )}
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 ,
custom_priors = custom_priors )
詳細については、custom_priors に関するドキュメントを参照してください。
weekday_seasonality=True
およびseasonality_frequency=365
、またはweekday_seasonality=False
およびseasonality_frequency=52
(デフォルト)を有効にすることで、日次データと週次データを切り替えることができます。日次データの場合、離散平日と平滑年次の 2 種類の季節性があります。
ユーザーは次のようにパラメータの収束メトリクスを確認できます。
mmm . print_summary ()
経験則では、すべてのパラメータのr_hat
値は 1.1 未満です。
ユーザーは、次の方法で真の KPI と予測された KPI の適合性を確認できます。
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
preprocessing.CustomScaler()
に使用されるtarget_scaler
が指定されている場合、ターゲットはスケーリングされません。ベイジアン R 二乗と MAPE がグラフに示されています。
ユーザーは次の方法でテスト データの予測を取得できます。
prediction = mmm . predict (
media = media_data_test ,
extra_features = extra_data_test ,
target_scaler = target_scaler
)
返される予測は分布です。点推定値が必要な場合、ユーザーは指定された分布に基づいて推定点を計算できます。たとえば、テスト データのdata_size
が 20、 number_samples
が 1000、 number_of_chains
が 2 の場合、 mmm.predict
20 データ ポイントを持つ 2000 セットの予測を返します。ユーザーは、分布をテスト データの真の値と比較し、平均や中央値などの指標を計算できます。
ユーザーは次の方法でパラメータ推定の詳細を取得できます。
mmm . print_summary ()
上記は、各パラメーターの平均、標準偏差、中央値、および信頼区間を返します。分布図は以下から提供されます。
plot . plot_media_channel_posteriors ( media_mix_model = mmm , channel_names = media_names )
channel_names
各チャートのメディア名を指定します。
応答曲線は次のように提供されます。
plot . plot_response_curves ( media_mix_model = mmm , media_scaler = media_scaler , target_scaler = target_scaler )
preprocessing.CustomScaler()
に使用されるmedia_scaler
とtarget_scaler
指定されている場合、メディアとターゲットの値は両方ともスケールされません。
メディアの効果と ROI の推定を抽出するには、ユーザーは次のことを実行できます。
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
はメディア効果の推定値、 roi_hat
ROI 推定値です。その後、ユーザーは次のように推定値の分布を視覚化できます。
plot . plot_bars_media_metrics ( metric = media_effect_hat , channel_names = media_names )
plot . plot_bars_media_metrics ( metric = roi_hat , channel_names = media_names )
最適化のために、メディアの合計コストが一定になるようにメディア入力を変更して売上を最大化します。また、各メディア入力に適切な制限 (例: +- x%) を許可することもできます。私たちはチャネル全体でのみ最適化を行い、長期にわたる最適化は行いません。最適化を実行するには、次の主なパラメータが必要です。
n_time_periods
: シミュレートする期間の数 (例: 毎週のデータでモデルをトレーニングした場合は、次の 10 週間を最適化します)。n_time_periods
に割り当てるbudget
。n_time_periods
のトレーニングに使用される追加機能。media_gap
、トレーニング データの終わりと、指定されたサンプル メディアの始まりとの間のメディア データ ギャップを指します。例えば。 100 週間のデータがトレーニングに使用され、トレーニング データが終了してから 2 か月後に予測が開始される場合、データ変換 (アドストック、キャリーオーバーなど) が正しく行われるように、トレーニング データと予測データの間に欠落している 8 週間を提供する必要があります。 。以下の最適化の例を参照してください。
# Run media optimization.
budget = 40 # your budget here
prices = np . array ([ 0.1 , 0.11 , 0.12 ])
extra_features_test = extra_features_scaler . transform ( extra_features_test )
solution = optimize_media . find_optimal_budgets (
n_time_periods = extra_features_test . shape [ 0 ],
media_mix_model = mmm ,
budget = budget ,
extra_features = extra_features_test ,
prices = prices )
ユーザーは次のようにモデルを保存およびロードできます。
utils . save_model ( mmm , file_path = 'file_path' )
ユーザーはfile_path
を指定してモデルを保存できます。保存した MMM モデルをロードするには:
utils . load_model ( file_path : 'file_path' )
このリポジトリを引用するには:
@software{lightweight_mmmgithub,
author = {Pablo Duque and Dirk Nachbar and Yuka Abe and Christiane Ahlheim and Mike Anderson and Yan Sun and Omri Goldstein and Tim Eck},
title = {LightweightMMM: Lightweight (Bayesian) Marketing Mix Modeling},
url = {https://github.com/google/lightweight_mmm},
version = {0.1.6},
year = {2022},
}
Jin, Y.、Wang, Y.、Sun, Y.、Chan, D.、Koehler, J. (2017)。キャリーオーバーと形状効果を使用したメディア ミックス モデリングのためのベイジアン手法。グーグル株式会社
チャン D.、ペリー M. (2017)。メディア ミックス モデリングにおける課題と機会。
Sun, Y.、Wang, Y.、Jin, Y.、Chan, D.、Koehler, J. (2017)。地域レベルのベイジアン階層メディア ミックス モデリング。
LMMM は Google の公式製品ではないため、LMMM チームは限定的なサポートしか提供できません。
方法論に関する質問については、「参考文献」セクションまたは「FAQ」ページを参照してください。
LMMM のインストールまたは使用に関する問題については、Github リポジトリの [ディスカッション] タブまたは [問題] タブに自由に投稿してください。 LMMM チームは空き時間にこれらの質問に回答するため、残念ながらタイムリーな回答を保証することはできません。また、コミュニティがここで互いにヒントやアドバイスを共有することも奨励しています。
機能リクエストについては、Github リポジトリの [ディスカッション] タブに投稿してください。私たちは LMMM 開発の社内ロードマップを持っていますが、機能のリクエストには注意を払い、感謝しています。
バグレポートについては、Github リポジトリの [問題] タブに投稿してください。それらに対処できる場合は、問題のコメントでお知らせします。
プル リクエストは歓迎されますが、このリポジトリ内のコードは Google の内部システムにリンクされており、内部レビューに合格する必要があるため、マージは非常に困難です。プル リクエストを送信し、それをマージするためのリソースがある場合は、そのことについてご連絡いたします。
「LightweightMMM を使用してマーケティング ミックス モデルを作成する方法」Mario Filho 著。
Google LightweightMMM の仕組みと Mike Taylor による Google の LightweightMMM のウォークスルー。