웅진X유데미 STARTERS/TIL (Today I Learned)

[스타터스 TIL] 24일차.시계열 데이터 분석 with 파이썬 (3) - 일반 예측 모델

라밍쏭 2023. 3. 12. 18:30
728x90


6. 일반 예측 모델

6.1 홀트-윈터스 계절성 기법을 활용한 예측

1) Train Test Split

시계열을 시간의 순서에 따라 오른쪽 방향으로 평행하게 늘어놓으면 첫 부분, 즉 더 큰 부분이 훈련 데이터가 되고 최근 데이터가 테스트 데이터가 된다.
따라서 예측 모델을 훈련 데이터에 피팅한 다음 훈련 데이터를 기반으로 테스트 데이터와 동일한 기간 만큼을 예측한다.
그리고 예측 결과를 이미 정답을 알고 있는 실제 테스트 데이터와 비교한 것을 통해 평가 지표를 얻을 수 있다.

 

# 총 144행 중에 107행까지 train 데이터셋
train_data = df.iloc[:108]
test_data = df.iloc[108:]

 

2) Fitting the Model

from statsmodels.tsa.holtwinters import ExponentialSmoothing

# 추세 : 덧셈모델, 계절성 : 덧셈모델
# 계절성 기간 : 12개월 (1년)
fitted_model = ExponentialSmoothing(train_data['Thousands of Passengers'],
                                    trend='mul',
                                    seasonal='mul',
                                    seasonal_periods=12).fit()

 

3) Evaluating Model against Test Set

fitted_model을 가져오면 fitted_model 객체에서 .forecast를 호출할 수 있다.
예측할 기간의 수는 알아서 기재하면 된다. (ex. 36 : 3년)

test_predictions = fitted_model.forecast(36).rename('HW Forecast')

 

기존 데이터를 나누어서 만들었던 train, test 데이터의 그래프를 그려보자.

# train 데이터와 test 데이터 그래프
train_data['Thousands of Passengers'].plot(legend=True,label='TRAIN')
test_data['Thousands of Passengers'].plot(legend=True,label='TEST',figsize=(12,8));

 

이 그래프에서 추가로 예측한 데이터(test_predictions)의 그래프를 그려보자.

# train 데이터와 test 데이터 그래프
train_data['Thousands of Passengers'].plot(legend=True,label='TRAIN')
test_data['Thousands of Passengers'].plot(legend=True,label='TEST',figsize=(12,8))

# 예측한 데이터 그래프 추가하기 (초록색 그래프)
test_predictions.plot(legend=True,label='PREDICTION');

 

예측한 기간 (3년)만 확대해서 확인해보자.

# 예측한 기간만 확인하기 (xlim을 활용)
train_data['Thousands of Passengers'].plot(legend=True,label='TRAIN')
test_data['Thousands of Passengers'].plot(legend=True,label='TEST',figsize=(12,8))
test_predictions.plot(legend=True,label='PREDICTION',xlim=['1958-01-01','1961-01-01']);

 

▶ 계절성도 예측한 것을 확인할 수 있다. 그러나 어떤 경우에는 예측이 조금 뒤지거나 결과를 더 낮게 예측하기도 한다. 특히 하강기에는 더 높게 예측한다.
모델이 단순하고 데이터에 계절성이 있다는 점을 고려하였을 때, 전반적으로 예측이 나쁘지 않다.

728x90