Analisis Forecasting Data Time Series Pada Data Harian Sicepat

Forecasting Data Time Series

Penjelasan Time Series

Forecasting adalah suatu metode yang digunakan untuk perencanaan yang efektif dan efisien terhadap ketidakpastian masa depan. Data time series adalah data yang direkam pada interval waktu tertentu secara konsisten. Data time series dapat menunjukkan bagaimana perubahan pada variabel dari waktu ke waktu. Adapun frekuensi yang waktu yang membentuk data time series dapat berupa tahun, kuartal, bulan, hari, jam, menit, ataupun detik. Asalkan data tersebut terurut dan tersimpan dalam urutan waktu, maka data tersebut merupakan data time series. Perbedaan paling dasar antara time series dengan regresi yaitu, pada regresi untuk memprediksi suatu nilai Y dipengaruhi oleh faktor-faktor seperti x1,x2,..,xn. Sementara pada time series, dalam memprediksi suatu nilai Y dipengaruhi oleh nilai Y itu sendiri pada masa lampau (Yt−1). Dalam mendeskripsikan data time series, kita bisa mendecompose data.

Dekomposisi Data Time Series

Dekomposisi digunakan untuk menguraikan komponen-komponen yang ada pada data time series. Jika pada hasil decompose, trend masih membetuk sebuah pola maka dapat dicurigai masih ada seasonality yang belum ditangkap. Seharusnya trend cenderung naik atau cendurung turun. Terdapat 4 teknik dalam mendecompose data time series, yaitu:

  1. Base (level) yaitu nilai-nilai data apabila jika serial data diubah ke dalam satu garis lurus.

  2. Trend yaitu kemiringan yang terbentuk dari data time series, dapat berupa penurunan atau kenaikan.

  3. Seasonality yaitu pola unik yang terbentuk di suatu interval waktu berdasarkan pola/faktor musiman. seasonality dapat terjadi karena suatu bulan di setiap tahunnya, suatu hari di setiap bulannya, atau bahkan suatu jam di dalam satu hari.

  4. Residual/Noise (Error) yaitu variasi dari data yang tidak dapat dijelaskan.

Namun, tidak semua time series memiliki 4 unsur di atas. Terdapat pula data time series yang tidak memiliki pola musiman (seasonality) dan trend. Komponen-komponen yang membentuk data time series dapat mengungkapkan sifat trend/seasonality. Yaitu:

  1. Additive model yaitu setiap data yang ada merupakan total dari komponen yang ada, dan dirumuskan sebagai: y = base + trend + seasonality + reasidual
  2. Multiplicative model yaitu setiap pengamatan data adalah adalah multiple/perkalian dari komponen yang ada.

Dirumuskan sebagai: y = base x trend x seasonality x residual Time series data adalah tipe data yang memerlukan gabungan analisis menggunakan gambar. Oleh karena itu sewaktu kita memilih model time series (untuk analisis ataupun prediksi), kita perlu memplot data tersebut untuk mendapatkan pola kasar dari data yang ada.

Teks alternatif

Teks alternatif

Karakteristik Data Time Series

Syarat yang harus dipenuhi sebelum melakukan forecasting data time series, yaitu:

  1. Data harus terurut berdasarkan periode waktu
  2. Tidak boleh ada waktu atau periode yang terlewat/kosong
  3. Data tidak boleh ada yang null/missing

Jika terdapat waktu yang kosong/data yang null, maka data time series harus ditangani terlebih dahulu sebelum masuk ke pemodelan.

Membentuk Object Time Series

Membentuk data time series di R dapat dilakukan dengan menggunakan fungsi ts() dengan parameter sebagai berikut: ts(data,start,frequency)

  1. data yaitu data yang akan dimodelkan/diprediksi
  2. start yaitu awal periode data yang akan dimodelkan
  3. frequency yaitu pola berulang dari data

Frekuensi dari data time series, dapat berupa: - data jam -> pola harian -> freq = 24 - data harian -> pola mingguan -> freq = 7 - data harian -> pola weekday -> freq = 5 - data jam -> pola mingguan -> freq = 247 - data bulanan -> pola tahunan -> freq = 12 - data bulanan -> pola kuartalan -> freq = 124 - data tahunan -> pola tahunan -> freq = 1

Teks alternatif

Pemodelan Time Series

Persiapan Data

data <- read.csv("D:/R/Time Series/Data Revenue & Package 2019-2022.csv", header = TRUE)
data_test <- read.csv("D:/R/Time Series/Data Testing Revenue & Package 2023.csv", header = TRUE)
head(data)
##      periode volume  berat    revenue
## 1 2019-01-01   6977   9944  170791867
## 2 2019-01-02  84942 107525 1871073643
## 3 2019-01-03  88100 113901 2010054726
## 4 2019-01-04  78848 104473 1885235390
## 5 2019-01-05  58016  78511 1471371663
## 6 2019-01-06  12541  15967  287919254

Terdapat 4 variabel dari data tersebut, yang terdiri dari variable periode, volume, berat, revenue. Namun pada pemodelan ini hanya akan digunakan variable periode dan volume. Data yang digunakan adalah data Volume Sicepat selama 4,1 tahun periode 01 Januari 2019 - 12 Januari 2023. Pertama, perlu dicek terlebih dahulu apakah terdapat null pada variable volume dan tanggal yang kosong pada variable periode.

data <- data %>% 
  mutate(date = ymd(periode))

range(data$date)
## [1] "2019-01-01" "2023-01-12"
colSums(is.na(data))
## periode  volume   berat revenue    date 
##       0       0       0       0       0

Hasil pengecekan menunjukan tidak terdapat NA pada data, dan tidak terdapat data dengan tanggal yang hilang. Sehingga data sudah memenuhi persayaratan dan dapat dilakukan pemodelan.

Pembentukan Data Time Series

Data yang akan dimodelkan terlebih dahulu harus diubah menjadi data dengan tipe time series.

volume_ts %>% ts_plot()

Cek Dekomposisi Data

Pertama akan dilakukan drop pada kolom yang tidak digunakan.

# Menghapus kolom revenue dan berat
data_clean <- within(data, {
  berat <- NULL 
  revenue <- NULL
})
data_clean <-  data_clean %>% 
  mutate(date = ymd(periode))
data_clean <- data_clean[,-1]

range(data_clean$date)
## [1] "2019-01-01" "2023-01-12"
summary(data_clean$volume)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       3  240473  600668  656237  990304 2866347
sd(data_clean$volume)
## [1] 476923.6

Selanjutnya adalah pembagian data training dan testing. Data training yang digunakan merupakan data 3 tahun 11 bulan. Sementara data bulan Desember sampai 12 Januari 2023 akan digunakan sebagai data testing.

# Membagi Data Training dan Data Testing
data_train <- head(volume_ts, 1426)
data_test <- tail(volume_ts, length(volume_ts)-length(data_train))
#This will plot the time series
ts.plot(data_train, xlab="Periode", ylab="Jumlah Volume", main="Volume Harian Sicepat, 2019-2022")

# This will fit in a line
abline(reg=lm(data_train~time(data_train)))

# Dekomposisi Time Series
data_train%>% decompose() %>% autoplot()

Dari hasil dekomposisi diketahui bahwa data memiliki pola additive dan musiman. Metode peramalan deret waktu yang akan digunakan berdasarkan pola data tersebut adalah Holt’s Winters Exponential (Triple Exponential Smoothing) dan Seasonal Arima. Selain dengan kedua pemodelan tersebut, akan pula diuji menggunakan pemodelan STLM (Seasonal Trend with Loess Model).

Pemodelan

Holt’s Winters Exponential (Triple Exponential Smoothing)

Metode Holt’s Winters Exponential (Triple Exponential Smoothing) disebut sebagai metode forecasting yang tepat digunakan untuk data yang memiliki efek trend dan seasonal.

# Pemodelan Holt's Winter Exponential
model_hoW <- HoltWinters(data_train)
# Evaluasi Model
model_how_forecast <- forecast(object = model_hoW, h = 43)

volume_ts %>% autoplot(series = "data_train")+
  autolayer(data_test, series = "data_test") +
  autolayer(model_how_forecast$mean, series = "forecast")

accuracy(model_how_forecast$mean, x = data_test)
##                ME     RMSE      MAE       MPE     MAPE      ACF1 Theil's U
## Test set -5740.13 202983.1 161562.1 -18.35968 35.08705 0.2321578 0.4624416

Seasonal ARIMA (SARIMA)

Sebelum dilakukan pemodelan menggunakan seasoanal Arima, perlu dilakukan pengujian untuk mengetahui kestasioneran data. Adapun hipotesis yang diberikan adalah:

H0 : data tidak stasioner H1 : data stasioner

# Cek Kestasioneran Data
acf(data_train,lag.max = 2000)

Auto Correllation Function (ACF) menunjukkan data stasioner dalam rata-rata.

#Cek kestasioneran data dengan ADF-Test dengan hipotesis sebagai berikut:
#H0 : Data tidak stasioner
#H1 : Data stasioner
adf.test(data_train) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_train
## Dickey-Fuller = -5.946, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary

Hasil menunjukkan bahwa P−value hasil uji ADF-Test lebih kecil dari alpha=0.05, sehingga terima H0. Artinya, pada taraf nyata 5% cukup bukti untuk menyatakan bahwa data yang digunakan telah stasioner.

tsdisplay(data_train, lag.max = 36)

Fungsi tsdisplay digunakan untuk menentukan kemungkinan ordo ARIMA yang dapat dibentuk, dimana: - tails off: garis saat lag ke-1 mengalami penurunan yang lambat. - cuts off lag: garis saat lag ke-1 mengalami penurunan yang cepat. Namun penentuan ordo ARIMA juga dapat dilakukan dengan auto.arima. Parameter yang dibutuhkan adalah peubah yang digunakan untk pemodelan (y) dan tipe pemodelan yang digunakan, Seasonal = TRUE untuk seasonal ARIMA.

# Model Arima
model_arima_auto <- auto.arima(y = data_train, seasonal = TRUE)
model_arima_auto
## Series: data_train 
## ARIMA(5,1,2) with drift 
## 
## Coefficients:
##           ar1     ar2     ar3      ar4     ar5      ma1      ma2     drift
##       -0.5371  0.2001  0.0123  -0.0938  0.1360  -0.1019  -0.8463  509.2655
## s.e.   0.0301  0.0310  0.0310   0.0307  0.0277   0.0155   0.0146  294.4678
## 
## sigma^2 = 7.214e+10:  log likelihood = -19833.38
## AIC=39684.75   AICc=39684.88   BIC=39732.11

Model Arima yang sesuai digunakan berdasarkan auto.arima adalah ARIMA(5,1,2)

arima_auto_forecast <- forecast(object = model_arima_auto, h = 43)
plot(arima_auto_forecast)

volume_ts %>% autoplot(series = "Data Train")+
  autolayer(data_test, series = "Data Test") +
  autolayer(arima_auto_forecast$mean, series = "forecast")

accuracy(arima_auto_forecast$mean, x = data_test)
##               ME     RMSE      MAE       MPE     MAPE      ACF1 Theil's U
## Test set -152191 302428.8 244607.9 -59.85775 68.32563 0.2024243 0.4601618

Seasonal Trend with Loess Model (SLTM)

STL secara konsep akan melakukan smoothing terhadap data tetangga setiap masing-masing observasi dengan memberikan bobot yang lebih berat terhadap data yang dekat dengan observed data. Kekurangan dari STL hanya bisa melakukan decompose pada additive data, apabila terdapat multiplicative data dapat menggunakan transformasi log()[^12].

Untuk memodelkan hasil STL, kita bisa menerapkan STLM(Seasonal Trend with Loess Model) dimana kita bisa menerapkan metode exponential smoothing (ETS) dan ARIMA. Selain itu, STLM dapat digunakan sebagai alternative cara untuk menangkap seasonal yang belum bisa ditangkap oleh metode ETS dan ARIMA biasa.

# Model STLM
model_stlm <- stlm(y = data_train, s.window = 43, method = "ets")
model_stlm_forecast <- forecast(model_stlm, h = 43)

volume_ts %>% autoplot(series = "Data Training")+
  autolayer(data_test, series = "Data Testing") +
  autolayer(model_stlm_forecast$mean, series = "forecast")

accuracy(model_stlm_forecast$mean, x = data_test)
##                 ME     RMSE      MAE       MPE     MAPE         ACF1 Theil's U
## Test set -103697.3 268814.9 226974.1 -40.07887 52.79543 -0.009535782 0.5291987

Model Terbaik

Pemilihan model terbaik didasarkan pada akurasi. Akurasi yang digunakan adalah MAPE (Mean Absolut Percentage Error) dan RMSE (Root Mean Squared Error). RMSE dan MAPE sama-sama bagus. Alasan digunakan RMSE adalah karena RMSE lebih sensitif pada data pencilan (amatan yang nilainya jauh dari rata-rata) Alasan RMSE Lebih Baik dari MAE. Sementara itu, MAPE memberikan nilai presentase sehingga lebih mudah untuk diinterpretasikan Alasan RMSE dan MAPE bagus. Model yang memberikan nilai RMSE dan MAPE terkecil adalah model Holt’s Winters Exponential. Menurut Lewis (1982), nilai MAPE dapat diinterpretasikan atau ditafsirkan ke dalam 4 kategori, yaitu: <10% = sangat akurat. 10-20% = baik. 20-50% = wajar. Nilai MAPE dalam pemodelan ini 35% masuk kategori wajar. Berikut ditampilkan selisih volume asli dan volume hasil dugaan forecast:

Hasil <- data.frame(
   Forecast  = model_how_forecast$mean,
   Volume_Real = data_test
)

Percentage <- with(Hasil, (abs(Forecast - Volume_Real)/Volume_Real)*100)
Fore_per_Act <- with(Hasil, (Forecast/Volume_Real))
Fore_per_Act <- round(Fore_per_Act, 2)
Percentage <- round(Percentage, 2)
#Periode <- data.frame(as.matrix(Percentage), date=time(Percentage))
#Periode <- Periode[,-1]
Hasil_Forecast <- data.frame(Hasil,Fore_per_Act, Percentage)
Hasil_Forecast
##    Forecast Volume_Real Fore_per_Act Percentage
## 1  673994.6      756184         0.89      10.87
## 2  718787.1      763572         0.94       5.87
## 3  647451.4      650713         0.99       0.50
## 4  509398.0      290657         1.75      75.26
## 5  699605.1     1054729         0.66      33.67
## 6  758801.8      870612         0.87      12.84
## 7  720744.3      796187         0.91       9.48
## 8  636086.5      675026         0.94       5.77
## 9  706891.9      672990         1.05       5.04
## 10 654061.5      606972         1.08       7.76
## 11 476235.3      249059         1.91      91.21
## 12 806146.8     1358276         0.59      40.65
## 13 960996.6     1238655         0.78      22.42
## 14 863278.1      880731         0.98       1.98
## 15 899705.9      673929         1.34      33.50
## 16 952378.0      572577         1.66      66.33
## 17 745461.5      482464         1.55      54.51
## 18 510638.3      171566         2.98     197.63
## 19 681743.8      753151         0.91       9.48
## 20 736597.7      570820         1.29      29.04
## 21 709345.2      533562         1.33      32.95
## 22 597199.0      502364         1.19      18.88
## 23 651291.9      497000         1.31      31.04
## 24 576698.6      433156         1.33      33.14
## 25 382332.4      190734         2.00     100.45
## 26 616249.8      930048         0.66      33.74
## 27 676053.5      761210         0.89      11.19
## 28 536319.5      653428         0.82      17.92
## 29 623446.7      596132         1.05       4.58
## 30 628470.4      518991         1.21      21.09
## 31 542964.3      351566         1.54      54.44
## 32 351727.6      143666         2.45     144.82
## 33 601135.3     1021083         0.59      41.13
## 34 657879.7      857401         0.77      23.27
## 35 529985.5      708520         0.75      25.20
## 36 615819.8      655426         0.94       6.04
## 37 679137.1      600668         1.13      13.06
## 38 599736.7      505451         1.19      18.65
## 39 424326.7      196722         2.16     115.70
## 40 600018.3      852717         0.70      29.63
## 41 706011.9      709323         1.00       0.47
## 42 616069.1      654272         0.94       5.84
## 43 544586.3      616674         0.88      11.69