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:
Base (level) yaitu nilai-nilai data apabila jika serial data diubah ke dalam satu garis lurus.
Trend yaitu kemiringan yang terbentuk dari data time series, dapat berupa penurunan atau kenaikan.
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.
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:
- Additive model yaitu setiap data yang ada merupakan total dari komponen yang ada, dan dirumuskan sebagai: y = base + trend + seasonality + reasidual
- 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:
- Data harus terurut berdasarkan periode waktu
- Tidak boleh ada waktu atau periode yang terlewat/kosong
- 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)
datayaitu data yang akan dimodelkan/diprediksistartyaitu awal periode data yang akan dimodelkanfrequencyyaitu 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