본문 바로가기
Work/ADP

[ADP 실기 준비] R 시계열 분석 2탄 / ARIMA 모델 / 기출공략

by Q flow 2020. 10. 14.

[ADP 실기] R 시계열 분석 2탄 / ARIMA 모델


지난 포스팅에 이어 오늘은 18회 ADP 실기시험에 출제된 기출문제를 예제로 공부해보려 한다.

실제 시험문제에 주어진 데이터는 월별 교통사고 건수로 년도-월, 교통사고 수 두개의 컬럼으로

구성되어 있다고 한다. 이번 회차는 직접 시험을 치르지 못해 문제의 시계열 데이터의 패턴을 

확인할 수는 없었지만, 기출 문제에 대한 풀이방법을 비교적 설명하기 쉬운 비계절성 시계열 자료를 

데이터 예제로 사용하려고 한다.



예제 : 영국 왕들의 사망시 나이


예제 데이터는 데이터에듀 ADP교재에 소개된 "영국 왕들의 사망시 나이" 데이터를 활용하려고 한다.

42년 간 영국 왕들이 사망한 나이로 구성되어 있다. 

install.packages("TTR")
install.packages("forecast")
install.packages("tseries")
library(TTR)
library(forecast)
library(tseries)
king <- scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)
king.ts <- ts(king)
plot(king.ts)

 

예제데이터 그래프이미지 입니다.

 



ADP 기출문제 / 예제실습


 



1. 정상성 확인 (10점) 


 

위의 시계열 그래프를 보면 평균이 시간에 따라 일정치 않은 모습을 보이므로 비정상 시계열이다.

 


2. ARIMA 모델 3가지 제시 (10점)


 

ARIMA 모델은 정상성 시계열에 한해 사용하므로, 비정상 시계열 자료는 차분을 통해  정상 시계열로 만들어준다.

king.diff <- diff(king.ts, difference=1)
plot(king.diff)

1차 차분 그래프 입니다.
1차 차분한 영국 왕들의 사망시 나이

  • 1차 차분 결과에서 평균과 분산이 시간에 따라 의존하지 않음을 알 수 있다.
  • ARIMA(p,1,q) 모델이며, 차분을 1회 해야 정상성을 만족한다.

정상 시계열로 만들었으면, ACF와 PACF를 통하여 적합한 ARIMA 모델을 결정한다.

 

① ACF

  • lag는 0부터 값을 갖는데, 너무 많은 구간을 설정하면 그래프 판단이 어려우니 20으로 설정해준다.

  • ACF값이 lag1인 지점을 제외하고 모두 점선 구간 안에 있으므로, lag2에서 절단점을 가진다. => MA(1) 모형
acf(king.diff, lag.max=20)

acf그래프 이미지

② PACF

  • PACF값이 lag 1, 2, 3에서 점선 구간을 초과하고 음의 값을 가지며, 절단점은 lag 4이다. => AR(3) 모형
pacf(king.diff, lag.max=20)

pacf 그래프 이미지

③ auto.arima

  • forecast package에 내장된 auto.arima() 함수 이용
  • 영국 왕들의 사망 나이 데이터의 적절한 ARIMA 모델은 ARIMA(0,1,1) 이다.
auto.arima(king)

Series: king

ARIMA(0,1,1)

 

Coefficients:

          ma1

      -0.7218

s.e.   0.1208

 

sigma^2 estimated as 236.2:  log likelihood=-170.06

AIC=344.13   AICc=344.44   BIC=347.56

결과적으로, 초기 분석에 의해 생성된 ARIMA 모델 후보들은 아래의 3가지이다.

  • AR(3) => ARIMA(3,1,0) 
  • MA(1) => ARIMA(0,1,1)  *auto.arima()로 생성된 모델과 동일.
  • ARMA(3,1) => ARIMA(3,1,1)

 


3. 한 가지 모델을 최종 선택하고 이유를 서술 (15점)


위의 3가지 후보 모델들의 AICc 값을 아래와 같이 계산하여 비교해본다.

> Arima(king.ts, order=c(3,1,0))

Series: king.ts
ARIMA(3,1,0)
 
Coefficients:
          ar1      ar2      ar3
      -0.6063  -0.4904  -0.3284
s.e.   0.1489   0.1551   0.1477

 
sigma^2 estimated as 239.6:  log likelihood=-169.3
AIC=346.59   AICc=347.7   BIC=353.45
> Arima(king.ts, order=c(0,1,1))

Series: king.ts
ARIMA(0,1,1)

Coefficients:
          ma1
      -0.7218
s.e.   0.1208

sigma^2 estimated as 236.2:  log likelihood=-170.06
AIC=344.13   AICc=344.44   BIC=347.56
> Arima(king.ts, order=c(3,1,1))

Series: king.ts
ARIMA(3,1,1)  

Coefficients:
          ar1      ar2      ar3      ma1
      -0.5805  -0.4778  -0.3196  -0.0293
s.e.   0.4646   0.2669   0.2140   0.4985 

sigma^2 estimated as 246:  log likelihood=-169.29
AIC=348.59   AICc=350.3   BIC=357.16

위의 3가지 모델 ARIMA(0,1,1) 모델이 가장 좋다. 이유는 가장 작은 AICc값을 갖기 때문이다.

AICc값 비교표 이미지

 

 


4. 최종 예측을 하고, 실제 결과와 비교 평가하고 그 평가 방법을 사용한 이유를 제시 (15점)


모델을 선택할 때, 보통 학습 데이터(training data)와 테스트 데이터(test data)로 나눈다.

학습 데이터는 예측 기법(여기선 ARIMA모델)의 어떠한 매개변수를 추정하는데 사용 되고,

테스트 데이터는 정확도(accuracy)를 평가할 때 사용 된다.

통상적으로 테스트 데이터의 크기는 전체 표본의 약 20% 정도로 정한다.

 

위 예제는 총 42년의 데이터이므로 약 20%인 마지막 8년을 테스트 데이터로 사용하였다.

학습 데이터의 시계열 그래프를 보면 전체데이터를 취한 경우와 마찬가지로 비정상성 시계열로 보인다.

train <- subset(king.ts, end=length(king.ts)-9)  #최근 8년 데이터를 제외한 나머지 데이터를 학습데이터로 선택
test <- subset(king.ts, start=length(king.ts)-8)  #최근 8년 데이터를 테스트 데이터로 선택
plot(train)

학습데이터 그래프 이미지
영국왕들의 사망시 나이 데이터의 80%(34년)를 가져온 학습 데이터

학습데이터에 1번 차분을 하여 정상성 시계열로 만들어준다. (전과 동일)

train.diff <- diff(train, differences = 1)
plot(train.diff)

학습데이터 1차 차분 그래프 이미지
학습 데이터를 1차 차분한 데이터

이전 ARIMA 모델 3가지를 만든 것과 동일 방식으로 모델을 생성해준다.

 

① ACF

  • ACF값이 lag 2에서 절단점을 가지므로 MA(1) 모형 => ARIMA(0,1,1) 모델 생성
acf(train.diff, lag.max=20)
Fit1 <-  Arima(train, order=c(0,1,1)

학습데이터 ACF 그래프 이미지

Fit1 %>% forecast(h=8) %>% autoplot() + autolayer(test)

아래는 영국왕들 사망시 나이의 학습 데이터에 ARIMA(0,1,1) 모델을 사용하여 마지막 8년을 예측한 결과이다.

첫번째모델 예측결과 그래프 이미지

② PACF

  • PACF값이 lag 4에서 절단점을 가지므로 AR(3) 모형 => ARIMA(3,1,0) 모델 생성
pacf(train.diff, lag.max=20)
Fit2 <- Arima(train, order=c(3,1,0)

학습데이터 PACF 그래프 이미지

Fit2 %>% forecast(h=8) %>% autoplot() + autolayer(test)

마찬가지로, 영국왕들 사망시 나이의 학습 데이터에 ARIMA(3,1,0) 모델을 사용하여 마지막 8년을 예측한 결과이다.

두번째모델 예측결과 그래프 이미지

 

③ auto.arima

  • 학습 데이터에 auto.arima() 함수를 사용하여 ARIMA(0,0,0) 모델 생성
> auto.arima(train)

Series: train
ARIMA(0,0,0) with non-zero mean

Coefficients:
         mean
      50.7273
s.e.   2.6318

sigma^2 estimated as 235.7:  log likelihood=-136.45
AIC=276.9   AICc=277.3   BIC=279.89

Fit3 <- auto.arima(train)
Fit3 %>% forecast(h=8) %>% autoplot() + autolayer(test)

세번째모델 예측결과 그래프 이미지

④ 위의 ARIMA 모델들을 사용하여, 모델을 테스트 데이터에 각각 적용해본다.

  • 이전에 얻은 (Fit1,2,3으로 저장된) 모델을 테스트 데이터에 적용한다.
  • accuracy() 명령으로 얻은 결과는 Training set으로 적혀 있으나, 실제로 테스트 데이터이다. 
> king.test1 <- Arima(test, model=Fit1)
> accuracy(king.test1)

                    ME       RMSE       MAE       MPE      MAPE      MASE       ACF1
Training set -3.172994 8.088363 6.394431 -5.621647 9.65837 0.6820726 -0.3601659
> king.test2 <- Arima(test, model=Fit2)
> accuracy(king.test2)

                       ME     RMSE     MAE       MPE     MAPE      MASE       ACF1
Training set -3.107322 8.025836 6.13352 -5.523792 9.314254 0.6542422 -0.3507316
> king.test3 <- Arima(test, model=Fit3)
> accuracy(king.test3)

                      ME     RMSE      MAE      MPE     MAPE     MASE       ACF1
Training set 21.27273 22.57521 21.27273 28.68647 28.68647 2.269091 -0.2373541

예측정확도 평가표 이미지

정확도 값을 분석해보면, 예측 정확도 평가에서 대표적으로 사용되는 RMSE, MAE, MAPE, MASE  모든 오차가 가장 작은ARIMA(0,1,1) 모델이 3가지 모델 중에서 가장 좋다고 할 수 있다.

 

지금까지 최근 ADP 실기 시험에 출제되었던 시계열 분석 문제에 대비하여 쉬운 예제를 활용하여 알아보았다. 

댓글