[ADP] R로 하는 시계열 분석 실습(분해시계열, ARIMA)

2020. 7. 18. 15:21ADP | ADsP with R/Knowledge

 이번 게시글에서는 R을 활용한 실습만 진행한다. 시계열 모형들에 대한 자세한 내용은 아래 링크를 통해서 학습하길 바란다. 

https://todayisbetterthanyesterday.tistory.com/36

 

[Data Analysis 개념] 시계열 분석 - AR/MA/ARIMA/분해시계열 의미

1. 비정상/정상 시계열 자료  시계열 자료란 시간의 흐름에 따라 관측된 데이터를 말한다. 시계열 분석을 하기 위해서는 기본적으로 정상성(Stationary)를 만족해야한다. 정상성을 만족하는 것은 ��

todayisbetterthanyesterday.tistory.com


시계열 분석 

실습은 특성이 다른 두 가지 데이터를 가지고 비교하면서 진행하겠다. 첫 번째 데이터는 나일강 연간 유입량에 관한 데이터이며 두 번째 데이터는 영국내 월별 사망자 데이터이다. 두 데이터 모두 R에 기본적으로 내장되어있는 데이터로 데이터 자체가 timeseries로 구성되어있다. 일반데이터를 시계열자료 형식으로 변환하기 위해서는 ts함수를 사용해서 시계열 자료 형식으로 변환 후 분석을 진행하면 된다.

 

데이터 불러오기

# 나일강 연간 유입량 데이터
Nile

 

# 영국 내의 월별 폐질환 사망자 데이터
ldeaths

 데이터를 표로 보면 추세나 흐름이 잘 보이지 않는다. 그렇기에 도식화를 통한 그림으로 살펴보자

 


 

Plot 고찰하기

# 나일강 연간 유입량 데이터
plot(Nile)

 나일강 데이터를 먼저 살펴보면 규칙적인 계절성이 띄는 것 같아 보이지 않는다. 하지만, 평균이 변화하는 추세는 약간 보이는 듯 하다. 그렇기에 정상성을 만족하지 못한다. 

# 영국 내의 월별 폐질환 사망자 데이터
plot(ldeaths)

 나일강 데이터와 달리 영국 내 폐질환 사망자 데이터는 년도별로 명확한 계절성이 띄는 것으로 보인다. 매년 일정 주기별 사망자의 수가 증가했다가 감소하는 것을 반복한다. 자세히 보면 년도별 3,4 분기에 급격하게 증가했다가, 1,2분기에 급격하게 감소하는 것처럼 보인다. 분해 시계열에서 다루고자 하는 시계열 데이터의 요소는 추세요인/계절요인/순환요인/불규칙요인이 있다. 그 중에서 계절요인이 어느정도 명확하니 분해 시계열을 통해서 다루어보자. 

 


 

ldeaths 데이터 - 분해 시계열

# 계절요인 분해시계열
ldeaths.decompose <- decompose(ldeaths)        # 데이터에서 4가지 요인을 분해시키는 함수
ldeaths.decompose$seasonal                     # 계절요인으로 분해된 부분이다.

 R에서 decompose(ts)함수를 사용하면 4가지 요인으로 분해를 시켜준다. view(decompose(ts))를 사용해서 변수를 확인하면 seasonal / trend / random / observed 컬럼이 생겨난 list를 확인할 수 있다. 

# 4가지 요인을 도식화로 살펴보자
plot(ldeaths.decompose)

 위와같이 그림을 그리면 추세요인, 계절요인, 불규칙요인으로 분해된 시계열 자료에 대한 그림을 그릴 수 있다. 게다가 특정 요인이 있다고 판단될 경우, 원 시계열자료에서 해당하는 특정요인을 빼면 적절한 조정이 가능하다.

# 계절요인 제외시키기
ldeaths.decompose.adj <- ldeaths - ldeaths.decompose$seasonal
plot(ldeaths.decompose.adj)

이제 계절요인을 제거한 시계열 자료를 얻게 된 것을 확인할 수 있다. 

 


 

Nile 데이터 - ARIMA모형

 앞에서 Nile 데이터에서 추세가 존재하는 것으로 보여(평균이 일정하지 않아) 정상성을 위배한다고 언급했다. 그렇기에 ARIMA모형을 통해서 비정상 시계열을 다루는 과정을 진행해보자. 맨 위에 걸어놓은 링크를 통해서 보면 평균이 일정하지 않은 비정상시계열의 경우는 차분을 통해서 비정상성을 해결한다. 그리고 분산이 일정하지 않은 시계열의 경우는 변환을 통해서 비정상성을 해결한다. 

 Nile의 경우는 평균이 일정하지 않는 것만 일차적으로 확인이 되기에 차분을 진행하여 ARIMA모형 분석을 진행하겠다.

 

# 1회 차분
Nile.diff_1 <- diff(Nile, differences = 1)
plot(Nile.diff_1)

 R에서 차분은 diff함수를 통해서 정할 수 있다. diff(ts, differences = d-횟수)를 사용하면, 원하는 d만큼 차분이 가능하다. 1번 차분을 한 결과 원 데이터보다는 평균이 일정해진 것처럼 보인다. 하지만 명확하지 않다. 한번 더 해보자

# 2회 차분
Nile.diff_2 <- diff(Nile, differences = 2)
plot(Nile.diff_2)

 차분을 2회 진행하니 1회 진행한 것보다도 평균과 분산이 시간이 지남에 따라서 일정한 정상성을 띄는 것을 확인할 수 있다. 이제 이 차분을 진행한 데이터 Nile.diff_2를 사용하여 자기상관함수와 부분자기상관함수를 통해서 AR/MA 모형의 여부를 살펴보자

# 자기상관함수 그래프
acf(Nile.diff_2, lag.max=20)

# 자기상관함수 도표
acf(Nile.diff_2, lag.max=20, plot = FALSE)

 

 acf 함수의 lag의 개수는 20개로 정했다. lag개수가 너무 많아지면 자기상관함수 그래프를 보고 모형식별을 판단하기가 힘들어지기 때문에 적절한 값의 선택이 중요하다. 위의 결과를 보면 1번째와 8번째 lag를 제외하고는 모두 신뢰구간안에 포함되어 있다. 

 그리고 acf함수와 pacf함수 모두 plot = FALSE 매개변수를 통해서 도식화되지 않은 수치로 확인해볼 수 있다.  이제 부분자기상관함수를 확인해보자.

 

# 부분자기상관함수 그래프
pacf(Nile.diff_2, lag.max=20)

# 부분자기상관함수 도표
pacf(Nile.diff_2, lag.max=20, plot = FALSE)

 

 부분자기상관함수는 pacf함수를 통해서 확인할 수 있다. 사용방법은 acf와 동일하다. 부분자기상관함수는 lag 1~8신뢰구간을 넘어 음의 값을 가지고 lag 9에서 절단이 된 것을 확인할 수 있다.  

 자기상관함수(ACF)와 부분자기상관함수(PACF)를 확인해 본 결과, 

- ARMA(8,0) 부분자기상관함수 그래프를 볼 때, lag 9에서 절단

- ARMA(0,1) 자기상관함수 그래프에서 lag 2에서 절단

 위의 결과처럼 단순 AR or MA로 모형을 나누기엔 결정하기가 좀 힘들다. 이처럼 어떤 모형을 선택해야할 지는 쉽지 않은 문제이다. ARMA(p,q)에서는 AR모형과 MA 모형을 혼합하여 모형을 식별하고 결정할 필요가 있다. 만약 모수가 많다면 설명력은 커질 것이다. 하지만 모형이 복잡하고 이해하기는 더 어려워진다. 그렇다고 모수가 너무 적으면 모형이 단순해서 이해력은 높아지나 설명력이 낮아질 수 밖에 없다. 그렇기에 항상 Trade-Off는 존재한다.

 


forecast 패키지의 auto.arima 함수 & 예측

 R에는 이러한 결정하기 힘든 ARIMA모형을 스스로 결정해주는 함수가 존재한다. 바로 forecast패키지에 존재하는 auto.arima함수이다.

간단한 실습을 통해 알아보자. 

#forecast packages
install.packages("forecast")
library(forecast)
#auto.arima function
auto.arima(Nile)

 위의 결과를 보면 자동적으로 ARIMA(1,1,1)을 선택한 것을 볼 수 있다. 이제 이를 이용하여 미래의 수치값을 예측해보자.

#arima 결과 1,1,1 대입
Nile.arima <- arima(Nile, order=c(1,1,1))
Nile.arima

#arima 결과를 활용한 forecast 예측
Nile.forecast <- forecast(Nile.arima, h = 10)
Nile.forecast

 결정된 ARIMA모형을 가지고 forecast 패키지의 forecast함수를 통해 미래의 수치값을 예측한 것이다. h=10은 10개년도를 예측한다는 뜻이다. 예측은 범위값으로 나온다. 그림을 통해보면 아래와 같다.

#arima 결과를 활용한 forecast 예측
plot(Nile.forecast)

  진한 파란선이 점추정과 같은 회귀선이고 가장 높은 옅은 파란 영역(80%)과 회색영역(95%)이 신뢰구간인 구간예측값이다.