Data Analysis & ML/시계열분석

[시계열분석] R을 활용한 시계열 분석(정상성 판단)

YSY^ 2020. 12. 24. 20:51

시계열 분석

  • 시간의 흐름에 따라 관찰된 값들을 시계열 자료라 함
  • 시계열 분석은 시간을 고려한 회귀분석이다.

정상성

  • 시간에 따라 확률적인 성분이 변하지 않는다는 가정
  • 정상성이란 시계열 분석에 기초가 되는 개념이다
  • 공분산은 단지 시차에만 의존하고 실제 어느 시점 t,s에는 의존하지 않는다.
  • 따라서 비정상 시계열은 시간대에 따라 데이터가 변하고 추세와 시간대를 갖는다.
  • 시계열은 series 데이터 형태로 불러와야 한다.

정상성 시계열 자료로 변환

  • 비정상성 시계열 데이터를 정상성 시계열로 바꾸는 방법은 두 가지가 있다.
    (1) 차분(diff) : 평균이 일정하지 않은 시계열을 정상화하는 방법으로, 현 시점 자료에서 전 시점 자료를 빼는 것
    • 일반차분(regular difference) : 바로 전 시점의 자료를 빼는 방법
    • 계절차분(seasonal difference) : 여러 시점 전의 자료를 빼는 방법 (주로 계절성을 갖는 자료의 정상화에 사용)
    • 함수 : diff(data, lag=k, diff=d) : 지연차수 k 및 차분차수 d의 차분을 수행 (k와d의 default값은 0)
      (2) 로그변환(log) : 시계열 자료를 로그함수로 변환하여 정상화하는 방법으로, 반드시 "차분" 전에 진행되어야 한다.
  • tseries 패키지에 내장되어 있는 adf.test 함수로 시계열이 정상성 시계열인지 확인한다.
  • p-value가 유의수준 0.05 하에서 로그변환 후 차분한 데이터셋은 정상성 시계열이라고 할 수 있다.

분해 시계열

  • 분해 시게열이란 시계열에 영향을 주는 일반적인 요인을 시계열에서 분리해 분석하는 방법이며 회귀분석적인 방법을 주로 사용함.
  • 시계열을 구성하는 요소는 4가지로 분류됨.
    1. 추세 요인(Trend Factor) : 자료의 그림을 그렸을 때 그 형태가 오르거나 또는 내리는 추세를 따르는 경우.
    2. 계절 요인(Seasonal factor): 요일마다 반복되거나 일년 중 각 월에 의한 변화, 사분기 자료에서 각 분기에 의한 변동 등 고정 주기에 따라 자료가 변화되는 경우.
    3. 순환 요인(Cyclical factor) : 명백한 경제적이나 자연적인 이유가 없이 알려지지 않은 주기를 가지고 변화하는 자료.
    4. 불규칙요인(Irregular factor) : 위 세 가지의 요인으로 설명할 수 없는 회귀 분석에서 오차에 해당하는 요인을 불규칙요인이라 함.

시계열 모형

  1. 자기회귀 모형(AR모형)
    • p 시점 전의 자료가 현재 자료에 영향을 주는 자기회귀모형(autoregressive model 이하 AR(p)) 모형이라 함.
    • 자기회귀모델의 경우, 데이터는 그 데이터 자신의 과거의 값 외에 잡음이 섞여 데이터가 결정되어 있다고 보는 것에서 시작됨
    • p가 차수를 의미한다. 1차 자기회귀 모형은 p가 1까지, 2차 자기회귀 모형은 p가 2까지 존재
  2. 이동평균 모형(MA모형)
    • 시계열 자료를 모형화 하는데 자귀회귀모형 외에 많이 사용되는 모형이 이동평균 모형(Moving average model)
  3. 자기회귀누적이동평균모형(ARIMA(p,d,q) 모형)
    • 자기회귀누적이동평균모형(Autoregressive integrated moving average model, ARIMA(p,d,q))은 가장 일반적인 모형임.
    • ARIMA 모형은 비정상 시계열 모형임.
    • AR모형과 MA모형을 합쳐 ARIMA모형으로 정상화할 수 있음.
    • ARIMA(p,d,q)모형은 차수 p,d,q의 값에 따라 다른이름으로 불린다.
      • p는 AR모형과 관련이 있음
      • q는 MA모형과 관련이 있음
        • 만약 d=0이면, ARMA(p,q)모형이라 부르고 이 모형은 정상성을 만족한다.
        • 만약 p=0이면, IMA(d,q)모형이라 부르고 d번 차분하면 MA(q)모형을 따르게 된다.
        • 만약 q=0이면, ARI(p,d)모형이라 부르며,d번 차분하면 AR(p)모형을 따르게 된다.

ARIMA모델 실습에 사용되는 함수

  • ts()는 데이터를 시계열 자료로 변환해주는 함수이다.
  1. 차분 : diff()함수를 사용
    • ARIMA(p,d,q) 에서, d는 차분을 몇번 수행했냐를 의미한다.
    • diff(data, differences=n ) - 여기서 n은 몇번 차분할지 정의한다.
    • 만약 diff(data, differences=2) 를 수행한 data는 ARIMA(p,2,q)가 된다.
    • 차분을 통해 정상성을 만족시키는 것이 diff()를 사용하는 목적이다.
  2. ARIMA 모델 ex) arima(data, order=c(p,d,q))
    • p,d,q에 숫자 입력
    • 만약 arima(1,2,1)를 수행해야한다면, arima(data, order=c(1,2,1))로 arima모델을 만들 수 있다.
  3. auto.arima
    • arima모델의 p,d,q의 숫자를 찾아주는 함수
    • 예를 들어, auto.arima(data)를 입력하면 가장 최적의 arima모델을 추천해준다
  4. forecast 함수를 활용하여 미래를 예측하는 함수, forecast.Arima()
    • forecast.Arima(data) 를 입력한 후 plot.forecast(forecast.Arima(data)를 하면 데이터를 예측하는 그래프를 보여준다.

R을 활용한 시계열 분석 (Nile Data)

library(TTR)
plot(Nile)

 

  • 정상성을 만족하지 못한다.
plot(log(Nile),main='var data')
  • 분산도 등분산성을 만족하지 못한다.
# 1회 차분
Nile.diff_1 <- diff(Nile, differences = 1) #diff(ts, differences = d-횟수)를 사용하면, 원하는 d만큼 차분이 가능하다. 
plot(Nile.diff_1, main='diff 1 data')
# 2회 차분
Nile.diff_2 <- diff(Nile, differences = 2)
plot(Nile.diff_2, main='diff 2 data')
# 분산 차분실시
plot(diff(log(Nile), differences = 2))

 

  • 정상성을 만족한다.

자기상관함수 그래프(MA) - 이동평균 모형(MA모형)

acf(Nile.diff_2, lag.max = 20)
acf(Nile.diff_2, lag.max = 20, plot=FALSE) #

 

  • lag 1에서 절단면을 갖는다. MA(1)모형이다.

부분자기상관함수 그래프(AR) 자기회귀 모형(AR모형)

pacf(Nile.diff_2, lag.max=20)
pacf(Nile.diff_2, lag.max=20, plot = FALSE)  

 

  • lag 8에서 절단면을 갖는다. AR(8)모형이다.

Auto.Arima분석

auto.arima(Nile) #(1,1,1)

Nile.arima <- arima(Nile, order=c(1,1,1))
Nile.arima

 

시계열 예측(forecast)

install.packages("forecast")
library(forecast)

Nile.forecast <- forecast(Nile.arima, h=10)
Nile.forecast

plot(Nile.forecast)

 

검증

length(Nile) #100
train <- subset(Nile, end=length(Nile)-21)
test <- subset(Nile, start = length(Nile)-20) #test 20%

# 2회차분
train.diff_2 <- diff(train, differences = 2)
plot(train.diff_2)
# acf
acf(train.diff_2, lag.max = 20)
fit1 <- Arima(train, order=c(0,2,1))

fit1 %>% forecast(h=20) %>% autoplot() + autolayer(test) #h=20 
# pacf
pacf(train.diff_2, lag.max = 20)
fit2 <- Arima(train, order=c(0,2,7))
fit2 %>% forecast(h=20) %>% autoplot() + autolayer(test) #h=20 
# auto.arima
auto.arima(train)
fit3 <- auto.arima(train)
fit3 %>% forecast(h=20) %>% autoplot() + autolayer(test) #h=20 
# 테스트 적용
nile.test1 <- Arima(test, model=fit1)
accuracy(nile.test1)

nile.test2 <- Arima(test, model=fit2)
accuracy(nile.test2)

nile.test3 <- Arima(test, model=fit3)
accuracy(nile.test3)

 

728x90
반응형