본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Exponential Smoothing; 지수평활법
과거 관측값에 최근일수록 큰 가중치를 주고, 그 가중치를 지수적으로 줄여 가며 평균을 내어 미래 값을 예측하는 시계열 분석 기법

단순 이동평균이 최근 n개 값에 같은 가중치를 주는 데 비해, 지수 평활법은 모든 과거 값을 쓰되 가중치가 α, α(1 − α), α(1 − α)2, …처럼 기하급수적으로 줄어든다. 계산이 간단하고 갱신이 빠르며, 수준(level)·추세(trend)·계절성(seasonality)을 차례로 더해 단순 지수평활 → Holt 선형 추세 → Holt-Winters 계절 모형으로 확장된다. 추세 없이 수준만 다루는 단순 지수평활은 지수 이동 평균과 같은 원리이다.

아래에서 ℓt는 수준, bt는 추세(기울기), st는 계절 요인, m은 계절 주기(월별 자료면 12), h는 예측 시차이다. 수식은 R HoltWinters() 문서의 표기를 따랐다.

단순 지수평활(SES): 추세와 계절성이 없는 자료에 쓴다. 예측값은 모든 h에 대해 평평하다.

ℓt=αyt+(1−α)ℓt−1,y^t+h=ℓt

Holt 선형 추세(이중 지수평활): 수준에 추세 식을 더한다.

ℓt=αyt+(1−α)(ℓt−1+bt−1),bt=β(ℓt−ℓt−1)+(1−β)bt−1,y^t+h=ℓt+hbt

Holt-Winters 가법 모형(삼중 지수평활): 계절 변동의 폭이 수준과 상관없이 일정할 때 쓴다.

ℓt=α(yt−st−m)+(1−α)(ℓt−1+bt−1),st=γ(yt−ℓt)+(1−γ)st−m

y^t+h=ℓt+hbt+st−m+1+(h−1)modm

Holt-Winters 승법 모형: 수준이 커질수록 계절 변동의 폭도 비례해 커질 때 쓴다. 빼기 대신 나누기, 더하기 대신 곱하기를 쓴다. 자료가 0이나 음수이면 쓸 수 없다.

ℓt=αytst−m+(1−α)(ℓt−1+bt−1),st=γytℓt+(1−γ)st−m,y^t+h=(ℓt+hbt)st−m+1+(h−1)modm

평활 상수의 의미

편집 원본 편집
  • α(수준), β(추세), γ(계절)는 모두 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")을 상태공간 모형으로 두고 정보 기준으로 가장 알맞은 조합을 고른다.
항목 지수 평활법 ARIMA
접근 수준·추세·계절 요소를 직접 갱신 자기상관 구조(AR, MA)를 모형화
정상성 요구하지 않는다 차분 등으로 정상 시계열로 만든 뒤 적합
모형 식별 추세·계절 유무만 정하면 된다 ACF·PACF로 차수 (p, d, q) 식별
해석 직관적, 계산이 가볍다 통계적 검정·진단 체계가 갖춰져 있다
관계 단순 지수평활은 ARIMA(0,1,1)과 같은 예측을 낸다 선형 지수평활 모형 일부는 특정 ARIMA의 특수한 경우이다
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로 모형을 비교하는 흐름을 쓴다.