지수 평활법
IT 위키
더 많은 작업
- Exponential Smoothing; 지수평활법
- 과거 관측값에 최근일수록 큰 가중치를 주고, 그 가중치를 지수적으로 줄여 가며 평균을 내어 미래 값을 예측하는 시계열 분석 기법
단순 이동평균이 최근 n개 값에 같은 가중치를 주는 데 비해, 지수 평활법은 모든 과거 값을 쓰되 가중치가 α, α(1 − α), α(1 − α)2, …처럼 기하급수적으로 줄어든다. 계산이 간단하고 갱신이 빠르며, 수준(level)·추세(trend)·계절성(seasonality)을 차례로 더해 단순 지수평활 → Holt 선형 추세 → Holt-Winters 계절 모형으로 확장된다. 추세 없이 수준만 다루는 단순 지수평활은 지수 이동 평균과 같은 원리이다.
아래에서 ℓt는 수준, bt는 추세(기울기), st는 계절 요인, m은 계절 주기(월별 자료면 12), h는 예측 시차이다. 수식은 R HoltWinters() 문서의 표기를 따랐다.
단순 지수평활(SES): 추세와 계절성이 없는 자료에 쓴다. 예측값은 모든 h에 대해 평평하다.
Holt 선형 추세(이중 지수평활): 수준에 추세 식을 더한다.
Holt-Winters 가법 모형(삼중 지수평활): 계절 변동의 폭이 수준과 상관없이 일정할 때 쓴다.
Holt-Winters 승법 모형: 수준이 커질수록 계절 변동의 폭도 비례해 커질 때 쓴다. 빼기 대신 나누기, 더하기 대신 곱하기를 쓴다. 자료가 0이나 음수이면 쓸 수 없다.
- α(수준), β(추세), γ(계절)는 모두 0과 1 사이 값이다.
- 1에 가까우면 최근 관측값을 크게 반영해 변화에 빨리 반응하지만 잡음에도 흔들린다. 0에 가까우면 과거를 오래 기억해 매끄럽지만 변화에 늦게 반응한다.
- γ가 0이면 계절 패턴을 처음 추정한 값 그대로 고정해 쓴다는 뜻이다.
- 보통 한 단계 앞 예측 오차 제곱합을 최소화하거나 최대우도로 추정한다. 초기값(ℓ0, b0, s)도 함께 추정하거나 앞부분 자료로 정한다.
| 모형 | 추세 | 계절성 | 평활 상수 | R | Python(statsmodels) |
|---|---|---|---|---|---|
| 단순 지수평활 | 없음 | 없음 | α | HoltWinters(x, beta = FALSE, gamma = FALSE), forecast::ses() |
SimpleExpSmoothing
|
| Holt 선형 추세 | 있음 | 없음 | α, β | HoltWinters(x, gamma = FALSE), forecast::holt() |
ExponentialSmoothing(trend="add")
|
| Holt-Winters 가법 | 있음 | 폭 일정 | α, β, γ | HoltWinters(x), forecast::hw(seasonal = "additive") |
ExponentialSmoothing(trend="add", seasonal="add")
|
| Holt-Winters 승법 | 있음 | 폭이 수준에 비례 | α, β, γ | HoltWinters(x, seasonal = "multiplicative") |
ExponentialSmoothing(trend="add", seasonal="mul")
|
- forecast 패키지의
ets()는 오차(Error)·추세(Trend)·계절(Seasonal)의 조합(예: "AAA", "MAM")을 상태공간 모형으로 두고 정보 기준으로 가장 알맞은 조합을 고른다.
x <- ts(y, start = c(2021, 1), frequency = 12) # 월별 시계열
fit_ses <- HoltWinters(x, beta = FALSE, gamma = FALSE)
fit_holt <- HoltWinters(x, gamma = FALSE)
fit_add <- HoltWinters(x) # 가법(기본값)
fit_mul <- HoltWinters(x, seasonal = "multiplicative")
predict(fit_add, n.ahead = 12)
library(forecast)
fit_ets <- ets(x) # 모형 조합 자동 선택
forecast(fit_ets, h = 12)
import numpy as np
import pandas as pd
from statsmodels.tsa.holtwinters import SimpleExpSmoothing, ExponentialSmoothing
# 추세 + 12개월 계절성이 있는 가상의 월별 판매량 4년치
rng = np.random.default_rng(5)
t = np.arange(48)
level = 100 + 2 * t + np.cumsum(rng.normal(0, 2, 48)) # 천천히 흔들리는 수준
y = level + 15 * np.sin(2 * np.pi * t / 12) + rng.normal(0, 2, 48)
y = pd.Series(y, index=pd.date_range("2021-01", periods=48, freq="MS"))
train, test = y[:36], y[36:] # 3년 학습, 마지막 1년 평가
models = {
"SES": SimpleExpSmoothing(train, initialization_method="estimated"),
"Holt": ExponentialSmoothing(train, trend="add", initialization_method="estimated"),
"HW-add": ExponentialSmoothing(train, trend="add", seasonal="add",
seasonal_periods=12, initialization_method="estimated"),
"HW-mul": ExponentialSmoothing(train, trend="add", seasonal="mul",
seasonal_periods=12, initialization_method="estimated"),
}
for name, m in models.items():
fit = m.fit()
fc = fit.forecast(12)
rmse = np.sqrt(np.mean((test.values - fc.values) ** 2))
p = fit.params
print(f"{name:7s} alpha={p['smoothing_level']:.3f} "
f"beta={p.get('smoothing_trend', np.nan):.3f} "
f"gamma={p.get('smoothing_seasonal', np.nan):.3f} "
f"AIC={fit.aic:.1f} RMSE={rmse:.2f}")
실행 결과:
SES alpha=1.000 beta=nan gamma=nan AIC=133.3 RMSE=17.44
Holt alpha=0.921 beta=0.921 gamma=nan AIC=125.6 RMSE=23.56
HW-add alpha=0.879 beta=0.000 gamma=0.000 AIC=81.0 RMSE=3.59
HW-mul alpha=0.783 beta=0.000 gamma=0.000 AIC=82.6 RMSE=4.88
- 자료에 계절성이 있는데 SES와 Holt는 계절 요소가 없어서, 계절 변동을 수준·추세 변화로 잘못 따라가느라 평활 상수가 1 가까이 커졌다. 마지막 1년 예측의 평균 제곱근 오차(RMSE)도 17~24로 크다.
- Holt-Winters 가법 모형은 AIC가 가장 작고 RMSE도 3.59로 가장 작다. 계절 폭이 일정한 사인파로 자료를 만들었으므로 가법 모형이 승법 모형보다 잘 맞는 것이 자연스럽다.
- 두 Holt-Winters 모형 모두 γ = 0으로 추정되었다. 계절 패턴이 해마다 바뀌지 않으므로 처음 추정한 계절 요인을 그대로 쓰는 것이 최적이라는 뜻이다. α가 큰 것은 수준이 무작위로 흔들리도록 만든 자료라서 최근 값을 빨리 반영하는 쪽이 낫기 때문이다.
- 모형 비교는 학습 구간의 AIC와 별도 평가 구간의 예측 오차(RMSE, 평균 절대 백분율 오차 등)를 함께 본다.
- 평활 상수 α가 클수록 최근 값에 큰 가중치를 주어 변화에 민감해지고, 작을수록 매끄러워진다.
- 추세·계절성 유무에 따라 단순 지수평활, Holt, Holt-Winters를 고르고, 계절 폭이 수준에 비례하면 승법, 일정하면 가법을 쓴다.
- 지수 평활법은 정상성을 요구하지 않는다는 점에서 ARIMA와 구별된다.
- 실기의 시계열 예측 성능 평가에서는 학습·평가 구간을 시간 순서대로 나누고 RMSE·MAPE로 모형을 비교하는 흐름을 쓴다.
- NIST/SEMATECH e-Handbook of Statistical Methods, 6.4.3 What is Exponential Smoothing?
- NIST/SEMATECH e-Handbook of Statistical Methods, 6.4.3.1 Single Exponential Smoothing
- NIST/SEMATECH e-Handbook of Statistical Methods, 6.4.3.3 Double Exponential Smoothing
- NIST/SEMATECH e-Handbook of Statistical Methods, 6.4.3.5 Triple Exponential Smoothing
- Holt, C. C. (2004). Forecasting seasonals and trends by exponentially weighted moving averages. International Journal of Forecasting 20(1), 5-10
- Winters, P. R. (1960). Forecasting Sales by Exponentially Weighted Moving Averages. Management Science 6(3), 324-342
- R Documentation - HoltWinters
- CRAN - forecast reference manual (ets, ses, holt, hw)
- statsmodels - ExponentialSmoothing