シーズナリティと祝日効果のモデリング:フーリエ変換の実践
シーズナリティを無視するとどうなるか?
MMMで最も見落とされる要素の一つが**シーズナリティ(季節性)**です。
例えばアパレルECでは夏に水着が売れます。この自然な売上変動を「広告効果」と混同すると、誤ったROI推定につながります。特に 夏期にTVCMを増やす企業 では、「TV=夏の売上UP」という誤った因果関係をモデルが学習してしまいます。
フーリエ項によるシーズナリティ表現
季節性を最もスムーズに表現できるのがフーリエ変換です。
import numpy as np
import pandas as pd
def fourier_terms(dates, n_order: int = 2, period: float = 52.0):
"""週次データの年次シーズナリティをフーリエ項で表現"""
t = np.arange(len(dates)) / period
terms = {}
for n in range(1, n_order + 1):
terms[f"sin_{n}"] = np.sin(2 * np.pi * n * t)
terms[f"cos_{n}"] = np.cos(2 * np.pi * n * t)
return pd.DataFrame(terms, index=dates)
# n_order=2: 年次の大まかな季節変動を4つの基底関数で表現
seasonality = fourier_terms(df["date"], n_order=2)
n_orderの選択指針:
- n_order=1:ゆるやかな1山(例:夏ピーク型)
- n_order=2:2山(例:春・秋ピーク型)
- n_order=4:より細かい変動も捉える