13.1 週次、日次、日次より細かいデータ

週次、日次、そして、日次より細かいデータは、理由はそれぞれですが、予測が困難になることがあります。

週次データ

週次データは、季節周期(1年間の週の数)が大きく、かつ、整数でないため、扱いが難しいです。1年間の週の数は平均すると52.18です。これまで検討してきたほとんどの手法では、季節周期は整数である必要があります。52に丸めたとしても、これほど大きな季節周期をほとんどの手法は効率的に扱えません。

一番単純なアプローチは(3章で議論したように)STL分解して、季節調整値に非季節性手法を適用することです。これは、米国の自動車用ガソリン最終製品供給(百万バーレル/日)の週次データの1991年2月から2005年5月までを使った例です。

my_dcmp_spec <- decomposition_model(
  STL(Barrels),
  ETS(season_adjust ~ season("N"))
)
us_gasoline %>%
  model(stl_ets = my_dcmp_spec) %>%
  forecast(h = "2 years") %>%
  autoplot(us_gasoline) +
  labs(y = "百万バーレル/日", level = "区間予測",
       title = "米国ガソリン週次生産量")
STL分解と季節調整値へのETSモデルを使った米国ガソリン週次生産量の予測

図 13.1: STL分解と季節調整値へのETSモデルを使った米国ガソリン週次生産量の予測

別のアプローチは、10.5節で議論した動学的ハーモニック回帰モデルを使うことです。以下の例では、フーリエ項の数はAICcを最小化するよう選んでいます。ARIMAモデルの次数も、ARIMA()関数の中で行っていることですが、AICc最小化で選んでいます。PDQ(0,0,0)として、ARIMA()に季節ARIMA成分を使わせないようにしています。

gas_dhr <- us_gasoline %>%
  model(dhr = ARIMA(Barrels ~ PDQ(0, 0, 0) + fourier(K = 6)))
gas_dhr %>%
  forecast(h = "2 years") %>%
  autoplot(us_gasoline) +
  labs(y = "百万バーレル/日", level = "区間予測",
       title = "米国ガソリン週次生産量")
動学的ハーモニック回帰を使った米国ガソリン週次生産量の予測

図 13.2: 動学的ハーモニック回帰を使った米国ガソリン週次生産量の予測

当てはめたモデルには6組のフーリエ項があり、以下のように書けます。 \[ y_t = bt + \sum_{j=1}^{6} \left[ \alpha_j\sin\left(\frac{2\pi j t}{52.18}\right) + \beta_j\cos\left(\frac{2\pi j t}{52.18}\right) \right] + \eta_t \] ただし、\(\eta_t\)はARIMA(0,1,1)過程です。\(\eta_t\)は非定常なので、実際にはこの方程式の両辺の変数の差分を取って、モデルは推計されています。季節性を取り込むために12個のパラメータがあり、自由度の合計は14です(他の2つはMAパラメータとドリフト・パラメータです)。

季節性が時を経て変化する場合は、STLアプローチの方が望ましいです。予測変数として役立つ共変量があるなら、リグレッサーとして追加できるので、動学的ハーモニック回帰アプローチの方が望ましいです。

日次と日次より細かいデータ

日次と日次より細かい (時間ごと、など)データは、違った理由、つまり、季節周期が複数あるのが普通なので複雑な季節性を扱える手法を使う必要がある、という理由で難しくなります。

もちろん、時系列が比較的短く、1つのタイプの季節性だけがある場合は、これまでの章で議論した単一季節性手法(例えば、ETSや季節性ARIMA)の一つを使うことができるでしょう。しかし、時系列が長く、より長期の季節周期のいくつかが明らかな場合は、12.1節で議論したように、STL、動学的ハーモニック回帰、もしくは、Prophetを使う必要があります。

しかし、これらの手法が扱えるのは定期の周期性だけです。イースター、イード、旧正月といった移動するイベントに伴う季節性を取り込むのは、より困難です。月次データでさえ、祭典が(イースターの場合)3月か4月に、(旧正月の場合)1月か2月に、(イードの場合)年のどの時点でも、あり得るので、扱いにくいです。

移動する祝日の影響を扱う最良の方法は、モデルにダミー変数を含めることです。これは、例えばARIMA()prophet()関数ではできますが、ETS()ではできません。実際、prophet()にはholiday()特殊関数があり、祝日の影響を容易に取り込めます。