メインコンテンツへスキップ
MMM基礎

アドストック効果とは?広告の残存効果を理解する

広告を見た後も効果が続く「アドストック効果」について、数式と図を使って分かりやすく解説します。

2026/2/197分で読める20

アドストック効果とは?広告の残存効果を理解する

はじめに

広告を見た消費者は、その直後に購入するとは限りません。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.30.3〜0.6週検索広告、リターゲティング即効性が高く、効果はすぐに消失
0.3〜0.50.6〜1.4週SNS広告、ディスプレイ広告中程度の残存効果
0.5〜0.71.4〜2.3週YouTube広告、動画広告視覚的記憶による長い残存
0.7〜0.852.3〜4.3週TVCMブランド記憶に基づく長期効果
0.85〜0.954.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分析では、チャネルごとに異なるアドストックパラメータが推定されます:

チャネル推定α(目安)半減期効果の特徴
TVCM0.7〜0.852〜4週高い認知効果、間接的に検索・EC売上を押し上げ
YouTube0.5〜0.71〜2週視覚的記憶が残りやすい、TVCMに次ぐ残存効果
SNS広告0.3〜0.50.5〜1週エンゲージメントベース、比較的短い残存
検索広告0.1〜0.3< 0.5週需要の刈り取り型、即効性が高い
ディスプレイ0.3〜0.50.5〜1週ブランド認知向上、リターゲティングは即効性高
PR・記事掲載0.8〜0.954〜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)」について解説します。

MMMをもっと深く学びませんか?

理論から実践まで体系的に学べるコース・記事を多数ご用意。 無料プランでも基礎コンテンツにアクセスできます。

MMMの最新情報をお届けします

新着記事・コース更新をメールでお知らせ

関連記事