자기상관함수(ACF) : 시차에 따른 일련의 자기상관
ACF는 시차에 따른 관측값 간의 연관 정도를 보여줌. 시차가 커질수록 ACF는 점차 0에 가까워짐. (멀리 떨어진 데이터일 수록 연관이 적다.) (10년전 키로 일주일후 키를 예측하는 것보다, 한달전 키로 일주일 후 키를 예측하는게 더 정확하다.)
정상 시계열의 ACF는 빠르게 0으로 접근(시간에 상관없기 때문) 비정상 시계열은 ACF는 천천히 감소하며 종종 큰 양수를 가질 수 도.
편자기상관(patial autocorrelation) : 시차가 다른 두 시계열 데이터 간의 순수한 상호 연관성 두 시점 사이의 값들은 무시
library(fpp2)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## ── Attaching packages ────────────────────────────────────────────── fpp2 2.4 ──
## ✓ ggplot2 3.3.5 ✓ fma 2.4
## ✓ forecast 8.16 ✓ expsmooth 2.3
##
head(goog200)
## Time Series:
## Start = 1
## End = 6
## Frequency = 1
## [1] 392.8300 392.5121 397.3059 398.0113 400.4902 408.0957
plot(goog200, main = "google stock prices")
library(forecast)
par(mfrow = c(1,2))
acf(goog200)
pacf(goog200)
ndiffs(goog200)
## [1] 1
diff_goog200 <- diff(goog200, lag = ndiffs(goog200))
head(diff_goog200)
## Time Series:
## Start = 2
## End = 7
## Frequency = 1
## [1] -0.317932 4.793823 0.705414 2.478882 7.605530 8.494751
par(mfrow = c(1,1))
plot(diff_goog200, main = "differencing google stock prices")
par(mfrow = c(1,2))
acf(diff_goog200)
pacf(diff_goog200)
#order = c(p, d, q)
goog200_arima = arima(goog200, order = c(1,1,1))
accuracy(goog200_arima)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.7230217 6.181976 3.718242 0.1482063 0.8397063 0.9939971
## ACF1
## Training set -0.003668023
goog200_arima_auto = auto.arima(goog200)
goog200_arima_auto
## Series: goog200
## ARIMA(0,1,0) with drift
##
## Coefficients:
## drift
## 0.6967
## s.e. 0.4373
##
## sigma^2 = 38.25: log likelihood = -644.45
## AIC=1292.91 AICc=1292.97 BIC=1299.5
goog200_pred = forecast(goog200_arima, h = 10)
goog200_pred
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 201 531.1189 523.1765 539.0612 518.9721 543.2656
## 202 531.2460 520.3168 542.1752 514.5313 547.9607
## 203 531.2010 517.8539 544.5481 510.7884 551.6136
## 204 531.2169 515.8542 546.5796 507.7217 554.7122
## 205 531.2113 514.0598 548.3628 504.9804 557.4422
## 206 531.2133 512.4455 549.9811 502.5104 559.9162
## 207 531.2126 510.9561 551.4691 500.2330 562.1922
## 208 531.2128 509.5702 552.8555 498.1132 564.3125
## 209 531.2127 508.2674 554.1581 496.1208 566.3047
## 210 531.2128 507.0348 555.3908 494.2357 568.1898
plot(goog200_pred, lwd = 2, lty = 3, flwd = 0.1, shadecols = c("royalblue","red"),main = "forecast google stock")
goog200_pred = forecast(goog200_arima_auto, h = 10)
goog200_pred
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 201 532.1750 524.2492 540.1008 520.0535 544.2965
## 202 532.8717 521.6629 544.0805 515.7293 550.0141
## 203 533.5684 519.8405 547.2964 512.5734 554.5635
## 204 534.2652 518.4135 550.1168 510.0222 558.5082
## 205 534.9619 517.2392 552.6846 507.8574 562.0664
## 206 535.6586 516.2444 555.0728 505.9671 565.3501
## 207 536.3553 515.3856 557.3251 504.2849 568.4258
## 208 537.0521 514.6345 559.4697 502.7673 571.3368
## 209 537.7488 513.9713 561.5263 501.3843 574.1133
## 210 538.4455 513.3819 563.5092 500.1140 576.7771
plot(goog200_pred, lwd = 2, lty = 3, flwd = 0.1, shadecols = c("royalblue","red"),main = "forecast google stock, by auto ")
Quiz : 정상적 시계열이 중요한 이유?!
추세 또는 계절성이 포함된 비정상적 시계열은 적절한 차분을 통하여 정상적 시계열로 바꿀 수 있음
curve(log(x),from = 1, to = 100)