はじめに
マーケティングミックスモデリング(MMM)の世界では、Google Meridian、Meta Robynに続く第三の選択肢としてPyMC-Marketingが急速に存在感を増しています。2024年後半から2025年にかけて、HelloFresh、Bolt、Shell、Lemonadeといったグローバル企業が相次いで採用事例を公開し、ベイジアンMMMの実務利用が本格化しています。
本記事では、PyMC-Marketingの全体像を、MMMlabの既存記事(Meridian編・Robyn編)を読んだ読者向けに解説します。MMMの基礎理論(アドストック、飽和関数、回帰モデル、ベイズ統計の基礎等)については別記事で詳しく扱っていますので、本記事ではPyMC-Marketing固有の内容に集中します。
本記事を読むと以下がわかります。
- PyMC-Marketingが他のMMMライブラリと何が違うのか(MMM以外にCLV・Customer Choiceを統合)
- 4層アーキテクチャと4つのサンプリングバックエンドの選び方
- Adstock変換(Geometric vs Weibull)の実務的な使い分け
- Saturation変換(Logistic vs Hill vs Tanh)の特性と選択基準
- Prior APIやYAML駆動モデルなどPyMC-Marketing独自の機能群
- 導入企業が得た具体的な成果(60%分散削減、10倍高速化など)
- データ要件と品質チェックリスト
1. PyMC-Marketingとは
基本情報
| 項目 | 内容 |
|---|---|
| 名称 | PyMC-Marketing |
| 開発元 | PyMC Labs(Dr. Thomas Wiecki、Alexandre Andorra) |
| ライセンス | Apache 2.0(商用利用無料) |
| 最新版 | v0.18.2(2026年2月23日リリース) |
| 対応Python | 3.11, 3.12, 3.13 |
| コントリビューター | 60人以上 |
| 依存ライブラリ | PyMC (>=5.0), PyTensor, ArviZ, scikit-learn, matplotlib, Plotly |
PyMC-Marketingは、確率的プログラミングフレームワークPyMCの上に構築されたマーケティング分析専用ライブラリです。PyMC自体はPyTensor(旧Theano)による自動微分とシンボリック計算を基盤としており、ユーザーは内部のサンプラーを意識せずに高レベルAPIでベイズモデルを記述できます。
PyMCは学術研究やデータサイエンスの世界で最も広く使われている確率的プログラミングフレームワークの一つであり、年間数千本の学術論文で引用されています。PyMC-Marketingはそのエコシステムを活用し、マーケティング分析に特化したAPIを提供します。
3つの分析モジュール
一般的なMMMツール(Google Meridian、Meta Robyn)との最大の違いは、MMM以外にCLV(顧客生涯価値)とCustomer Choice(カニバリゼーション分析)を統合している点です。
| モジュール | 概要 | 他のMMMライブラリとの差 |
|---|---|---|
| MMM | 広告チャネルの効果測定と予算最適化 | Meridian/Robynにもある |
| CLV | 顧客生涯価値のベイズ推定(BTYD全系列) | PyMC-Marketingのみ |
| Customer Choice | 新製品カニバリゼーション分析(MV-ITS) | PyMC-Marketingのみ |
MMMモジュールの概要
マーケティングミックスモデリングの標準的なワークフロー(データ投入 → Adstock/Saturation変換 → ベイズ線形回帰 → 事後分布推定 → チャネル貢献度分解 → 予算最適化)を高レベルAPIで実装します。GeometricやWeibullなど複数のAdstock関数をクラスとして提供し、1行でモデル定義できるのが特徴です。
主なAPIの流れは以下の通りです。
from pymc_marketing.mmm import MMM, GeometricAdstock, LogisticSaturation
# モデル定義(1行でAdstock/Saturation/チャネルを指定)
mmm = MMM(
date_column="date_week",
channel_columns=["tv", "search", "social"],
adstock=GeometricAdstock(l_max=8),
saturation=LogisticSaturation(),
)
# フィッティング
mmm.fit(X=df, target_column="revenue")
# チャネル貢献度の可視化
mmm.plot_channel_contribution_share_hdi()
# 予算最適化
mmm.optimize_budget(budget=1000000, num_periods=52)
CLVモジュールの概要
BTYD(Buy Till You Die)モデル群をベイズ推定で実装します。具体的には以下のモデルクラスを提供しています。
| クラス名 | モデル | 用途 |
|---|---|---|
BetaGeoModel | BG/NBD | 購買頻度予測 + 離脱確率 |
ParetoNBDModel | Pareto/NBD | BG/NBDの一般化版 |
GammaGammaModel | Gamma-Gamma | 期待購買金額の推定 |
| 組み合わせ | BG/NBD + Gamma-Gamma | CLV = 頻度 x 金額 |
従来のBTYDモデル(Python lifetimesライブラリ等)は最尤推定(MLE)でしたが、PyMC-MarketingはMCMCによるベイズ推定を行うため、パラメータの不確実性がそのまま予測のHDI(Highest Density Interval)として得られます。これにより「CLV = 12,000円」ではなく「CLV = 12,000円 [8,500円, 16,200円]」のような不確実性付きの推定が可能です。
この不確実性の定量化は、マーケティング投資の意思決定において非常に重要です。例えば「この顧客セグメントに100万円を投資すべきか?」という問いに対して、点推定だけでは判断材料が不十分ですが、信頼区間があれば最悪ケースも含めたリスク評価が可能になります。
Customer Choiceモジュールの概要
Multivariate Interrupted Time Series(MV-ITS)による因果効果推定を実装します。例えば「新商品Bを投入したとき、既存商品Aの売上はどう変化したか?」という問いに対して、ベイズ構造時系列モデルで反事実(もしBがなかったら)を推定し、カニバリゼーション率を定量化します。
新商品のローンチは、しばしば既存商品の売上を奪います。Customer Choiceモジュールを使えば、「新商品の売上のうち何%が既存商品からのカニバリゼーションで、何%が純粋な新規需要なのか」を分離できます。この情報は、プロダクトポートフォリオの最適化に不可欠です。
CLVとCustomer Choiceを統合しているのはPyMC-Marketingだけです。MMMツールが必要なだけならMeridianやRobynでも代替可能ですが、CLVやカニバリゼーション分析まで一つのフレームワークで扱いたい場合はPyMC-Marketing一択になります。
2. アーキテクチャ — 4層スタック構造
PyMC-Marketingの内部は、以下の4層で構成されています。この構造を理解しておくと、トラブルシューティングやカスタマイズの際に役立ちます。
+--------------------------------------+
| PyMC-Marketing |
| (MMM / CLV / Customer Choice) |
+--------------------------------------+
| PyMC |
| (確率的プログラミングフレームワーク) |
+--------------------------------------+
| PyTensor |
| (シンボリック計算 / 自動微分) |
+------+------+------+----------------+
| NUTS |NumPyro|BlackJAX| Nutpie |
|(既定) |(JAX) |(JAX) | (Rust) |
+------+------+------+----------------+
| CPU / GPU (CUDA) / TPU |
+--------------------------------------+
レイヤー構成の詳細
PyMC-Marketing層(最上位): ユーザーが直接触るAPI。MMM(), BetaGeoModel() などのクラスを提供し、fit(), predict(), optimize_budget() などのメソッドで分析を実行します。マーケティング実務者はこのレイヤーだけを理解すれば分析を実行できます。
PyMC層: 確率モデルの記述言語。PyMC-Marketingの各クラスは内部で pm.Model() コンテキストを使ってベイズモデルを自動構築します。mmm.model でPyMCモデルオブジェクトを直接参照でき、上級者はカスタマイズが可能です。例えば、デフォルトの正規分布尤度をStudent-T分布に変更するといったカスタマイズが、PyMCレベルで実現できます。
PyTensor層: 数式のシンボリック表現と自動微分を担当します。Adstock変換やSaturation変換はPyTensorの演算グラフとして実装されているため、勾配ベースのMCMCサンプラー(HMC/NUTS)が効率的に動作します。ユーザーが直接触ることはほぼありませんが、カスタム変換を実装する場合にはこのレイヤーの知識が必要になります。
サンプラー層: 実際にMCMCサンプリングを実行するエンジン。4つのバックエンドから選択可能で、すべてHMC(Hamiltonian Monte Carlo)系のアルゴリズムを使用します。バックエンドの選択はコード1行で切り替えられ、モデル定義を変更する必要はありません。
MMMの内部モデル構造
PyMC-Marketingの MMM クラスは、内部で以下のベイズモデルを自動構築します。
y[t] = intercept
+ Sigma_c beta_channel[c] * Saturation( Adstock( x[t,c] ) )
+ Sigma_j beta_control[j] * z[t,j]
+ fourier_seasonality[t]
+ trend[t]
+ epsilon[t]
ここで重要なのは、Adstock → Saturation の順番で変換が合成される点です。「まず広告効果の残存を計算し、その残存効果に対して飽和効果を適用する」という流れで、マーケティングの因果関係に対応しています。
各項の詳細は以下の通りです。
y[t]: 目的変数(売上等)。正規分布Normal(mu, sigma)で観測モデルを仮定intercept: 切片(ベースライン売上)。広告がゼロでも存在する売上に対応beta_channel[c]: チャネルcの効果係数。HalfNormal(sigma=2)がデフォルト(非負制約 = 広告は売上にプラスの影響しか与えないという仮定)Adstock(): 広告残存効果の変換。GeometricまたはWeibullクラスが担当Saturation(): 飽和効果の変換。Logistic/Hill/Tanhクラスが担当beta_control[j]: コントロール変数の効果。符号制約なし(気温や競合価格は売上を増減させ得る)fourier_seasonality[t]: フーリエ級数で季節性をモデル化。年次・週次のパターンを捕捉epsilon[t]: 観測ノイズ。モデルが説明できない変動
3. 4つのサンプリングバックエンド
「サンプリングバックエンドの交換可能性」はPyMC-Marketingの大きな強みです。MeridianはTensorFlow Probabilityに固定されており、Robynはそもそも頻度論的手法(勾配降下 + Nevergrad進化的最適化)であるため、この柔軟性はPyMC-Marketing独自のものです。
バックエンド一覧
| バックエンド | ベース技術 | 推奨シーン | 備考 |
|---|---|---|---|
| NUTS(既定) | PyTensor | 初めての利用、小-中規模データ | 最も安定。診断情報が最も詳細。追加インストール不要 |
| Nutpie | Rust | CPU環境での高速化 | Rust製バイナリ。CPUのみで5-10倍高速化。メモリ効率も良好 |
| NumPyro | JAX | GPU活用、大規模データ | CUDA/ROCm必須。JITコンパイルで10-50倍高速化が可能 |
| BlackJAX | JAX | カスタムサンプラーが必要な研究用途 | HMC以外のサンプラー(GHMC等)も使える。最も柔軟 |
バックエンド選択の判断フロー
GPUが使える?
|-- Yes --> NumPyro(最速。GPU VRAM 8GB以上推奨)
| コード: mmm.fit(..., nuts_sampler="numpyro")
|
+-- No
|-- データが大きい(200週x5ch以上)?
| +-- Yes --> Nutpie(CPU最速。pip install nutpie が必要)
| コード: mmm.fit(..., nuts_sampler="nutpie")
+-- No --> NUTS(既定。追加設定不要)
コード: mmm.fit(...)
パフォーマンスベンチマーク
PyMC-Marketing内部のバックエンド比較(100週 x 3チャネル、4chain x 1000 draws):
| バックエンド | 実行時間 | メモリ使用量 | セットアップの手間 |
|---|---|---|---|
| NUTS(既定) | 約5分 | 2-4GB | なし |
| Nutpie | 約1分 | 1-2GB | pip install nutpie のみ |
| NumPyro(GPU) | 約30秒 | 4-6GB(VRAM) | JAX + CUDA環境構築が必要 |
| BlackJAX | 約40秒 | 4-6GB(VRAM) | JAX + CUDA環境構築が必要 |
NutpieはCPU環境で最もコストパフォーマンスが高い選択です。pip install nutpie だけで導入でき、GPU環境の構築コストなしに5-10倍の高速化が得られます。「まずNUTSで試して、遅ければNutpieに切り替える」というフローが実務的に推奨されます。
PyMC-Marketing vs Meridian 比較(PyMC Labs公式ベンチマーク、同一データ・同一ハードウェア):
| 指標 | 結果 |
|---|---|
| サンプリング速度 | Meridian比 2-20倍高速(バックエンドによる) |
| チャネル貢献度推定精度 | 約40%の誤差低減 |
| エンタープライズ規模 | 50地域x30チャネルでMeridianは収束失敗、PyMCは成功 |
重要な注意: このベンチマークはPyMC Labsが公式ブログで公開しているものです。Meridian開発元のGoogleは独自のベンチマークを公開していません。中立的な第三者検証はまだ存在しない点に留意してください。ベンダーが自社製品に有利なベンチマークを公開する傾向は業界全般に見られるため、これらの数値は参考値として捉えるのが適切です。
バックエンドの切り替えコード例
モデル定義はそのままに、fit() の引数を1つ変更するだけでバックエンドを切り替えられます。
# NUTS(既定)
mmm.fit(X=df, target_column="y")
# Nutpie(Rust製、CPU高速)
mmm.fit(X=df, target_column="y", nuts_sampler="nutpie")
# NumPyro(JAX、GPU対応)
mmm.fit(X=df, target_column="y", nuts_sampler="numpyro")
# BlackJAX(JAX、研究用途)
mmm.fit(X=df, target_column="y", nuts_sampler="blackjax")
4. Adstock変換の選択ガイド
Adstock(広告残存効果)は「今週の広告が来週以降にも効果を持つ」という現象をモデル化します。例えば、今週見たTV CMの記憶が来週の購買行動に影響する、といったケースです。PyMC-Marketingは2つのAdstockクラスを提供しています。
GeometricAdstock(幾何減衰)
| 項目 | 内容 |
|---|---|
| クラス名 | GeometricAdstock(l_max=8) |
| パラメータ | alpha(減衰率、0-1) |
| 減衰パターン | 指数的に減衰。effect[t+k] = alpha^k * spend[t] |
| l_max | 最大ラグ(この期間を超えると効果ゼロと仮定) |
| 適用シーン | デジタル広告(検索、リターゲティング、SNS)。効果が即座に発現し急速に減衰するチャネル |
| 利点 | パラメータが1つだけ(alpha)で安定。データが少なくても推定可能 |
alpha = 0.7 の場合の減衰パターン:
Week 0: 1.000(広告出稿週)
Week 1: 0.700
Week 2: 0.490
Week 3: 0.343
Week 4: 0.240
Week 5: 0.168
Week 6: 0.118
Week 7: 0.082
--> 5週目で約17%まで減衰。l_max=8 で十分
alpha値の目安:
- alpha = 0.3-0.5: 短命な効果(検索広告、リターゲティング)
- alpha = 0.5-0.7: 中程度の持続(ディスプレイ広告、SNS広告)
- alpha = 0.7-0.9: 長い持続(TV CM、ブランドキャンペーン)
from pymc_marketing.mmm import GeometricAdstock
# 基本的な使い方(alphaの事前分布はデフォルト: Beta(1,1) = 一様分布)
adstock = GeometricAdstock(l_max=8)
# 事前分布のカスタマイズ(ドメイン知識の反映)
adstock = GeometricAdstock(
l_max=8,
priors={"alpha": {"dist": "Beta", "kwargs": {"alpha": 3, "beta": 3}}},
)
# --> alpha ~ Beta(3,3): 平均0.5、0.2-0.8に集中する事前分布
# デジタル広告チャネルに適した設定
WeibullAdstock(Weibull分布ベース)
| 項目 | 内容 |
|---|---|
| クラス名 | WeibullAdstock(l_max=12, kind="PDF") |
| パラメータ | lam(スケール)、k(形状) |
| 減衰パターン | Weibull分布のPDFまたはCDFに従う |
| l_max | 最大ラグ(TV広告等は12以上推奨) |
| 適用シーン | TV、OOH、ラジオ。効果にピーク遅延(Delay)があるチャネル |
| 利点 | 「出稿直後ではなく数週間後にピーク」というパターンを表現可能 |
WeibullAdstockの最大の特徴は、ピーク遅延(Delay Effect)を表現できることです。GeometricAdstockでは効果は出稿週に最大で、その後減衰するだけですが、WeibullAdstockでは「出稿後2-3週目にピーク」というベル型のパターンを表現できます。
WeibullAdstock(kind="PDF") の形状パラメータkによる挙動の変化:
k < 1: 出稿直後にピーク --> 急速に減衰(Geometricに類似)
k = 1: 指数減衰(Geometricと同等)
k > 1: 遅延ピーク --> ベル型の減衰カーブ
例: k=2, lam=3 の場合:
Week 0: 0.000(出稿直後は効果なし)
Week 1: 0.198
Week 2: 0.439(ピーク付近)
Week 3: 0.494(ピーク)
Week 4: 0.395
Week 5: 0.218
Week 6: 0.083
--> TV広告の「認知の蓄積 --> ピーク --> 減衰」パターンを表現
from pymc_marketing.mmm import WeibullAdstock
# PDF型(ベル型の遅延効果 -- TV広告に適する)
adstock_pdf = WeibullAdstock(l_max=12, kind="PDF")
# CDF型(累積効果、立ち上がりが緩やか -- ブランド認知の蓄積に適する)
adstock_cdf = WeibullAdstock(l_max=12, kind="CDF")
Adstock選択の判断基準
| 判断基準 | GeometricAdstock | WeibullAdstock |
|---|---|---|
| データ量 | 少なくてもOK(50週-) | 多いほうが安定(100週-推奨) |
| チャネル特性 | 即効性(検索、SNS) | 遅延効果あり(TV、OOH) |
| パラメータ数 | 1(alpha) | 2(lam, k) |
| 推定の安定性 | 高い | やや低い(事前分布の設定が重要) |
| 計算コスト | 低い | やや高い |
| 迷ったら | こちらを選択(初心者推奨) | ドメイン知識がある場合 |
判断ツリー:
チャネルの効果にピーク遅延がある?
|-- Yes(TV、OOH、ブランド広告)
| +-- データが100週以上ある?
| |-- Yes --> WeibullAdstock(kind="PDF", l_max=12)
| +-- No --> GeometricAdstock(l_max=8)(安全側の選択)
|
+-- No(検索広告、SNS広告、リターゲティング)
+-- GeometricAdstock(l_max=6)
チャネルごとに異なるAdstockを使いたい場合は、
PyMCレベルでのカスタマイズが必要です(上級者向け)。
l_max(最大ラグ)の目安
l_maxは「広告効果が持続する最大期間」を指定するパラメータです。大きすぎると計算コストが増加し、小さすぎると長期的な効果を見逃します。
| チャネル種類 | l_max推奨値 | 根拠 |
|---|---|---|
| 検索広告 | 2-4週 | クリック後の購買は即座-数日 |
| SNS広告 | 3-6週 | 認知からの検討期間 |
| ディスプレイ広告 | 4-8週 | リターゲティングの効果持続 |
| TV CM | 6-12週 | ブランド認知の蓄積と減衰 |
| OOH(屋外広告) | 4-8週 | 繰り返し接触の効果 |
| メール/DM | 1-3週 | 即効性が高い |
5. Saturation変換の選択ガイド
Saturation(飽和効果)は「広告支出を増やしても効果は無限に伸びず、どこかで頭打ちになる」という収穫逓減の法則をモデル化します。直感的には、「TV CMを1本流すと大きな効果があるが、100本流しても100倍の効果にはならない」という現象です。PyMC-Marketingは3つのSaturationクラスを提供しています。
LogisticSaturation(シグモイド型)
| 項目 | 内容 |
|---|---|
| クラス名 | LogisticSaturation() |
| パラメータ | lam(飽和の速さ)。lamが大きいほど早く飽和 |
| 数式 | S(x) = 1 - exp(-lam * x) |
| 適用シーン | デフォルト推奨。特にドメイン知識がない場合はこれを使用 |
| 利点 | パラメータが1つで安定。解釈もシンプル(「lamは飽和の速さ」) |
lam = 0.001 の場合(飽和が遅い -- 効果の余地が大きい):
Spend = 1,000 --> Effect = 0.63
Spend = 5,000 --> Effect = 0.99(ほぼ飽和)
Spend = 10,000 --> Effect = 1.00
lam = 0.0001 の場合(飽和が更に遅い -- 大きな予算でも効果が持続):
Spend = 1,000 --> Effect = 0.10
Spend = 10,000 --> Effect = 0.63
Spend = 50,000 --> Effect = 0.99(ほぼ飽和)
HillSaturation(Hill関数)
| 項目 | 内容 |
|---|---|
| クラス名 | HillSaturation() |
| パラメータ | sigma(半飽和点)、beta(Hill係数、曲線の急峻さ) |
| 数式 | S(x) = x^beta / (sigma^beta + x^beta) |
| 適用シーン | 半飽和点をビジネス上議論したい場合 |
| 利点 | sigmaに「支出がこの額で効果が半分に達する」という直接的な経済的解釈がある |
HillSaturationの最大の魅力は、パラメータに直接的なビジネス上の意味があることです。
sigma = 5000, beta = 2 の場合:
Spend = 1,000 --> Effect = 0.04(効果わずか)
Spend = 5,000 --> Effect = 0.50(半飽和点: 50%の効果)
Spend = 10,000 --> Effect = 0.80
Spend = 20,000 --> Effect = 0.94
Spend = 50,000 --> Effect = 0.99
--> 経営層への説明: 「このチャネルは5,000ドルで効果の半分が得られます。
10,000ドルで80%、20,000ドルで94%です。20,000ドルを超えると
追加投資の効率は大幅に低下します。」
TanhSaturation(双曲線正接型)
| 項目 | 内容 |
|---|---|
| クラス名 | TanhSaturation() |
| パラメータ | b(飽和の速さ)、c(スケーリング) |
| 数式 | S(x) = tanh(b * x + c) |
| 適用シーン | 急な飽和が予想されるチャネル(在庫制約、キャパシティ制約がある場合) |
| 利点 | Logisticより急峻な飽和カーブを表現可能 |
Saturation選択の比較表
| 判断基準 | LogisticSaturation | HillSaturation | TanhSaturation |
|---|---|---|---|
| パラメータ数 | 1 | 2 | 2 |
| 解釈のしやすさ | 高い | 高い(半飽和点が直感的) | 中程度 |
| 推定の安定性 | 高い | 中程度 | 中程度 |
| ビジネス活用 | 一般的な飽和効果 | 「いくら使えば50%効果?」の議論 | 急飽和チャネル |
| 経営層への説明 | 「飽和が速い/遅い」 | 「X万円で効果の半分」 | 「急激に頭打ち」 |
| 迷ったら | これを選択 | 上級者向け | 特殊ケース |
選択の指針:
- 初めてMMMを構築する場合 --> LogisticSaturation(パラメータ1つで最も安定)
- 経営層に「半飽和点」を報告したい場合 --> HillSaturation
- 在庫制約やキャパシティ制約があるチャネル --> TanhSaturation
- 複数の関数を試してLOO-CVで比較する --> 上級者向けのアプローチ
6. PyMC-Marketing独自機能
他のMMMライブラリにはないPyMC-Marketing固有の機能群を紹介します。これらの機能が、実務でのMMM運用を大幅に効率化します。
Prior API(事前分布の完全カスタマイズ)
すべてのモデルパラメータの事前分布を辞書形式で指定できます。これは「ドメイン知識をモデルに注入する」ための仕組みです。
custom_priors = {
# チャネル効果: 非負制約。sigma=2で緩めの事前分布
"beta_channel": {
"dist": "HalfNormal",
"kwargs": {"sigma": 2},
},
# Adstock alpha: 0.3-0.8に集中させたい
"alpha": {
"dist": "Beta",
"kwargs": {"alpha": 3, "beta": 3},
},
# 切片: ベースライン売上は正
"intercept": {
"dist": "HalfNormal",
"kwargs": {"sigma": 5},
},
}
mmm = MMM(
date_column="date_week",
channel_columns=["x1", "x2"],
adstock=GeometricAdstock(l_max=8),
saturation=LogisticSaturation(),
model_config=custom_priors,
)
事前分布の選択によってモデルの推定結果は大きく変わります。「事前分布の設計 = ドメイン知識の翻訳」であり、PyMC-Marketingの最大の利点であると同時に、最も注意が必要な工程です。事前分布が適切に設定されていれば、少ないデータでも安定した推定が得られます。逆に不適切な事前分布は、データの情報を無視した歪んだ推定を引き起こします。
sample_prior_predictive()(事前予測チェック)
データにフィットする前に、事前分布から生成される予測がデータのスケールと整合しているかを確認できます。この機能はPyMC-Marketing独自のものではありませんが、MMMの文脈で使いやすい形でAPIに統合されています。
prior_predictive = mmm.sample_prior_predictive(
X=df, target_column="y", samples=500
)
fig = mmm.plot_prior_predictive(original_scale=True)
事前予測チェックの判断基準:
- 良好: 事前予測のリボン(90% HDI)が実データを大まかに包含
- 広すぎる: リボンが極端に広い --> beta_channelのsigmaを小さくする
- 狭すぎる: リボンがデータを全く包含しない --> sigmaを大きくする
- スケール不一致: 予測が全て負値やゼロ付近 --> interceptの事前分布を調整
このステップを飛ばすと「事前分布が不適切なまま長時間のMCMCを実行して無駄にする」リスクがあります。必ず実行してからフィッティングに進みましょう。
geo_column(階層Geoモデル)
v0.18.0以降、1つのMMMクラスで地域別の階層モデルを構築可能です。地域ごとのパラメータが共通の事前分布(ハイパープライア)から生成されるため、データが少ない地域でも「他の地域の情報を借りて」安定した推定ができます。
mmm = MMM(
date_column="date_week",
channel_columns=["tv", "search"],
geo_column="region", # 地域列を指定するだけ
adstock=GeometricAdstock(l_max=8),
saturation=LogisticSaturation(),
)
これは従来、自分で階層モデルをPyMCで記述する必要があったのが、パラメータ1つで実現できるようになった大きな改善です。Google Meridianも階層Geoモデルをサポートしていますが、PyMC-Marketingの方がカスタマイズの自由度が高いのが特徴です。
YAML駆動モデル
MMM.from_yaml() でコードを書かずにモデルを構築できます。
# config.yml
model:
type: mmm
date_column: date_week
target_column: revenue
channel_columns:
- tv
- search
- social
adstock:
type: geometric
l_max: 8
saturation:
type: logistic
yearly_seasonality: 2
sampling:
draws: 1000
tune: 1000
chains: 4
mmm = MMM.from_yaml("config.yml")
mmm.fit(X=df, target_column="revenue")
YAMLファイルにモデル構成を記述するため、非エンジニアでも設定変更が可能になり、Gitでの実験管理にも適しています。「先月はGeometricAdstock、今月はWeibullAdstockで試す」といった比較実験が、YAML設定の切り替えだけで実現できます。
MLflow autolog() 統合
本番運用に必要な実験追跡をゼロ設定で実現します。
import mlflow
mlflow.autolog()
mmm.fit(X=df, target_column="y")
# --> パラメータ、メトリクス、モデルアーティファクトが自動的にMLflowに記録
全機能の一覧表
| 機能 | 概要 | どこで使う? |
|---|---|---|
Prior API | 全パラメータの事前分布を辞書形式で完全カスタマイズ | ドメイン知識の組み込み |
sample_prior_predictive() | データ前のモデル妥当性検証 | フィッティング前の必須チェック |
geo_column パラメータ | 1つのMMMクラスで階層Geoモデル構築(v0.18.0+) | 地域別分析 |
| HSGP時変パラメータ | チャネル効果の時間変化をモデル化 | 長期間データの分析 |
optimize_budget() | SLSQP+制約付き予算最適化 | 予算配分の意思決定 |
save() / load() | NetCDF形式でモデル永続化 | 本番運用・チーム共有 |
| Plotly対話的可視化 | ズーム・ホバーできるインタラクティブチャート(v0.18.0+) | レポーティング |
MLflow autolog() | 実験追跡・モデルレジストリ統合 | 本番運用 |
| YAML駆動モデル | MMM.from_yaml() でコードレス構築 | チーム展開・実験管理 |
7. Meridian・Robynとの差別化
MMMlabの既存記事でMeridianとRobynについては詳しく解説していますので、ここではPyMC-Marketingの視点から簡潔に比較します。
PyMC-Marketing vs Google Meridian
| 観点 | PyMC-Marketing | Google Meridian |
|---|---|---|
| 開発元 | PyMC Labs(OSSコミュニティ) | |
| バックエンド | PyTensor + 4種サンプラー | TensorFlow Probability(固定) |
| モジュール | MMM + CLV + Customer Choice | MMMのみ |
| GPU対応 | NumPyro/BlackJAX経由 | TFP経由 |
| 事前分布 | 完全カスタマイズ可能 | 制限あり |
| YAML駆動 | あり | なし |
| MLflow統合 | あり | なし |
| ドキュメント | 45+ノートブック | 限定的 |
| コミュニティ | 活発(Discord、GitHub Issues) | Google内部寄り |
| Google Ads連携 | なし | ネイティブ |
PyMC-Marketing vs Meta Robyn
| 観点 | PyMC-Marketing | Meta Robyn |
|---|---|---|
| 言語 | Python | R |
| 統計手法 | ベイズ推定(MCMC) | 頻度論(勾配降下 + Nevergrad進化的最適化) |
| 不確実性 | HDI(事後分布の信頼区間) | なし(点推定のみ) |
| モデル選択 | LOO-CV(ベイズモデル選択) | Pareto最適化(自動選択) |
| セットアップ | Python環境 | R + reticulate(一部Python依存) |
| CLV/Choice | あり | なし |
| 実行速度 | やや遅い(MCMCのため) | 高速(最適化ベース) |
| 自動モデル選択 | なし(手動で設定) | あり(Pareto最適化で自動選択) |
選択の指針まとめ
- Pythonチーム + ベイズ推定 + CLVも欲しい --> PyMC-Marketing
- Google Adsデータとの連携を重視 --> Meridian
- R環境 + 素早いプロトタイプ + 自動モデル選択 --> Robyn
- 不確実性の定量化が必須の意思決定 --> PyMC-Marketing(Robynでは不可)
- ベイズの柔軟性でカスタムモデルを構築したい --> PyMC-Marketing
なお、これらのライブラリは排他的ではありません。実務では「Robynで素早くプロトタイプを作り、PyMC-Marketingで本番モデルを構築する」「MeridianとPyMC-Marketingの結果を比較して頑健性を確認する」といった組み合わせアプローチも有効です。
8. 導入企業サマリー
PyMC-Marketing(またはその前身であるPyMC3ベースのMMM)を本番環境で運用している企業の公開事例を紹介します。チーム規模、運用頻度、具体的な成果を含む実務的な情報に焦点を当てます。
HelloFresh(ドイツ・ミールキットサブスクリプション)
PyMC-Marketingの最も有名な本番採用企業です。
| 項目 | 内容 |
|---|---|
| 業種 | ミールキット宅配(サブスクリプション) |
| 売上規模 | 約70億ユーロ(2023年) |
| 展開地域 | 18カ国以上 |
| リード | Luca Fiaschi(MMM/マーケティングDS責任者) |
| チーム構成 | データサイエンティスト複数名 + PyMC Labsコンサルタント |
具体的な成果:
-
予測分散を60%削減: 対数変換 + Student-T尤度に切り替えたことで達成。外れ値に対するロバスト性が大幅に向上しました。
-
推論時間を20分から2分に短縮(10倍高速化): Adstock関数のアルゴリズム最適化(二次時間から線形時間へ)とNumba JITコンパイルの導入によるもの。
-
A/Bテストパイプラインを60倍高速化: 5-6時間かかっていた処理が5-6分に短縮。
-
TV広告への投資増加を推奨 --> 翌四半期が同社最良の業績に: 当初マーケティングチームは懐疑的でしたが、モデルの推奨通りにTV予算を増加させた結果、大幅な売上増を達成。
-
不確実性を活用した意思決定: 「ROASは2.5だが、94%信頼区間は1.8-3.2」という形で不確実性を伝えることで、リスクを考慮した投資判断が可能に。
Bolt(エストニア・配車/モビリティサービス)
プライバシー規制の強化によりアトリビューションモデルの精度が低下したことを契機に採用。
| 項目 | 内容 |
|---|---|
| 業種 | 配車サービス/モビリティ |
| MAU | 1億以上 |
| 展開地域 | ヨーロッパ・アフリカ45カ国以上 |
具体的な成果:
- Webベースの予算シミュレーターを構築し、マーケターが自らWhat-Ifシナリオを実行可能に
- チャネル別のレスポンスカーブを可視化し、追加投資が効果を生まなくなる**「プラトー点」**を特定
- 全結果を実験(A/Bテスト)と準実験(Google CausalImpact)で検証
- 目的別(市場シェア拡大/収益性/効率性)の自動予算配分戦略を設計
- 予算配分モデルをPyMC-MarketingにPRとして還元(オープンソース貢献)
Qonto(フランス・法人向けネオバンク)
2名のデータサイエンティストがMMMを構築し、その全過程を6回のブログシリーズとして公開。小規模チームでもPyMC-Marketingを運用できることを実証しています。
| 項目 | 内容 |
|---|---|
| 業種 | 法人向けデジタルバンキング |
| 顧客数 | 50万社以上(ヨーロッパ) |
| 評価額 | 約50億ユーロ(2022年時点) |
| チーム | Louis Magowan、Ruari Walker(2名のDS) |
技術的特徴:
- Geometric Adstock + Logistic Saturation
- MLflowでの実験管理 + DVCでのデータバージョニング
- Google Cloud Platformとの連携
- 6回にわたるブログで全工程を詳細公開(プロジェクト開始からMLOpsまで)
Lemonade(米国・オンライン保険)
2025年1月にarXivで学術論文(arXiv:2501.01276)を公開し、オンライン保険事業におけるベイズMMMの全体像を報告。
| 項目 | 内容 |
|---|---|
| 業種 | オンライン保険(AI駆動型インシュアテック) |
| 上場 | NYSE(LMND) |
具体的な成果:
- オンライン広告、SNS、ブランドマーケティングの効果を推定
- 季節性、市場トレンド、マクロ経済指標を考慮した包括的モデル
- モデルの予測がA/Bテストの結果と整合することを確認
- 凸最適化によるシナリオ分析で感度を検証
- 分析結果に基づいてマーケティング戦略を調整し、予算配分を改善
Shell + Databricks(エネルギー大手)
PyMC-MarketingモデルをDatabricks上にデプロイし、技術者・非技術者の両方がアクセスできる環境を構築。
- Databricks上でPyMC-Marketingモデルをスケール運用
- MLflowでパラメータとコードバージョンを追跡
- エンタープライズ規模のデータ処理とアクセスガバナンスを両立
Ovative Group(米国・マーケティングアナリティクス代理店)
クライアントごとにカスタムMMMを構築する代理店ビジネスのコアツールとして活用。PyMC-Marketingの柔軟性・カスタマイズ性が、クライアントごとに異なる要件への対応を可能にしています。MLflow + GCP(BigQuery/GCS)で集中管理。
Haleon(英国・消費者向けヘルスケア、旧GSKコンシューマー)
PyMC Labsの支援で**時変係数(Time-Varying Coefficients)**をMMMに導入し、季節性の捕捉を大幅に改善。「モデルの精度と解釈性の両方が大幅に向上した」と報告。
その他の採用企業・組織
| 企業名 | 業種 | 活用内容 |
|---|---|---|
| Colgate-Palmolive | 消費財 | 「最先端の問題に対する比類なき品質の仕事」と評価 |
| Wise | フィンテック | PyMC-Marketing ハッカソンに参加、MMM構築 |
| FREENOW | モビリティ | PyMC-Marketing Webinarで実践経験を共有 |
| 電通 | 広告代理店 | 顧客案件でPyMC-Marketingを活用 |
導入企業から見える共通パターン
| パターン | 詳細 |
|---|---|
| チーム規模 | 最小2名のDS(Qonto)。一般的には3-5名のDS/MLチーム + PyMC Labsコンサルタント |
| 運用頻度 | 週次-月次でモデル再フィッティング。What-Ifシミュレーションは随時。四半期ごとにモデル構造の見直し |
| 共通の成功要因 | A/Bテストとの整合性検証を必ず実施。HDI可視化による経営層の信頼獲得。MLflow等の実験管理ツールとの連携。段階的な導入(まず1チャネル --> 全チャネルへ拡大) |
| 業種の広がり | フードテック、モビリティ、フィンテック、エネルギー、消費財、広告代理店と幅広い |
9. データ要件
MMMモデルに投入するデータの要件を整理します。他のMMMツールと共通する部分もありますが、PyMC-Marketing固有の注意点もあります。
必須列
| 列の種類 | 説明 | PyMC-Marketing固有の注意 |
|---|---|---|
| date_column | 日付列(datetime型推奨) | parse_dates=["date_week"] でpandas読み込み。文字列のままだとエラー |
| target_column | 目的変数(売上等) | 正の値のみ。HalfNormal事前分布と整合するようスケーリング推奨 |
| channel_columns | チャネル支出列(1つ以上) | 0以上の値。欠損値(NaN)は許容されない |
オプション列
| 列の種類 | 説明 |
|---|---|
| control_columns | コントロール変数(気温、祝日、コロナ、競合価格等)。符号制約なし |
| geo_column | 地域列(階層Geoモデル用、v0.18.0+) |
推奨データ量
| データ量 | 判定 | 補足 |
|---|---|---|
| 50週未満 | 不十分 | 推定が不安定。チャネル数を減らすか日次データを検討 |
| 50-100週 | 最低限 | GeometricAdstock + LogisticSaturationの組み合わせ推奨 |
| 100-200週(推奨) | 推奨 | WeibullAdstockやHillSaturationも選択可能 |
| 200週以上 | 理想的 | 複数のAdstock/Saturation比較が可能。階層モデルも検討 |
一般的な目安として、チャネル数 x 20週以上のデータがあることが望ましいです。3チャネルなら60週以上、5チャネルなら100週以上が推奨されます。
データ品質チェックリスト
以下のチェックをフィッティング前に実行することを推奨します。
import pandas as pd
def check_data_quality(df, date_col, target_col, channel_cols):
issues = []
# 1. 日付型チェック
if not pd.api.types.is_datetime64_any_dtype(df[date_col]):
issues.append(f"{date_col} がdatetime型ではない -> parse_datesで読み込む")
# 2. 欠損値チェック
for col in [target_col] + channel_cols:
na_count = df[col].isna().sum()
if na_count > 0:
issues.append(f"{col} に {na_count} 個の欠損値 -> 補完が必要")
# 3. 負の値チェック
for col in channel_cols:
neg_count = (df[col] < 0).sum()
if neg_count > 0:
issues.append(f"{col} に {neg_count} 個の負の値 -> 0以上にクリップ")
# 4. データ量チェック
n_weeks = len(df)
n_channels = len(channel_cols)
if n_weeks < 50:
issues.append(f"データが {n_weeks} 週のみ -> 最低50週、推奨100週以上")
if n_weeks < n_channels * 20:
issues.append(f"チャネル数に対してデータが少ない({n_weeks}週/{n_channels}ch)")
# 5. 日付の等間隔チェック
date_diffs = df[date_col].diff().dropna().dt.days
if date_diffs.nunique() > 1:
issues.append("日付間隔が不均一 -> リサンプリングが必要")
# 6. 多重共線性チェック
if len(channel_cols) >= 2:
corr_matrix = df[channel_cols].corr()
for i in range(len(channel_cols)):
for j in range(i+1, len(channel_cols)):
corr_val = abs(corr_matrix.iloc[i, j])
if corr_val > 0.7:
issues.append(
f"{channel_cols[i]} と {channel_cols[j]} の"
f"相関が {corr_val:.2f}(多重共線性の懸念)"
)
# 7. ゼロ支出週の確認(情報提供)
for col in channel_cols:
zero_weeks = (df[col] == 0).sum()
zero_pct = zero_weeks / len(df) * 100
if zero_pct > 50:
issues.append(
f"{col} のゼロ支出週が {zero_pct:.0f}%"
f" -> 効果推定の精度が低下する可能性"
)
if issues:
print(" データ品質の問題:")
for issue in issues:
print(f" WARNING: {issue}")
else:
print(" OK: データ品質チェック合格")
return len(issues) == 0
コントロール変数の選び方
目的変数(売上等)に影響する広告以外の要因をコントロール変数として追加します。これにより、広告効果の推定精度が向上します。
| カテゴリ | 例 | 注意 |
|---|---|---|
| 季節・天候 | 気温、降水量 | yearly_seasonalityと重複しないよう注意 |
| イベント | 祝日、セール、プロモーション | ダミー変数(0/1)で投入 |
| 経済指標 | 消費者信頼感指数、失業率 | 月次データは週次に変換が必要 |
| 競合 | 競合の広告支出、価格変更 | 入手可能な場合のみ |
| 外部ショック | コロナ、自然災害 | ステップ関数またはダミー変数 |
まとめ
PyMC-Marketingは、ベイジアンMMMの実装ライブラリとして以下の点で独自のポジションを持っています。
- MMM + CLV + Customer Choice の3モジュール統合: マーケティング分析を一つのフレームワークで完結できる唯一のライブラリ
- 4つのサンプリングバックエンド: CPU/GPU、小規模/大規模に応じた柔軟な選択。コード1行で切り替え可能
- Prior APIによる完全カスタム事前分布: ドメイン知識を直接モデルに反映し、少ないデータでも安定した推定
- YAML駆動 + MLflow統合: チーム展開と本番運用を見据えた設計
- 活発なOSSコミュニティ: 60人以上のコントリビューター、45+のノートブック、定期的なアップデート
Meridianが「Googleエコシステムとの統合」、Robynが「素早いプロトタイプと自動モデル選択」に強みを持つのに対し、PyMC-Marketingは「ベイズの柔軟性と拡張性」「不確実性の定量化」「マーケティング分析の統合プラットフォーム」で差別化しています。
HelloFresh、Bolt、Qonto、Shell、Lemonadeといったグローバル企業の導入事例が示す通り、PyMC-Marketingは概念実証の段階を超え、本番環境での実用段階に入っています。特に「最小2名のデータサイエンティストで運用可能」(Qontoの事例)という点は、中小規模のチームにとって心強い事実です。
次の記事では、PyMC-Marketingを使ったMMMの実装手順を、データ準備からROAS算出・予算最適化まで、コード付きでステップバイステップで解説します。
参考リンク
- PyMC-Marketing GitHub: https://github.com/pymc-labs/pymc-marketing
- PyMC-Marketing 公式ドキュメント: https://www.pymc-marketing.io/
- PyMC Labs 公式サイト: https://www.pymc-labs.com/
- PyMC-Marketing vs Google Meridian ベンチマーク: https://www.pymc-labs.com/blog-posts/pymc-marketing-vs-google-meridian
- HelloFresh ケーススタディ: https://www.pymc-labs.com/blog-posts/reducing-customer-acquisition-costs-how-we-helped-optimizing-hellofreshs-marketing-budget
- Bolt ケーススタディ: https://bolt.eu/en/blog/budgeting-with-bayesian-models-pymc-marketing/
- Qonto Marketing Mix Modelingシリーズ: https://medium.com/qonto-way/marketing-measurement-series-marketing-mix-modeling-at-qonto-337b8af11471
- Lemonade arXiv論文: https://arxiv.org/abs/2501.01276
- Databricks Blog (Shell): https://www.databricks.com/blog/revolutionizing-tech-marketing
- Ovative Group: https://ovative.com/impact/expert-insights/reality-open-source-mmms/
- ArviZ Documentation: https://python.arviz.org/
- Nutpie (Rust sampler): https://github.com/pymc-devs/nutpie