ARIMA (Autoregressive Integrated Moving Average)

ARIMA adalah gabungan antara dua metode, yaitu Auto Regressive (AR) dan Moving Average (MA). I nya menjelaskan Integrated. Tujuan utama dari ARIMA adalah melakukan autocorrelation pada data.

Stasionarity

Stasionarity time series memiliki arti bahwa pada data time series yang kita miliki tidak memiliki trend maupun seasonal dan memiliki variansi konstan[^4]. Apabila data yang kita miliki belum stasioner, maka kita bisa melakukan differencing.

Differencing

Jadi untuk membuat datanya stasioner, cara yang paling umum digunakan adalah dengan melakukan differencing diff, yaitu mengurangi data saat ini dengan data sebelumnya[^5]. Terkadang, tergantung pada kompleksitas data, jumlah differencing bisa lebih dari 1 kali.

Ide utama melakukan differencing adalah agar ketika melakukan prediksi, tidak ada multicolinearity terhadap data-data sebelumnya.

Model ARIMA:

ARIMA(p,d,q)

AR(p) : Auto Regressive

Auto regressive di ARIMA artinya kita membuat model linear regression berdasarkan lag dari datanya sebagai prediktor[^6]. Linear regression models, baik ketika prediktornya tidak ada korelasi dan independen satu dengan lainnya. Nilai p berarti berapa banyak data yang akan dipakai ketika melakukan auto regressive.

Model autoregressive dapat dituliskan sebagai berikut.

Yt = α + β1Yt − 1 + β2Yt − 2 + ... + βpYt − p + ϵ1

dimana, Yt − 1 adalah lag1, β1 adalah coefficient dari lag1, dan α adalah intercept.

MA(q) : Moving Average

Moving Average dalam ARIMA artinya kita melakukan rata-rata berjalan terhadap data time series itu sendiri[^7].

Moving Average Model (MA model).

Yt = α + ϵt + ϕ1ϵt − 1 + ϕ2ϵt − 2 + ... + ϕqϵt − q

Arima memiliki bentuk model (p,d,q) dimana[^8] :

  • Auto Regressive -> AR(p)
    AR ini mirip dengan regresi linear, hanya saja dia melakukan regresi terhadap dirinya sendiri. Nilai p berarti berapa banyak data yang akan dipakai ketika melakukan auto regressive.

Untuk mencari order p untuk model AR, kita dapat melihat dari plot PACF (Partial Autocorrelation Function).

  • Integrated -> I(d)
    Integrated adalah berapa kali data dilakukan differencing untuk membuat suatu data stationer. Nilai d dapat diketahui dengan mencari tahu berapa kali differencing yang dilakukan pada data.

  • Moving Average -> MA(q)
    MA digunakan untuk melakukan smoothing error. Nilai q berarti berapa banyak data yang diperlukan untuk smoothing error menggunakan moving average.

Untuk mencari order q untuk model MA, kita dapat melihat dari plot ACF (Auto correlation Function)

Studi Kasus

Peramalan akan dilakukan terhadap data Penjualan motor YAMAHA Tahun 2018 menggunakan model ARIMA terbaik

Eksplorasi Data Analyst

# read data 
data=read.csv(file.choose(),header=TRUE,sep=";")
head(data)
# cek apakah ada atau tidaknya NA
data %>% 
  anyNA()
> [1] FALSE
# Cek seberapa banyak jumlah NA pada masing-masing kolom
data %>% 
  is.na() %>% 
  colSums()
>             t periode.tahun         Honda        Yamaha        Suzuki 
>             0             0             0             0             0 
>      Kawasaki 
>             0

Analisis Time Series

Membuat Object Time series

yamaha_ts <- ts(data = data$Yamaha, start = c(2009), frequency = 12)
yamaha_ts
>         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct
> 2009 185900 188047 186286 221016 217867 204735 214136 223222 212012 207671
> 2010 162135 180723 196695 189082 206992 218614 250483 279054 187904 279049
> 2011 239340 250894 269041 308418 272825 298708 303118 316447 208690 315060
> 2012 277686 243810 319686 288779 281952 243771 312506 284719 276284 253281
> 2013 206704 258481 247103 236185 201589 167661 185783 134020 208849 233849
> 2014 203051 202102 217817 217820 222693 214998 229554 152940 216419 231552
> 2015 173502 214532 226897 242330 237586 235120 172377 182829 209767 190618
> 2016 140243 150840 145609 139978 150745 191965 124875 169277 158101 131463
> 2017 112124 139235 108416 120158 112145 127224  91015 123972 119717 114493
> 2018  94117  93511  98040 101908 122186 105133 120608 123620              
>         Nov    Dec
> 2009 210231 194423
> 2010 249364 250897
> 2011 295731 248108
> 2012 230150 133431
> 2013 213891 139809
> 2014 220744 163606
> 2015 130200 158044
> 2016 125472 170062
> 2017 107501 118078
> 2018

Pengecekan Object Time Series

Stasioner adalah data yang bergerak disekitar rata-rata globalnya.

Visualisasi Object

ts.plot(yamaha_ts, main ="Plot Data Yamaha")

Karena datanya terdapat trend menurun, artinya data belum stasioner, perlu distasionerkan

Decomposition

Decomposition adalah suatu tahapan dalam time series analisis yang digunakan untuk menguraikan beberapa komponen dalam time series data.

💡 Komponen dalam time series :

  • Trend : pola data secara general, cenderung untuk naik atau turun. Jika ada trend masih terdapat pola artinya masih ada pola yang belum terurai dengan baik.
  • Seasonal : pola musiman yang membentuk pola berulang pada periode waktu yang tetap
  • Error/Reminder/Random : pola yang tidak dapat ditangkap dalam trend dan seasonal

Untuk dapat menguraikan data time series kita menjadi 3 komponen tersebut, kita dapat menggunakan fungsi decompose().

Memvisualisasikan hasil decompose menggunakan autoplot() dari package forecast

# autoplot
yamaha_decom <- decompose(x = yamaha_ts)
yamaha_decom %>% autoplot()

Pada hasil decompose kita mendapatkan informasi visualisasi:

  1. Data : pola data asli
  2. Seasonal (S) : terdapat seasonality
  3. Trend (T) : terdapat trend naik pada tahun 2010-2012, namun pada tahun 2013-2018 terjadi penurunan
  4. Remainder (E) : pola data yang tidak dapat ditangkap oleh seasonal dan trend

Splitting Data

Test data : sisanya Train data : diambil 8 tahun pertama

yamaha_train <- head(yamaha_ts, 9*12)
yamaha_test <- tail(yamaha_ts, -length(yamaha_train))

Pengujian Stasioner

  • Melakukan pengujian menggunakan adf.test()

H0: data tidak stasioner

H1: data stasioner

adf.test(yamaha_train)
> 
>   Augmented Dickey-Fuller Test
> 
> data:  yamaha_train
> Dickey-Fuller = -2.1949, Lag order = 4, p-value = 0.4958
> alternative hypothesis: stationary

Dengan alpha = 5%, p-value > alpha artinya gagal tolak H0, artinya data belum stasioner.

Differencing Data

  • Mencoba melakukan pengujian data yamaha_ts dengan satu kali differencing
yamaha.diff1=diff(yamaha_train,1)
ts.plot(yamaha.diff1, main="Plot Data Differens")

adf.test(yamaha.diff1)
> 
>   Augmented Dickey-Fuller Test
> 
> data:  yamaha.diff1
> Dickey-Fuller = -7.119, Lag order = 4, p-value = 0.01
> alternative hypothesis: stationary

Dengan alpha = 5%, p-value < alpha artinya tolak H0, artinya data sudah stasioner.

Data kita perlu dilakukan differencing 1x hingga dia stasioner.

ARIMA(p,d,q)

d -> diperoleh dari hasil berapa kali melakukan differencing = 1

Artinya nilai d pada ARIMA(p,d,q) = 1

Model Fitting

  • melakukan tunning model untuk p, d, dan q nya menggunakan acf dan pacf

p = melihat lag yang keluar dari plot PACF (partial autocorrelation function) q = melihat lag yang keluar dari plot ACF (autocorrelation function)

ACF untuk melihat korelasi suatu data dengan mempertimbangkan data tengahnya. misal ingin melihat korelasi hari senin dengan hari rabu, kita harus mempertimbangkan:

  • korelasi hari senin - selasa
  • korelasi hari senin - rabu
  • korelasi hari selasa - rabu

PACF untuk melihat korelasi data tanpa mempertimbangkan data tengahnya. misal ingin melihat korelasi hari senin dengan rabu, cukup melihat nilai korelasi hari senin - rabu saja

Melihat plot pacf dan acf untuk menemukan nilai p dan `q

yamaha.diff1 %>% tsdisplay()

model_yamaha1<- Arima(yamaha_train, order = c(2,1,0))
model_yamaha2<- Arima(yamaha_train, order = c(0,1,1))

Goodness of Fit

Untuk pemilihan model terbaik kita bisa melihat nilai AIC dari masing-masing model yang paling kecil

model_yamaha1$aic
> [1] 2540.472
model_yamaha2$aic
> [1] 2531.169

Forecasting

# forecast
length(yamaha_test)
> [1] 8
yamaha_forecast <- forecast(model_yamaha2, h =8)

Visualisasi

# menggunakan autoplot dan autolayer
yamaha_train %>% 
  autoplot()+
  autolayer(yamaha_test)+
  autolayer(yamaha_forecast$mean)

Model Evaluation

  • Bisa menggunakan fungsi accuracy() dari package forecast untuk melihat MAPE
# accuracy
accuracy(model_yamaha2$fitted, yamaha_train)
>                 ME     RMSE      MAE      MPE     MAPE       ACF1 Theil's U
> Test set -1870.909 32310.72 23952.57 -3.58503 12.90323 0.02491334 0.7811886
accuracy(yamaha_forecast$mean, yamaha_test)
>                 ME     RMSE      MAE       MPE     MAPE      ACF1 Theil's U
> Test set -7502.471 14136.45 12936.34 -8.298467 12.74026 0.3791575  1.192581

Dengan melihat nilai MAPE dapat disimpulkan bahwa model sama - sama memiliki erorr sebesar 12%.

Uji Asumsi

Asumsi pada time series diujikan untuk mengukur apakah residual yang peroleh dari hasil modeling sudah cukup baik untuk menggambarkan dan menangkap informasi pada data. Mengapa menggunakan residual data? Karena dengan menggunakan residual data, kita dapat mendapatkan informasi dari data aktual maupun dari hasil prediksi menggunakan model. Metode forecasting yang baik menghasilkan nilai residual berikut ini[^11]:

  1. Residual yang tidak berkorelasi. Apabila terdapat residual yang berkorelasi, artinya masih terdapat informasi yang tertinggal yang seharusnya digunakan untuk menghitung hasil forecast.
  2. Residual memiliki rata-rata 0.

Uji Autokorelasi

H0: residual has no-autocorrelation

H1: residual has autocorrelation

yang diinginkan p-value > 0.05 (alpha), no-autocorrelation

Untuk mengecek ada/tidaknya autokorelasi pada hasil forecasting time series bisa menggunakan beberapa cara, yaitu:

  • Menggunakan visualisasi plot residual acf dengan fungsi acf(residual model)
# menggunakan visualisasi
acf(model_yamaha2$residuals)

Untuk mengetahui ada atau tidaknya autocorrelation, kita lihat dari lag 1 - terakhir tidak ada yang keluar garis putus-putus. Berdasarkan acf residual model, masih ada lag yang keluar garis putus-putus, bisa saja ada indikasi bahwa model yang dimiliki terdapat autocorrelation

  • Melakukan uji Ljung-box dengan menggunakan fungsi Box.test(residual model, type = "Ljung-Box)

H0: residual has no-autocorrelation

H1: residual has autocorrelation

# menggunakan Ljung-Box test
Box.test(model_yamaha2$residuals, type = "Ljung-Box")
> 
>   Box-Ljung test
> 
> data:  model_yamaha2$residuals
> X-squared = 0.068912, df = 1, p-value = 0.7929

Pada Ljung-Box test diats, p-value > alpha, dimana 0.79 > 0.05 artinya gagal tolak H0, artinya residual/eror pada data tidak terdapat autocorrelation

Uji Normalitas

H0: residual menyebar normal

H1: residual tidak menyebar normal

yang diinginkan p-value > 0.05 (alpha), residual menyebar normal

Untuk mengecek normality residual pada hasil forecasting time series kita bisa melakukan uji normality (shapiro test) dengan menggunakan fungsi shapiro.test(residual model)

shapiro.test(model_yamaha2$residuals)
> 
>   Shapiro-Wilk normality test
> 
> data:  model_yamaha2$residuals
> W = 0.96018, p-value = 0.002597

Karena p-value < alpha, dimana 0.002 < 0.05, maka residual tidak berdistribusi normal

hist(model_yamaha2$residuals)

Note : Untuk mengecek asumsi cukup di model yang memang paling baik.

Prediksi

predict(model_yamaha2,n.ahead = 4)
> $pred
>           Jan      Feb      Mar      Apr
> 2018 114892.8 114892.8 114892.8 114892.8
> 
> $se
>           Jan      Feb      Mar      Apr
> 2018 32614.11 34667.90 36606.64 38447.74

Nilai prediksi untuk empat periode kedepan mulai dari bulan Januari hingga April 2018 memiliki hasil yang sama yaitu 114892.8

Kesimpulan

Berdasarkan Analisis yang telah dilakukan, dapat disimpulkan beberapa hal sebagai berikut :

  1. Data yang dapat digunakan dalam metode ARIMA dapat disimpulkan bahwa pola data tidak stasioner.

  2. Berdasarkan uji ADF dapat disimpulkan bahwa nilai p-value 0.49 > 0.05 (α) sehingga didapatkan keputusan gagal tolak H0 sehingga dapat disimpulkan data tidak stasioner.

  3. Berdasarkan plot ACF dan PACF juga disimpulkan bahwa data tidakstationer karena terdapat banyak data yang keluar dari batas lag.

  4. Setelah data di diferensiasikan, pola data menunjukkan stasioner.

  5. Berdasarkan uji ADF dari data yang telah di diferensi dapat disimpulkan bahwa nilai p-value 0,01 < 0.05 (α) sehingga didapatkan keputusan tolak H0 sehingga dapat disimpulkan data stasioner.

  6. Berdasarkan hasil overfitting diperoleh koefisien yang signifikan yaitu model ARIMA (2,1,0) dan model ARIMA (0,1,1).

  7. Berdasarkan hasil uji diagnostik antara model ARIMA (2,1,0) dan model ARIMA (0,1,1), diperoleh model terbaik yaitu model ARIMA (0,1,1) karena memiliki nilai AIC terkecil yaitu sebesar 2531 sehingga layak digunakan untuk forecasting.

  8. Dari hasil peramalan menggunakan model ARIMA (0,1,1), diperoleh hasil yang sama untuk ramalan empat periode kedepan yaitu sebesar 114892.8.