SARIMA (Seasonal AutoRegressive Integrated Moving Average)
1. 개요
SARIMA는 시계열 데이터의 추세(Trend)뿐만 아니라 주기적으로 반복되는 계절성(Seasonality) 패턴을 동시에 모델링하기 위해 설계된 통계적 예측 모델이다.
기존의 [ARIMA] 모델은 데이터의 [정상성]을 제거하여 예측하는 데 탁월하지만, 특정 주기(예: 매년 12월의 매출 상승)로 발생하는 계절적 변동을 처리하는 기능이 없다. SARIMA는 ARIMA 모델에 계절성 성분을 추가하여, 과거의 동일한 계절 시점의 데이터가 현재에 미치는 영향을 수학적으로 반영함으로써 계절성 데이터에 대한 예측 정확도를 높이는 것을 목적으로 한다.
2. 모델의 구성 요소와 원리
SARIMA 모델은 비계절성 파라미터와 계절성 파라미터의 조합으로 정의되며, 일반적으로 $\text{SARIMA}(p, d, q)(P, D, Q)_s$ 형태로 표기한다.
2.1 파라미터 상세 정의
- 비계절성 파라미터 $(p, d, q)$: 단기적인 시계열 패턴을 제어한다.
- 계절성 파라미터 $(P, D, Q)_s$: 특정 주기 $s$를 기준으로 반복되는 장기적 패턴을 제어한다.
| 구분 |
파라미터 |
명칭 |
역할 및 의미 |
| 비계절성 |
$p$ |
AR (AutoRegressive) |
자기상관성: 이전 시점의 값이 현재 값에 미치는 영향 (자기회귀 차수) |
|
$d$ |
I (Integrated) |
정상성을 확보하기 위해 수행한 일반 차분 횟수 |
|
$q$ |
MA (Moving Average) |
충격(Shock)의 전이: 이전 예측 오차가 현재 값에 미치는 영향 (이동평균 차수) |
| 계절성 |
$P$ |
Seasonal AR |
이전 계절 주기($s$ 전)의 값이 현재 값에 미치는 자기상관성 |
|
$D$ |
Seasonal I |
계절성 제거를 위해 수행한 계절 차분 횟수 |
|
$Q$ |
Seasonal MA |
이전 계절 주기($s$ 전)의 예측 오차가 현재 값에 미치는 영향 |
| 주기 |
$s$ |
Seasonality |
계절성 주기 (예: 월별 데이터 $\rightarrow 12$, 분기별 $\rightarrow 4$) |
2.2 수학적 수식
SARIMA 모델은 백색잡음(White Noise) $\epsilon_t$를 이용하여 다음과 같은 일반식으로 표현된다.
$$\Phi_P(B^s) \phi_p(B) \nabla^d \nabla_s^D y_t = \Theta_Q(B^s) \theta_q(B) \epsilon_t$$
- $\nabla^d$: 일반 차분 연산자 $(1-B)^d$
- $\nabla_s^D$: 계절 차분 연산자 $(1-B^s)^D$
- $\phi_p(B)$: 비계절성 AR 다항식 $\phi_p(B) = 1 - \phi_1 B - \dots - \phi_p B^p$
- $\Phi_P(B^s)$: 계절성 AR 다항식 $\Phi_P(B^s) = 1 - \Phi_1 B^s - \dots - \Phi_P B^{Ps}$
- $\theta_q(B)$: 비계절성 MA 다항식 $\theta_q(B) = 1 + \theta_1 B + \dots + \theta_q B^q$
- $\Theta_Q(B^s)$: 계절성 MA 다항식 $\Theta_Q(B^s) = 1 + \Theta_1 B^s + \dots + \Theta_Q B^{Qs}$
- $B$: 후진 연산자(Backshift Operator), $B y_t = y_{t-1}$
3. 모델 구축 프로세스
3.1 데이터 탐색 및 정상성 확인
시계열 분석의 전제 조건은 데이터가 [정상성]을 갖는 것이다. 정상성이란 시간의 흐름에 따라 평균과 분산이 일정하고 자기공분산이 시점과 무관하게 유지되는 상태를 말한다.
- [ADF 검정]: 데이터에 단위근(Unit Root)이 존재하는지 확인하는 통계적 검정 방법이다.
- 귀무가설($H_0$): 데이터에 단위근이 존재한다 (비정상 시계열이다).
- 대립가설($H_1$): 데이터에 단위근이 없다 (정상 시계열이다).
- 판단: $p\text{-value} < 0.05$일 때 귀무가설을 기각하며, 해당 데이터를 정상 시계열로 판단한다.
3.2 차분(Differencing) 및 주기($s$) 결정
정상성이 확보되지 않은 경우 차분을 통해 데이터를 변환한다. 실제 SARIMA 모델링에서는 일반적으로 일반 차분을 먼저 수행한 후 계절 차분을 수행하여 추세와 계절성을 순차적으로 제거한다.
- 일반 차분($d$): $y'_t = y_t - y_{t-1}$ (추세 제거)
- 계절 차분($D$): $y''_t = y'_t - y'_{t-s}$ (계절성 제거)
계절성 주기($s$) 결정 방법:
- 도메인 지식 활용: 데이터 수집 주기(월간 $\rightarrow 12$, 주간 $\rightarrow 7$)를 통해 결정한다.
- 시각화 분석: 시계열 그래프에서 반복되는 피크(Peak)와 밸리(Valley) 사이의 간격을 측정한다.
- ACF(Autocorrelation Function) 분석: 자기상관함수 그래프에서 특정 시차(Lag)마다 유의미한 상관관계가 반복적으로 나타나는 지점을 $s$로 설정한다.
3.3 ACF/PACF 분석 및 모델 선택
- ACF (자기상관함수): 시차 $k$에 따른 자기상관성을 측정하며, 주로 MA($q$) 차수를 결정하는 데 사용된다.
- PACF (편자기상관함수): 다른 시점의 영향을 제거한 순수한 두 시점 간의 상관성을 측정하며, 주로 AR($p$) 차수를 결정하는 데 사용된다.
차수 결정 기준:
- 절단점(Cut-off): 상관계수가 갑자기 0으로 떨어지는 지점
- 점진적 감소(Tailing-off): 상관계수가 서서히 감소하는 형태
| 모델 |
ACF |
PACF |
| AR($p$) |
점진적 감소 (Tailing-off) |
시차 $p$ 이후 절단 (Cut-off) |
| MA($q$) |
시차 $q$ 이후 절단 (Cut-off) |
점진적 감소 (Tailing-off) |
| ARMA($p, q$) |
시차 $q$ 이후 점진적 감소 |
시차 $p$ 이후 점진적 감소 |
4. 모델 최적화 및 평가
여러 파라미터 조합 중 최적의 모델을 선택하기 위해 모델의 복잡도와 적합도를 동시에 고려하는 지표를 사용한다.
- [AIC]: 모델의 로그 우도(Likelihood)에 파라미터 수를 페널티로 부여한다. 값이 낮을수록 효율적인 모델이다.
- [BIC]: AIC보다 파라미터 수에 더 강한 페널티를 부여하여 과적합(Overfitting)을 더 엄격하게 방지한다.
4.2 예측 성능 평가 지표
- RMSE (Root Mean Squared Error): 예측값과 실제값 차이의 제곱 평균의 제곱근으로, 큰 오차에 민감하게 반응한다.
- MAPE (Mean Absolute Percentage Error): 오차를 비율로 나타내어 데이터의 스케일에 상관없이 직관적인 성능 파악이 가능하다.
5. 구현 예제 및 활용
Python의 <a href="/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/statsmodels" class="wiki-link wiki-link-missing">statsmodels</a> 라이브러리를 사용하여 SARIMA 모델을 구현하는 일반적인 흐름은 다음과 같다.
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
# 1. 데이터 로드 (예시: 'date' 인덱스를 가진 'value' 컬럼 데이터)
df = pd.read_csv('time_series_data.csv', index_col='date', parse_dates=True)
# 2. 정상성 확인 (ADF 검정)
result = adfuller(df['value'])
print(f'ADF Statistic: {result[0]}, p-value: {result[1]}')
# 3. SARIMA 모델 정의 및 학습
# order=(p, d, q), seasonal_order=(P, D, Q, s)
model = SARIMAX(df['value'],
order=(1, 1, 1), # (p, d, q)
seasonal_order=(1, 1, 1, 12)) # (P, D, Q, s)
model_fit = model.fit()
# 4. 예측 수행
# steps=12: 향후 12개 시점(예: 1년)을 예측
forecast = model_fit.get_forecast(steps=12)
forecast_df = forecast.summary_frame()
# 5. 시각화
plt.figure(figsize=(10, 5))
plt.plot(df['value'], label='Actual')
plt.plot(forecast_df['mean'], label='Forecast', color='red')
# 신뢰구간(Confidence Interval) 표시
plt.fill_between(forecast_df.index,
forecast_df['mean_ci_lower'],
forecast_df['mean_ci_upper'],
color='pink', alpha=0.3)
plt.title('SARIMA Time Series Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.show()
SARIMA 모델의 확장판인 SARIMAX는 외생 변수(Exogenous variables)를 추가로 고려할 수 있는 모델이다.
| 비교 항목 |
SARIMA |
SARIMAX |
| 입력 데이터 |
타겟 시계열 데이터만 사용 |
타겟 데이터 + 외부 영향 변수($X$) |
| 분석 관점 |
과거의 패턴이 미래를 결정함 |
과거 패턴 + 외부 요인이 미래를 결정함 |
| 활용 예시 |
단순 계절성 매출 예측 |
기온, 공휴일 여부 등을 포함한 전력 수요 예측 |
| 수식적 차이 |
$\text{SARIMA}(p,d,q)(P,D,Q)_s$ |
$\text{SARIMA} + \beta X$ (회귀 성분 추가) |
7. 한계점 및 발전 방향
7.1 한계점
- 계산 복잡도: 파라미터 조합이 많아질수록 최적의 조합을 찾는 그리드 서치(Grid Search) 시간이 기하급수적으로 증가한다.
- 단일 계절성: SARIMA는 하나의 주기($s$)만 처리할 수 있다. 예를 들어, '주 단위'와 '연 단위' 계절성이 동시에 존재하는 데이터(Multi-seasonality)를 처리하기 어렵다.
- 선형성: 데이터의 비선형적인 복잡한 패턴을 학습하는 데 한계가 있다.
7.2 대안 모델
- Prophet: Facebook에서 개발한 모델로, 다중 계절성과 휴일 효과를 쉽게 처리하며 파라미터 튜닝 부담이 적다.
- LSTM (Long Short-Term Memory): 딥러닝 기반의 RNN 구조로, 매우 길고 복잡한 비선형 시퀀스 데이터를 학습하는 데 유리하다.
- Exponential Smoothing (ETS): 오차, 추세, 계절성을 지수적으로 가중 평균하여 예측하는 모델로, 데이터셋이 작을 때 효율적이다.
# SARIMA (Seasonal AutoRegressive Integrated Moving Average)
## 1. 개요
**SARIMA**는 시계열 데이터의 추세(Trend)뿐만 아니라 주기적으로 반복되는 계절성(Seasonality) 패턴을 동시에 모델링하기 위해 설계된 통계적 예측 모델이다.
기존의 [[ARIMA]](AutoRegressive Integrated Moving Average) 모델은 데이터의 [[정상성]](Non-stationarity)을 제거하여 예측하는 데 탁월하지만, 특정 주기(예: 매년 12월의 매출 상승)로 발생하는 계절적 변동을 처리하는 기능이 없다. SARIMA는 ARIMA 모델에 계절성 성분을 추가하여, 과거의 동일한 계절 시점의 데이터가 현재에 미치는 영향을 수학적으로 반영함으로써 계절성 데이터에 대한 예측 정확도를 높이는 것을 목적으로 한다.
---
## 2. 모델의 구성 요소와 원리
SARIMA 모델은 비계절성 파라미터와 계절성 파라미터의 조합으로 정의되며, 일반적으로 $\text{SARIMA}(p, d, q)(P, D, Q)_s$ 형태로 표기한다.
### 2.1 파라미터 상세 정의
- **비계절성 파라미터 $(p, d, q)$**: 단기적인 시계열 패턴을 제어한다.
- **계절성 파라미터 $(P, D, Q)_s$**: 특정 주기 $s$를 기준으로 반복되는 장기적 패턴을 제어한다.
| 구분 | 파라미터 | 명칭 | 역할 및 의미 |
| :--- | :---: | :--- | :--- |
| **비계절성** | $p$ | AR (AutoRegressive) | **자기상관성**: 이전 시점의 값이 현재 값에 미치는 영향 (자기회귀 차수) |
| | $d$ | I (Integrated) | 정상성을 확보하기 위해 수행한 일반 차분 횟수 |
| | $q$ | MA (Moving Average) | **충격(Shock)의 전이**: 이전 예측 오차가 현재 값에 미치는 영향 (이동평균 차수) |
| **계절성** | $P$ | Seasonal AR | 이전 계절 주기($s$ 전)의 값이 현재 값에 미치는 자기상관성 |
| | $D$ | Seasonal I | 계절성 제거를 위해 수행한 계절 차분 횟수 |
| | $Q$ | Seasonal MA | 이전 계절 주기($s$ 전)의 예측 오차가 현재 값에 미치는 영향 |
| **주기** | $s$ | Seasonality | 계절성 주기 (예: 월별 데이터 $\rightarrow 12$, 분기별 $\rightarrow 4$) |
### 2.2 수학적 수식
SARIMA 모델은 백색잡음(White Noise) $\epsilon_t$를 이용하여 다음과 같은 일반식으로 표현된다.
$$\Phi_P(B^s) \phi_p(B) \nabla^d \nabla_s^D y_t = \Theta_Q(B^s) \theta_q(B) \epsilon_t$$
- $\nabla^d$: 일반 차분 연산자 $(1-B)^d$
- $\nabla_s^D$: 계절 차분 연산자 $(1-B^s)^D$
- $\phi_p(B)$: 비계절성 AR 다항식 $\phi_p(B) = 1 - \phi_1 B - \dots - \phi_p B^p$
- $\Phi_P(B^s)$: 계절성 AR 다항식 $\Phi_P(B^s) = 1 - \Phi_1 B^s - \dots - \Phi_P B^{Ps}$
- $\theta_q(B)$: 비계절성 MA 다항식 $\theta_q(B) = 1 + \theta_1 B + \dots + \theta_q B^q$
- $\Theta_Q(B^s)$: 계절성 MA 다항식 $\Theta_Q(B^s) = 1 + \Theta_1 B^s + \dots + \Theta_Q B^{Qs}$
- $B$: 후진 연산자(Backshift Operator), $B y_t = y_{t-1}$
---
## 3. 모델 구축 프로세스
### 3.1 데이터 탐색 및 정상성 확인
시계열 분석의 전제 조건은 데이터가 **[[정상성]](Stationarity)**을 갖는 것이다. 정상성이란 시간의 흐름에 따라 평균과 분산이 일정하고 자기공분산이 시점과 무관하게 유지되는 상태를 말한다.
- **[[ADF 검정]](Augmented Dickey-Fuller Test)**: 데이터에 단위근(Unit Root)이 존재하는지 확인하는 통계적 검정 방법이다.
- **귀무가설($H_0$)**: 데이터에 단위근이 존재한다 (비정상 시계열이다).
- **대립가설($H_1$)**: 데이터에 단위근이 없다 (정상 시계열이다).
- **판단**: $p\text{-value} < 0.05$일 때 귀무가설을 기각하며, 해당 데이터를 정상 시계열로 판단한다.
### 3.2 차분(Differencing) 및 주기($s$) 결정
정상성이 확보되지 않은 경우 차분을 통해 데이터를 변환한다. 실제 SARIMA 모델링에서는 일반적으로 **일반 차분을 먼저 수행한 후 계절 차분을 수행**하여 추세와 계절성을 순차적으로 제거한다.
1. **일반 차분($d$)**: $y'_t = y_t - y_{t-1}$ (추세 제거)
2. **계절 차분($D$)**: $y''_t = y'_t - y'_{t-s}$ (계절성 제거)
**계절성 주기($s$) 결정 방법**:
- **도메인 지식 활용**: 데이터 수집 주기(월간 $\rightarrow 12$, 주간 $\rightarrow 7$)를 통해 결정한다.
- **시각화 분석**: 시계열 그래프에서 반복되는 피크(Peak)와 밸리(Valley) 사이의 간격을 측정한다.
- **ACF(Autocorrelation Function) 분석**: 자기상관함수 그래프에서 특정 시차(Lag)마다 유의미한 상관관계가 반복적으로 나타나는 지점을 $s$로 설정한다.
### 3.3 ACF/PACF 분석 및 모델 선택
- **ACF (자기상관함수)**: 시차 $k$에 따른 자기상관성을 측정하며, 주로 MA($q$) 차수를 결정하는 데 사용된다.
- **PACF (편자기상관함수)**: 다른 시점의 영향을 제거한 순수한 두 시점 간의 상관성을 측정하며, 주로 AR($p$) 차수를 결정하는 데 사용된다.
**차수 결정 기준:**
- **절단점(Cut-off)**: 상관계수가 갑자기 0으로 떨어지는 지점
- **점진적 감소(Tailing-off)**: 상관계수가 서서히 감소하는 형태
| 모델 | ACF | PACF |
| :--- | :--- | :--- |
| **AR($p$)** | 점진적 감소 (Tailing-off) | 시차 $p$ 이후 절단 (Cut-off) |
| **MA($q$)** | 시차 $q$ 이후 절단 (Cut-off) | 점진적 감소 (Tailing-off) |
| **ARMA($p, q$)** | 시차 $q$ 이후 점진적 감소 | 시차 $p$ 이후 점진적 감소 |
---
## 4. 모델 최적화 및 평가
### 4.1 정보 기준 (Information Criteria)
여러 파라미터 조합 중 최적의 모델을 선택하기 위해 모델의 복잡도와 적합도를 동시에 고려하는 지표를 사용한다.
- **[[AIC]](Akaike Information Criterion)**: 모델의 로그 우도(Likelihood)에 파라미터 수를 페널티로 부여한다. 값이 낮을수록 효율적인 모델이다.
- **[[BIC]](Bayesian Information Criterion)**: AIC보다 파라미터 수에 더 강한 페널티를 부여하여 과적합(Overfitting)을 더 엄격하게 방지한다.
### 4.2 예측 성능 평가 지표
- **RMSE (Root Mean Squared Error)**: 예측값과 실제값 차이의 제곱 평균의 제곱근으로, 큰 오차에 민감하게 반응한다.
- **MAPE (Mean Absolute Percentage Error)**: 오차를 비율로 나타내어 데이터의 스케일에 상관없이 직관적인 성능 파악이 가능하다.
---
## 5. 구현 예제 및 활용
Python의 `statsmodels` 라이브러리를 사용하여 SARIMA 모델을 구현하는 일반적인 흐름은 다음과 같다.
```python
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
# 1. 데이터 로드 (예시: 'date' 인덱스를 가진 'value' 컬럼 데이터)
df = pd.read_csv('time_series_data.csv', index_col='date', parse_dates=True)
# 2. 정상성 확인 (ADF 검정)
result = adfuller(df['value'])
print(f'ADF Statistic: {result[0]}, p-value: {result[1]}')
# 3. SARIMA 모델 정의 및 학습
# order=(p, d, q), seasonal_order=(P, D, Q, s)
model = SARIMAX(df['value'],
order=(1, 1, 1), # (p, d, q)
seasonal_order=(1, 1, 1, 12)) # (P, D, Q, s)
model_fit = model.fit()
# 4. 예측 수행
# steps=12: 향후 12개 시점(예: 1년)을 예측
forecast = model_fit.get_forecast(steps=12)
forecast_df = forecast.summary_frame()
# 5. 시각화
plt.figure(figsize=(10, 5))
plt.plot(df['value'], label='Actual')
plt.plot(forecast_df['mean'], label='Forecast', color='red')
# 신뢰구간(Confidence Interval) 표시
plt.fill_between(forecast_df.index,
forecast_df['mean_ci_lower'],
forecast_df['mean_ci_upper'],
color='pink', alpha=0.3)
plt.title('SARIMA Time Series Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.show()
```
---
## 6. SARIMA vs SARIMAX
SARIMA 모델의 확장판인 **SARIMAX**는 외생 변수(Exogenous variables)를 추가로 고려할 수 있는 모델이다.
| 비교 항목 | SARIMA | SARIMAX |
| :--- | :--- | :--- |
| **입력 데이터** | 타겟 시계열 데이터만 사용 | 타겟 데이터 + 외부 영향 변수($X$) |
| **분석 관점** | 과거의 패턴이 미래를 결정함 | 과거 패턴 + 외부 요인이 미래를 결정함 |
| **활용 예시** | 단순 계절성 매출 예측 | 기온, 공휴일 여부 등을 포함한 전력 수요 예측 |
| **수식적 차이** | $\text{SARIMA}(p,d,q)(P,D,Q)_s$ | $\text{SARIMA} + \beta X$ (회귀 성분 추가) |
---
## 7. 한계점 및 발전 방향
### 7.1 한계점
- **계산 복잡도**: 파라미터 조합이 많아질수록 최적의 조합을 찾는 그리드 서치(Grid Search) 시간이 기하급수적으로 증가한다.
- **단일 계절성**: SARIMA는 하나의 주기($s$)만 처리할 수 있다. 예를 들어, '주 단위'와 '연 단위' 계절성이 동시에 존재하는 데이터(Multi-seasonality)를 처리하기 어렵다.
- **선형성**: 데이터의 비선형적인 복잡한 패턴을 학습하는 데 한계가 있다.
### 7.2 대안 모델
- **Prophet**: Facebook에서 개발한 모델로, 다중 계절성과 휴일 효과를 쉽게 처리하며 파라미터 튜닝 부담이 적다.
- **LSTM (Long Short-Term Memory)**: 딥러닝 기반의 RNN 구조로, 매우 길고 복잡한 비선형 시퀀스 데이터를 학습하는 데 유리하다.
- **Exponential Smoothing (ETS)**: 오차, 추세, 계절성을 지수적으로 가중 평균하여 예측하는 모델로, 데이터셋이 작을 때 효율적이다.