시계열 분석
- 시간의 흐름에 따라 관찰된 값들을 시계열 자료라 함
- 시계열 분석은 시간을 고려한 회귀분석이다.
정상성
- 시간에 따라 확률적인 성분이 변하지 않는다는 가정
- 정상성이란 시계열 분석에 기초가 되는 개념이다
- 공분산은 단지 시차에만 의존하고 실제 어느 시점 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가지로 분류됨.
- 추세 요인(Trend Factor) : 자료의 그림을 그렸을 때 그 형태가 오르거나 또는 내리는 추세를 따르는 경우.
- 계절 요인(Seasonal factor): 요일마다 반복되거나 일년 중 각 월에 의한 변화, 사분기 자료에서 각 분기에 의한 변동 등 고정 주기에 따라 자료가 변화되는 경우.
- 순환 요인(Cyclical factor) : 명백한 경제적이나 자연적인 이유가 없이 알려지지 않은 주기를 가지고 변화하는 자료.
- 불규칙요인(Irregular factor) : 위 세 가지의 요인으로 설명할 수 없는 회귀 분석에서 오차에 해당하는 요인을 불규칙요인이라 함.
시계열 모형
- 자기회귀 모형(AR모형)
- p 시점 전의 자료가 현재 자료에 영향을 주는 자기회귀모형(autoregressive model 이하 AR(p)) 모형이라 함.
- 자기회귀모델의 경우, 데이터는 그 데이터 자신의 과거의 값 외에 잡음이 섞여 데이터가 결정되어 있다고 보는 것에서 시작됨
- p가 차수를 의미한다. 1차 자기회귀 모형은 p가 1까지, 2차 자기회귀 모형은 p가 2까지 존재
- 이동평균 모형(MA모형)
- 시계열 자료를 모형화 하는데 자귀회귀모형 외에 많이 사용되는 모형이 이동평균 모형(Moving average model)
- 자기회귀누적이동평균모형(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()는 데이터를 시계열 자료로 변환해주는 함수이다.
- 차분 : diff()함수를 사용
- ARIMA(p,d,q) 에서, d는 차분을 몇번 수행했냐를 의미한다.
- diff(data, differences=n ) - 여기서 n은 몇번 차분할지 정의한다.
- 만약 diff(data, differences=2) 를 수행한 data는 ARIMA(p,2,q)가 된다.
- 차분을 통해 정상성을 만족시키는 것이 diff()를 사용하는 목적이다.
- ARIMA 모델 ex) arima(data, order=c(p,d,q))
- p,d,q에 숫자 입력
- 만약 arima(1,2,1)를 수행해야한다면, arima(data, order=c(1,2,1))로 arima모델을 만들 수 있다.
- auto.arima
- arima모델의 p,d,q의 숫자를 찾아주는 함수
- 예를 들어, auto.arima(data)를 입력하면 가장 최적의 arima모델을 추천해준다
- 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
반응형