はじめに:なぜマーケターにPythonが必要なのか
マーケティング・ミックス・モデリング(MMM)を実務で活用するには、データの前処理・モデリング・可視化といった一連の作業をプログラムで行う必要があります。Excelでは限界がある大規模データの処理や、ベイズ統計モデルの推定には、Pythonが最適なツールです。
本記事では、プログラミング経験がないマーケターでもMMMを実行できるよう、環境構築から初回のモデル実行までを一歩一歩解説します。
Pythonとは?マーケターに必要な最低限の知識
Pythonは、データ分析・機械学習分野で世界的に最も広く使われているプログラミング言語です。MMMの文脈では、以下の理由からPythonが選ばれます。
- 豊富なライブラリ:統計分析、データ操作、可視化のためのツールが充実
- 無料で利用可能:オープンソースのため、ライセンス費用がかからない
- コミュニティが大きい:困ったときに日本語の情報も見つかりやすい
- GoogleやMetaが公式ツールを提供:PyMC-Marketing、Lightweight MMM、Meridianなどが全てPython製
マーケターが知っておくべきPythonの基本概念
| 概念 | 説明 | MMM での用途 |
|---|---|---|
| 変数 | データを格納する箱 | ad_spend = 1000000 |
| リスト | 複数の値をまとめる | channels = ["TV", "Digital", "OOH"] |
| DataFrame | 表形式のデータ構造 | CSV読み込み後のデータ操作 |
| 関数 | 処理をまとめたもの | model.fit() でモデル推定 |
| ライブラリ | 再利用可能なコード集 | import pandas as pd |
環境構築の3つの選択肢
Pythonの実行環境を構築する方法は主に3つあります。初学者には Google Colab を強く推奨します。
選択肢の比較
| 項目 | Google Colab | ローカル(Anaconda) | Docker |
|---|---|---|---|
| 難易度 | ★☆☆☆☆ | ★★★☆☆ | ★★★★☆ |
| セットアップ時間 | 1分 | 30分〜1時間 | 1〜2時間 |
| 必要な知識 | Googleアカウントのみ | コマンドラインの基礎 | コンテナの知識 |
| GPU利用 | 無料枠あり | 別途GPU必要 | 設定が必要 |
| データの永続性 | Googleドライブ連携 | ローカルに保存 | ボリュームマウント |
| 推奨対象 | 初学者・PoC | 本格運用 | チーム開発 |
Google Colabで始める手順
ステップ1:Google Colabにアクセス
ブラウザで https://colab.research.google.com にアクセスし、Googleアカウントでログインします。
ステップ2:新しいノートブックを作成
「ファイル」→「ノートブックを新規作成」をクリックします。ノートブック名を MMM_Introduction.ipynb に変更しましょう。
ステップ3:ランタイムの確認
「ランタイム」→「ランタイムのタイプを変更」で、Pythonのバージョンを確認します。Python 3 が選択されていればOKです。MMMの計算を高速化したい場合は、ハードウェアアクセラレータを「GPU」に変更することもできます(T4 GPUが無料で利用可能)。
ステップ4:最初のセルを実行
以下のコードをセルに入力し、Shift + Enter で実行してみましょう。
import sys
print(f"Python version: {sys.version}")
print("Google Colab でPythonが実行できました!")
Python version: 3.10.x のような出力が表示されれば成功です。
必要なライブラリのインストール
MMMに必要な主要ライブラリを以下に整理します。
ライブラリ一覧と役割
| ライブラリ | 役割 | バージョン目安 |
|---|---|---|
pandas | データの読み込み・操作 | 2.0+ |
numpy | 数値計算の基盤 | 1.24+ |
matplotlib | グラフ・可視化 | 3.7+ |
seaborn | 統計的可視化 | 0.12+ |
scikit-learn | 前処理・評価指標 | 1.3+ |
pymc | ベイズ推論エンジン | 5.10+ |
pymc-marketing | MMM専用ライブラリ | 0.9+ |
arviz | ベイズモデルの結果可視化 | 0.17+ |
インストール手順
Google Colabのセルで以下を実行します。
# 基本ライブラリ(Colabにはプリインストール済み)
!pip install --quiet pandas numpy matplotlib seaborn scikit-learn
# MMMに必要な追加ライブラリ
!pip install --quiet pymc pymc-marketing arviz
print("全てのライブラリがインストールされました。")
注意:
pymc-marketingのインストールには数分かかることがあります。「Restart Runtime」を求められた場合は、指示に従ってランタイムを再起動してください。
インストール確認
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pymc as pm
import pymc_marketing as pmm
print(f"pandas: {pd.__version__}")
print(f"numpy: {np.__version__}")
print(f"PyMC: {pm.__version__}")
print(f"PyMC-Marketing: {pmm.__version__}")
最初のデータ読み込み:CSVからpandas DataFrame
MMMの入力データは、通常CSVファイルとして準備します。ここでは、サンプルデータを作成して読み込む手順を示します。
サンプルデータの作成
import pandas as pd
import numpy as np
# 再現性のための乱数シード
np.random.seed(42)
# 52週分のサンプルデータを生成
n_weeks = 52
dates = pd.date_range(start="2024-01-01", periods=n_weeks, freq="W-MON")
data = pd.DataFrame({
"date": dates,
"tv_spend": np.random.uniform(500000, 2000000, n_weeks).round(0),
"digital_spend": np.random.uniform(200000, 800000, n_weeks).round(0),
"search_spend": np.random.uniform(100000, 500000, n_weeks).round(0),
"sales": np.random.uniform(5000000, 15000000, n_weeks).round(0),
})
# 広告効果を模擬的に追加(実際のデータではこの手順は不要)
data["sales"] = (
3000000 # ベース売上
+ data["tv_spend"] * 2.5 # テレビの効果
+ data["digital_spend"] * 1.8 # デジタルの効果
+ data["search_spend"] * 3.0 # 検索広告の効果
+ np.random.normal(0, 500000, n_weeks) # ノイズ
).round(0)
# CSVとして保存
data.to_csv("mmm_sample_data.csv", index=False)
print("データを保存しました。")
print(data.head(10))
CSVの読み込みと基本的な確認
# CSVファイルを読み込む
df = pd.read_csv("mmm_sample_data.csv", parse_dates=["date"])
# 基本情報の確認
print(f"データの形状: {df.shape[0]}行 x {df.shape[1]}列")
print(f"期間: {df['date'].min()} 〜 {df['date'].max()}")
print("\n基本統計量:")
print(df.describe())
簡単なMMM実行デモ:PyMC-Marketingの最小コード例
いよいよPyMC-Marketingを使ってMMMを実行します。以下は、最小限のコードでベイズMMMを実行する例です。
import pandas as pd
import numpy as np
import pymc_marketing.mmm as mmm
from pymc_marketing.mmm import (
GeometricAdstock,
LogisticSaturation,
MMM,
)
# データの準備
df = pd.read_csv("mmm_sample_data.csv", parse_dates=["date"])
# チャネルの定義
channel_columns = ["tv_spend", "digital_spend", "search_spend"]
# MMMモデルの構築
my_mmm = MMM(
adstock=GeometricAdstock(l_max=8), # アドストック:最大8週間の残存効果
saturation=LogisticSaturation(), # 飽和曲線:ロジスティック関数
date_column="date", # 日付列
channel_columns=channel_columns, # 広告チャネル列
target_column="sales", # 目的変数(売上)
)
# モデルの学習(サンプリング)
# tune: バーンイン期間, draws: サンプル数, chains: チェーン数
my_mmm.fit(
X=df,
y=df["sales"],
target_accept=0.85,
tune=500,
draws=1000,
chains=2,
)
print("モデルの学習が完了しました!")
実行時間の目安: Google Colab(CPU)で約5〜15分程度かかります。GPUランタイムを使うと高速化される場合があります。
モデルの要約を確認
# モデルパラメータの要約
my_mmm.fit_result.summary()
結果の可視化:matplotlib基礎
MMMの結果を解釈するには、可視化が不可欠です。PyMC-Marketingには便利な可視化メソッドが用意されています。
チャネル別の貢献度分解
# チャネル別貢献度の可視化
fig = my_mmm.plot_channel_contributions()
plt.title("チャネル別売上貢献度")
plt.tight_layout()
plt.savefig("channel_contributions.png", dpi=150, bbox_inches="tight")
plt.show()
アドストック効果の可視化
# アドストック(残存効果)の可視化
fig = my_mmm.plot_channel_parameter("adstock_alpha")
plt.suptitle("各チャネルのアドストック減衰率")
plt.tight_layout()
plt.show()
予測値 vs 実績値のプロット
import matplotlib.pyplot as plt
import matplotlib
# 日本語フォントの設定(Colabの場合)
matplotlib.rcParams["font.family"] = "DejaVu Sans"
# 予測値の取得
posterior_pred = my_mmm.predict(df)
# 実績 vs 予測のプロット
fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(df["date"], df["sales"], label="Actual Sales", color="black", linewidth=2)
ax.plot(df["date"], posterior_pred.mean(axis=0),
label="Predicted (Mean)", color="blue", linestyle="--")
ax.fill_between(
df["date"],
np.percentile(posterior_pred, 5, axis=0),
np.percentile(posterior_pred, 95, axis=0),
alpha=0.2, color="blue", label="90% CI"
)
ax.set_xlabel("Date")
ax.set_ylabel("Sales (JPY)")
ax.set_title("MMM: Actual vs Predicted Sales")
ax.legend()
plt.tight_layout()
plt.show()
トラブルシューティング
初回実行時によくあるエラーとその対処法を紹介します。
| エラー | 原因 | 対処法 |
|---|---|---|
ModuleNotFoundError | ライブラリ未インストール | !pip install ライブラリ名 を実行 |
Theano/Aesara compilation error | C++コンパイラの問題 | ランタイムを再起動し再実行 |
Divergences during sampling | モデルの収束不良 | target_accept を0.9以上に引き上げ |
MemoryError | データが大きすぎる | chains=2, draws=500 に減らす |
ValueError: shape mismatch | データ形状の不一致 | 欠損値の確認と列名の確認 |
次のステップ
本記事でMMMの初回実行ができたら、以下のステップに進みましょう。
- 実際のデータで試す: 自社の広告費データと売上データをCSVで準備する
- データ収集を体系化する: 広告プラットフォーム別のデータ収集チェックリストを活用する
- モデルを改善する: アドストックや飽和曲線のパラメータを調整する
- 結果を解釈する: チャネル別ROI・ROASを算出し、予算配分の最適化に活用する
MMMは一度モデルを構築して終わりではなく、定期的にデータを更新しながらモデルを改善していく継続的なプロセスです。まずは本記事の手順で「動くMMM」を体験し、そこから実務への応用を進めてください。