본문 바로가기
내가 하는 데이터분석/내가 하는 통계분석

[시계열 분석, Timeseries Analysis] - AR, MA, ARIMA with Python

by Pymoon 2023. 1. 28.

시간의 흐름에 따라 기록된 데이터를 바탕으로 미래의 변화에 대한 추세를 분석방법인 시계열 분석을 다뤄보자.

 

 

 

이 전의 통계분석에선 시계열 분석 중에서 시계열 분해, 정상성에 대해서 정리하며 다뤄보았다.

 

시계열 분석(Timeseries Analysis) - 시계열 분해, 정상성 with Python

이번엔시간의 흐름에 따라 기록된 데이터를 바탕으로 미래의 변화에 대한 추세를 분석방법인 시계열 분석을 다뤄보자. 이 전글에서 연관분석(지지도, 신뢰도, 향상도)에 대해서 다뤄보며 정리

py-moon.tistory.com

 

 

이번에 정리해 볼 내용은 시계열 분석 중에서 시계열 모형인 AR모형, MA모형, ARIMA모형이다.

 

 


 

이 전글에서 사용했던 데이터와 코드를 그대로 가지고 이어서 진행해보고자 한다.

 

 

 

먼저, AR(Auto Regressive) 모형이 무엇인지 설명하자면


과거의 값이 현재의 값에 얼마나 영향을 미쳤는지를 파악하는 것이다.


만약, 영향을 미치지 않는다면 모형의 성능을 낮아진다.

 

최적의 성능을 가지는 모델을 만들 수 있는 과거의 값을 찾게 되는데, 이 값을 p라고 하며 AR(p) 모형이라 한다.


PACF(편자기상관 함수) 값이 0에 수렴할 때의 p값을 AR모형의 p값으로 설정한다.

 

PACF(편자기상관 함수)가 크다면, 그 시계열 데이터는 이전의 값으로 미래를 예측하는데 도움이 될 것이다.

 

 

 

plot_pacf(diff_data, method='ywm')

> 위 그래프는 PACF값을 확인해 보기 위해 데이터를 시각화한 것이다.

 

> 그래프를 보면 알 수 있듯이, x축의 시차 2 이후에 y축의 값이 0으로 수렴하는 것을 확인할 수 있다.

 

> 이를 통해서 AR모형에서 최적의 p값은 2로 설정할 수 있다.

 

 

 


 

 

다음으로 MA(Moving Average) 모형이다.


MA모형은 과거의 예측 오차를 이용하여 미래를 예측하는 모형이다.


과거의 예측 오차들에 따라서 MA모형은 달라진다.


최적의 성능을 가지는 모델을 만들 수 있는 과거의 값을 찾게 되는데, 이 값을 q라고 하며 MA(q) 모형이라 한다.


정상 시계열일 경우 ACF(자기 상관함수) 값이 빠르게 0으로 수렴하며, 0으로 수렴할 때에 시차를 q값으로 설정한다.

 

 

 

plot_acf(diff_data)

> 위 그래프는 ACF값을 확인해보기 위해 데이터를 시각화한 것이다.

 

> 그래프를 보면 알 수 있듯이, x축의 시차 2 이후에 y축의 값이 0으로 수렴하는 것을 확인할 수 있다.

 

> 이를 통해서 MA모형에서 최적의 q값은 2라는 것을 알 수 있다.

 

 

 

> PACF는 과거 t시점의 데이터와 현재시점의 데이터와의 상관성이라면,

 

> ACF는 과거 t시점까지의 데이터로 현재시점과의 상관성이다.

 

 


 

이번에는 ARIMA(Auto-Regressive Intergrated Moving Average) 모형이다.

 

ARIMA모형은 앞서 살펴본 AR모형과 MA모형을 결합한 것으로, 과거의 데이터로 현재나 미래의 데이터를 예측하는 모형이다.

 

ARIMA모형의 파라미터로는 (p, d, q)를 사용한다,

 

p는 PACF로, d는 차분의 횟수, q는 ACF로 최적화할 수 있다.

 

지금까지 우리가 살펴본 실습으로 각 파라미터의 값들을 도출해 낸 것을 알 수 있다.

 

1번의 차분을 했었고, AR(2) 모형과 MA(2) 모형을 통해서 우리가 실습해 볼 ARIMA의 모형은 ARIMA(2, 1, 2)라는 것을 알 수 있다.

 

 

 

 

1
2
3
4
from statsmodels.tsa.arima.model import ARIMA
 
model = ARIMA(training, order=(2,1,2))
result = model.fit()
cs

 

> 해당 데이터와 파라미터를 가지고 ARIMA모델에 학습시켜 준다.

 

 

 

result.summary()

> 결과에서 AIC값과 AR, MA모델의 pvalue를 보는 것이 중요하다고 한다.

 

> AIC값은 작을수록 성능이 좋으며 다른 모델과 비교할 때 좋다.

 

> 그리고, coef에서 pvalue가 0.05 이하라면 AR모형과 MA모형을 사용할 수 있다고 한다.

 

 

 

plt.plot(result.predict()), plt.plot(training)

> 파란색 그래프가 ARIMA모형에 의해 예측된 값이고, 주황색 그래프는 원본데이터 값을 표현하고 있다.

 

> 두 선을 보니 모양이 거의 일치함으로 성능이 좋아 보인다.

 

 

 

> 위 그래프의 x축은 20130101부터 20161201까지의 데이터를 시계열로 표현하고 있다.

 

> 원본에는 20171201까지 있지만 성능검증을 위해 처음에 분리를 시킨 것이다.

 

> 지금부터는 그 성능검증에 초점을 두어 수치를 예측하고자 한다.

 

 

 

 

1
2
3
4
forecast_data = result.forecast(steps=len(test), alpha=0.05)
 
pred_y = forecast_data
test_y = test
cs

 

> 비교를 위해 pred_y와 test_y로 각각 예측치와 실제값을 할당해 주었다.

 

 

 

 

plt.show()

> 예측치와 실제값을 비교하는 그래프를 보니 한눈에 봐도 예측이 되지 않았음을 알 수 있다.

 

 

 

 

1
2
r2_score : -1.6440394214966672
RMSE : 2302.6962527470355
cs

 

> 성능지표에서도 그 결과를 적나라게 보여주고 있다.

 

> R2값이 음수가 나오는 것은 해당 모델의 정확도가 매우 낮다는 것을 말한다.

 

 

 

> 계절성이 있는 데이터의 경우에는 계절성지수가 추가된 SARIMA 모델을 사용하는 것이 좋다.

 


 

 

1
2
3
4
5
6
7
8
from pmdarima import auto_arima
 
auto_model = auto_arima(training, start_p=0, d=1, start_q=0, max_p=3, max_q=3,
                        start_P=0, start_Q=0, max_P=3, max_Q=3, m=12, seasonal=True,
                        information_criterion='aic', trace=True)
 
 
Best model:  ARIMA(0,1,1)(0,1,0)[12]
cs

 

> SARIMA를 적용시켜 최적의 파라미터를 찾는 코드를 돌려본다.

 

> 그 결과는 앞의 ARIMA(2, 1, 2) 모델과는 완전히 다른 것을 알 수 있다. 이는 계절성이 추가되어서 그런 듯하다.

 

 

 

auto_model.summary()

> AIC 값이 761이었던 ARIMA(2, 1, 2) 모델보다는 성능이 좋은 모델인 것을 알 수 있다.

 

 

 

 

1
2
3
auto_pred_y = pd.DataFrame(auto_model.predict(n_period=len(test)),
                           index=test.index)
auto_pred_y.columns = ['predicted_price']
cs

 

> SARIMA를 적용한 모델을 활용해서 20170101부터 20171201까지의 값을 예측해 본다.

 

> 예측된 값과 원본 값을 비교해 보자.

 

 

 

plt.show()

> 범례를 통해서 각각의 선이 무엇을 의미하는지 확인할 수 있다.

 

> ARIMA(2, 1, 2) 모형과는 확실히 다른 예측력을 가지고 있음을 알 수 있다.

 

> 그래프를 통해서 실제값과 예측값이 거의 같음을 알 수 있지만 성능 지표를 통해서 한번 더 확인해 보자.

 

 

 

1
2
r2_score :  0.9305467069431359
RMSE :  373.2064254331493
cs

 

> 이번에는 R2값이 양수가 나옴과 동시에 약 93%의 정확도를 가지고 있다고 할 수 있다.

 

> 그리고 평균 오차는 373으로 높은 예측력을 가진다고 할 수 있다.

 

 


 

OUTTRO.

 

 

이번 시계열 분석에 사용된 데이터는 시간에 따른 가격을 나타내는 데이터이다.

 

SARIMA를 사용하면서 가격을 시간의 영향을 받는다는 인사이트를 볼 수 있었다.

 

추세를 판단하는 분석에는 ARIMA모형이, 계절성이 존재하는 분석의 경우에는 SARIMA모형이 적절하다는 것이다.

 

 

 

분석하기 전 혹은, 분석을 진행하면서 데이터의 특성이나 분석케이스에 따라서 사용해야 할 분석 방법과 방향은 분명 달라야 한다.

 

같은 데이터를 사용해도 다른 분석 방법을 사용함으로써 명확한 차이를 볼 수 있었으니 말이다.