본문 바로가기

ML | DL

ARIMA model for time series forecasting(시계열 분석)

이번 포스트에서는 제가 최근에 진행했던 프로젝트에서 사용했던 시계열 데이터 분석 모형인 ARIMA를 정리해보겠습니다.

 

ARIMA를 간단히 정의하면, 과거의 시계열 데이터를 가지고 예측하는 모델이며, 두 가지 변수(시계열, 종속 변수)를 가지고 모델을 훈련합니다. 

 

ARIMA를 훈련시키기 위해서는 몇 가지 조건이 필요한데 첫 번째로, data가 stationary(정상적인)해야 합니다. 이 말은 밑의 그래프처럼 선형적인 data는 적합하지 않다는 것을 의미합니다.

a stationary series / Non-stationary series.

두 번째는 계절성(Seasonality)입니다. 규칙적으로 변동이 있는 가령, 아이스크림 판매는 여름에 더 높은 수익을 내는 것처럼 data에 계절성이 있다면 모델의 정확도를 더 높일 수 있습니다.

 

Differencing

만약 두가지 조건을 만족시키지 못한다면 data differencing을 통해 stationary 한 data를 만들 수 있습니다. differencing에는 많은 방법들이 있지만 간단한 방법으로는

 

# Differencing
train = train.diff().dropna()

 

이렇게 수행할 수 있습니다. 여기서 diff() 함수는 dataFrame안에 있는 value에서 다른 value의 차이를 계산하는 것을 말합니다. (기본값으로는 previous value를 계산한다고 하네요.!) 여기서 주의할 점은 over-differenced가 되지 않게 해야한다는 것입니다. 때에 따라서 1차, 2차 differencing을 하게 되는데 data가  over-differenced 되도 여전히 stationary 하지만 모델이 제대로 훈련할 수 없습니다. 

 

밑의 그래프는 위의 코드로 1차 differencing을 하기 전과 후입니다.

Differencing 전 / 후

위의 그림과 비슷해진 것 같나요? ㅎㅎㅎ 

자 그러면 이제 data 전처리는 끝이 난 것 같습니다.

간단하네요.!

 

Modeling

시계열 분석에 사용되는 ARIMA를 비롯해 크게 3가지가 있습니다. AR, MA, ARIMA 이 모델들을 결정짓는 데에는 parameter p, d, q를 설정이 중요한데요. 가령, parameter가 (p1, d1, q1,) 있다고 가정했을 때 q값이 0면 그 모델은 AR이고, p값이 0이라면 MA입니다. 그리고 예시처럼 p, d, q에 값이 전부 들어있다면 ARIMA model이 되는 것입니다. (parameter를 설정하고 tuning 하는 것은 다음 시간에 하겠습니다.!)

 

p, d, q에 어떤 값을 할당해서 어떤 모델을 만들지 모르겠을 때는 auto_arima library를 사용해 적합한 p,d,q값을 찾는데 도움을 받을 수 있습니다.

 

from pmdarima.arima import auto_arima

model_arima= auto_arima(train,trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,suppress_warnings=True,stepwise=False,seasonal=False)

model_arima.fit(train)

 

여기서 우리가 살펴보아야 할 것은 'start_p=1,start_q=1,max_p=3,max_q=3' 처럼  범위를 정하는 것입니다. start를 시작으로 max까지의 범위를  설정해 얼마나 다양한 실험을 통해 적절한 p,d,q값을 찾을지 설정하는 것인데요. 저는 1을 시작으로 3까지의 범위를 설정했습니다.

 

결과를 보시면 AIC(통계 모델을 성능을 측정하는 기준)이 많이 높게 나왔습니다. (낮을 수록 좋은 모델인데 전처리나, 더 다양한 tuning이 필요해 보입니다.)

 

여기서 가장 괜찮은 값인 p,d,q(1,1,3)을 가지고 ARIMA 모델링을 해보겠습니다.

 

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(train, order=(1,1,3))

model_fit = model.fit(disp=0)

print(model_fit.summary())

model의 summary를 보시면 중간에 coef값과 P>|z|값이 있습니다. coef값은 0에서 가장 떨어졌을때 가장 이상적이며 p값은 0과 가장 가까울때가 가장 좋습니다. 그러므로 가장 마지막에 q 값이 3인 ma L3 가장 정확도가 높습니다.

 

이제 실제 데이터와 그 데이터를 예측한 데이터를 그래프로 그려보겠습니다.

 

model_fit.plot_predict(dynamic=False)

plt.show()

 

꽤 잘 따라한 것 같습니다. ㅎㅎㅎ

이번에는 마지막 데이터 이후 15개월을 예측한 그래프입니다.

 

model = ARIMA(train, order=(1, 1, 3))  
fitted = model.fit(disp=-1)  

# Forecast
fc, se, conf = fitted.forecast(15, alpha=0.05)  # 95% conf

# Make as pandas series
fc_series = pd.Series(fc, index=[79,80,81,82,83,84,85,86,87,88,89,90,91,92,93])

# Plot
plt.figure(figsize=(12,5), dpi=100)
plt.plot(train, label='solid ticket')
plt.plot(fc_series, label='forecast')
plt.title('Forecast')
plt.legend(loc='upper right', fontsize=8)
plt.show()

 

 

점점 증가하는 그래프를 그려주었네요.!

 

 

이상으로 이번 포스트를 마무리 하겠습니다.

감사합니다.!

 

 

참조글 : https://www.machinelearningplus.com/time-series/arima-model-time-series-forecasting-python/

'ML | DL' 카테고리의 다른 글

XGBoost regressor  (0) 2020.10.01
Cluster analysis of Unsupervised Learning  (0) 2020.08.23
Linear Regression  (0) 2020.06.17
Supervised Learning  (0) 2020.06.12