Background

Pada LBB kali ini saya akan melakukan analysis dan forecasting menggunakan data Turkish electricity demand sumber data di dapatkan dari Rob J Hyndman

Read Data

Kita akan read data turkish electricity demand dan membuat object time series, data di observasi dari tahun 1 january 2000 sampai dengan 31 desember 2008.

dataku <- read.csv("https://robjhyndman.com/data/turkey_elec.csv")

telects <- ts(data = dataku, start = 2000, frequency = 365) ## daily 

ts_info(telects)
##  The telects series is a ts object with 1 variable and 3287 observations
##  Frequency: 365 
##  Start time: 2000 1 
##  End time: 2009 2

Library

library(tidyverse) # data wrangling
library(lubridate) # date manipulation
library(forecast) # time series library
library(TTR) # for Simple moving average function
library(MLmetrics) # calculate error
library(tseries) # adf.test
library(TSstudio) # mempercantik visualisasi timeseries
library(plotly) # visualisasi data
library(ggplot2) # visualisasi data

Exploratory Data Analysis

Pada tahap ini kita akan membuat plot tujuannya melihat pola trend dan seasonal pada data sehingga kita bisa memiliki gambaran apakah data yang kita analysis typenya additive atau multiplicative.

telec_plot <- 
  telects %>% 
  autoplot()+
  theme_minimal()

ggplotly(telec_plot) %>% 
  layout(title = " daily Turkish electricity demand data.",
         xaxis = list(title = "year"),
         yaxis = list(title = "Daily data "))

Apa yang bisa kita lihat dari plot di atas :

  1. Pola cenderung naik artinya kebutuhan electricity setiap tahun terus meningkat
  2. Jika diperhatikan kenaikan cenderung naik secara linear sehingga di asumsikan typenya adalah additive, untuk melihat lebih jelas kita akan uraikan menggunakan decompose.

Decompose

Decomposition adalah suatu tahapan dalam time series analisis yang digunakan untuk menguraikan beberapa komponen dalam time series data, dengan decompose kita dapat mengurai lebih jelas data elcetricity diantarannya :

  1. Data : pola data asli
  2. Seasonal (S) : pola musiman atau pola berulang dari data
  3. Trend (T) : pola data secara global (naik atau turun)
  4. Remainder (E) : pola data yang tidak dapat ditangkap oleh seasonal dan tren

Karena pada plot sebelumnya data terlihat additive maka Formula yang di gunakan adalah :

electricity = Trend+Seasonality+Error

Single Seasonality

telects %>% 
  decompose() %>% 
  autoplot()

Berdasarkan hasil decompose di atas masih ada pola dari trend yang masih belum di tangkap selanjutnya akan mencoba menggunakan multiseasonal time series

Multiple Seasonality

Disini kita akan mencoba menggunakan 3 multiple seasonal.periode yaitu mingguan, tahun kabisat dan tahun islam yaitu 7, 365.25 dan 354.37.

datakumsts<- dataku %>% 
 msts(seasonal.periods = c(7,354.37,365.25))
datakumsts %>% 
  mstl() %>% 
  autoplot()+
  theme_minimal()

Decompose dengan multiseasonal terlihat trend nya cukup smooth artinya pola mampu di tangkap dengan baik jika dibandingkan dengan trend pada decompose sebelumnya, dan error pun lebih kecil jika di bandinkan dengan sebelumnya.

adf.test(datakumsts)
## Warning in adf.test(datakumsts): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  datakumsts
## Dickey-Fuller = -7.7431, Lag order = 14, p-value = 0.01
## alternative hypothesis: stationary

Berdasarkan Augmented Dickey-Fuller Test(adf.test) p-value < 0.05 artinya data stasioner sehingga tidak akan dilakukan differencing.

Cross Validation

telec_train <- datakumsts %>% 
  head(-2*365)

telec_test <- datakumsts %>% 
  tail(2*365)

Modeling

STLM

telco_ets <- stlm(y = telec_train, method = "ets", lambda = 0)


telco_arima <- stlm(y = telec_train, method = "arima", lambda = 0)
telco_forecast_ets <- forecast(telco_ets, h = 2*365)
#head(telco_forecast_ets) #  forecast value + confidence interval dari ETS model
plot(telco_forecast_ets)

datakumsts %>% 
  autoplot(series = "actual")+
  autolayer(telco_forecast_ets$fitted, series = "data train")+
  autolayer(telco_forecast_ets$mean, series = "data test")+
  scale_color_manual(values = c("#3b3b3b", "blue", "#bf0808"))+
  theme_minimal()

telco_forecast_arima <- forecast(telco_arima, h = 2*365) 
#head(telco_forecast_arima) # forecast value + confidence interval dari ETS model
plot(telco_forecast_arima)

datakumsts %>% 
  autoplot(series = "actual")+
  autolayer(telco_forecast_arima$fitted, series = "data train")+
  autolayer(telco_forecast_arima$mean, series = "data test")+
  scale_color_manual(values = c("#3b3b3b", "blue", "#bf0808"))+
  theme_minimal()

bindaccuracy <- rbind(
  accuracy(telco_forecast_ets$mean, telec_test),
  accuracy(telco_forecast_arima$mean, telec_test))

rownames(bindaccuracy) <- c("STLM ETS", "STLM ARIMA")
bindaccuracy
##                    ME     RMSE       MAE        MPE     MAPE      ACF1
## STLM ETS   1640.15196 2131.084 1814.4925  7.1251112 8.192825 0.8754382
## STLM ARIMA  -47.72611 1381.207  963.6161 -0.6452799 4.608553 0.8847108
##            Theil's U
## STLM ETS    1.395047
## STLM ARIMA  1.056964

Dari hasil analisis di atas model ARIMA adalah model yang lebih baik karena MAPE yang dihasilkan lebih kecil.

Assumption

Asumsi pada time series diujikan untuk mengukur apakah residual yang diperoleh dari hasil modeling sudah cukup baik untuk menggambarkan dan menangkap informasi pada data.

  1. Normality residual

H0 : residual menyebar normal H1 : residual tidak menyebar normal

shapiro.test(telco_forecast_arima$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  telco_forecast_arima$residuals
## W = 0.88497, p-value < 0.00000000000000022
hist(telco_forecast_arima$residuals,breaks = 20)

Untuk normality residual data tidak menyebar normal berdasarkan hasil uji shapiro.test nilai (p-value < 0.05) mungkin dikarenakan jumlah sample yang sedikit.

  1. Autocorrelations: Box.test-Ljng-Box

H0 : residual no-autocorrelation H1 : residual autocorrelation

Box.test(telco_forecast_arima$residuals, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  telco_forecast_arima$residuals
## X-squared = 0.0000018104, df = 1, p-value = 0.9989

Berdasarkan hasil asumsi check (p-value > 0.05), gagal tolak H0, tolak H1 artinya tidak ada autocorrelation pada hasil forecasting time series.

Conclusion

Dari hasil forecast yang telah dibuat munggunakan data turki electricty harian model yang baik jika melihat hasil MAPE yaitu STLM arima karena MAPE lebih kecil jika dibandingan dengan model ets.