メインコンテンツへスキップ
MMM基礎

PyMC-Marketing完全入門 — ベイジアンMMMの新標準ライブラリ

PyMC-Marketing v0.18.2の全体像を解説。MMMだけでなくCLV・カニバリゼーション分析まで統合したベイジアンマーケティング分析ライブラリの特徴、アーキテクチャ、Adstock/Saturation選択ガイド、導入企業の実績を網羅します。

MMM Lab 編集部2026/3/731分で読める8

はじめに

マーケティングミックスモデリング(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日リリース)
対応Python3.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)モデル群をベイズ推定で実装します。具体的には以下のモデルクラスを提供しています。

クラス名モデル用途
BetaGeoModelBG/NBD購買頻度予測 + 離脱確率
ParetoNBDModelPareto/NBDBG/NBDの一般化版
GammaGammaModelGamma-Gamma期待購買金額の推定
組み合わせBG/NBD + Gamma-GammaCLV = 頻度 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初めての利用、小-中規模データ最も安定。診断情報が最も詳細。追加インストール不要
NutpieRustCPU環境での高速化Rust製バイナリ。CPUのみで5-10倍高速化。メモリ効率も良好
NumPyroJAXGPU活用、大規模データCUDA/ROCm必須。JITコンパイルで10-50倍高速化が可能
BlackJAXJAXカスタムサンプラーが必要な研究用途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-2GBpip 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選択の判断基準

判断基準GeometricAdstockWeibullAdstock
データ量少なくても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 CM6-12週ブランド認知の蓄積と減衰
OOH(屋外広告)4-8週繰り返し接触の効果
メール/DM1-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選択の比較表

判断基準LogisticSaturationHillSaturationTanhSaturation
パラメータ数122
解釈のしやすさ高い高い(半飽和点が直感的)中程度
推定の安定性高い中程度中程度
ビジネス活用一般的な飽和効果「いくら使えば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-MarketingGoogle Meridian
開発元PyMC Labs(OSSコミュニティ)Google
バックエンドPyTensor + 4種サンプラーTensorFlow Probability(固定)
モジュールMMM + CLV + Customer ChoiceMMMのみ
GPU対応NumPyro/BlackJAX経由TFP経由
事前分布完全カスタマイズ可能制限あり
YAML駆動ありなし
MLflow統合ありなし
ドキュメント45+ノートブック限定的
コミュニティ活発(Discord、GitHub Issues)Google内部寄り
Google Ads連携なしネイティブ

PyMC-Marketing vs Meta Robyn

観点PyMC-MarketingMeta Robyn
言語PythonR
統計手法ベイズ推定(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コンサルタント

具体的な成果:

  1. 予測分散を60%削減: 対数変換 + Student-T尤度に切り替えたことで達成。外れ値に対するロバスト性が大幅に向上しました。

  2. 推論時間を20分から2分に短縮(10倍高速化): Adstock関数のアルゴリズム最適化(二次時間から線形時間へ)とNumba JITコンパイルの導入によるもの。

  3. A/Bテストパイプラインを60倍高速化: 5-6時間かかっていた処理が5-6分に短縮。

  4. TV広告への投資増加を推奨 --> 翌四半期が同社最良の業績に: 当初マーケティングチームは懐疑的でしたが、モデルの推奨通りにTV予算を増加させた結果、大幅な売上増を達成。

  5. 不確実性を活用した意思決定: 「ROASは2.5だが、94%信頼区間は1.8-3.2」という形で不確実性を伝えることで、リスクを考慮した投資判断が可能に。

Bolt(エストニア・配車/モビリティサービス)

プライバシー規制の強化によりアトリビューションモデルの精度が低下したことを契機に採用。

項目内容
業種配車サービス/モビリティ
MAU1億以上
展開地域ヨーロッパ・アフリカ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の実装ライブラリとして以下の点で独自のポジションを持っています。

  1. MMM + CLV + Customer Choice の3モジュール統合: マーケティング分析を一つのフレームワークで完結できる唯一のライブラリ
  2. 4つのサンプリングバックエンド: CPU/GPU、小規模/大規模に応じた柔軟な選択。コード1行で切り替え可能
  3. Prior APIによる完全カスタム事前分布: ドメイン知識を直接モデルに反映し、少ないデータでも安定した推定
  4. YAML駆動 + MLflow統合: チーム展開と本番運用を見据えた設計
  5. 活発なOSSコミュニティ: 60人以上のコントリビューター、45+のノートブック、定期的なアップデート

Meridianが「Googleエコシステムとの統合」、Robynが「素早いプロトタイプと自動モデル選択」に強みを持つのに対し、PyMC-Marketingは「ベイズの柔軟性と拡張性」「不確実性の定量化」「マーケティング分析の統合プラットフォーム」で差別化しています。

HelloFresh、Bolt、Qonto、Shell、Lemonadeといったグローバル企業の導入事例が示す通り、PyMC-Marketingは概念実証の段階を超え、本番環境での実用段階に入っています。特に「最小2名のデータサイエンティストで運用可能」(Qontoの事例)という点は、中小規模のチームにとって心強い事実です。

次の記事では、PyMC-Marketingを使ったMMMの実装手順を、データ準備からROAS算出・予算最適化まで、コード付きでステップバイステップで解説します。


参考リンク

MMMをもっと深く学びませんか?

理論から実践まで体系的に学べるコース・記事を多数ご用意。 無料プランでも基礎コンテンツにアクセスできます。

MMMの最新情報をお届けします

新着記事・コース更新をメールでお知らせ

関連記事