Business Question:
Kita memiliki data tindakan kriminal per hari dari tahun 2014 hingga 2019, dengan data tersebut kita diharapkan mampu membuat model untuk memprediksi tindakan kriminal yang akan terjadi. Data tersebut tersimpan dalam assault.csv
assault <- read.csv("assault.csv")
glimpse(assault)
#> Rows: 2,190
#> Columns: 2
#> $ Date <chr> "2014-01-01", "2014-01-02", "2014-01-03", "2014-01-04",~
#> $ Amount_Assault <int> 33, 24, 24, 32, 28, 20, 20, 30, 25, 32, 49, 39, 42, 47,~
Deskripsi kolom:
Date: Tanggal kejadian tindakan kriminalAmount_Assault: Jumlah kejadian tindakan kriminal di hari tersebutCek Range Data
range(assault$Date)
#> [1] "2014-01-01" "2019-12-30"
Cek Missing Value
colSums(is.na(assault))
#> Date Amount_Assault
#> 0 0
Ubah Tipe Data
assault <- assault %>%
mutate(Date = ymd(Date))
Membuat object ts
assault_ts <- ts(data = assault$Amount_Assault, frequency = 365)
Cek class dari data assault_ts
class(assault_ts)
#> [1] "ts"
Visualisasi data untuk observasi
assault_ts %>%
autoplot()
Insight:
Memvisualisasikan hasil decompose menggunakan autoplot() dari package forecast
assault_ts %>%
decompose() %>%
autoplot()
Insight: Grafik trend menunjukkan adanya kenaikan yang bersifat additive akan tiap periode, dan data memiliki trend yang berulang tiap tahun, mengindikasikan seasonal bersifat tahunan
Cross validation
# 1 tahun untuk test (365 hari)
assault_test <- tail(assault_ts, 365)
# 5 tahun untuk train (2190-365 hari)
assault_train <- head(assault_ts, -365)
Fitting Model
assault_hwes <- HoltWinters(assault_train)
Note: Data memiliki trend dan seasonal, maka model time series yang pertama digunakan adalah Triple Exponential Smoothing / Holt-Winters Exponential Smoothing, karena model time series ini mengizinkan data untuk memiliki trend dan seasonal.
Forecasting
forecast_hwes <- forecast(assault_hwes, h = 365)
Memvisualisasikan data actual dengan hasil forecasting Holt-Winters
assault_ts %>%
autoplot(series = "actual") +
autolayer(forecast_hwes$fitted, series = "train") +
autolayer(forecast_hwes$mean, series = "test")
Evaluasi Model
accuracy(forecast_hwes, assault_test)
#> ME RMSE MAE MPE MAPE MASE
#> Training set 0.3266116 9.620419 7.129348 -1.625931 14.29854 0.7667659
#> Test set -3.3789802 10.576606 8.584446 -9.072787 17.01781 0.9232627
#> ACF1 Theil's U
#> Training set 0.1124743 NA
#> Test set 0.1296306 0.9017591
Insight: Model Holt-Winters masih menghasilkan prediksi yang buruk, jika dilihat dari MAPE, error yang dihasilkan model ini adalah 14% pada data train dan 17% pada data test.
Fitting Model
assault_ets <- ets(assault_train, model = "ZZZ")
summary(assault_ets)
#> ETS(A,N,N)
#>
#> Call:
#> ets(y = assault_train, model = "ZZZ")
#>
#> Smoothing parameters:
#> alpha = 0.1266
#>
#> Initial states:
#> l = 30.0793
#>
#> sigma: 8.4707
#>
#> AIC AICc BIC
#> 21507.16 21507.17 21523.69
#>
#> Training set error measures:
#> ME RMSE MAE MPE MAPE MASE
#> Training set 0.08317131 8.46602 6.711338 -2.659607 14.09525 0.7218087
#> ACF1
#> Training set 0.08679505
Forecasting
forecast_ets <- forecast(assault_ets, h = 365)
Memvisualisasikan data actual dengan hasil forecasting ets
assault_ts %>%
autoplot(series = "actual") +
autolayer(forecast_ets$fitted, series = "train") +
autolayer(forecast_ets$mean, series = "test")
Evaluasi Model
accuracy(forecast_ets, assault_test)
#> ME RMSE MAE MPE MAPE MASE
#> Training set 0.08317131 8.46602 6.711338 -2.659607 14.09525 0.7218087
#> Test set 7.21793205 12.93578 10.568825 9.141828 18.14927 1.1366840
#> ACF1 Theil's U
#> Training set 0.08679505 NA
#> Test set 0.41692815 0.9893145
Insight: Model ets menghasilkan error sebesar 18.15%. Dari plot dapat dilihat bahwa hasil prediksi yang diberikan oleh model ets membentuk garis lurus. Hal ini disebabkan oleh karena model melakukan efisiensi memory, dimana model ets hanya dapat digunakan untuk frequency maksimal 24.
Fitting Model Auto-SARIMA
assault_auto <- auto.arima(assault_train, seasonal = T)
assault_auto
#> Series: assault_train
#> ARIMA(4,1,2)
#>
#> Coefficients:
#> ar1 ar2 ar3 ar4 ma1 ma2
#> -0.8486 0.1392 0.0249 -0.0196 0.0653 -0.8827
#> s.e. 0.0326 0.0395 0.0376 0.0265 0.0229 0.0225
#>
#> sigma^2 estimated as 70.74: log likelihood=-6470.22
#> AIC=12954.44 AICc=12954.51 BIC=12993.01
Forecasting
fct_sarima_auto <- forecast(assault_auto, h = 365)
Memvisualisasikan model SARIMA
assault_ts %>%
autoplot(series = "actual") +
autolayer(fct_sarima_auto$fitted, series = "train") +
autolayer(fct_sarima_auto$mean, series = "test")
Evaluasi Model
accuracy(fct_sarima_auto, assault_test)
#> ME RMSE MAE MPE MAPE MASE
#> Training set 0.1043785 8.394838 6.647731 -2.574768 13.92763 0.7149678
#> Test set 6.6659979 12.635566 10.287404 8.124408 17.78416 1.1064170
#> ACF1 Theil's U
#> Training set -0.0004176678 NA
#> Test set 0.4165074049 0.9699017
Insight: Model SARIMA menghasilkan error sebesar 17.78%. Dari plot dapat dilihat bahwa hasil prediksi yang diberikan oleh model SARIMA (auto.arima) membentuk garis lurus. Hal ini disebabkan oleh karena model melakukan efisiensi memory, dimana model SARIMA hanya dapat digunakan untuk frequency hingga 350, namun pada prakteknya biasanya akan kehabisan memory jika digunakan untuk frequency diatas 200.
Fitting Model TBATS
x <- ts(head(assault$Amount_Assault,-365), frequency=365)
fit <- tbats(x)
Forecasting
fct_tbats <- forecast(fit, h = 365)
Visualisasi Prediksi Model
plot(forecast(fit))
Evaluasi Model
accuracy(fct_tbats, assault_test)
#> ME RMSE MAE MPE MAPE MASE
#> Training set 0.5649083 8.198203 6.496265 -1.627259 13.50565 0.6986774
#> Test set -1.1689829 8.834615 7.182270 -4.897286 14.02559 0.7724577
#> ACF1 Theil's U
#> Training set -0.005206181 NA
#> Test set 0.126966829 0.742858
Insight: Model TBATS menghasilkan error sebesar 14.02%
Fitting Model Fourier
fitt <- auto.arima(assault_train, seasonal=FALSE, xreg=fourier(assault_train, K=30))
Forecasting
fct_fourier <- forecast(fitt, h=365, xreg=fourier(assault_train, K=30, h=365))
Visualisasi Model Fourier
plot(forecast(fitt, h=365, xreg=fourier(assault_train, K=30, h=365)))
Evaluasi Model
accuracy(fct_fourier, assault_test)
#> ME RMSE MAE MPE MAPE MASE
#> Training set 0.4712586 7.990399 6.311193 -1.714178 13.15083 0.6787729
#> Test set -1.2719822 8.932471 7.237673 -5.112292 14.16149 0.7784164
#> ACF1 Theil's U
#> Training set -0.003804313 NA
#> Test set 0.142995056 0.7529281
Insight: Model Fourier menghasilkan error sebesar 14.16%. Nilai K dapat dinaikkan untuk tuning model, namun tidak dilakukan oleh karena keterbatasan spesifikasi hardware.