ADP (R)

[Adp 실기 기출 풀이] 18회 시계열 정상성 체크

멋쟁이천재사자 2022. 8. 16. 12:30

9월 25일 26회 시험을 준비하고 있습니다.

 

1. 문제

출처 : https://ckmoong.tistory.com/10?category=933194

다음 king 데이터로 시계열 분석을 실시하라.

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

1. 정상성 체크(10점)

2. 시계열 예측 모델 제시(10점)
3. 한가지 모델을 최종 선택하고 이유 서술(15점)

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

 

2. 풀이

 

#총42년의 데이터중 약10%인 마지막 4년을 테스트데이터로 사용
king.ts
train <- subset(king.ts, end=length(king.ts)-4)
test  <- subset(king.ts, start=length(king.ts)-3)

 

# 1. 정상성 체크
#정상성 평가 - 비정상
adf.test(train)
# 필요한 차분수 확인 - 1차 차분
ndiffs(train)
#1차 차분 데이터의 정상성 평가 - 정상
adf.test(diff(train))

#1차 차분 pq 수치 확인 -> pq  가 3,1
par(mfrow=c(1,2))
acf(diff(train));pacf(diff(train))

 

# 2. 시계열 예측 모델 제시
# pdq  가 3,1,1 이므로 다음 3개중 하나 선택
m1 <- arima(king.ts, order=c(3,1,0))
m2 <- arima(king.ts, order=c(0,1,1))
m3 <- arima(king.ts, order=c(3,1,1))

 

# 3. 한가지 모델을 최종 선택
# RMSE 관점에서 3,1,1 모델이 가장 우수
library(dplyr)
rbind(cbind(m='m1',accuracy(m1)),
      cbind(m='m2',accuracy(m2)),
      cbind(m='m3',accuracy(m3))) %>%
  data.frame() %>% 
  select(m,RMSE) %>% 
  arrange(RMSE)

#정규성 평가
qqnorm(m3$residuals, pch=21, col="black", 
       bg="gold", main="Q-Q Plot of Residuals") 

qqline(m3$residuals, col="royalblue", lwd=2) 
# H0 : 데이터들이 독립적으로 분포함. 
# p-value = 0.9349 그러므로 독립
Box.test(m3$residuals, type="Ljung-Box") 

 

# 4. 최종 예측 후 실제 결과와 비교 평가
# 예측
m3.pred <- forecast(m3,4)
plot(m3.pred)
plot(m3.pred, 
     col="darkgreen", 
     lwd=2, 
     flty=1,flwd=2, 
     fcol="royalblue", shadecols=c("mistyrose","salmon"), 
     xlab="y", 
     ylab="x", 
     main="Forecast" 


 

3. Study 이력


1 정상성 체크

 

plot(king.ts)

(plot 만으로는 정상성을 만족하는지 잘 보이지가 않습니다)

adf.test(king.ts)

adf 테스트 결과 p-value 가 0.05 보다 크므로 유의수준 5% 에서 비정상 시계열입니다.

(plot 으로 본것에 비해 p-value 수치가 높네요)

 

par(mfrow=c(1,2))
acf(king.ts);pacf(king.ts)

ACF 가 시차 1 이후에 0으로 수렴하고 PACF 는 정상이므로 MA(1) 모형으로 보입니다.

 


2. 시계열 예측 모델 제시

 

비정상데이터를 차분을 통해 정상시계열로 변환합니다.

ndiffs(king.ts)
adf.test(diff(king.ts,1))

 

1차 차분이 필요하며, 1차 차분 후에는 정상성을 만족하는 것으로 확인됩니다.

따라서 ARIMA(0,1,1) 모델이 적합해 보입니다.

 

arima(king.ts, order=c(0,1,1))

단순지수평활법과 비교해보겠습니다.

 

ets(king.ts)

 

Box.test(king.ts,type = "Ljung-Box")

 

 

3. 한가지 모델을 최종 선택하고 이유 서술

ARIMA(0,1,1) 이 AIC 지표로 보아 우수한 성능이므로 선택

 

4. 최종 예측 후 실제 결과와 비교 평가하고, 평가 방법 사용 이유를 제시

...

 

5. 풀이 (2022-09-14)

 

#정상성 평가 - 비정상
adf.test(king.ts)
# 필요한 차분수 확인 - 1차 차분
ndiffs(king.ts)
#1차 차분 데이터의 정상성 평가 - 정상
adf.test(diff(king.ts))


#1차 차분 p1q 수치 확인 -> pdq  가 2,1,1
par(mfrow=c(1,2))
acf(diff(king.ts));pacf(diff(king.ts))

# pdq  가 2,1,1 이므로 다음 3개중 하나 선택
arima(king.ts, order=c(0,1,1))
arima(king.ts, order=c(2,1,1))
arima(king.ts, order=c(2,1,0))

# RMSE 관점에서 2,1,1 모델이 가장 우수
# 그러나 0,1,1 모델과 차이가 크지 않음. 
# 간명도 원칙에 따라 0,1,1 선택 
accuracy(arima(king.ts, order=c(0,1,1)))
accuracy(arima(king.ts, order=c(2,1,1)))
accuracy(arima(king.ts, order=c(2,1,0)))


4. 참고 자료


https://ysyblog.tistory.com/227

https://ckmoong.tistory.com/10?category=933194 

 

 

 

 

 

 

 

 

 

 

 

 

.