小売業は毎年12月にホリデー向け在庫を積み増します。電力会社は毎年夏にエアコン需要のピークに備えます。こうしたパターンは毎年繰り返されます。もし時系列予測でこれらを無視しているなら、精度を取りこぼしていることになります。
季節自己回帰和分移動平均モデル(略してSARIMA)は、広く使われるARIMAの枠組みを拡張し、規則的なトレンドに加えて反復する季節パターンを捉えます。本記事では、SARIMAとは何か、その構成要素の働き、ARIMAとの使い分け、そしてPythonでの段階的な実装方法を解説します。
SARIMAとは?
SARIMAは、季節性のないパターンと季節性のあるパターンの双方を扱える時系列予測モデルです。ARIMAを直接拡張しているため、ARIMAの経験があれば多くの仕組みは見覚えがあるはずです。最大の違いは、SARIMAでは月次・四半期・週次といった一定間隔で繰り返す挙動をモデル化するための第2のパラメータ群が追加されている点です。
形式的には、SARIMAモデルは SARIMA(p, d, q)(P, D, Q)[S] と表記します。最初の(p, d, q)は標準的なARIMAと同様に非季節部分を扱います。続く(P, D, Q)[S]は季節パターンを扱い、Sは季節サイクルの長さです。年周期をもつ月次データでは S = 12、四半期データでは S = 4 となります。
SARIMAの主要構成要素
SARIMAの7つのパラメータは、最初は多く感じられるかもしれません。これらを2つのグループで考えると理解しやすくなります。すなわち、馴染みのあるARIMAの三要素(p, d, q)と、それらを季節スケールで鏡写しにした対応要素(P, D, Q, S)です。各季節パラメータは非季節側の「双子」と同じ役割を果たしますが、隣接時点ではなく季節ラグをまたいで適用されます。
自己回帰(AR)項
AR成分は系列の過去の値を使って将来の値を予測します。パラメータ p は何個のラグを含めるかを指定します。p = 2 であれば、直近2時点の値を現在値の予測に用います。
季節側では、P が同じことを季節ラグで行います。P = 1 かつ S = 12 の場合、12期前、つまり前年同月の値を予測子として参照します。これにより前年比のパターンを直接捉えられます。
差分(I)項
パラメータ d は系列を定常化するために差分を何回とるかを制御します。差分とは各観測値から直前の観測値を引くことで、線形トレンドを除去します。d = 1 なら一次差分、d = 2 なら一次差分後の系列にさらに差分を適用します。
季節差分も同様ですが、季節ラグで行います。D は季節差分の回数を指定します。D = 1 かつ S = 12 なら、各観測値から12期前の値を引きます。一般的な上昇トレンドと反復する季節パターンが同時に存在する場合、d = 1 と D = 1 を併用するのが一般的です。
移動平均(MA)項
AR成分が過去の値を参照するのとは異なり、MA成分は現在の観測と過去の予測誤差との関係をモデル化します。パラメータ q は何個のラグ付き誤差項を含めるかを定めます。q = 1 なら、直前ステップの予測誤差で現在の予測を調整します。
季節側の対応パラメータ Q は、同じ論理を季節ラグで適用します。Q = 1 かつ S = 12 なら、12期前の予測誤差を取り込みます。たとえば、異常に暑い夏でエネルギー需要が押し上げられ、それが翌年同時期にも影響しがちな場合に重要です。
季節成分(S)
S は季節サイクルの長さを定義し、3つの季節パラメータ(P, D, Q)を結びつけます。S を正しく設定することが重要です。年周期のある月次データなら S = 12、年周期のある週次データなら S はおよそ 52 です。
ここで季節性がやや厄介になることがあります。1年は正確には52週ではなく、約52.18週です。多くの実務では S = 52 に丸めても問題ありません。しかし、季節周期が複数あるデータセットもあります。例えば日次の電力需要には、週次(S = 7)と年次(S = 365)の両方のサイクルが見られます。標準的なSARIMAは1つの季節周期しか扱えないため、複数の季節性にはTBATSやFacebook Prophetのような手法が必要です。
S が明確でない場合は、時系列分解が役立ちます。トレンド・季節・残差に分解することで、支配的な反復周期を可視化できます。自己相関プロットで規則的なラグにスパイクが現れるかを確認するのも有効です。
ARIMAとSARIMAの違いは?
きっとこう思っているはずです――実際、いつARIMAではなくSARIMAを使うべきなのか?
短い答え:意味のある季節パターンがなければARIMA、あればSARIMAを使ってください。
ARIMAは3つをモデル化します。系列自体の自己相関(AR)、定常化に必要な差分回数(I)、過去の予測誤差が現在値に及ぼす残留的な影響(MA)です。トレンド、循環、不規則ノイズをうまく扱えます。しかし、固定した季節頻度で繰り返すパターンは扱えません。そうしたパターンは未説明分散として残ってしまいます。
SARIMAはまさにその能力を追加します。データに明確な季節的な山と谷があるのに素のARIMAを当てはめると、それらのパターンは残差に押し込まれ、予測精度は悪化し、残差はホワイトノイズになりません。SARIMAならそれらを直接捉えられます。
実務的なルール:データをプロットして、一定間隔で繰り返すパターンを探してください。それが見える、たとえばホリデーの売上急増、冬のエネルギー需要増、四半期ごとの決算パターンがあるならSARIMA。規則的なサイクルがなく不規則またはトレンド主導なら、ARIMAの方が簡潔で十分です。
当社のPythonによるARIMAモデルコースでは、両方の枠組みをハンズオンで扱い、どちらを適用すべきかの直感を磨けます。
PythonでSARIMAモデルを構築する方法
SARIMAモデルの構築は、データ収集、定常性の確認、パラメータ同定、モデル推定、診断、予測という順序で進みます。ここではPythonのstatsmodelsライブラリを用いて、各ステップを実務的に説明します。
データ収集
季節性を捉えるには、少なくとも2サイクル、理想的には複数サイクル分の履歴が必要です。月次の小売売上、気温記録、エネルギー消費、旅客数などは定番です。公開データとしては、FRED(米連邦準備制度の経済データ)、米国勢調査局、Kaggleなどが良い出発点です。
このワークフローの標準的な教材は航空旅客数のデータセットです。1949〜1960年の月次データで、明確な上昇トレンドと強い年次季節性があります。これはstatsmodelsのget_rdataset()からRdatasetsコレクション経由で取得できます。まずはこのデータセットで手順に慣れてから、手元のデータに適用してください。
データ前処理
SARIMAを当てはめる前に、平均と分散が時間とともに変化しない定常系列にする必要があります。拡張Dickey-Fuller(ADF)検定で形式的に確認できます。p値が0.05未満なら定常と示唆されます。
定常でない場合は差分で対応します。トレンドには通常の差分(d = 1)、季節的非定常には季節差分(ラグ S で D = 1)、必要なら両方を適用します。この前に欠損値を処理してください。時系列では行削除が時系列構造を壊すため、前方補完や補間が一般的です。
モデル同定
定常系列が得られたら、自己相関関数(ACF)と偏自己相関関数(PACF)プロットを用いてパラメータを同定します。注目点は次のとおりです。
- ACF は系列とそのラグとの相関を示します。ラグ q で鋭く打ち切られるパターンはMA次数の示唆になります。季節ラグ(例:月次なら12, 24, 36)のスパイクは Q を示唆します。
- PACF は中間ラグの影響を除いた部分相関を示します。ラグ p で鋭く打ち切られるパターンはAR次数の示唆になります。季節スパイクは P を示唆します。
実務では、これらのプロットから候補値を得て、いくつかのモデルを情報量規準で比較します(診断で詳述)。自動化したい場合は、pmdarimaのauto_arima()がパラメータ組み合わせをグリッドサーチし、最良のモデルを選択します。
パラメータ推定
候補パラメータが決まったら、statsmodelsが最尤推定(MLE)で推定します。観測データが最も生起しやすくなる係数を求めます。SARIMAの推定は非季節と季節の両成分を同時に最適化するため、ARIMAより計算負荷が高くなります。
最適化はときに大域解ではなく局所解に収束することがあります。結果に違和感がある場合は、初期値やパラメータ組み合わせをいくつか試す価値があります。
モデル適合
航空旅客データセットを用いて、PythonでSARIMAモデルを適合させる例です。
import pandas as pd
import statsmodels.api as sm
# Load the classic airline dataset
airline_data = sm.datasets.get_rdataset("AirPassengers", "datasets").data
airline_data.index = pd.date_range(start="1949-01", periods=len(airline_data), freq="MS")
passengers = airline_data["value"]
# Fit SARIMA(1,1,1)(1,1,1)[12]
sarima_model = sm.tsa.statespace.SARIMAX(
passengers,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False,
enforce_invertibility=False
)
sarima_result = sarima_model.fit(disp=False)
print(sarima_result.summary())
order引数は非季節部分の(p, d, q)、seasonal_orderは(P, D, Q, S)を受け取ります。enforce_stationarity=False と enforce_invertibility=False を指定すると最適化の自由度が増し、実データで収束が改善することが多いです。
モデル統計と診断
適合後は sarima_result.plot_diagnostics() で組み込み診断プロットを実行します。確認すべき4点は次のとおりです。
- 標準化残差: 目立ったパターンのないホワイトノイズ状であること。
- 残差のヒストグラム: おおむね正規分布であること。
- 正規Q-Qプロット: 点が対角線上におおむね並ぶこと。
- コレログラム(残差のACF): 有意なスパイクがないこと。スパイクは未説明の自己相関を示します。
特に季節ラグのスパイクに注意してください。ラグ12、24などでスパイクがある場合、季節成分が取り切れていない可能性があります。AIC(赤池情報量規準)やBIC(ベイズ情報量規準)で代替仕様を比較しましょう。値が低いほど適合が良く、BICは複雑さにより強いペナルティを課します。
予測
検証済みモデルが得られたら、予測の生成は簡単です。予測精度を正しく把握するため、データを学習用とテスト用に分割してください。
# Train on first 11 years, test on final year
train = passengers[:"1959"]
test = passengers["1960":]
# Refit on training data and forecast
sarima_train = sm.tsa.statespace.SARIMAX(
train,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False, # add this
enforce_invertibility=False # add this
).fit(disp=False)
forecast = sarima_train.get_forecast(steps=12)
forecast_mean = forecast.predicted_mean
conf_int = forecast.conf_int()
get_forecast()は、先に進むほど広がる信頼区間とともに点予測を返します。広がりは欠点ではなく、不確実性を正直に反映したものです。ホールドアウトしたテストデータに対して、RMSE(平均二乗誤差平方根)やMAPE(平均絶対パーセント誤差)で精度を評価してください。
SARIMAの実用例
現実世界の多くのシグナルは季節的であり、SARIMAはあらゆる時系列ツールキットで常備すべき手法です。業界横断の例をいくつか挙げます。
- 小売: 在庫計画のための月次売上予測。特にホリデー期のように、需要の急増が予測可能だが年ごとに大きさが変わる場面で有効です。
- エネルギー消費: 電気・ガス需要の予測。気温や活動パターンに駆動される日次・年次の季節サイクルに従います。
- 金融: 会計カレンダーに沿って繰り返す四半期の利益や出来高パターンのモデリング。
- 気象予測: 強い年次サイクルに従う気温、降水量、その他の気候変数の予測。
いずれも、繰り返し構造こそがシグナルであり、SARIMAはそれを捉えるために設計されています。
SARIMAの限界
どこで有効かを知るだけでは十分ではありません。SARIMAは季節性時系列に対する堅実なベースラインですが、その限界を理解しているかどうかが、モデルを適切に使う人と盲目的に使う人を分けます。
SARIMAが扱える季節周期は1つだけです。日次・週次・年次のように複数の季節性が重なるデータでは、SARIMAはすべてを同時にはモデル化できません。TBATS、Prophet、LSTMネットワークのような手法は、複数の季節周波数をより自然に扱えます。
また、SARIMAは線形性を仮定します。過去の値や過去の誤差と将来の観測との線形関係をモデル化します。金融時系列やカオス的なシステムに見られる非線形的なダイナミクスには別の手法が必要です。さらに、ARIMA同様、SARIMAは系列自身の履歴のみに依存します。プロモーション、気象、経済指標など外部要因が予測に影響するなら、外生変数を組み込めるSARIMAXを検討してください。
最後に、パラメータ選定は本当に難しいことがあります。7つのパラメータをチューニングするため探索空間は広く、長い系列では推定も遅くなります。pmdarimaのauto_arima()は自動化に役立ちます。しかし、近道はありません。各パラメータの意味を理解することが不可欠であり、だからこそコードに触れる前に構成要素を解説しました。
まとめ
入門的な予測コースではSARIMAは過小評価されがちだと常々思っています。「ARIMAに季節性を足しただけ」と教えられ、ささやかな拡張のように聞こえるからです。実際は違います。季節パラメータは後付けではなく、ARIMAでは届かないデータの挙動の層を実質的に捉えています。
実務でSARIMAが腑に落ちるのは、非季節と季節の成分が並走する別々のモデルではないと理解した瞬間です。ARとMAの項は季節側の双子と並んで働き、異なるタイムスケールの自己相関をそれぞれ処理します。これが分かると、ACFやPACFの読み解きは当てずっぽうではなく、データを本当に理解する感覚に変わります。
月次、四半期、その他の規則的サイクルを持つデータに取り組むなら、SARIMAは出発点として適切です。最終解だからではなく、系列の構造を明確に考えさせてくれるからです。そこから、SARIMAXで外部予測子を加え、TBATSやProphetでより複雑な多重季節性に対応できます。当社の時系列予測チュートリアルやPythonによるARIMAモデルコースは、次の一歩として有益です。
SARIMAのよくある質問
SARIMAは何の略ですか?
SARIMAはSeasonal AutoRegressive Integrated Moving Average(季節自己回帰和分移動平均)の略です。標準的なARIMAに季節パラメータ(P, D, Q)と季節周期 S を追加し、月次や四半期など時系列データにおける反復パターンを捉えられるように拡張したものです。
ARIMAとSARIMAの違いは何ですか?
ARIMAは非季節のパターン(トレンド、自己相関、移動平均効果)をモデル化します。SARIMAは季節ラグにおいて同様の効果をモデル化する第2層のパラメータ(P, D, Q, S)を追加します。毎年12月に売上が高くなるといった一定間隔の繰り返しがある場合、SARIMAはそれを直接捉えますが、ARIMAでは未説明の残差分散として残ります。
適切なSARIMAパラメータはどう選べばよいですか?
まず拡張Dickey-Fuller検定で系列が定常かを確認します。次にACFとPACFを確認します。非季節のAR(p)とMA(q)の次数は、非季節ラグでの打ち切りパターンから推定し、季節ラグのスパイクは季節次数 P と Q を示唆します。pmdarimaのauto_arima()を使えば、AICやBICを用いてパラメータ組み合わせを自動探索できます。
SARIMAモデルの季節周期 S はどう決めますか?
季節周期 S はパターンの繰り返し頻度を表します。年次季節性のある月次データでは S = 12、四半期データでは S = 4、週次データでは S = 52(または52.18の丸め)です。周期が明確でない場合は、時系列分解や、ACFで規則的なスパイクの有無を確認してください。これらのスパイクが支配的な季節周波数を示します。
SARIMAで複数の季節周期を扱えますか?
標準的なSARIMAが扱える季節周期は1つだけです。日次電力需要のように週次と年次が重なるなど、季節性が多層に重なっている場合は、TBATS、Facebook Prophet、LSTMネットワークなど、複数の季節構造を同時に扱える手法を用いる必要があります。
SARIMAモデルの実装に最適なPythonライブラリはどれですか?
Pythonではstatsmodelsが標準的な選択で、外生変数なしのSARIMAにも柔軟に対応できるSARIMAX()を提供しています。パラメータ選定を自動化するには、pmdarimaのauto_arima()がグリッドサーチを行うので、出発点が分からないときにワークフローへ取り入れる価値があります。
SARIMAモデルが適合しているかどうかはどう評価しますか?
適合後は結果オブジェクトでplot_diagnostics()を実行し、残差が構造のないホワイトノイズに見えるか、特にACFで季節ラグのスパイクがないかを確認します。AICやBIC(低いほど良い)で競合モデルを比較してください。ホールドアウトデータでの予測精度には、RMSEとMAPEが一般的です。
SARIMAXとは何ですか? SARIMAの代わりにいつ使うべきですか?
SARIMAXはSARIMAの枠組みに外生変数(外部予測子)を追加したものです。小売の販促費が売上に影響する、気温がエネルギー需要に影響する、マクロ指標が四半期収益に影響するなど、系列の履歴以外に影響要因がある場合に使用します。系列そのものしかない場合はSARIMAで十分ですが、関連する外部要因があるならSARIMAXで直接取り込めます。