Rumusan Masalah

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.

Praproses Data

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

Time Series Object

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)

Decompose

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.

Cross Validation

Membagi data menjadi data train dan test.

train <- pass_ts_log %>% head(-12)
test <- pass_ts_log %>% tail(12)

Model Time Series and Forecasting

Model Holt-Winter

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%.

Holt-Winter Forecasting

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)

Seasonal ARIMA

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%.

Seasonal ARIMA Forecasting

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)

Uji Asumsi

1. Residual Menyebar Normal

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).

2. Autocorrelation

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.

Kesimpulan

  1. Data jumlah penumpang bulanan dari US Airline tahun 1949 sampai tahun 1960, dengan frequency amatan 12 (tahunan), memiliki Trend dan Seasonal.
  2. Model Holt-Winters dan Seasonal ARIMA, sama - sama menghasilkan error (MAPE) yang sangat kecil, sehingga baik digunakan untuk data Time Series ini.
  3. Model Seasonal ARIMA memenuhi kedua uji asumsi (residual menyebar normal dan resudual tidak ada autokorelasi), sedangkan model Holt-Winters hanya memenuhi asumsi residual menyebar normal.