アドストック効果とは?広告の残存効果を理解する
はじめに
広告を見た消費者は、その直後に購入するとは限りません。TVCMを見てから数日後にGoogle検索し、レビューサイトを確認し、さらに数日後に購入する——これはよくある購買行動パターンです。
この「広告の効果が時間と共に減衰しながら残存する現象」を**アドストック効果(Adstock Effect)**と呼びます。1979年にSimon Broadbentが提唱した概念で、MMMにおいて最も重要なコンポーネントの一つです。
アドストック効果を正しくモデリングしないと、広告の直接効果しか測定できず、マーケティングのROIを30〜50%過小評価してしまう可能性があります。
アドストック効果の直感的な理解
例:TVCMの効果の流れ
1億円のTVCM出稿を考えてみましょう。効果は出稿日にピークを迎え、その後徐々に減衰していきます:
| 日付 | イベント | 残存効果 | 累積インパクト |
|---|---|---|---|
| 月曜 | TVCM放映 | 100% | ★★★★★ |
| 火曜 | 残存効果で検索増加 | 70% | ★★★★ |
| 水曜 | まだ記憶に残っている | 49% | ★★★ |
| 木曜 | 効果が薄れてくる | 34% | ★★ |
| 金曜 | さらに減衰 | 24% | ★★ |
| 土曜 | 週末に購入行動 | 17% | ★ |
| 日曜 | ほぼ忘れている | 12% | ★ |
この例では、減衰率(α)が 0.7 の場合を示しています。広告費1億円の真の効果は、直接効果(100%)だけでなく、残存効果の合計(70% + 49% + 34% + ...)を含めて評価すべきです。
数学的な定式化
1. Geometric Adstock(幾何減衰モデル)
最もシンプルで広く使われるモデルです。効果が一定の比率で減衰すると仮定します:
Adstock(t) = x(t) + α × Adstock(t-1)
x(t): 時点 t の広告投下量α: 減衰率(0 < α < 1)— 値が大きいほど効果が長く残るAdstock(t-1): 前期のアドストック値
Pythonで実装すると:
import numpy as np
import matplotlib.pyplot as plt
def geometric_adstock(x: np.ndarray, alpha: float) -> np.ndarray:
"""幾何減衰アドストック変換"""
adstocked = np.zeros_like(x, dtype=float)
adstocked[0] = x[0]
for t in range(1, len(x)):
adstocked[t] = x[t] + alpha * adstocked[t - 1]
return adstocked
# 使用例:週次の広告費データ
spend = np.array([100, 0, 0, 50, 0, 0, 0, 80, 0, 0])
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
for i, alpha in enumerate([0.3, 0.5, 0.7]):
result = geometric_adstock(spend, alpha=alpha)
axes[i].bar(range(len(spend)), spend, alpha=0.3, label="元の広告費")
axes[i].plot(result, "r-o", label=f"Adstock (α={alpha})")
axes[i].set_title(f"α = {alpha}")
axes[i].legend()
plt.tight_layout()
2. 半減期(Half-life)
半減期は「効果が半分に減衰するまでの期間」を表します:
half_life = log(0.5) / log(α)
| α の値 | 半減期 | 典型的なチャネル | 特徴 |
|---|---|---|---|
| 0.1〜0.3 | 0.3〜0.6週 | 検索広告、リターゲティング | 即効性が高く、効果はすぐに消失 |
| 0.3〜0.5 | 0.6〜1.4週 | SNS広告、ディスプレイ広告 | 中程度の残存効果 |
| 0.5〜0.7 | 1.4〜2.3週 | YouTube広告、動画広告 | 視覚的記憶による長い残存 |
| 0.7〜0.85 | 2.3〜4.3週 | TVCM | ブランド記憶に基づく長期効果 |
| 0.85〜0.95 | 4.3〜13.5週 | ブランド広告、PR施策 | 非常に長い残存、態度変容を伴う |
学術研究では広告の半減期は7〜12週間という報告がありますが、実務では2〜5週間が一般的です(Recast社の分析より)。この差は、研究がブランドリフトを含む長期効果を測定するのに対し、実務は直接的なコンバージョン効果に焦点を当てるためです。
3. Weibull Adstock(ワイブル分布モデル)
Meta社のRobynで採用されているモデルで、時間と共に減衰率が変化できる柔軟なモデルです。Geometric Adstockは減衰率が一定ですが、Weibullは2つのパラメータで制御します:
def weibull_adstock(
x: np.ndarray,
shape: float, # 形状パラメータ(k)
scale: float, # スケールパラメータ(λ)
L: int = 12, # 最大ラグ
) -> np.ndarray:
"""Weibull PDF アドストック変換"""
t = np.arange(L)
# Weibull PDF
weights = (shape / scale) * (t / scale) ** (shape - 1) * \
np.exp(-(t / scale) ** shape)
weights[0] = max(weights[0], 1e-10) # ゼロ除算防止
weights /= weights.sum()
padded = np.concatenate([np.zeros(L - 1), x])
return np.convolve(padded, weights[::-1], mode="valid")
| パラメータ | 効果 |
|---|---|
| shape < 1 | 即時ピーク → 急速減衰(Geometricに類似) |
| shape = 1 | 指数減衰(一定の減衰率) |
| shape > 1 | 遅延ピーク → 徐々に減衰(PR・ブランド施策向き) |
4. Delayed Adstock(遅延アドストックモデル)
一部のチャネルでは効果のピークが即時ではなく遅延します。例えばPR施策は、掲載から数日後にSNSで拡散されて効果がピークに達することがあります:
def delayed_adstock(
x: np.ndarray,
alpha: float, # 減衰率
theta: int, # ピークまでの遅延期間
L: int = 12,
) -> np.ndarray:
"""遅延アドストック変換"""
weights = np.array([
alpha ** ((i - theta) ** 2) for i in range(L)
])
weights /= weights.sum()
padded = np.concatenate([np.zeros(L - 1), x])
return np.convolve(padded, weights[::-1], mode="valid")
チャネル別アドストックの特徴
実際のMMM分析では、チャネルごとに異なるアドストックパラメータが推定されます:
| チャネル | 推定α(目安) | 半減期 | 効果の特徴 |
|---|---|---|---|
| TVCM | 0.7〜0.85 | 2〜4週 | 高い認知効果、間接的に検索・EC売上を押し上げ |
| YouTube | 0.5〜0.7 | 1〜2週 | 視覚的記憶が残りやすい、TVCMに次ぐ残存効果 |
| SNS広告 | 0.3〜0.5 | 0.5〜1週 | エンゲージメントベース、比較的短い残存 |
| 検索広告 | 0.1〜0.3 | < 0.5週 | 需要の刈り取り型、即効性が高い |
| ディスプレイ | 0.3〜0.5 | 0.5〜1週 | ブランド認知向上、リターゲティングは即効性高 |
| PR・記事掲載 | 0.8〜0.95 | 4〜13週 | SNS拡散により遅延効果が大きい |
Suntory Wellnessの事例では、YouTubeが全デジタルメディア中で最長のアドストックを示し、購買行動への持続的な影響が確認されました(Think with Google APAC)。
PyMC-Marketingでのアドストック
PyMC-Marketingでは、アドストックのパラメータを自動的にベイズ推定します:
from pymc_marketing.mmm import (
GeometricAdstock,
LogisticSaturation,
MMM,
)
mmm = MMM(
date_column="date",
channel_columns=["tv", "digital", "sns"],
adstock=GeometricAdstock(l_max=8), # 最大ラグ8週
saturation=LogisticSaturation(),
)
# モデル学習
mmm.fit(X=df[["date", "tv", "digital", "sns"]], y=df["revenue"])
# 各チャネルのα(減衰率)の事後分布を確認
alpha_posterior = mmm.fit_result["adstock_alpha"]
print("平均α:", alpha_posterior.mean(dim=["chain", "draw"]).values)
print("95%信頼区間:", alpha_posterior.quantile([0.025, 0.975],
dim=["chain", "draw"]).values)
ベイズ推定の利点は、αの点推定値だけでなく不確実性の幅も得られることです。例えば「TVのαは0.72(95%CI: 0.65〜0.79)」のように報告できます。
アドストックを無視するリスク
ケーススタディ:アドストック無視による判断ミス
ある企業がTVCMの効果を「放映週の売上増分のみ」で評価したケースを考えます:
| 評価方法 | TVCM の ROI | 判断 |
|---|---|---|
| 直接効果のみ | 0.8倍 | TVCM は非効率→予算カット |
| アドストック込み | 2.5倍 | TVCM は高効率→予算維持 |
アドストックを無視した評価では、TVCMの2〜3週間にわたる残存効果が見落とされ、誤った予算削減判断に至る可能性があります。
まとめ
- アドストック効果は広告の残存効果をモデル化する重要な概念
- Geometric(一定減衰)、Weibull(可変減衰)、Delayed(遅延ピーク)の3種類が代表的
- 減衰率αはチャネルごとに異なり、ベイズ推定で自動的に学習可能
- アドストックを無視すると、広告効果を大幅に過小評価するリスクがある
- 半減期の概念を使うことで、ビジネス担当者にも理解しやすい形で説明可能
次の記事では、もう一つの重要な概念「飽和曲線(Saturation Curve)」について解説します。