はじめに:MMMの精度はデータの質で8割決まる
マーケティング・ミックス・モデリング(MMM)の結果の信頼性は、入力データの品質に大きく依存します。「ゴミを入れればゴミが出る(Garbage In, Garbage Out)」という原則は、MMMにおいて特に顕著です。
本記事では、MMMに必要なデータを広告プラットフォーム別に整理し、すぐに使えるチェックリストを提供します。データ収集は地味な作業ですが、MMMプロジェクトの成功を左右する最も重要なフェーズです。
共通ルール:全プラットフォームで統一すべき項目
データを統合するために、以下のルールを事前に決めておきましょう。
日付の粒度
| 粒度 | 推奨ケース | メリット | デメリット |
|---|---|---|---|
| 日次 | データが2年以上ある場合 | 精度が高い、季節変動を捉えやすい | データ量が多い、ノイズが多い |
| 週次 | 最も一般的(推奨) | ノイズが平滑化される、扱いやすい | 短期的な効果を見逃す可能性 |
| 月次 | データが少ない場合 | データ量が少なくて済む | 精度が低い、年間12データポイントのみ |
推奨: 週次(月曜始まり)を基本とし、最低2年分(104週)以上を確保してください。
通貨・単位の統一
- 広告費: 全てを同一通貨(例:日本円、税抜)に統一する
- インプレッション: 千単位(000)か実数かを統一する
- 売上: 税抜/税込を統一する。可能であれば数量(ユニット数)も取得する
プラットフォーム別データ収集ガイド
1. Google Ads
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| 費用 | google_ads_spend | 必須 | 税抜で統一 |
| インプレッション | google_ads_impressions | 推奨 | 検索/ディスプレイを分離 |
| クリック数 | google_ads_clicks | 推奨 | |
| コンバージョン | google_ads_conversions | 任意 | ラストクリックCV |
| 表示回数シェア | google_ads_impression_share | 任意 | 競合分析に有用 |
取得方法
方法A:管理画面からダウンロード
- Google Ads管理画面 → 「レポート」タブ
- カスタムレポート作成 → 期間・セグメント設定
- CSVまたはExcelでダウンロード
方法B:Google Ads API
from google.ads.googleads.client import GoogleAdsClient
client = GoogleAdsClient.load_from_storage("google-ads.yaml")
query = """
SELECT
segments.date,
campaign.name,
metrics.cost_micros,
metrics.impressions,
metrics.clicks
FROM campaign
WHERE segments.date BETWEEN '2023-01-01' AND '2024-12-31'
ORDER BY segments.date
"""
response = client.get_service("GoogleAdsService").search_stream(
customer_id="1234567890",
query=query
)
方法C:BigQuery連携(推奨)
Google AdsとBigQueryを連携させると、日次のレポートが自動的にBigQueryに蓄積されます。大量データの処理に最適です。
注意点
- 検索広告とディスプレイ広告は分離する:効果のメカニズムが異なるため、別チャネルとして投入する
- ブランド検索とノンブランド検索を分離する:ブランド検索は内生性の問題が生じやすい
- 費用は
cost_micros(マイクロ単位)で返るため、/ 1,000,000して円に変換する
2. Meta(Facebook / Instagram)Ads
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| 費用 | meta_spend | 必須 | |
| インプレッション | meta_impressions | 推奨 | |
| リーチ | meta_reach | 推奨 | ユニークユーザー数 |
| クリック数 | meta_clicks | 推奨 | リンククリックを使用 |
| 動画再生3秒 | meta_video_3s_views | 任意 | 動画広告の場合 |
取得方法
方法A:Ads Manager
- Meta Ads Manager → 「レポート」
- 列のカスタマイズで必要な指標を選択
- 分析の軸に「日」を設定
- エクスポート → CSV
方法B:Marketing API
import requests
access_token = "YOUR_ACCESS_TOKEN"
account_id = "act_123456789"
url = f"https://graph.facebook.com/v18.0/{account_id}/insights"
params = {
"access_token": access_token,
"time_range": '{"since":"2023-01-01","until":"2024-12-31"}',
"time_increment": 1, # 日次
"fields": "spend,impressions,reach,clicks",
"level": "account",
}
response = requests.get(url, params=params)
data = response.json()
注意点
- Meta広告はFacebookとInstagramの配信が自動最適化で混在するため、プラットフォーム別に分けるか統合するか事前に決定する
- リーチ(ユニークユーザー数)はMeta独自の指標で、MMMのモデリングで有用
- アトリビューションウィンドウ(1日クリック/7日クリックなど)はMMM自体が効果測定するため、気にしなくてよい
3. Yahoo!広告(日本)
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| 費用 | yahoo_spend | 必須 | 検索/ディスプレイを分離 |
| インプレッション | yahoo_impressions | 推奨 | |
| クリック数 | yahoo_clicks | 推奨 |
取得方法
- Yahoo!広告管理画面 → 「レポート」→「パフォーマンスレポート」
- レポートタイプ:キャンペーン、期間:日次
- 「レポートのダウンロード」からCSVで取得
注意点
- Yahoo!広告は検索連動型広告(YSA)とディスプレイ広告(YDA/旧YDN)で管理画面が分かれている
- APIの利用には申請が必要で、レート制限が厳しい場合がある
- 日本市場特有のプラットフォームであり、PCユーザー比率が高い傾向
4. LINE広告
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| 費用 | line_spend | 必須 | |
| インプレッション | line_impressions | 推奨 | |
| クリック数 | line_clicks | 推奨 | |
| 友だち追加 | line_friend_adds | 任意 | LINE特有のKPI |
取得方法
- LINE Ads Platform管理画面 → 「レポート」
- レポートの種類・期間を設定
- CSVダウンロード
注意点
- LINE広告は日本国内でのリーチが非常に広い(月間アクティブユーザー9,500万人以上)
- 公式アカウントの友だち追加数もMMMの変数として検討可能
- LINE広告のAPIは機能が限定的な場合がある
5. テレビCM
テレビCMのデータ取得はデジタル広告と比べて複雑です。
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| GRP | tv_grp | 必須 | 延べ視聴率 |
| 出稿金額 | tv_spend | 必須 | |
| 出稿本数 | tv_spots | 推奨 | 15秒/30秒を区別 |
| リーチ | tv_reach | 任意 | 到達率 |
取得方法
| データソース | 提供内容 | 費用 |
|---|---|---|
| ビデオリサーチ社 | GRPデータ(関東/関西/中京など地域別) | 有料契約 |
| スイッチメディア | 全国個人視聴率、CM出稿データ | 有料契約 |
| 広告代理店レポート | 出稿実績・金額 | 代理店経由 |
| 自社出稿記録 | CMスケジュール・金額 | 社内データ |
注意点
- GRP(Gross Rating Point)は「延べ視聴率」であり、同じ人が2回見れば2カウントされる
- 地域別にGRPが異なるため、全国一律の値は概算に過ぎない
- テレビCMの効果は アドストック(残存効果) が長い傾向にある(2〜6週間)
6. YouTube / 動画広告
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| 費用 | youtube_spend | 必須 | |
| 視聴回数 | youtube_views | 推奨 | |
| 完全視聴率 | youtube_completion_rate | 任意 | 動画品質の指標 |
| CPV | youtube_cpv | 任意 | 視聴単価 |
取得方法
- Google Ads経由で配信している場合はGoogle Ads APIで取得可能
- YouTube Studio の「アナリティクス」からオーガニックデータを取得
7. 新聞・雑誌
取得すべき指標
| 指標 | カラム名例 | 重要度 | 備考 |
|---|---|---|---|
| 出稿金額 | print_spend | 必須 | |
| 掲載面積 | print_column_inches | 推奨 | 段数 |
| 掲載紙名 | print_publication | 任意 | 影響力の違い |
| 推定リーチ | print_estimated_reach | 任意 | 発行部数ベース |
取得方法
- 広告代理店からの出稿レポート
- 日本ABC協会の発行部数データ(リーチ推定用)
外部データ(コントロール変数)
MMMでは広告以外の売上影響要因をコントロール変数として投入することで、モデルの精度が向上します。
天気データ
import requests
import pandas as pd
# 気象庁API(無料、日次)
url = "https://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php"
# パラメータで地点・期間を指定
# Open-Meteo API(無料、REST API)
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 35.6762, # 東京
"longitude": 139.6503,
"daily": "temperature_2m_max,temperature_2m_min,precipitation_sum",
"start_date": "2023-01-01",
"end_date": "2024-12-31",
"timezone": "Asia/Tokyo"
}
response = requests.get(url, params=params)
weather_data = response.json()
祝日・イベントカレンダー
| 種類 | データソース | 取得方法 |
|---|---|---|
| 日本の祝日 | 内閣府 | CSVダウンロード |
| 大型セール | 自社カレンダー | 手動入力(楽天スーパーSALEなど) |
| 競合イベント | 業界情報 | 手動入力 |
経済指標
| 指標 | データソース | 粒度 |
|---|---|---|
| GDP | 内閣府 | 四半期 |
| 消費者物価指数(CPI) | 総務省統計局 | 月次 |
| 消費者信頼感指数 | 内閣府 | 月次 |
| 有効求人倍率 | 厚生労働省 | 月次 |
データ統合のベストプラクティス
統合時の注意点
- 共通の日付キーを設定:
date列をISO 8601形式(YYYY-MM-DD)で統一する - 週次集計の基準日を統一: 月曜始まりまたは日曜始まりに統一する
- 欠損値の処理方針を決める: 0埋めか線形補間か、チャネルごとに判断する
- 外れ値の確認: 大型セール日の売上急増などが外れ値でないことを確認する
統合のPythonコード例
import pandas as pd
# 各プラットフォームのデータを読み込み
google_ads = pd.read_csv("google_ads_weekly.csv", parse_dates=["date"])
meta_ads = pd.read_csv("meta_ads_weekly.csv", parse_dates=["date"])
tv_data = pd.read_csv("tv_grp_weekly.csv", parse_dates=["date"])
sales = pd.read_csv("sales_weekly.csv", parse_dates=["date"])
# 日付キーで結合(左外部結合で欠損を保持)
df = sales.copy()
df = df.merge(google_ads, on="date", how="left")
df = df.merge(meta_ads, on="date", how="left")
df = df.merge(tv_data, on="date", how="left")
# 欠損値の確認
print("欠損値の数:")
print(df.isnull().sum())
# 広告費の欠損は0で埋める(出稿がなかった = 費用0)
spend_columns = [col for col in df.columns if "spend" in col]
df[spend_columns] = df[spend_columns].fillna(0)
# 統合データの保存
df.to_csv("mmm_integrated_data.csv", index=False)
print(f"統合データ: {df.shape[0]}行 x {df.shape[1]}列")
総合チェックリスト
以下のチェックリストを使って、データ収集の漏れがないか確認しましょう。
| # | チェック項目 | 状態 |
|---|---|---|
| 1 | 日付粒度は統一されているか(週次推奨) | [ ] |
| 2 | 通貨単位は統一されているか(円/税抜) | [ ] |
| 3 | 最低2年分のデータがあるか | [ ] |
| 4 | Google Ads(検索/ディスプレイ別)を取得したか | [ ] |
| 5 | ブランド/ノンブランド検索を分離したか | [ ] |
| 6 | Meta広告データを取得したか | [ ] |
| 7 | Yahoo!広告データを取得したか(該当する場合) | [ ] |
| 8 | LINE広告データを取得したか(該当する場合) | [ ] |
| 9 | テレビCMデータ(GRP/出稿金額)を取得したか | [ ] |
| 10 | YouTube/動画広告データを取得したか | [ ] |
| 11 | 新聞・雑誌データを取得したか(該当する場合) | [ ] |
| 12 | 売上データ(金額+数量)を取得したか | [ ] |
| 13 | 天気データを取得したか | [ ] |
| 14 | 祝日・セール・イベントフラグを作成したか | [ ] |
| 15 | 経済指標を取得したか(CPI、消費者信頼感など) | [ ] |
| 16 | 全データが共通の日付キーで結合できるか | [ ] |
| 17 | 欠損値の処理方針を決めたか | [ ] |
| 18 | 外れ値の確認を行ったか | [ ] |
まとめ
データ収集はMMMプロジェクトの中で最も時間がかかるフェーズですが、ここでの手抜きはモデルの精度に直結します。本チェックリストを活用して、体系的かつ漏れのないデータ収集を心がけてください。特に、デジタル広告のブランド検索/ノンブランド検索の分離と、テレビCMのGRPデータの取得は、日本市場のMMMにおいて精度を大きく左右するポイントです。