Pada Learn by Building terkait Time Series and Forecasting ini, data yang digunakan adalah jumlah penumpang bulanan dari US Airline tahun 1949 sampai tahun 1960, pada alamat berikut ini: https://www.kaggle.com/chirag19/air-passengers.
Objek Time Series yang akan diamati adalah jumlah penumpang tahunan. Selanjutnya dibuat beberapa model time series dan forecasting dan dipilih model terbaik.
Membaca dan melihat struktur data.
passenger <- read.csv("AirPassengers.csv")
str(passenger)
## 'data.frame': 144 obs. of 2 variables:
## $ Month : Factor w/ 144 levels "1949-01","1949-02",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ X.Passengers: int 112 118 132 129 121 135 148 148 136 119 ...
Merubah kelas data Month menjadi kelas Date.
passenger$Month <- ymd(paste(passenger$Month,"-01",sep=""))
head(passenger)
## Month X.Passengers
## 1 1949-01-01 112
## 2 1949-02-01 118
## 3 1949-03-01 132
## 4 1949-04-01 129
## 5 1949-05-01 121
## 6 1949-06-01 135
Melihat apakah ada missing value.
anyNA((passenger))
## [1] FALSE
Membuat objek time series dan melihat plot-nya.
pass_ts <- ts(passenger$X.Passengers,
start = range(passenger$Month)[[1]],
frequency = 12)
autoplot(pass_ts)
Dari plot di atas, dapat dilihat bahwa data bertipe Multiplcative, sehingga dilakuan transformasi log() untuk merubah tipe menjadi Additive.
pass_ts_log <- log(pass_ts)
autoplot(pass_ts_log)
Melihat komponen dari objek time series yang telah dibuat.
autoplot(decompose(pass_ts_log))
Dari plot di atas, dapat dilihat bahwa objek time series tersebut memiliki Trend dan Seasonal.
Membagi data menjadi data train dan test.
train <- pass_ts_log %>% head(-12)
test <- pass_ts_log %>% tail(12)
Karena objek time series memiliki Trend dan Seasonal, maka dibuat model Holtwinter(), dan dilihat error yang dihasilkan.
pass_hw <- HoltWinters(train)
MAPE(pass_hw$fitted[,1], train)
## [1] 0.005368002
Mean Average Percentage Error (MAPE) yang dihasilkan pada data train sangat kecil, yaitu 3.94%.
Berikut ini forecast untuk 12 data ke depan.
pass_hw_forecast <- forecast(pass_hw, h = 12)
MAPE(pass_hw_forecast$mean, test)
## [1] 0.005725939
Mean Average Percentage Error (MAPE) yang dihasilkan pada data test juga sangat kecil, yaitu 0.57%.
Berikut ini plot antara forecast dan data test.
autoplot(pass_hw_forecast)+
autolayer(test)
pass_arima <- auto.arima(train, seasonal = T)
MAPE(pass_arima$fitted, train)
## [1] 0.004738142
Mean Average Percentage Error (MAPE) yang dihasilkan pada data train lebih kecil dari model Holtwinter(), yaitu 0.47%.
Berikut ini forecast untuk 12 data ke depan.
pass_arima_forecast <- forecast(pass_hw, h = 12)
MAPE(pass_arima_forecast$mean, test)
## [1] 0.005725939
Mean Average Percentage Error (MAPE) yang dihasilkan pada data test juga sangat kecil, yaitu 0.57%.
Berikut ini plot antara forecast dan data test.
autoplot(pass_arima_forecast)+
autolayer(test)
Hipotesis untuk uji ini adalah:
H0: Residual menyebar normal H1: Residual menyebar tidak normal
Berikut ini test yang dilakukan.
shapiro.test(pass_hw$x - pass_hw$fitted[,1])
##
## Shapiro-Wilk normality test
##
## data: pass_hw$x - pass_hw$fitted[, 1]
## W = 0.98189, p-value = 0.1066
shapiro.test(pass_arima$x - pass_arima$fitted)
##
## Shapiro-Wilk normality test
##
## data: pass_arima$x - pass_arima$fitted
## W = 0.988, p-value = 0.3065
Baik pada model Holt-Winters dan model Seasonal ARIMA, p-value > alpha (0.05), sehingga H0 diterima (residual menyebar normal).
Hipotesis untuk uji ini adalah:
H0: Residual tidak ada autokorelasi H1: Residual ada autokorelasi
Berikut ini test yang dilakukan.
Box.test(pass_hw$x - pass_hw$fitted[,1], type = "Ljung-Box")
##
## Box-Ljung test
##
## data: pass_hw$x - pass_hw$fitted[, 1]
## X-squared = 9.9121, df = 1, p-value = 0.001642
Box.test(pass_arima$x - pass_arima$fitted, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: pass_arima$x - pass_arima$fitted
## X-squared = 0.002904, df = 1, p-value = 0.957
Pada model pada model Holt-Winters, p-value < alpha (0.05), sehingga H0 ditolak (Residual ada autokorelasi).
Sedangkan pada model Seasonal ARIMA, p-value > alpha (0.05), H0 diterima(Residual tidak ada autokorelasi).
Jadi model yang memenuhi ke-dua asumsi adalah Seasonal ARIMA.