1 Read and Inspect Data

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 kriminal
  • Amount_Assault: Jumlah kejadian tindakan kriminal di hari tersebut

2 Data Cleaning

Cek 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))

3 Exploratory Data Analysis

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:

  • Data membentuk pola sebanyak 6 kali, dimana tiap pola melambangkan satu tahun (2014-2019)
  • Data memiliki trend yang cenderung naik tiap tahunnya
  • Berdasarkan observasi terhadap plot diatas, kenaikan data tiap tahunnya terlihat konstan, disimpulkan bahwa trend data bersifat additive

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

4 Data Cleaning

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)

4.1 Triple Exponential Smoothing dengan Function HoltWinters

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.

4.2 Triple Exponential Smoothing dengan Function ets

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.

4.3 SARIMA

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.

4.4 TBATS

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%

4.5 Fourier

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.

5 Conclusion

  • Data memiliki seasonal tahunan yang bersifat additive.
  • Data menunjukkan pola terjadinya tindak kriminal yang meningkat dari awal tahun hingga pertengahan tahun, kemudian menurun hingga akhir tahun, dan berulang kembali di tahun berikutnya.
  • Model TBATS memberikan model yang paling baik meskipun error masih besar, yaitu 14.16%.
  • Model TBATS dan Fourier masih dapat di tuning untuk mendapatkan hasil maksimal, tergantung kepada spesifikasi hardware yang digunakan.