小規模データでのMMM:データ量が少ないときの実践的対処法
「MMMを始めたいが、データが2年分しかない」「広告チャネルが3つだけ」「地域展開していないので全国1系列のみ」――こうした小規模データ環境はMMMの大きな課題ですが、適切なアプローチを取れば有意義な分析は可能です。本記事では、データ量が限られている場合の7つの実践的対処法を解説します。
「データが少ない」の定義
MMMにおける「十分なデータ量」は、チャネル数やモデルの複雑さに依存します。以下は一般的な目安です。
最低限必要なデータ量の目安(チャネル数別)
| チャネル数 | 推定パラメータ数(目安) | 最低データ行数(週次) | 推奨データ行数(週次) |
|---|---|---|---|
| 3 | 10〜15 | 52行(1年) | 104行(2年) |
| 5 | 18〜25 | 78行(1.5年) | 156行(3年) |
| 8 | 28〜40 | 104行(2年) | 208行(4年) |
| 12 | 40〜60 | 156行(3年) | 260行(5年) |
推定パラメータ数の内訳例(5チャネルの場合):
- メディア係数:5
- Adstock減衰率:5
- 飽和曲線パラメータ:5
- コントロール変数:3〜5
- 季節性:4〜6(フーリエ項)
- 切片:1
- 合計:約23〜27パラメータ
週次52行(1年分)で27パラメータを推定しようとすると、1パラメータあたり約2行しかなく、推定が極めて不安定になります。
小規模データの3大課題
課題1:パラメータ推定の不安定性
データが少ないと、小さなデータの変動がモデル全体に大きく影響します。
import numpy as np
from sklearn.linear_model import LinearRegression
# シミュレーション:少ないデータで推定が不安定になる例
np.random.seed(42)
true_beta = 0.5 # 真の係数
estimates_small = [] # N=30
estimates_large = [] # N=200
for _ in range(100):
# 小サンプル
X_small = np.random.randn(30, 1)
y_small = true_beta * X_small.flatten() + np.random.randn(30) * 0.5
model_small = LinearRegression().fit(X_small, y_small)
estimates_small.append(model_small.coef_[0])
# 大サンプル
X_large = np.random.randn(200, 1)
y_large = true_beta * X_large.flatten() + np.random.randn(200) * 0.5
model_large = LinearRegression().fit(X_large, y_large)
estimates_large.append(model_large.coef_[0])
print(f"小サンプル(N=30)の推定値: {np.mean(estimates_small):.3f} ± {np.std(estimates_small):.3f}")
print(f"大サンプル(N=200)の推定値: {np.mean(estimates_large):.3f} ± {np.std(estimates_large):.3f}")
# 出力例:
# 小サンプル: 0.501 ± 0.098
# 大サンプル: 0.499 ± 0.035
課題2:季節性の学習不足
週次データ1年分(52行)では、季節パターンのサイクルを1回しか観測できません。モデルは「1年間で1回だけ見た12月の売上上昇」が、本当に毎年の季節パターンなのか、たまたまの変動なのか判断できません。
課題3:チャネル効果の分離困難
複数チャネルに同時に投資していると、各チャネルの個別効果を分離することが困難になります。データが少ないほどこの問題は深刻化します。