メインコンテンツへスキップ
データサイエンス

ARIMAX:外生変数を用いた時系列予測の方法

ARIMAXが外部予測変数でARIMAをどう拡張するか、そのパラメータと前提を理解し、Pythonのstatsmodelsで予測モデルを構築しましょう。
Vinod Chugani's photo
Vinod Chugani
更新日 · 9 分 読む

AIで探求

ChatGPTClaudePerplexity

無料アカウントを作成する

練習とトラックであなたの進捗を記録しましょう。

Googleで登録
続行すると、弊社の利用規約、プライバシーポリシーに同意し、データが米国に保存されることに同意したことになります。

月次の電力需要を予測しているとします。系列の自己相関やトレンドを捉える堅実なARIMAモデルを作成しました。ところが猛暑が到来し、予測が15%も外れてしまいました。系列自体が変わったのではなく、天候が変わったのです。まさにARIMAXが想定している状況です。系列自身の履歴と同じくらい外的要因が変動を左右する場合の時系列予測に使います。

ここではARIMAXとは何か、ARIMAやSARIMAXとの違い、そしてどの場面でどれを使うべきかを解説します。さらに、データ前処理、モデルの当てはめ、診断、予測評価までを含むPythonでの実装を一通り示し、実務にすぐ活用できるようにします。

ARIMAXとは?

ARIMAXはAutoRegressive Integrated Moving Average with eXogenous variables(外生変数付き自己回帰和分移動平均)の略です。 ARIMAモデルに外部からの入力、つまり目的系列の外にある予測変数を受け付ける拡張です。典型例としては広告費、気温、プロモーションの有無、金利などが挙げられます。

一般的な表記は、1つ以上の外生回帰変数を伴うARIMAX(p, d, q)です。p、d、qはARIMAと同じく、それぞれ自己回帰次数、差分次数、移動平均次数を表します。「X」は、目的に影響すると考える追加の列を渡せることを意味します。ここで一つ注意点があります。ソフトウェアによっては、外生変数を直接AR項として扱うのではなく、ARIMA誤差を伴う回帰モデルとしてARIMAXを実装しています。数学的には微妙な違いですが、係数の解釈に影響します。statsmodelsの出力を見る際に、この点に戻って説明します。

ARIMAXの仕組み

ARIMAXは、系列自体の記憶と、外部変数の説明力という2つの要素を組み合わせます。

AR・I・MA成分

AR(自己回帰)成分は、目的系列の遅れ値を使って現在の値を予測します。先月の売上が高かったなら、それは重要な情報です。

I(和分)成分は、系列を差分化してトレンドや単位根を取り除き、定常化します。

MA(移動平均)成分は、過去の予測誤差を用いて、モデルが犯してきた系統的な誤りを補正します。

これら3つを組み合わせることで、典型的な時系列を駆動する多くの要因、すなわちトレンド、循環、残差の自己相関を扱えます。

外生変数の役割

外生変数は、系列の履歴だけでは得られない情報を提供します。売上を予測するなら、過去の売上は典型的なパターンを教えてくれます。しかし値下げや新規競合の参入は新しい情報です。モデルは、誤差の自己相関を同時に考慮しながら、各外部予測変数に対して係数を推定します。

実務的に言うと、目的系列がその過去値だけで十分に説明でき、信頼できる外部予測変数がないなら、素のARIMAで十分なことが多いでしょう。しかし外的要因が作用しており、かつ将来のそれらの値を入手できるなら、ARIMAXのほうが高精度な予測になりがちです。

ARIMA vs. ARIMAX vs. SARIMAX

SARIMAXは、SARIMAに外生変数を加えたものです。実務では、PythonでのARIMAX実装の多くがstatsmodelsのSARIMAX()を用い、季節次数をゼロに設定して実現されています。

これは回避策ではありません。標準的なやり方です。明確な季節性がある、あるいは外部回帰変数が必要な場合、SARIMAXはどちらもきれいに扱えるため第一候補になります。ただし注意点として、「ARIMAX」と「SARIMAX」はライブラリ間で必ずしも同義ではありません。季節項なしのSARIMAXとARIMAXが実質同一のこともあれば、外生変数が尤度に入る形が異なることもあります。使っているツールのドキュメントを確認してください。

ARIMAXを使うべきとき

本質的にはひとつの問いに集約されます。目的に影響しうる外部予測変数があり、予測時点でそれらの将来値を入手できるかどうか、です。

ARIMAXが効果を発揮する状況

好例として、プロモーションや価格変更を伴う売上予測、気温を入力とするエネルギー需要、キャンペーン支出と連動したウェブトラフィック、金利データを含む経済指標などがあります。いずれも外部変数は、系列自身では生成できない情報を提供します。

外部予測変数が手に入らない、信頼できない、あるいはサンプル外の精度向上に寄与しない場合は、素のARIMAで十分なことがあります。信号のないノイズを持ち込む予測変数を追加しても意味はありません。入力を増やしても予測精度が上がるとは限りません。導入前に、候補の予測変数は必ずホールドアウトデータで評価してください。

因果関係について一言

予測変数と目的の関係が見られても、因果関係が確立されたわけではありません。ARIMAXは予測の枠組みであり、推定しているのは連関です。もし広告費と売上が12月に同時に上がるから相関しているだけなら、モデルはそれを捉えるかもしれませんが、広告が増加の原因だとは教えてくれません。結果の予測ではなく意思決定の根拠に使う場合には、この違いが重要です。結果を提示する際には、この点を明確にしておく価値があります。

PythonでARIMAXモデルを構築する方法

それでは実装です。

再現可能な例として、月次のアイスクリーム販売(販売数量)を目的に、外生変数として気温(℃)とプロモーションフラグを用います。データは48カ月分で、36カ月を学習用、残り12カ月を評価用に分割します。

データ準備

まず、整合的な月次日付インデックスを持つDataFrameを読み込むか作成します。目的変数と外生列を特定し、日付で整列させます。分割前に欠損値を処理してください。学習・テストの境界をまたいで代入するとリーケージになります。

早い段階で覚えておくべきルールがあります。学習時に渡した外生値は、予測時にも同等の将来値が必要です。将来の気温予報を入手できないなら、気温を予測変数として使うことはできません。些細な注意ではなく、多くの候補を却下する条件です。

import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import mean_absolute_error

# Construct a sample monthly dataset
np.random.seed(42)
dates = pd.date_range(start="2020-01", periods=48, freq="MS")
temperature = 15 + 10 * np.sin(np.linspace(0, 4 * np.pi, 48)) + np.random.normal(0, 1, 48)
promotion = np.where((np.arange(48) % 6 == 0), 1, 0)
sales = (
    500
    + 8 * temperature
    + 150 * promotion
    + np.cumsum(np.random.normal(0, 10, 48))
)

df = pd.DataFrame({"sales": sales, "temperature": temperature, "promotion": promotion}, index=dates)

# Train/test split
train = df.iloc[:36]
test = df.iloc[36:]

statsmodelsでの推定では通常スケーリングは必須ではありませんが、予測変数のスケールが大きく異なると数値安定性の面で役立つことがあります。スケーリングするかは判断次第です。

系列と予測変数の確認

パラメータ選定の前に、目的系列を可視化し、定常性の検定を行います。拡張Dickey–Fuller(ADF)検定が標準です。p値が0.05未満なら定常と示唆され、差分不要(d=0)の可能性が高いでしょう。明確なトレンドがあるなら通常d=1にします。検定は判断材料の一つであり、領域知識や視覚的検討も重要です。

予測変数も確認してください。目的と正しく整列していますか。予測時点以降に測定された変数が混ざっていませんか。月初前に設定されるプロモーションフラグは問題ありませんが、その月の売上高は該当しません。

候補パラメータの選定と当てはめ

ACFとPACFはpとqの候補選定に役立ちます。PACFのラグ1に有意なスパイクがありACFが漸減するならAR(1)が示唆され、逆ならMA(1)が示唆されます。候補を少数に絞り、学習データでAICやBICを比較し、テストセットは最終評価のみに残してください。

# Fit ARIMAX(1,1,1) via SARIMAX with no seasonal order
exog_train = train[["temperature", "promotion"]]
exog_test = test[["temperature", "promotion"]]

model = SARIMAX(
    train["sales"],
    exog=exog_train,
    order=(1, 1, 1),
    seasonal_order=(0, 0, 0, 0),
    trend="n"
)
result = model.fit(disp=False)
print(result.summary())

summary()の出力には、ARIMAの係数と並んで外生変数の係数が表示されます。気温の係数は、自己回帰構造が系列の慣性を考慮したうえで、気温が1度上がると売上水準がどれだけ変化するかを示します。知っておくべき点として、statsmodelsはARIMA誤差を伴う回帰の定式化を用いており、差分(d=1)は回帰式そのものではなく誤差過程に適用されます。したがって、係数はdに関わらず売上の水準に対する効果を表します。一方、(他のパッケージで用いられることのある)トランスファー関数型のARIMAXでは、d=1の場合、係数は水準ではなく変化量への効果を表すことになります。この違いは誤解の元になりやすいので、使うツールのドキュメントを確認してください。

残差の確認と予測の評価

残差はホワイトノイズのようであるべきです。残差のACFプロットで自己相関が残っていないか確認します。有意なスパイクがあれば、モデルが構造を取りこぼしています。季節ラグで系統的なパターンが見られたら、季節次数を持つSARIMAXに切り替えてください。

# Generate out-of-sample predictions
predictions = result.forecast(steps=12, exog=exog_test)

# Evaluate
mae = mean_absolute_error(test["sales"], predictions)

# Naive baseline: forecast each period using the previous period's actual value
naive_forecast = np.concatenate([[train["sales"].iloc[-1]], test["sales"].values[:-1]])
naive_mae = mean_absolute_error(test["sales"], naive_forecast)

print(f"ARIMAX MAE: {mae:.1f}")
print(f"Naive MAE:  {naive_mae:.1f}")

ARIMAXのMAEを単純なベースライン(前期の実績値をそのまま予測に使う)と比較してください。テストセットでARIMAXがナイーブモデルに勝てないなら、それは重要な結果です。複雑さを正当化できません。特に外生変数がインサンプルほどには安定していない場合、この現象は想像以上によく起こります。

将来値を予測する

学習期間を超えた予測は、サンプル外評価と同じやり方で行います。すなわち、forecast()呼び出しと一緒に将来の外生値を渡します。プロモーションフラグは事前に販促カレンダーが分かるので通常は簡単です。気温については天気予報や歴史的な季節平均を使うのが一般的です。

留意点として、statsmodelsが返す信頼区間は、入力として与えた予測変数の値を所与とした条件付きのものです。予測変数の不確実性は織り込まれていません。気温予報が不確実であれば、実際の予測不確実性は表示された区間より広いはずです。結果をもとに意思決定する相手に説明する際は、この点を伝えてください。

よくある課題と限界

ここまで示したのは順調に進む場合です。実務で躓きがちなポイントを挙げます。

  • 将来の予測変数が不明なことがある:最も一般的な実務上の障壁です。将来の外生変数の値を確実に得られない場合、それらを使うことはできません。明日の気温でエネルギー需要を予測するには、昨日の気温ではなく気温予報が必要です。
  • 予測変数が情報リークを起こす可能性:予測時点より後に測定された変数は、インサンプル評価を実際以上に良く見せてしまいます。予測変数のタイムスタンプが実際に何を指すのか注意してください。
  • 関係性が変化する:過去データで推定した係数が将来も成り立つとは限りません。2年間安定していた価格弾力性が、市場ショックを経て変わることがあります。2024〜2025年はその典型と言える出来事が多く、もはや机上の話ではありません。モデルを定期的に再推定するのが望ましいです。
  • 相関した予測変数は解釈を難しくする:強い多重共線性があると、個々の係数推定が不安定になります。必ずしも予測精度が落ちるとは限りませんが、どの予測変数が効いているのか言いにくくなります。
  • 入力を増やしても予測は必ずしも良くならない:すべての候補予測変数を、ホールドアウトデータでベースラインと比較してください。インサンプルでは有益に見えても、サンプル外ではノイズを増やすだけの特徴もあります。
  • 季節性には季節項が必要:毎年12月にスパイクする月次売上のように一貫した季節パターンがあるなら、季節次数を持つSARIMAXが正解です。ARIMAXだけでは捉えられません。
  • 因果は確立されない:繰り返しますが、ARIMAXは予測の枠組みであり、因果推論の手法ではありません。追加の分析なしに、係数の符号を根拠に因果を主張すべきではありません。

まとめ

ARIMAXは、目的に真に影響する外部要因があり、予測時にそれらの将来値を与えられる場合にこそ力を発揮します。ARIMAの自然な拡張であり、置き換えではありません。系列が素直で、信頼できる予測変数がないなら、まずはARIMAから始めるのが通常は賢明です。変数を足すと前進した気になりますが、そうとは限りません。

ワークフローの要諦は次の4点に尽きます。

  1. 予測変数を正しく整列させること、
  2. 評価前にリーケージがないか確認すること、
  3. 真にホールドアウトされたデータで検証すること、そして
  4. 常に単純なベースラインと比較すること。

ナイーブ予測に辛うじて勝つ程度のARIMAXは、ナイーブ予測より優れてはいません。ただコストが高いだけです。

時系列の基礎をさらに深く学ぶには、当社の Time Series Analysis in Python コースで、ARIMA、定常性、診断を詳しく扱っています。statsmodelsについては、Introduction to Regression with statsmodels in Pythonコースが、モデル要約の解釈や残差チェックに役立つ統計的直感を養うのに適しています。


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chuganiは、東京でJPMorgan最年少のヘッジファンド・セールスデスク責任者としてキャリアをスタートし、その後Lehman Brothersで個人売上記録を樹立、さらに30か国に展開するエレクトロニクス流通事業を売上SG$1億を超える規模へと成長させたのち、データ分野へ転身しました。Duke大学で経済学を専攻し、NYC Data Science Academyを修了。MavenのHugo Bowne-Andersonによる「Building AI Applications」コースでは、100名超の応募者の中から3名の奨学生の一人に選出されました。現在は、DataCamp、KDnuggets、Machine Learning Mastery、Statologyにて統計からエージェント型AIまで幅広いテーマで執筆し、NYC Data Science Academyでは1,000回以上の1対1セッションを通じてデータ分野のプロフェッショナルをメンターしています。

 

FAQs

ARIMAXとARIMAの違いは何ですか?

ARIMAは目的系列の過去値と過去の予測誤差のみを用いて予測します。ARIMAXはこれを拡張し、気温・プロモーション・金利などの外部入力(外生変数)を取り入れます。外部要因が系列の変動を実際に駆動しており、その将来値を供給できるなら、ARIMAXは通常、ARIMA単独よりも良い予測をもたらします。

ARIMAXはSARIMAXとどう違いますか?

ARIMAXは外部変数を扱えますが、季節パターンは扱いません。SARIMAXはARIMAXに、季節AR・季節差分・季節MAの項を加え、繰り返し現れる季節構造がある系列に適した選択肢とします。Pythonのstatsmodelsでは、ARIMAXは通常SARIMAX()で季節次数を(0, 0, 0, 0)に設定して実装されます。その構成では、機能的には同一です。

ARIMAXで予測するには、外生変数の将来値を提供する必要がありますか?

はい——これは最も重要な実務上の制約の一つです。学習期間を超えて予測を生成する際、各外生変数について将来の各時点の値を必ず与える必要があります。プロモーションや休日の指標のような変数は通常簡単です。一方、気温や商品価格のような変数には、予測値や妥当な仮定が必要になり、追加の不確実性が生じます。

ARIMAXモデルのp、d、qはどう選べばよいですか?

(差分後の)目的系列のACFとPACFから始めましょう。PACFのラグ1に有意なスパイクがありACFが減衰するならAR(1)が、逆ならMA(1)が示唆されます。dは領域知識とADF検定で決めます。そのうえで、学習データ上でAICまたはBICにより、少数の(p, d, q)候補を比較します。この選定段階でテストセットを使うのは避け、最終評価のみに用いてください。

ARIMAXモデルにおける外生変数の係数は何を意味しますか?

係数は、自己回帰構造を考慮したうえで、その予測変数が1単位増加したときに目的系列の水準がどれだけ変化すると推定されるかを表します。statsmodelsではd=1でも同様で、差分は回帰式ではなく誤差過程に適用されます(ARIMA誤差を伴う回帰の定式化)。一部の他パッケージはトランスファー関数の定式化を用いており、その場合d=1なら係数は水準ではなく変化量への効果を表します。利用ツールのドキュメントを確認してください。また、予測変数のスケールが異なる、あるいは相互に相関していると解釈が難しくなるため、係数比較を重視するなら標準化を検討する価値があります。

外生予測変数の多重共線性はどう検出し、対処すべきですか?

当てはめ前に各予測変数についてVIF(分散拡大係数)を計算しましょう。10を超える値は問題のある共線性を示唆します。見つかった場合は、理論的根拠が最も薄い予測変数を除くか、相関する変数を一つの合成変数にまとめることを検討します。高い共線性は必ずしも予測精度を損なうとは限りませんが、個別の係数は不安定で解釈しづらくなります。

ARIMAXが本当に価値を生んでいるか、どう評価すべきですか?

常に単純なベースラインと比較してください。ナイーブ予測(前期値をそのまま使う)が良い出発点です。ホールドアウトしたテストデータでARIMAXがそれを上回らないなら、モデルは複雑さに見合う価値を生んでいません。指標はMAEとRMSEのどちらも妥当ですが、MAEのほうが関係者に説明しやすいことが多いです。比較は、パラメータ選定に一切使っていない適切なテストセットで行ってください。

ARIMAXではなくSARIMAXを使うべきなのはいつですか?

明確な季節パターンがある場合はSARIMAXを使いましょう。例えば、12月にピークがある月次売上や、月曜にスパイクする週次Webトラフィックなどです。SARIMAXは、ARIMAXにはない季節AR・季節差分・季節MAの要素を追加します。Pythonのstatsmodelsでは結局SARIMAX()でARIMAXを実装するため、実務上の論点は季節次数をゼロ以外に設定するかどうかです。ARIMAX適合後に、残差が季節ラグで有意な自己相関を示すなら、季節項を追加するサインです。

トピック
データサイエンス

DataCampで学ぶ

コース

Rで学ぶ予測入門

5時間
52.8K
Rで時系列予測を学び、ARIMAモデルや指数平滑法で将来を予測する方法を習得します。
詳しく見るコースを始める

無料アカウントを作成する

練習とトラックであなたの進捗を記録しましょう。

Googleで登録
続行すると、弊社の利用規約、プライバシーポリシーに同意し、データが米国に保存されることに同意したことになります。
もっと見る