시계열 패턴 추출기법 (Stationary Time Series)
; 시계열의 전환점 또는 변화의 방향를 해석하려면, 추세-주기 성분 >> 계절 성분 제거 데이터
# 고전적 시계열분해 예측기법 / 비추
1) 분해 종류 (계절성, 추세주기, 나머지)
-
곱셈 : 계절성 변동크기가 추세-주기 변동크기에 비례하여 변한다면 y = 추세 * 계절 * 나머지
-
덧셈 : 계절성과 추세주기가 독립일 때, 또는 곱셉의 로그변환 y = 추세 + 계절 + 나머지
2) 추세-주기 성분 추출(계절성 제거)
-
이동평균
-
중심화 이동평균, 이동평균의 이동평균 : 2*12MA(월) , 7MA(일)
-
가중이동평균
3) 사용하지 말아야 할 이유
-
계절성분이 매년 반복된다는 것을 가정함, 즉 계절성분의 반복주기가 변하면 추출못함.
-
일시적 특이패턴 추출못함
# STL 분해기법 (Seasonal and Trend using Loess)
; Loess를 사용한 계절성과 추세 분해
1) 장단점
-
SEAT와 X11과는 다르게, STL은 월별이나 분기별 데이터를 포함하여 어떤 종류의 계절성도 다룰 수 있습니다.
-
계절적인 성분이 시간에 따라 변해도 괜찮습니다. 계절성분의 변화율을 사용자가 조절할 수 있습니다.
-
추세-주기의 매끄러운 정도를 사용자가 조절할 수 있습니다.
-
가끔 있는 이상값이 추세-주기와 계절성분에 영향을 주지 않게 만들 수 있습니다(즉, 사용자가 강력한 분해법을 명시할 수 있습니다). 하지만, 이상값은 나머지 성분(remainder)에 영향을 줄 것입니다.
-
(단점) 거래일이나 달력 변동을 자동으로 다루지 않고, 덧셈 분해만 지원합니다. ; Box-Cox변환으로 곱셈분해가능.
from statsmodels.tsa.seasonal import seasonal_decompose
ts = df.timeseries
result = seasonal_decompose(ts, model='additive') # multiplicative
result.trend
result.seasonal
result.resid
2) 성분 강도 측정하기 (추세강도, 계절강도)
-
추세강도 = MAX(0, 1 - Var(나머지)/Var(추세+나머지) )
-
계절강도 = MAX(0, 1 - Var(나머지)/Var(계절+나머지) )
3) 성분 합산으로 예측하기
-
계절성분 제거된 시계열 : 나이브 예측값, 표류예측, 비계절성 ARIMA예측
-
계절성분 시계열: 나이브 계절성 예측값
-
더하기
4) seasonal sub-series plot 시각화
; 시간에 따른 계절성분의 변화 with 평균
#Exponential Smoothing 예측기법
1) 단순 ES ; 관측치의 가중평균 (초기값, 가중치가 매개변수임)
2) 선형추세 ES : 관측치의 가중평균 + 추세(기울기)의 가중평균 * 예측시차
-
과거의 추세(기울기)가 시간이 지나도 유지된다.
3) 감쇠추세 ES : 관측치의 가중평균 + 추세(기울기)의 가중평균 * 예측시차의 등비급수
-
과거의 추세(기울기)가 시간이 지날수록 약해진다.
-
alpha = 1 : 최근 데이터에 민감한 절편. Beta = 0 : 시간에 따라 민감한 추세.
4) 계절성 선형추세 ES : 관측치의 가중평균 + 추세(기울기)의 가중평균 * 예측시차 + 계절성 가중평균
-
덧셈 기법은 계절성 변동이 시계열 전반에 걸쳐 거의 일정할 때 사용
-
곱셈 기법은 계절성 변동이 시계열의 수준에 비례하게 변할 때
5) 계절성 감쇠추세 ES : {관측치의 가중평균 +추세(기울기)의 가중평균 * 예측시차의 등비급수} * 계절성 가중평균
-
덧셈 기법은 계절성 변동이 시계열 전반에 걸쳐 거의 일정할 때 사용
-
곱셈 기법은 계절성 변동이 시계열의 수준에 비례하게 변할 때 ; 예측값의 수준이 증가함에 따라 더 크고 증가하는 계절성 변동을 설명함.
예측 범위(forecast horizon) 길이, 테스트 데이터 크기, 예측 오차 측정 방식, 데이터의 빈도 등 여러 변수에 의해 예측 작업이 변할 수 있기 때문에, 한 가지 기법이 모든 예측 시나리오에 대해 다른 모든 기법보다 좋을 것이라고 보장하기 어렵습니다. 어떤 한 가지 예측 기법에서 필요한 것은 일관적인 예측값입니다. 이렇게 얻은 예측값은 수작업으로 진행한 것과 자주 비교해야 합니다.
##ETS 예측기법 (Error,Trend,Season)
; ETS가 ARIMA, SARIMA보다 성능이 좋은 편인듯..
1) 혁신상태공간모델 for 예측구간!
-
과측데이터 측정식(Measurement equation)
-
비관측 성분/상태(수준, 추세, 계절성)가 시간에 따라 어떻게 변하는지 기술하는 몇 가지 상태식(state equation)
-
혁신 --> 덧셈/곱셉 오차
: 수준식(관측치)에 학습오차항 추가하기 : 곱셈오차 - 데이터가 양수일 때만 사용
-
상태 --> None/선형/감쇠 추세, 공간 --> None/덧셈/곱셈 계절성
-
from statsmodels.tsa.exponential_smoothing.ets import ETSModel
model = ETSModel(austourists, error="add", trend="add",damped_trend=True,
# simple exponential smoothing
; none
# heuristic
initialization_method='heuristic'
# Holt-Winters’ seasonal method
seasonal="add",seasonal_periods=4
)
fit = model.fit()
# prediction
pred = fit.get_prediction(start='2014', end='2020')
simulated = fit.simulate(anchor="end", nsimulations=17, repetitions=100)
for i in range(simulated.shape[1]):
simulated.iloc[:,i].plot(label='_', color='gray', alpha=0.1)
df["mean"].plot(label='mean prediction')
df["pi_lower"].plot(linestyle='--', color='tab:blue', label='95% interval')
df["pi_upper"].plot(linestyle='--', color='tab:blue', label='_')
pred.endog.plot(label='data')
plt.legend()
*https://www.statsmodels.org/dev/examples/notebooks/generated/ets.html#Holt-Winters'-seasonal-method
# 여러개 계절성이 존재하는 경우
1. STL ; # pip install statsmodels
2. dynamic harmoic regression : covariate 있음
3. TBATS (Exponential smoothing state space model with Box-Cox transformation, ARMA errors, Trend and Seasonal components) ; # pip install tbats
- TBATS의 특장점
-
계절성 패턴이 변하지만, 느리게 변함.
-
covariate 없음
-
단계별 선형 함수와 일별 계절성 패턴을 허용하기 위한 회귀
-
# Prophet 정리 잘 되어있는 블로그
'Statistics > Time Series Analysis' 카테고리의 다른 글
TSA - 5. 동적회귀 (0) | 2021.01.22 |
---|---|
TSA - 4. 자기회귀 (0) | 2021.01.22 |
TSA - 2. 일반회귀 (0) | 2021.01.22 |
TSA - 1. 시각화 및 벤치마크 예측기법 (0) | 2021.01.22 |
모수추정방법 / (0) | 2021.01.22 |