본문으로 바로가기
데이터 사이언스

ARIMAX: 외생 변수를 활용한 시계열 예측 방법

ARIMAX가 외부 예측 변수로 ARIMA를 어떻게 확장하는지, 파라미터와 가정을 이해하고, statsmodels로 Python에서 예측 모델을 구축하세요.
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 모델에 외생 입력, 즉 대상 시계열 외부에서 온 예측 변수를 함께 받는 모델입니다. 대표적인 예로는 광고비, 기온, 프로모션 플래그, 금리가 있습니다.

일반 표기는 외생 회귀변수를 하나 이상 포함한 ARIMAX(p, d, q)입니다. p, d, q의 의미는 ARIMA와 동일합니다. 각각 자기회귀 차수, 차분 차수, 이동평균 차수입니다. "X"는 대상에 영향을 준다고 믿는 추가 열을 전달할 수 있음을 의미합니다. 한 가지 짚어둘 점: 일부 소프트웨어는 외부 변수를 직접 AR 항으로 취급하기보다 ARIMA 오차를 가진 회귀 모델 형태로 ARIMAX를 구현합니다. 수학적으로는 미묘한 차이지만 계수 해석에는 영향을 줍니다. statsmodels의 출력 해석에서 이 부분을 다시 살펴보겠습니다.

ARIMAX의 동작 원리

ARIMAX는 두 가지를 결합합니다. 시계열 자체의 기억과 외부 변수의 설명력을요.

AR, I, MA 구성 요소

AR(자기회귀) 구성 요소는 목표 시계열의 지연 값을 사용해 현재 값을 예측합니다. 지난달 매출이 높았다면 그 정보는 의미가 있습니다.

I(적분) 구성 요소는 추세나 단위근을 제거하기 위해 차분하여 정상성을 만듭니다.

MA(이동평균) 구성 요소는 과거 예측 오차를 이용해 모델이 체계적으로 범해 온 실수를 보정합니다.

이 세 요소를 함께 사용하면 일반적인 시계열을 움직이는 요인인 추세, 순환, 잔차의 자기상관을 상당 부분 처리할 수 있습니다.

외생 변수가 하는 역할

외생 변수는 시계열의 과거만으로는 알 수 없는 정보를 제공합니다. 매출 예측에서 과거 매출은 전형적 패턴을 알려줍니다. 하지만 가격 인하나 경쟁사의 진입은 새로운 정보입니다. 모델은 오차의 자기상관을 동시에 고려하면서 각 외부 예측 변수에 대한 계수를 추정합니다.

실무적으로는 이렇습니다. 대상 시계열이 과거 값만으로 잘 설명되고 신뢰할 만한 외부 예측 변수가 없다면, 기본 ARIMA면 충분합니다. 그러나 외부 요인이 작용하고, 그 예측 변수의 미래 값도 실제로 확보할 수 있다면, ARIMAX가 더 정확한 예측을 제공하는 경향이 있습니다.

ARIMA vs. ARIMAX vs. SARIMAX

SARIMAX는 SARIMA에 외생 변수를 더한 것입니다. 실제로 Python에서 ARIMAX 구현은 대부분 statsmodels의 SARIMAX()를 통해 이루어지며, 계절 차수는 0으로 설정합니다.

이는 편법이 아닙니다. 표준 접근입니다. SARIMAX는 시계열에 뚜렷한 계절 패턴이 있거나 외부 회귀 변수가 필요할 때 첫 선택지로 좋습니다. 둘 다 깔끔하게 다루기 때문입니다. 단, 모든 라이브러리에서 "ARIMAX"와 "SARIMAX"가 상호 대체 가능하진 않습니다. 일부 패키지에서는 계절 항이 없는 SARIMAX와 ARIMAX가 기능적으로 동일하지만, 다른 곳에서는 외생 변수가 가능도에 들어가는 방식이 다릅니다. 사용하는 도구의 문서를 확인하세요.

ARIMAX를 사용할 때

결국 핵심은 하나입니다. 대상에 영향을 미칠 법한 외부 예측 변수가 있고, 예측 시점에 그 미래 값을 확보할 수 있는가?

ARIMAX가 가치를 더하는 상황

좋은 후보로는 프로모션 플래그나 가격 변화를 포함한 매출 예측, 기온을 포함한 에너지 수요, 캠페인 집행비와 함께 보는 웹사이트 트래픽, 금리 데이터와 함께 보는 경제 지표 등이 있습니다. 각 경우에서 외부 변수는 시계열 자체로는 생성할 수 없는 정보를 제공합니다.

외부 예측 변수가 없거나, 신뢰하기 어렵거나, 샘플 밖 정확도를 개선하지 못한다면 기본 ARIMA로도 충분합니다. 신호 없이 잡음만 도입하는 예측 변수를 추가해도 도움이 되지 않습니다. 입력을 늘린다고 더 나은 예측이 보장되진 않습니다. 채택 전에는 반드시 홀드아웃 데이터로 제안된 예측 변수를 평가하세요.

인과관계에 대한 한마디

예측 변수와 대상 간의 관계가 있다고 해서 인과가 성립하는 것은 아닙니다. ARIMAX는 예측 프레임워크로 연관성을 추정합니다. 광고비와 매출이 12월에 함께 증가해 상관이 있다면 모델이 이를 포착할 수는 있지만, 광고가 증가의 원인이라고 말해주지는 않습니다. 이는 결과 예측을 넘어 의사결정을 위한 입력으로 예측을 사용할 때 중요한 구분입니다. 결과를 제시할 때 이 점을 분명히 하세요.

Python으로 ARIMAX 모델 구축하기

이제 구현 단계로 넘어가겠습니다.

재현 가능한 예시를 사용하겠습니다. 월별 아이스크림 판매량(판매 수량)을 대상으로, 외생 예측 변수로 기온(°C)과 프로모션 플래그를 사용합니다. 데이터는 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 추정에는 보통 스케일링이 필수는 아니지만, 예측 변수의 스케일 차이가 매우 클 때 수치적 안정성에 도움이 됩니다. 스케일링 여부는 판단에 따릅니다.

시계열과 예측 변수 점검

모델 파라미터를 선택하기 전에, 대상 시계열을 시각적으로 살펴보고 정상성 검정을 수행하세요. 표준적으로 확장 딕키-풀러(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와 무관하게 판매의 수준(level)에 대한 효과를 의미합니다. 일부 다른 패키지에서 쓰는 전달함수(transfer-function) 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가 보통 더 나은 출발점입니다. 변수를 추가하면 진전한 듯 느껴지지만, 그렇지 않을 때도 많습니다.

워크플로의 핵심은 다음 네 가지를 제대로 하는 것입니다.

  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의 최연소 헤지펀드 세일즈 데스크 책임자로 커리어를 시작했으며, 이후 리먼 브라더스에서 개인 판매 실적 기록을 세웠고, 이어서 30개국에 걸친 전자제품 유통 사업을 구축하여 매출을 SG$1억을 넘어 성장시킨 뒤 데이터 분야로 방향을 틀었습니다. 듀크대학교 경제학 졸업생이자 NYC Data Science Academy 출신인 그는 Maven의 Hugo Bowne-Anderson가 진행한 Building AI Applications 과정에서 100명+ 지원자 중 세 명뿐인 장학생 가운데 한 명이었습니다. 현재는 DataCamp, KDnuggets, Machine Learning Mastery, Statology에 통계부터 에이전트형 AI까지 폭넓은 주제로 글을 기고하고 있으며, NYC Data Science Academy에서 데이터 전문가들을 멘토링하고 있습니다. 지금까지 1,000회가 넘는 일대일 멘토링 세션을 진행했습니다.

 

FAQs

ARIMAX와 ARIMA의 차이는 무엇인가요?

ARIMA는 대상 시계열의 과거 값과 과거 예측 오차만으로 예측합니다. ARIMAX는 여기에 기온, 프로모션, 금리와 같은 외생 변수—즉 외부 입력—를 통합해 확장합니다. 외부 요인이 시계열 변동을 실제로 주도하고, 그 미래 값을 제공할 수 있다면, ARIMAX가 단일 ARIMA보다 보통 더 나은 예측을 제공합니다.

ARIMAX는 SARIMAX와 어떻게 다른가요?

ARIMAX는 외부 변수를 처리하지만 계절 패턴은 다루지 않습니다. SARIMAX는 ARIMAX에 계절 AR, 차분, MA 항을 추가하여 반복적인 계절 구조가 있는 시계열에 적합합니다. Python의 statsmodels에서는 계절 차수를 (0, 0, 0, 0)으로 설정한 SARIMAX()로 ARIMAX를 구현하는 것이 일반적입니다. 그 구성에서는 기능적으로 동일한 모델입니다.

ARIMAX로 예측하려면 외생 변수의 미래 값을 제공해야 하나요?

예—가장 중요한 실무 제약 중 하나입니다. 훈련 기간을 넘어 예측을 생성할 때는 각 외생 변수의 값을 모든 미래 시점에 대해 제공해야 합니다. 프로모션 플래그나 공휴일 지표는 보통 간단합니다. 반면 기온이나 원자재 가격 같은 변수는 예측값이나 합리적 가정이 필요해, 추가적인 불확실성을 야기합니다.

ARIMAX 모델의 p, d, q는 어떻게 선택하나요?

(차분된) 대상 시계열의 ACF와 PACF 플롯부터 살펴보세요. PACF의 래그 1에서 유의한 스파이크와 감쇠하는 ACF는 보통 AR(1)을, 반대 패턴은 MA(1)을 시사합니다. d는 도메인 지식과 ADF 검정 결과로 결정하세요. 그런 다음 학습 데이터에서 AIC나 BIC로 소수의 (p, d, q) 후보를 비교합니다. 이 단계에서 테스트 세트를 사용하지 마세요—최종 평가에만 사용해야 합니다.

ARIMAX에서 외생 변수의 계수는 무엇을 의미하나요?

계수는 자기회귀 구조를 고려한 후, 해당 예측 변수가 1단위 증가할 때 대상 시계열 수준(level)의 추정 변화량을 의미합니다. statsmodels에서는 d=1이어도 이 해석이 유지됩니다. 차분이 회귀식이 아니라 오차 과정에 적용되는(ARIMA 오차를 가진 회귀) 구성 때문입니다. 일부 다른 패키지의 전달함수 구성에서는 d=1일 때 계수가 수준이 아닌 변화량에 대한 효과를 반영하므로 도구 문서를 확인하세요. 또한 예측 변수의 스케일이 다르거나 서로 상관되어 있으면 해석이 까다로울 수 있으니, 계수 비교가 중요하다면 표준화를 고려하세요.

외생 예측 변수의 다중공선성은 어떻게 탐지하고 대응하나요?

적합 전에 각 예측 변수의 VIF(분산팽창계수)를 계산하세요. 10을 넘으면 문제가 될 수 있는 공선성을 시사합니다. 그런 경우 이론적으로 덜 타당한 변수를 제거하거나, 상관된 변수를 하나의 합성 변수로 결합하세요. 높은 공선성은 예측 정확도를 반드시 해치진 않지만, 개별 계수를 불안정하고 해석하기 어렵게 만듭니다.

ARIMAX가 실제로 가치를 더하는지 어떻게 평가하나요?

항상 단순 기준과 비교하세요—직전 기간 값을 사용하는 나이브 예측이 좋은 시작점입니다. 홀드아웃 테스트 데이터에서 ARIMAX가 이를 이기지 못한다면, 모델의 복잡성이 설득력을 잃습니다. MAE와 RMSE 모두 합리적인 지표이며, MAE는 이해관계자에게 설명하기 더 쉽습니다. 파라미터 선택에 사용되지 않은 적절한 테스트 세트에서 비교를 수행하세요.

ARIMAX 대신 SARIMAX를 써야 하는 때는 언제인가요?

일관된 계절 패턴이 보일 때 SARIMAX를 사용하세요—12월에 정점을 찍는 월별 매출, 월요일 스파이크가 있는 주간 트래픽 등. SARIMAX는 ARIMAX에 없는 계절 AR, 차분, MA 성분을 추가합니다. 어차피 Python의 statsmodels는 SARIMAX()로 ARIMAX를 구현하므로, 실무적으로는 계절 차수를 0이 아닌 값으로 둘지의 문제입니다. ARIMAX 적합 후 잔차가 계절 래그에서 유의한 자기상관을 보인다면, 계절 항을 추가하라는 신호입니다.

주제
데이터 사이언스

DataCamp와 함께 배우세요

강의

R로 배우는 시계열 예측

5시간
52.8K
R로 시계열 예측을 학습합니다. ARIMA와 지수평활 등 기법으로 미래를 예측하는 방법을 익히세요.
자세히 보기강의 시작

무료 계정 만들기

실습 문제하고 트랙하세요.

Google로 계속하기
계속 진행하시면 당사의 이용약관 및 개인정보처리방침에 동의하고 및 귀하의 데이터가 미국에 저장되는 것에 동의하게 됩니다.
더 보기