MMMのためのデータ準備完全ガイド
はじめに
マーケティングミックスモデリング(MMM)の精度は、投入するデータの品質で8割が決まると言われています。どれほど高度なベイズモデルを使っても、データに問題があれば正確なチャネル貢献度やROIは得られません。
「Garbage In, Garbage Out」はMMMにおいても鉄則です。データ準備に十分な時間を投資することが、分析成功への最短ルートです。
本記事では、MMMに必要なデータの収集・加工・品質管理について、実務で使えるCSVテンプレートや具体的なPythonコードとともに解説します。MMMの基本概念についてはMMMとは?初心者向け完全ガイドをご参照ください。
MMMに必要なデータの全体像
データの3つのカテゴリ
MMMでは大きく分けて3種類のデータが必要です:
| カテゴリ | 説明 | 具体例 |
|---|---|---|
| メディア変数 | 広告チャネルごとの投下量 | TV GRP、デジタル広告費、SNS広告費、OOH出稿量 |
| 目的変数(KPI) | 予測対象のビジネス指標 | 売上金額、コンバージョン数、新規会員数 |
| コントロール変数 | KPIに影響する外部要因 | 気温、祝日フラグ、競合セール、自社プロモーション |
推奨データ期間と粒度
| 項目 | 最低要件 | 推奨 | 理想 |
|---|---|---|---|
| 期間 | 52週(1年) | 104週(2年) | 156週(3年) |
| 粒度 | 週次 | 週次 | 日次(集約して週次に変換) |
| 地域 | 全国集計 | 地域別(エリア×時系列) | 都道府県レベル |
なぜ52週以上必要なのか? 季節性(年末商戦、GWなど)を正しく学習するには最低1年分のデータが必要です。また、広告費の「増減パターン」が複数回含まれていないと、広告効果とトレンドを分離できません。
Step 1: メディアデータの収集
チャネル別の収集方法
| チャネル | データソース | 取得指標 | 注意点 |
|---|---|---|---|
| TV CM | ビデオリサーチ / Switch Media | GRP、到達率 | エリア別GRPが理想。費用よりGRPが精度高い |
| Google広告 | Google Ads API / レポート | 費用、imp、クリック | キャンペーン単位→チャネル単位に集約 |
| Meta広告 | Meta Ads Manager | 費用、リーチ、imp | iOS 14.5以降のCV計測精度低下に注意 |
| YouTube | Google Ads(動画キャンペーン) | 費用、視聴回数 | TVとの重複リーチに注意 |
| LINE広告 | LINE Ads Platform | 費用、imp | 友だち追加等のブランド効果も考慮 |
| OOH | 媒体社レポート | 費用、掲出面数 | 時系列が粗い場合は月次→週次に按分 |
Pythonでの集約処理
import pandas as pd
# 日次データを週次に集約
daily = pd.read_csv("daily_ad_spend.csv", parse_dates=["date"])
daily["week"] = daily["date"].dt.to_period("W").apply(lambda r: r.start_time)
weekly = daily.groupby("week").agg({
"tv_grp": "sum",
"google_spend": "sum",
"meta_spend": "sum",
"line_spend": "sum",
"youtube_spend": "sum",
"revenue": "sum",
}).reset_index()
print(f"期間: {weekly['week'].min()} 〜 {weekly['week'].max()}")
print(f"レコード数: {len(weekly)} 週")
Step 2: コントロール変数の収集
代表的なコントロール変数
| 変数 | データソース | 影響メカニズム |
|---|---|---|
| 気温 | 気象庁オープンデータ | アパレル・飲料・食品の需要変動 |
| 祝日・連休 | 内閣府カレンダー | EC購買パターンの変化 |
| 自社セール | 社内データ | 価格効果の分離に必須 |
| 競合活動 | SimilarWeb / 業界データ | 市場シェア変動の補正 |
| 為替レート | 日銀統計 | 輸入商材のコスト変動 |
| COVID等イベント | ダミー変数 | 構造変化の補正 |
# 気象庁データの取得例
import pandas as pd
weather = pd.read_csv("weather_tokyo.csv", parse_dates=["date"])
weather["week"] = weather["date"].dt.to_period("W").apply(
lambda r: r.start_time
)
weekly_temp = weather.groupby("week")["temperature"].mean().reset_index()
Step 3: CSVテンプレート構造
推奨フォーマット
date,revenue,tv_grp,google_spend,meta_spend,line_spend,temperature,holiday_flag,own_promotion
2024-01-01,5230000,120,800000,600000,300000,5.2,1,0
2024-01-08,4850000,100,750000,580000,280000,4.8,0,0
2024-01-15,5100000,110,820000,620000,310000,6.1,0,1
カラム命名規則
| ルール | 良い例 | 悪い例 |
|---|---|---|
| スネークケース | google_spend | Google Spend |
| 単位を統一 | すべて円 or すべて千円 | 混在 |
| 日付フォーマット | YYYY-MM-DD | MM/DD/YYYY |
| チャネル名を明確に | meta_spend | channel_3 |
Step 4: データ品質チェック
必須チェック項目
import pandas as pd
import numpy as np
df = pd.read_csv("mmm_data.csv", parse_dates=["date"])
channel_cols = ["tv_grp", "google_spend", "meta_spend", "line_spend"]
# 1. 欠損値チェック
print("=== 欠損値 ===")
print(df.isnull().sum())
# 2. 週次連続性チェック
date_diff = df["date"].diff().dt.days
gaps = date_diff[date_diff != 7].dropna()
if len(gaps) > 0:
print(f"\n警告: {len(gaps)}箇所の日付ギャップを検出")
print(gaps)
# 3. ゼロ値の割合
print("\n=== ゼロ値の割合 ===")
for col in channel_cols:
zero_pct = (df[col] == 0).mean() * 100
print(f" {col}: {zero_pct:.1f}%")
# 4. 外れ値検出(IQR法)
print("\n=== 外れ値(IQR法) ===")
for col in channel_cols + ["revenue"]:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
outliers = ((df[col] < Q1 - 1.5 * IQR) | (df[col] > Q3 + 1.5 * IQR)).sum()
print(f" {col}: {outliers}件の外れ値")
# 5. 多重共線性チェック(VIF)
from statsmodels.stats.outliers_influence import variance_inflation_factor
X = df[channel_cols].values
vif = [variance_inflation_factor(X, i) for i in range(X.shape[1])]
print("\n=== VIF(10以上は要注意) ===")
for col, v in zip(channel_cols, vif):
flag = " ⚠️" if v > 10 else ""
print(f" {col}: {v:.2f}{flag}")
よくある失敗パターンと対策
| 失敗パターン | 原因 | 対策 |
|---|---|---|
| モデルが収束しない | データ期間が短すぎる | 最低52週、推奨104週以上を確保 |
| TV効果がゼロと推定 | TV出稿が常に一定額 | 出稿量に変動がないとモデルは効果を推定できない |
| 季節性と広告が混同 | 年末に広告も売上も増加 | コントロール変数で季節性を分離 |
| ROIが非現実的に高い | 多重共線性 | VIFチェック、チャネル統合を検討 |
| 欠損週がある | データ収集漏れ | 線形補間 or 前後の平均で補完(3週以上の欠損は要注意) |
最も重要なポイント: 広告費に十分な変動があることです。毎週同じ金額を投下しているチャネルは、MMMで効果を推定できません。実験的に出稿量を変動させる「メディア実験」が理想です。
まとめ
- MMMの精度はデータ品質で8割決まる。準備に十分な時間を投資すべき
- 52週以上の週次データが最低要件。104週以上が推奨
- メディア変数・目的変数・コントロール変数の3カテゴリを網羅的に収集
- 品質チェック(欠損値、連続性、外れ値、VIF)は必須プロセス
- 広告費の変動パターンがなければ効果推定は不可能
次のステップとして、PyMC-Marketingステップバイステップで実際のモデル構築に進みましょう。