티스토리 뷰

R

(macOS)[R] 시계열 예측 : 실습 - 2

jinozpersona 2022. 4. 19. 21:55

INTRO

forecast package : auto.arima, forecast

R console> install.packages.("forecast")

 

시계열 자료 분석 및 모형 예측

[예제] 1871~1970년 아스완 댐에서 측정한 나일강의 연간 유입량 시계열 데이터

test_time_series_analysis.R
rm(list=ls())
library(forecast)
library(TTR)

## Nile time-series data
Nile
str(Nile)
class(Nile)
mode(Nile)
summary(Nile)

par(mfrow=c(1,1))
plot(Nile)

출력결과

> ## Nile time-series data
> Nile
Time Series:
Start = 1871 
End = 1970 
Frequency = 1 
  [1] 1120 1160  963 1210 1160 1160  813 1230 1370 1140  995  935 1110  994
 [15] 1020  960 1180  799  958 1140 1100 1210 1150 1250 1260 1220 1030 1100
 [29]  774  840  874  694  940  833  701  916  692 1020 1050  969  831  726
 [43]  456  824  702 1120 1100  832  764  821  768  845  864  862  698  845
 [57]  744  796 1040  759  781  865  845  944  984  897  822 1010  771  676
 [71]  649  846  812  742  801 1040  860  874  848  890  744  749  838 1050
 [85]  918  986  797  923  975  815 1020  906  901 1170  912  746  919  718
 [99]  714  740

> str(Nile)
 Time-Series [1:100] from 1871 to 1970: 1120 1160 963 1210 1160 1160 813 1230 1370 1140 ...

> class(Nile)
[1] "ts"

> mode(Nile)
[1] "numeric"

> summary(Nile)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  456.0   798.5   893.5   919.4  1032.5  1370.0 

> par(mfrow=c(1,1))

> plot(Nile)

Smoothing Method : Simple Moving Average method를 이용한 Data 시각화

test_time_series_analysis.R
...

# SMA : Simple Moving Average method
Nile.sma3  = SMA(Nile, n = 3)
Nile.sma5  = SMA(Nile, n = 5)
Nile.sma10 = SMA(Nile, n = 10)

par(mfrow=c(2,2))
plot(Nile,       main="Original data by 1-years periodic")
plot(Nile.sma3,  main="Smothing by 3-years periodic")
plot(Nile.sma5,  main="Smothing by 5-years periodic")
plot(Nile.sma10, main="Smothing by 10-years periodic")

출력결과

 

 

차분을 이용한 비정상성 시계열 자료 정상화

test_time_series_analysis.R
...

# diff
Nile.diff1 = diff(Nile,differences=1)
Nile.diff2 = diff(Nile,differences=2)
Nile.diff3 = diff(Nile,differences=3)

par(mfrow=c(2,2))
plot(Nile)
plot(Nile.diff1)
plot(Nile.diff2)
plot(Nile.diff3)

출력결과

 

자기상관함수/부분자기상관함수 분석

test_time_series_analysis.R
...

# ACF
par(mfrow=c(2,2))
acf(Nile, lag.max=20)
acf(Nile.diff1, lag.max=20)
acf(Nile.diff2, lag.max=20)
acf(Nile.diff3, lag.max=20)

# Partial ACF
par(mfrow=c(2,2))
pacf(Nile, lag.max=20)
pacf(Nile.diff1, lag.max=20)
pacf(Nile.diff2, lag.max=20)
pacf(Nile.diff3, lag.max=20)

출력결과

d = 1의 경우

PACF : Lag=3 or Lag=11 부터 임계치 안에 있다고 볼 수 있으나 Lag=2로 판단, p = 1

ACF   : Lag=9 부터 임계치 안에 있음, q = 8

-> ARIMA(1,1,8)

 

d = 2의 경우

PACF : Lag=9 부터 임계치 안에 있음, p = 8

ACF   : Lag=2 or Lag=9 부터 임계치 안에 있다고 볼 수 있으나 Lag=2로 판단, q = 1

-> ARIMA(8,2,1)

 

forecast package의 auto.arima 함수 사용하여 ARIMA Model 분석

test_time_series_analysis.R
...

auto.arima(Nile)
auto.arima(Nile.diff1)
auto.arima(Nile.diff2)
auto.arima(Nile.diff3)

출력결과

...

> ## auto.arima
> auto.arima(Nile)
Series: Nile 
ARIMA(1,1,1) 

Coefficients:
         ar1      ma1
      0.2544  -0.8741
s.e.  0.1194   0.0605

sigma^2 = 20177:  log likelihood = -630.63
AIC=1267.25   AICc=1267.51   BIC=1275.04

> auto.arima(Nile.diff1)
Series: Nile.diff1 
ARIMA(1,0,1) with zero mean 

Coefficients:
         ar1      ma1
      0.2544  -0.8741
s.e.  0.1194   0.0605

sigma^2 = 20177:  log likelihood = -630.63
AIC=1267.25   AICc=1267.51   BIC=1275.04

> auto.arima(Nile.diff2)
Series: Nile.diff2 
ARIMA(5,0,0) with zero mean 

Coefficients:
          ar1      ar2      ar3      ar4      ar5
      -1.2286  -1.1253  -0.8620  -0.6070  -0.2993
s.e.   0.0965   0.1450   0.1632   0.1467   0.0992

sigma^2 = 29842:  log likelihood = -642.4
AIC=1296.79   AICc=1297.72   BIC=1312.3

> auto.arima(Nile.diff3)
Series: Nile.diff3 
ARIMA(5,0,0) with zero mean 

Coefficients:
          ar1      ar2      ar3      ar4      ar5
      -1.7318  -1.9023  -1.5768  -1.0222  -0.4343
s.e.   0.0919   0.1701   0.2034   0.1733   0.0974

sigma^2 = 47208:  log likelihood = -658.97
AIC=1329.93   AICc=1330.87   BIC=1345.38

 

 

fitting by auto.arima & my_arima

test_time_series_analysis.R
...

## fitting
# auto.arima : Arima(1,1,1)
Nile.auto_arima <- arima(Nile, order=c(1,1,1))
# auto.arima_diff1 : Arima(1,0,1)
Nile.auto_arima_diff1 <- arima(Nile.diff1, order=c(1,0,1))

# myARIMA(1,1,8)
Nile.my1_arima <- arima(Nile, order=c(1,1,8))
# myARIMA(8,2,1)
Nile.my2_arima <- arima(Nile, order=c(8,2,1))


## forecast
Nile.forecast_1 <- forecast(Nile.auto_arima, h=20)
Nile.forecast_2 <- forecast(Nile.auto_arima_diff1, h=20)
Nile.forecast_3 <- forecast(Nile.my1_arima, h=20)
Nile.forecast_4 <- forecast(Nile.my2_arima, h=20)

par(mfrow=c(2,2))
plot(Nile.forecast_1)
plot(Nile.forecast_2)
plot(Nile.forecast_3)
plot(Nile.forecast_4)

출력결과

수동으로 분석한 ARIMA Model과 자동으로 분석한 auto.arima Model을 비교하여 향후 20년 데이터를 예측해 본다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함