1 Kasus

Metode Time Series, atau biasa dikenal dengan Peramalan Deret Waktu, merupakan metode berbasis statistika yang biasa menduga nilai sebuah variabel di masa depan. Prediktornya adalah data-data historis sebelumnya sebagai dasar pemodelannya. Metode ini berbeda dengan analisis regresi. Metode ini membutuhkan variabel Y dalam bentuk seri waktu secara berurutan.

Pada artikel ini, akan dilakukan analisis prediksi penjualan sebuah perusahaan.Data yang akan digunakan adalah data penjualan dari kuartal pertama tahun 2000 sampai kuartal keempat tahun 2019.

1.1 Libraries and Setup

# chunk options
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  fig.align = "center",
  comment = "#>"
)

# scientific notation
options(scipen = 9999)
# import libs
library(tidyverse)
library(forecast)
library(lubridate)
library(TTR)
library(fpp)
library(xts)
library(tseries)
library(TSstudio)
library(padr)
library(MLmetrics)
library(ggfortify)
library(ggplot2)
library(tidyr)

1.2 Impor Dataset

Mengimpor dataset yang akan digunakan dan memberi nama variabel

sales <- read.csv("sales.csv")
names(sales)<-c("date","sales")
sales
sales_clean <-  sales %>% 
  mutate(date = ymd(date))
sales_clean
range(sales_clean$date)
#> [1] "2000-04-01" "2020-01-01"

2 Membuat Model Time Series

Kita akan mengubah data menjadi data dengan tipe time series. Proses konversi data menjadi data bertipe time series adalah sebagai berikut:

sales_ts <- ts(data = sales_clean$sales, start = c(2000,1), frequency = 4)
sales_ts
#>       Qtr1  Qtr2  Qtr3  Qtr4
#> 2000  7.75  8.25  8.58 12.32
#> 2001  8.35  9.85  9.33 13.22
#> 2002  9.59 10.07 10.19 14.06
#> 2003 10.32  9.59  9.83 13.68
#> 2004 10.18 10.56 10.91 15.19
#> 2005 11.48 11.99 12.21 16.95
#> 2006 12.86 13.35 13.57 19.71
#> 2007 14.04 14.62 14.84 19.87
#> 2008 14.80 15.47 15.11 19.56
#> 2009 14.83 15.07 15.28 20.18
#> 2010 15.59 15.53 15.61 20.66
#> 2011 15.94 16.24 16.40 22.29
#> 2012 16.87 16.78 16.93 22.73
#> 2013 16.71 17.12 17.26 20.20
#> 2014 16.66 16.96 17.25 21.75
#> 2015 17.12 17.43 17.61 21.63
#> 2016 16.20 16.17 16.44 22.47
#> 2017 16.22 16.63 16.87 22.98
#> 2018 16.78 17.78 17.82 22.98
#> 2019 17.63 18.35 19.15 23.55

Plot akan dibuat dari data time series dengan hasil sebagai berikut

sales_ts %>% ts_plot()

Penjualan memilki trend yang semakin naik dan memiliki pola musiman di kuartal tertentu.

3 Data Crossvalidation

Data akan dibagi menjadi data train dan data tes. Prosesnya adalah sebagai berikut:

sales_train <- head(sales_ts, 17*4)
sales_test <- tail(sales_ts, length(sales_ts)-length(sales_train))
sales_train
#>       Qtr1  Qtr2  Qtr3  Qtr4
#> 2000  7.75  8.25  8.58 12.32
#> 2001  8.35  9.85  9.33 13.22
#> 2002  9.59 10.07 10.19 14.06
#> 2003 10.32  9.59  9.83 13.68
#> 2004 10.18 10.56 10.91 15.19
#> 2005 11.48 11.99 12.21 16.95
#> 2006 12.86 13.35 13.57 19.71
#> 2007 14.04 14.62 14.84 19.87
#> 2008 14.80 15.47 15.11 19.56
#> 2009 14.83 15.07 15.28 20.18
#> 2010 15.59 15.53 15.61 20.66
#> 2011 15.94 16.24 16.40 22.29
#> 2012 16.87 16.78 16.93 22.73
#> 2013 16.71 17.12 17.26 20.20
#> 2014 16.66 16.96 17.25 21.75
#> 2015 17.12 17.43 17.61 21.63
#> 2016 16.20 16.17 16.44 22.47
sales_test
#>       Qtr1  Qtr2  Qtr3  Qtr4
#> 2017 16.22 16.63 16.87 22.98
#> 2018 16.78 17.78 17.82 22.98
#> 2019 17.63 18.35 19.15 23.55

4 Pembuatan Model

4.1 Dekomposisi Time Series

sales_train%>% decompose() %>% autoplot()

Dari hasil dekomposisi, penjualan memiliki trend yang semakin menaik. Selain itu dalam satu tahun, terdapat pola musiman dimana terjadi kenaikan penjualan pada kuartal tertentu. Jika kita melihat dataset, kuartal keempat (bulan oktober, november, desember) terjadi lonjakan penualan.

4.2 STLM

Model pertama yang dibuat adalah model STLM. Berikut adalah proses pembuatan model STLM:

stlm_model <- sales_train%>% 
              stlm(lambda = NULL) %>% 
              forecast(h=20)
plot(stlm_model)

stlmForecast <- as.vector(stlm_model$mean)
accuracy_stlm <- accuracy(stlmForecast,sales_test)
accuracy_stlm
#>                  ME      RMSE       MAE       MPE   MAPE       ACF1 Theil's U
#> Test set -0.6290312 0.7378872 0.6613553 -3.561438 3.7021 -0.3415284 0.1961432

4.3 Holt-Winters

Model kedua yang dibuat adalah model Holt-Winters. Berikut adalah proses pembuatan model Holt-WInters:

sales_hw <- HoltWinters(x = sales_train)
sales_hw_forecast <- forecast(sales_hw, 20)
plot(sales_hw_forecast)

HW_Forecast <- as.vector(sales_hw_forecast$mean)
accuracy_HW<- accuracy(HW_Forecast,sales_test)
accuracy_HW
#>                   ME      RMSE       MAE        MPE     MAPE      ACF1
#> Test set -0.01938989 0.5085938 0.4306363 -0.3400511 2.362886 0.3031687
#>          Theil's U
#> Test set  0.142743

4.4 ARIMA

Model ketiga yang dibuat adalah model ARIMA. Berikut adalah proses pembuatan model ARIMA:

sales_arima <- stlm(sales_train,method="arima")
sales_arima_forecast <- forecast(sales_arima, 20)
plot(sales_arima_forecast)

Arima_Forecast <- as.vector(sales_arima_forecast$mean)
accuracy_Arima<- accuracy(Arima_Forecast,sales_test)
accuracy_Arima
#>                  ME      RMSE       MAE       MPE     MAPE       ACF1 Theil's U
#> Test set -0.4285301 0.6093215 0.5324898 -2.520017 3.016724 -0.1142561 0.1580156

4.5 Pengujian Kinerja Model

result <- rbind(accuracy_stlm, accuracy_HW, accuracy_Arima)
rownames(result) <- c("stlm model", "holt winters model", "arima model")
result
#>                             ME      RMSE       MAE        MPE     MAPE
#> stlm model         -0.62903125 0.7378872 0.6613553 -3.5614382 3.702100
#> holt winters model -0.01938989 0.5085938 0.4306363 -0.3400511 2.362886
#> arima model        -0.42853012 0.6093215 0.5324898 -2.5200173 3.016724
#>                          ACF1 Theil's U
#> stlm model         -0.3415284 0.1961432
#> holt winters model  0.3031687 0.1427430
#> arima model        -0.1142561 0.1580156

Berdasarkan beberapa parameter kinerja (ME, RMSE, MAE, MPE, MAPE), model holt winters memiliki akurasi yang baik dalam melakukan forecasting. Oleh karena itu penggunaan model holt winters adalah yang terbaik.

5 Uji Asumsi

Tahap berikutnya adalah uji asumsi yang terdiri dari uji normalitas dan ketiadaan autokorelasi terhadap model terbaik yang telah dibuat. Model yang akan diuji tentulah model holt winters.

5.1 Uji Normalitas

shapiro.test(sales_hw_forecast$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  sales_hw_forecast$residuals
#> W = 0.89501, p-value = 0.00005216
hist(sales_hw_forecast$residuals, breaks = 100)

plot(sales_hw_forecast$residuals)

Karena nilai pvalue < alpha dan histogram berbentuk lonceng simetris, maka residual menyebar secara normal.

5.2 Uji Autokorelasi

Box.test(sales_hw_forecast$residuals, type = "Ljung-Box")
#> 
#>  Box-Ljung test
#> 
#> data:  sales_hw_forecast$residuals
#> X-squared = 0.0089629, df = 1, p-value = 0.9246

Karena nilai pvalue > alpha, artinya residual dari model tidak ada autokorelasi

6 Kesimpulan

Model terbaik yang digunakan untuk forecasting adalah model holt winters. Penjualan memiliki trend yang semakin menaik dari tahun ke tahun. Selain itu penjualan memiliki pola-pola musiman dimana pada saat bulan oktober, november, dan desember mengalami lonjakan penjualan.