시계열 데이터 분석은 데이터 사이언스의 중요한 영역 중 하나이며, 그 중에서도 계절성을 고려한 시계열 분석은 매우 중요합니다.
이번 포스트에서는 계절성 자기회귀 통합 이동 평균 모델(SARIMA)에 대해 자세히 알아보고자 한다.
SARIMA 모델의 기본 개념
계절성 자기회귀 통합 이동 평균 모델(SARIMA, Seasonal Autoregressive Integrated Moving Average Model)은 복잡한 시계열 데이터, 특히 계절적 변동성을 가진 데이터를 분석하는 데 사용되는 고급 통계적 방법론이다. SARIMA 모델은 ARIMA 모델을 확장하여 계절성 요소를 포함하고 있으며, 계절적 패턴을 보이는 시계열 데이터의 예측에 더욱 적합하게 설계되었다.
SARIMA 모델의 구성 요소
SARIMA 모델은 다음과 같은 구성 요소로 이루어져 있다
- 자기회귀(AR, Autoregressive) 부분: 이 부분은 시계열 데이터의 현재 값이 과거의 여러 값들에 의존한다는 개념을 나타낸다. 이는 “과거의 정보가 미래를 예측하는 데 도움이 된다”는 아이디어에 근거한다.
- 차분(Integrated) 부분: 시계열 데이터가 비정상성(non-stationary)을 보일 경우, 일정한 차수의 차분을 통해 데이터를 정상성(stationary)으로 변환한다. 이 과정은 시계열의 추세나 계절성을 제거하는 데 도움이 된다.
- 이동 평균(MA, Moving Average) 부분: 이 부분은 시계열 데이터의 현재 값이 과거의 예측 오차들에 의존한다는 개념을 나타낸다. 이는 “과거의 오차가 미래 값을 예측하는 데 영향을 준다”는 아이디어에 기반한다.
- 계절성(Seasonality) 부분: 이 부분은 기본 ARIMA 모델에 계절적 요소를 추가한다. 계절성 차분과 계절성 AR, MA 요소를 포함하여 계절적 변동성을 모델링한다.
수학적 표현
SARIMA 모델은 일반적으로 SARIMA(p, d, q)(P, D, Q)[S]로 표현됩니다.
- p,d,q는 비계절성 AR, 차분, MA 구성요소의 차수이며,
- P,D,Q는 계절성 AR, 차분, MA 구성요소의 차수이다.
- S는 계절 주기를 나타낸다.
수식은 다음과 같이 구성된다
여기서 은 지연 연산자(backshift operator), 는 모델 계수, 는 오차 항이다.
SARIMA 모델의 특징
- 계절성 고려: SARIMA 모델은 계절성 요인을 포함하여 더 정확한 예측을 제공한다.
- 유연성: 다양한 시계열 데이터 패턴에 적용 가능하다.
- 장기 예측: 장기적인 예측에 효과적이다.
SARIMA 모델의 활용
- 경제 및 금융 데이터 분석: 계절성이 뚜렷한 경제 지표나 주식 가격 예측에 사용된다.
- 기상학: 계절별 기상 변화 예측에 활용된다.
- 수요 예측: 소매업에서 계절별 판매량 예측에 사용될 수 있다.
Python 구현 예제
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_squared_error
# 가상 데이터 생성
data = np.sin(np.linspace(0, 20, 120)) * 10 + np.random.normal(size=120) * 2
# 데이터를 pandas Series로 변환
ts = pd.Series(data)
# 학습 데이터와 테스트 데이터로 분리
train, test = ts[:80], ts[80:]
# SARIMA 모델 피팅
model = SARIMAX(train, order=(5, 2, 5), seasonal_order=(8, 1, 8, 6))
model_fitted = model.fit()
# 예측
predictions = model_fitted.predict(start=len(train), end=len(train) + len(test) - 1, typ='levels')
# 테스트 데이터와 예측 결과를 시각화
plt.figure(figsize=(10, 5))
plt.plot(train, label='Train')
plt.plot(test.index, test, label='Test', color='gray')
plt.plot(test.index, predictions, label='Predicted', color='red')
plt.title('SARIMA Model')
plt.legend()
plt.show()
# 모델의 성능 평가
mse = mean_squared_error(test, predictions)
mse
order=(p, d, q):
- p(자기회귀 부분의 차수, AR): 이는 현재 시계열 값이 과거 p개의 시계열 값에 얼마나 의존하는지 나타낸다. 높은 p 값은 과거 값들이 현재 값에 더 많은 영향을 미친다.
- d(차분 차수, I): 시계열 데이터가 비정상적(non-stationary)일 경우, 이를 정상적인(stationary) 형태로 만들기 위해 수행되는 차분(differencing)의 횟수이다. 이 값은 일반적으로 데이터의 계절성(seasonality)이나 추세(trend)를 제거하기 위해 사용된다.
- q(이동 평균 부분의 차수, MA): 현재 시계열 값이 과거 q개의 예측 오류 항에 얼마나 의존하는지 나타냅니다. q 값이 높으면 과거의 예측 오류가 현재 값에 큰 영향을 준다.
seasonal_order=(P, D, Q, S):
- P(계절성 자기회귀 부분의 차수, Seasonal AR): 계절성 요소를 고려하는 자기회귀 부분의 차수로 p와 같이 과거 계절성 데이터가 현재 값에 미치는 영향의 정도를 나타낸다.
- D(계절성 차분 차수, Seasonal I): 계절성 요소를 고려하는 차분의 횟수로 계절성 패턴을 제거하기 위해 사용된다.
- Q(계절성 이동 평균 부분의 차수, Seasonal MA): 계절성 요소를 고려하는 이동 평균 부분의 차수이다. 여기서도 q와 같이 과거의 계절성 예측 오류가 현재 값에 미치는 영향의 정도를 나타낸다.
- S(계절 주기의 길이): 계절성 패턴이 반복되는 시간 간격을 나타낸다. 예를 들어, 월별 데이터에서 연간 계절성 패턴을 모델링하고자 할 경우 S=12로 설정한다.