Chicago Crimes - Time Series

CHICAGO CRIMES

Kumpulan data ini mencerminkan insiden kejahatan yang dilaporkan (dengan pengecualian pembunuhan di mana data tersedia untuk setiap korban) yang terjadi di Kota Chicago dari tahun 2001 hingga sekarang, dikurangi tujuh hari terakhir. Data diambil dari sistem CLEAR (Citizen Law Enforcement Analysis and Reporting) Departemen Kepolisian Chicago. Untuk melindungi privasi korban kejahatan, alamat hanya ditampilkan di tingkat blok dan lokasi tertentu tidak diidentifikasi. Jika Anda memiliki pertanyaan tentang kumpulan data ini, Anda dapat menghubungi Divisi Pemenuhan dan Analisis Data Departemen Kepolisian Chicago di . Penafian: Kejahatan-kejahatan ini mungkin didasarkan pada informasi awal yang diberikan kepada Departemen Kepolisian oleh para pelapor yang belum diverifikasi. Klasifikasi kejahatan awal dapat diubah di kemudian hari berdasarkan investigasi tambahan dan selalu ada kemungkinan kesalahan mekanis atau manusia. Oleh karena itu, Departemen Kepolisian Chicago tidak menjamin (baik tersurat maupun tersirat) keakuratan, kelengkapan, ketepatan waktu, atau urutan informasi yang benar dan informasi tersebut tidak boleh digunakan untuk tujuan perbandingan dari waktu ke waktu. Departemen Kepolisian Chicago tidak akan bertanggung jawab atas kesalahan atau kelalaian apa pun, atau atas penggunaan, atau hasil yang diperoleh dari penggunaan informasi ini. Semua visualisasi data pada peta harus dianggap sebagai perkiraan dan upaya untuk memperoleh alamat tertentu dilarang keras. Departemen Kepolisian Chicago tidak bertanggung jawab atas konten halaman di luar situs mana pun yang direferensikan oleh atau yang mereferensikan halaman web ini selain halaman web resmi Departemen Kepolisian Kota Chicago atau Chicago. Pengguna secara khusus mengakui bahwa Departemen Kepolisian Chicago tidak bertanggung jawab atas tindakan memfitnah, ofensif, menyesatkan, atau ilegal dari pengguna lain, tautan, atau pihak ketiga dan bahwa risiko cedera dari hal tersebut di atas sepenuhnya menjadi tanggung jawab pengguna. Penggunaan kata-kata “Departemen Kepolisian Chicago” yang tidak sah, “Polisi Chicago”, atau tiruan berwarna apa pun dari kata-kata ini atau penggunaan logo Departemen Kepolisian Chicago yang tidak sah adalah melanggar hukum. Halaman web ini, dengan cara apa pun, tidak mengizinkan penggunaan tersebut. Data diperbarui setiap hari. Untuk mengakses daftar kode Chicago Police Department - Illinois Uniform Crime Reporting (IUCR), menggunakan data Chicago Dataset ini saya akan melakukan prediksi banyaknya angka kasus penembakan di negara Chicago selama tahun 2001 sampai 2021, menggunakan metode “Time Series”.

PROSES DATA & EKSPLORASI

Persiapan Library/Paket R studio

Dalam proses pembuatan prediksi menggunakan Time Series dibutuhkan pemasangan “library” atau paket pada R studio sebagai berikut :

# prevent scientific notation
options(scipen = 1000)

# load library
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse) # manipulasi data
## ── Attaching packages
## ───────────────────────────────────────
## tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0     ✔ purrr   0.3.5
## ✔ tibble  3.1.8     ✔ stringr 1.4.1
## ✔ tidyr   1.2.1     ✔ forcats 0.5.2
## ✔ readr   2.1.3     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(lubridate) # manipulasi tanggal
## 
## Attaching package: 'lubridate'
## 
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(plotly)
## 
## Attaching package: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout
library(ggplot2)
library(padr) # TS padding
library(zoo) # imputasi missing value TS
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(fpp) # TS dataset
## Loading required package: forecast
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo 
## Loading required package: fma
## Loading required package: expsmooth
## Loading required package: lmtest
## Loading required package: tseries
library(forecast) # time series library
library(TTR) # Fungsi Simple Moving Avarage SMA 
library(tseries) # pengujian stasioner adf.test
library(MLmetrics) # kalkulasi error
## 
## Attaching package: 'MLmetrics'
## 
## The following object is masked from 'package:base':
## 
##     Recall
# supaya semua plot memiliki theme_minimal()
theme_set(theme_minimal())

Pemanggilan Data & Cleansing

Setelah “library” sudah dipastikan terpasang dengan baik, dilanjutkan dengan proses pemanggilan “Dataset” :

crimes <- read.csv("Crimes2001toPresent.csv")
head(crimes)
##         ID Case.Number                   Date                 Block IUCR
## 1 10224738    HY411648 09/05/2015 01:30:00 PM       043XX S WOOD ST 0486
## 2 10224739    HY411615 09/04/2015 11:30:00 AM   008XX N CENTRAL AVE 0870
## 3 11646166    JC213529 09/01/2018 12:01:00 AM 082XX S INGLESIDE AVE 0810
## 4 10224740    HY411595 09/05/2015 12:45:00 PM     035XX W BARRY AVE 2023
## 5 10224741    HY411610 09/05/2015 01:00:00 PM   0000X N LARAMIE AVE 0560
## 6 10224742    HY411435 09/05/2015 10:55:00 AM   082XX S LOOMIS BLVD 0610
##   Primary.Type             Description Location.Description Arrest Domestic
## 1      BATTERY DOMESTIC BATTERY SIMPLE            RESIDENCE  false     true
## 2        THEFT          POCKET-PICKING              CTA BUS  false    false
## 3        THEFT               OVER $500            RESIDENCE  false     true
## 4    NARCOTICS   POSS: HEROIN(BRN/TAN)             SIDEWALK   true    false
## 5      ASSAULT                  SIMPLE            APARTMENT  false     true
## 6     BURGLARY          FORCIBLE ENTRY            RESIDENCE  false    false
##   Beat District Ward Community.Area FBI.Code X.Coordinate Y.Coordinate Year
## 1  924        9   12             61      08B      1165074      1875917 2015
## 2 1511       15   29             25       06      1138875      1904869 2015
## 3  631        6    8             44       06                        NA 2018
## 4 1412       14   35             21       18      1152037      1920384 2015
## 5 1522       15   28             25      08A      1141706      1900086 2015
## 6  614        6   21             71       05      1168430      1850165 2015
##               Updated.On Latitude Longitude                      Location
## 1 02/10/2018 03:50:01 PM 41.81512 -87.67000 (41.815117282, -87.669999562)
## 2 02/10/2018 03:50:01 PM 41.89508 -87.76540 (41.895080471, -87.765400451)
## 3 04/06/2019 04:04:43 PM       NA        NA                              
## 4 02/10/2018 03:50:01 PM 41.93741 -87.71665 (41.937405765, -87.716649687)
## 5 02/10/2018 03:50:01 PM 41.88190 -87.75512 (41.881903443, -87.755121152)
## 6 02/10/2018 03:50:01 PM 41.74438 -87.65843 (41.744378879, -87.658430635)

Setelah dilakukan pemanggilan “Dataset”, lakukan cek pada tipe data untuk dapat disesuaikan dengan kebutuhan proses pengolahan menggunkan metode “Time Series”.

glimpse(crimes)
## Rows: 828,884
## Columns: 22
## $ ID                   <chr> "10224738", "10224739", "11646166", "10224740", "…
## $ Case.Number          <chr> "HY411648", "HY411615", "JC213529", "HY411595", "…
## $ Date                 <chr> "09/05/2015 01:30:00 PM", "09/04/2015 11:30:00 AM…
## $ Block                <chr> "043XX S WOOD ST", "008XX N CENTRAL AVE", "082XX …
## $ IUCR                 <chr> "0486", "0870", "0810", "2023", "0560", "0610", "…
## $ Primary.Type         <chr> "BATTERY", "THEFT", "THEFT", "NARCOTICS", "ASSAUL…
## $ Description          <chr> "DOMESTIC BATTERY SIMPLE", "POCKET-PICKING", "OVE…
## $ Location.Description <chr> "RESIDENCE", "CTA BUS", "RESIDENCE", "SIDEWALK", …
## $ Arrest               <chr> "false", "false", "false", "true", "false", "fals…
## $ Domestic             <chr> "true", "false", "true", "false", "true", "false"…
## $ Beat                 <int> 924, 1511, 631, 1412, 1522, 614, 1434, 1034, 1222…
## $ District             <int> 9, 15, 6, 14, 15, 6, 14, 10, 12, 8, 8, 16, 5, 2, …
## $ Ward                 <int> 12, 29, 8, 35, 28, 21, 32, 25, 27, 15, 13, 45, 34…
## $ Community.Area       <int> 61, 25, 44, 21, 25, 71, 24, 31, 27, 63, 65, 11, 4…
## $ FBI.Code             <chr> "08B", "06", "06", "18", "08A", "05", "05", "06",…
## $ X.Coordinate         <chr> "1165074", "1138875", "", "1152037", "1141706", "…
## $ Y.Coordinate         <int> 1875917, 1904869, NA, 1920384, 1900086, 1850165, …
## $ Year                 <int> 2015, 2015, 2018, 2015, 2015, 2015, 2015, 2015, 2…
## $ Updated.On           <chr> "02/10/2018 03:50:01 PM", "02/10/2018 03:50:01 PM…
## $ Latitude             <dbl> 41.81512, 41.89508, NA, 41.93741, 41.88190, 41.74…
## $ Longitude            <dbl> -87.67000, -87.76540, NA, -87.71665, -87.75512, -…
## $ Location             <chr> "(41.815117282, -87.669999562)", "(41.895080471, …

Lakukan pengecekan pada data, apakah ada data yang hilang?.

anyNA(crimes)
## [1] TRUE

setelah dilakukan pengecekan ternyata terdapat data yang hilang pada “dataset”, lakukan pengecekan lebih lanjut untuk mengetahui data yang hilang :

colSums(is.na(crimes))
##                   ID          Case.Number                 Date 
##                    0                    0                    0 
##                Block                 IUCR         Primary.Type 
##                    0                    0                    0 
##          Description Location.Description               Arrest 
##                    0                    0                    0 
##             Domestic                 Beat             District 
##                    0                    4                    5 
##                 Ward       Community.Area             FBI.Code 
##                  224                  216                    0 
##         X.Coordinate         Y.Coordinate                 Year 
##                    0                 4467                    5 
##           Updated.On             Latitude            Longitude 
##                    0                 4467                 4467 
##             Location 
##                    0

Eksplorasi Data

Setelah dilakukan pengecekan pada tipe data dan tipe data yang hilang, pastikan kembali tipe data dan data apa yang ingin digunakan. pada kesempatan kali ini saya akan berfokus pada banyaknya angka kasus penembakan di Chicago. dengan menggunakan “dataset crimes” dibutuhkan proses “subsetting” pada kolom “Primary.Type” dengan index : “ASSAULT”, langkah selanjutnya melakukan perhitungan pada “Primary.Type” yang sudah dilakukan “subsetting” dengan kurun waktu per bulan untuk dapat melakukan proses prediksi/*forecasting** *“dataset crime”**. Syarat memproses data menggunakan metode “Time Series” harus menggunakan tipe data integer/angka untuk menghasilkan data sesuai yang di inginkan. Selanjutnya melalkukan konversi data pada kolom “Date” dan pengelompokan data sesuai kebutuhan untuk proses “Time Series” dapat dilakukan. dibawah ini dilakukan proses pengelompokan sesuai kebutuhan data date sebagai frekuensi dari jumlah data “ASSAULT”.

c_assault <- crimes %>% # Data set & penamaan untuk data set dengan subsetting
  filter(Primary.Type %in% "ASSAULT") %>% # Memilih hanya data "ASSAULT"
  mutate(IncidentTime = mdy_hms(Date), # konversi data sesuai kebutuhan
         IncidentTime = date(IncidentTime),# subset menjadi komponen data tanggal.
         Month = month(IncidentTime)) %>% # membuat kolom "Month"
  select(Primary.Type, Month, Year) %>% # Memilih Kolom yang dibutuhkan
  group_by(Year, Month) %>% # Menggabungkan Kolom yang akan menjadi frekuensi
  summarise(AssaultCrime = n()) %>%  # Menghitung Total AssaultCrime
  ungroup() %>% 
  mutate(IncidentTime = parse_date_time(paste(Year, Month), orders = "Ym")) %>% # Menjadikan data diawali dengan Tahun
  select(IncidentTime, AssaultCrime) # Memilih Data yang dibutuhkan
## `summarise()` has grouped output by 'Year'. You can override using the
## `.groups` argument.
head(c_assault, 20) # Menampilkan Data c_assault
## # A tibble: 20 × 2
##    IncidentTime        AssaultCrime
##    <dttm>                     <int>
##  1 2001-01-01 00:00:00            2
##  2 2001-02-01 00:00:00            1
##  3 2001-03-01 00:00:00            1
##  4 2001-05-01 00:00:00            5
##  5 2001-07-01 00:00:00            4
##  6 2001-08-01 00:00:00            3
##  7 2001-10-01 00:00:00            1
##  8 2002-04-01 00:00:00            1
##  9 2002-11-01 00:00:00            1
## 10 2007-08-01 00:00:00            1
## 11 2009-08-01 00:00:00            1
## 12 2010-03-01 00:00:00            1
## 13 2014-04-01 00:00:00            1
## 14 2014-08-01 00:00:00            1
## 15 2014-09-01 00:00:00            1
## 16 2014-10-01 00:00:00            1
## 17 2014-11-01 00:00:00            2
## 18 2015-01-01 00:00:00            1
## 19 2015-02-01 00:00:00            4
## 20 2015-03-01 00:00:00           96

Berdasarkan code diatas sudah dilakukan “subsetting”, “groupby”, dan penamaan pada kolom Date menjadi IncidentTime & kolom Primary.Type yang sudah di “subsetting”, khusus pada baris Total “ASSAULT” menjadi “AssaultCrime”. sebelum melanjutkan langkah selanjutnya kita dapat memastikan kembali untuk rentang waktu 2001 - 2021 apakah sudah sesuai dengan kebutuhan data yang akan di proses dengan menggunakan coding dibawah ini :

range(c_assault$IncidentTime)
## [1] "2001-01-01 UTC" "2021-11-01 UTC"
c_assault %>% pad()
## pad applied on the interval: month
## # A tibble: 251 × 2
##    IncidentTime        AssaultCrime
##    <dttm>                     <int>
##  1 2001-01-01 00:00:00            2
##  2 2001-02-01 00:00:00            1
##  3 2001-03-01 00:00:00            1
##  4 2001-04-01 00:00:00           NA
##  5 2001-05-01 00:00:00            5
##  6 2001-06-01 00:00:00           NA
##  7 2001-07-01 00:00:00            4
##  8 2001-08-01 00:00:00            3
##  9 2001-09-01 00:00:00           NA
## 10 2001-10-01 00:00:00            1
## # … with 241 more rows
c_assault %>% mutate(AssaultCrime = na.fill(AssaultCrime, 0))
## # A tibble: 85 × 2
##    IncidentTime        AssaultCrime
##    <dttm>                     <int>
##  1 2001-01-01 00:00:00            2
##  2 2001-02-01 00:00:00            1
##  3 2001-03-01 00:00:00            1
##  4 2001-05-01 00:00:00            5
##  5 2001-07-01 00:00:00            4
##  6 2001-08-01 00:00:00            3
##  7 2001-10-01 00:00:00            1
##  8 2002-04-01 00:00:00            1
##  9 2002-11-01 00:00:00            1
## 10 2007-08-01 00:00:00            1
## # … with 75 more rows
anyNA(c_assault)
## [1] FALSE

Apabila sudah dapat dipastikan rentang waktu sudah sesuai, dapat dilanjutkan proses selanjutnya Membuat “Object Time Series” dengan periode 1 tahun & 1 bulan atau dengan frekuansi 12 & 1 bulan. rentang waktu yang akan kita proses yaitu mulai dari tahun 2001 berakhir pada tahun 2021.

# Membuat Object TS
crimes_ts1 <- ts(c_assault$AssaultCrime, start=2001, end=2021, freq = 1)
crimes_ts6 <- ts(c_assault$AssaultCrime, start=2001, end=2021, freq = 6)
crimes_ts12 <- ts(c_assault$AssaultCrime, start=2001, end=2021, freq =12)

Berikut ini adalah tampilan Object TS per bulan “crimes_ts1”, Kenapa pada “crimes_ts1” tidak menampilkan bulan melainkan hanya angka dalam interpretasi bulan ?, dikarenakan saat ini saya berfokus pada analisa berdasarkan tahun.

crimes_ts1
## Time Series:
## Start = 2001 
## End = 2021 
## Frequency = 1 
##  [1]   2   1   1   5   4   3   1   1   1   1   1   1   1   1   1   1   2   1   4
## [20]  96 192

Kenapa pada “crimes_ts6” tidak menampilkan bulan melainkan hanya angka dalam interpretasi per 6 bulan ?, dikarenakan saat ini saya berfokus pada analisa berdasarkan tahun.

crimes_ts6
## Time Series:
## Start = c(2001, 1) 
## End = c(2021, 1) 
## Frequency = 6 
##   [1]    2    1    1    5    4    3    1    1    1    1    1    1    1    1    1
##  [16]    1    2    1    4   96  192  190  178  866 1545 1481 1375 1204 1196 1176
##  [31] 1194 1587 1462 1729 1764 1650 1695 1616 1606 1368 1209 1316 1259 1442 1585
##  [46] 1796 1785 1746 1664 1707 1557 1388 1320 1387 1313 1564 1590 1966 1800  525
##  [61] 1679  507    4    2    1    3    1    1    2    6    3    1    3    2  444
##  [76]  268  158    2    1   68   44    1    1   32    9    2    1    1    5    4
##  [91]    3    1    1    1    1    1    1    1    1    1    1    2    1    4   96
## [106]  192  190  178  866 1545 1481 1375 1204 1196 1176 1194 1587 1462 1729 1764
## [121] 1650

Berikut ini adalah tampilan Object TS per 12 bulan “crimes_ts12”, dapat diperhatikan kembali untuk proses Object TS akan diawali dari bulan januari sampai dengan bulan januari pada tahun depannya dikarenakan data awal dimulai dari bulan januari dengan frequensi 12 bulan, berbeda dengan perbandingan antara frequensi 1 & 6 bulan, berdasarkan data “subsetting” sebelumnya yang berfokus pada analisa pertahun maka akan menampilkan data perbulan dari setiap tahunnya dikarenakan 1 tahun dengan frequensi 12 yaitu sebagai bulan dalam 1 tahun.

crimes_ts12
##       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
## 2001    2    1    1    5    4    3    1    1    1    1    1    1
## 2002    1    1    1    1    2    1    4   96  192  190  178  866
## 2003 1545 1481 1375 1204 1196 1176 1194 1587 1462 1729 1764 1650
## 2004 1695 1616 1606 1368 1209 1316 1259 1442 1585 1796 1785 1746
## 2005 1664 1707 1557 1388 1320 1387 1313 1564 1590 1966 1800  525
## 2006 1679  507    4    2    1    3    1    1    2    6    3    1
## 2007    3    2  444  268  158    2    1   68   44    1    1   32
## 2008    9    2    1    1    5    4    3    1    1    1    1    1
## 2009    1    1    1    1    1    2    1    4   96  192  190  178
## 2010  866 1545 1481 1375 1204 1196 1176 1194 1587 1462 1729 1764
## 2011 1650 1695 1616 1606 1368 1209 1316 1259 1442 1585 1796 1785
## 2012 1746 1664 1707 1557 1388 1320 1387 1313 1564 1590 1966 1800
## 2013  525 1679  507    4    2    1    3    1    1    2    6    3
## 2014    1    3    2  444  268  158    2    1   68   44    1    1
## 2015   32    9    2    1    1    5    4    3    1    1    1    1
## 2016    1    1    1    1    1    1    2    1    4   96  192  190
## 2017  178  866 1545 1481 1375 1204 1196 1176 1194 1587 1462 1729
## 2018 1764 1650 1695 1616 1606 1368 1209 1316 1259 1442 1585 1796
## 2019 1785 1746 1664 1707 1557 1388 1320 1387 1313 1564 1590 1966
## 2020 1800  525 1679  507    4    2    1    3    1    1    2    6
## 2021    3

Plot Object “pcrimes_ts1” dapat disimpulkan untuk trend banyaknya kasus penembakan dari tahun 2001 sampai dengan 2017 cendrung stabil total kasusnya, berlanjut pada tahun 2018 sampai 2021 kasus penembakan di Chicago meningkat setiap bulannya.

pcrimes_ts1 <- autoplot(crimes_ts1) + theme_linedraw()
ggplotly(pcrimes_ts1)

Plot Object “pcrimes_ts6” dapat disimpulkan untuk trend tertinggi banyaknya kasus penembakan dari tahun 2001 sampai dengan 2021 berada pada tahun 2010 dengan total 1966 kasus, terjadi penurunan secara signifikan pada 2011 dengan total kasus 4, dan kembali terjadi kenaikan secara signifikan setelah 10 tahun setelahnya dengan total kasus penembakan 1764 kasus.

pcrimes_ts6 <- autoplot(crimes_ts6) + theme_minimal()
ggplotly(pcrimes_ts6)

Plot Object “pcrimes_ts12” dapat disimpulkan untuk trend banyaknya kasus penembakan memiki pola berulang dengan titik tertinggi kasus berada di 2005, 2012, 2019. Pola yang terjadi setiap 7 tahun Chicago menjadi trend kasus penembakan tertinggi setelah 1 tahun akan menjadi fase dimana kasus penembakan terjadi.

pcrimes_ts12 <- autoplot(crimes_ts12) + theme_light()
ggplotly(pcrimes_ts12)

Pada hasil ploting diatas antara “pcrimes_ts1”, “pcrimes_ts6”, “pcrimes_ts12”. data “pcrimes_ts12” menampilkan adanya “Seasonal” (pola berulang).

Selanjutnya akan dilakukan proses Decomposition, Apa itu Decomposition?. Decomposition adalah suatu tahapan dalam Time Series analisis yang digunakan untuk menguraikan beberapa komponen dalam time series data.

Komponen/unsur dalam time series :

  • Trend : pola data secara general, cenderung naik atau turun
  • Seasonal : pola yang berulang pada periode waktu yang tetap/sama
  • Residual/Error : pola yang tidak dapat ditangkap dalam trend dan seasonal

Untuk dapat menguraikan object time series kita menjadi 3 komponen tersebut, kita dapat menggunakan fungsi `“decompose()” Pada tahap ini sudah ditentukan akan menggunakan “crimes_ts12” untuk proses Decomposition sebagai berikut :

crimests6_dc <- decompose(crimes_ts6)
crimests12_dc <- decompose(crimes_ts12)

berdasarkan tampilan Decomposition ini dibutuhkan hasil visualisasi untuk mempermudah proses analisa sebagai berikut :

crimests6_dc %>% autoplot()

crimests12_dc %>% autoplot()

adf.test(crimes_ts6, alternative = "stationary")
## 
##  Augmented Dickey-Fuller Test
## 
## data:  crimes_ts6
## Dickey-Fuller = -1.5837, Lag order = 4, p-value = 0.7495
## alternative hypothesis: stationary
adf.test(crimes_ts12, alternative = "stationary")
## 
##  Augmented Dickey-Fuller Test
## 
## data:  crimes_ts12
## Dickey-Fuller = -2.16, Lag order = 6, p-value = 0.5086
## alternative hypothesis: stationary
plot(diff(crimes_ts6))

stat1<- diff(diff(crimes_ts12))
plot(stat1)

Berdasarkan pola diatas dapat disimpulkan sudah stasioner dengan tanpa adanya trend dan plot diatas sudah membentuk seasonal.

MODEL TIME SERIES / FORCASTING

Proses pembuatan model Time Series forecasting, lakukan proses cross validation dengan dataset c_assault menjadi data train dan data test. data train digunakan untuk pemodelan dan data train untuk uji pemodelan.

train_c_assault <- c_assault %>% filter(IncidentTime< "2018-01-01") %>%
  select(AssaultCrime) %>% 
  ts(frequency = 12, start = 2001)

test_c_assault <- c_assault %>% filter(IncidentTime >= "2018-01-01") %>%
  filter(IncidentTime <= "2021-12-01") %>%
  select(AssaultCrime) %>% 
  ts(frequency = 12, start = 2018)
autoplot(train_c_assault)+ geom_line(data=test_c_assault, col = "red")

Pembuatan model auto ARIMA

auto_c_assault <- auto.arima(train_c_assault, seasonal = F)
auto_c_assault
## Series: train_c_assault 
## ARIMA(0,1,1) 
## 
## Coefficients:
##          ma1
##       0.3195
## s.e.  0.1326
## 
## sigma^2 = 26915:  log likelihood = -338.55
## AIC=681.09   AICc=681.34   BIC=684.99
summary(auto_c_assault)
## Series: train_c_assault 
## ARIMA(0,1,1) 
## 
## Coefficients:
##          ma1
##       0.3195
## s.e.  0.1326
## 
## sigma^2 = 26915:  log likelihood = -338.55
## AIC=681.09   AICc=681.34   BIC=684.99
## 
## Training set error measures:
##                    ME    RMSE      MAE         MPE     MAPE      MASE
## Training set 18.70256 160.933 90.34764 -0.01180506 24.51971 0.1948479
##                      ACF1
## Training set -0.003029751

Model auto ARIMA menghasilkan MAPE 24,51% di Data Train.

Hasil dari auto arima tersebut memiliki model ARIMA(0,1,1), dengan melakukan differencing sebanyak 2x dikarenakan pada data sebelumnya belum stationer. Melihat plot acf dan pacf menggunakan “tsdisplay()”

tsdisplay(diff(train_c_assault))

Berdasarkan plot diatas dapat kita perhatikan, Pertama lihat pattern ACF dan PACF:

Ada 2 tipe pola pada plot PACF dan ACF: - dies down/decay: mengalami penurunan atau kenaikan secara lambat - cuts off lag: mengalami penurunan atau kenaikan secara cepat

berdasarkan plot diatas termasuk dalam tipe pola “cuts off lag”

modelarima1 <-  Arima(train_c_assault, order=c(1,1,1))
modelarima2 <-  Arima(train_c_assault, order=c(1,0,0))
tsdisplay(modelarima1$residuals)

tsdisplay(modelarima2$residuals)

accuracy(modelarima1)
##                    ME     RMSE      MAE        MPE     MAPE      MASE
## Training set 18.23702 160.8998 90.50458 0.06793601 24.33332 0.1951864
##                      ACF1
## Training set -0.007094345
accuracy(modelarima2)
##                    ME     RMSE      MAE       MPE     MAPE      MASE      ACF1
## Training set 24.25395 169.7652 95.91569 -745.0399 757.9178 0.2068562 0.2905056
MAPE(modelarima1$fitted[,1], modelarima1$x)*100
## [1] 24.33332
MAPE(modelarima2$fitted[,1], modelarima2$x)*100
## [1] 757.9178

Dari hasil evaluasi model diatas menggunakan MAPE mendapatkan tingkat error modelarima1 lebih kecil dibandingkan modelarima2, dengan menggunakan ARIMA (1,1,1) dengan nilai 24,33%. proses model yang direkomendasikan adalah modelarima1 untuk proses forcasting. dan untuk evaluasi model “Goodness of Fit” menggunakan accuracy() didapatkan modelarima1 24.33332 sedangkan modelarima2 757.9178. sehingga modelarima1 tetap menjadi model terbaik untuk forcasting.

forcast <- forecast(modelarima1, h=12)
forcast
##          Point Forecast     Lo 80    Hi 80      Lo 95    Hi 95
## Jun 2005       1308.263 1095.9654 1520.560  983.58198 1632.944
## Jul 2005       1307.375  955.1304 1659.620  768.66340 1846.087
## Aug 2005       1307.308  853.3984 1761.217  613.11316 2001.503
## Sep 2005       1307.303  770.4444 1844.161  486.24879 2128.357
## Oct 2005       1307.302  698.6835 1915.921  376.50009 2238.105
## Nov 2005       1307.302  634.5332 1980.072  278.39069 2336.214
## Dec 2005       1307.302  575.9886 2038.616  188.85444 2425.750
## Jan 2006       1307.302  521.7953 2092.810  105.97297 2508.632
## Feb 2006       1307.302  471.1069 2143.498   28.45176 2586.153
## Mar 2006       1307.302  423.3203 2191.285  -44.63159 2659.236
## Apr 2006       1307.302  377.9877 2236.617 -113.96185 2728.567
## May 2006       1307.302  334.7658 2279.839 -180.06394 2794.669
# Ljung-Box test
Box.test(modelarima1$residuals, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  modelarima1$residuals
## X-squared = 0.0028214, df = 1, p-value = 0.9576

Dilakukan visualisasi hasil forecast :

Plotresult <- autoplot(forcast$x) + 
  autolayer(forcast$fitted) + 
  autolayer(forcast$mean) + 
  geom_line(c_assault=test_c_assault, col="blue", aes(x=x, y=y))
## Warning in geom_line(c_assault = test_c_assault, col = "blue", aes(x = x, :
## Ignoring unknown parameters: `c_assault`
Plotresult

KESIMPULAN

Berdasarkan “Plotresult” hasil forecasting dengan frequensi 12 bulan dengan data awal berbading dengan data test, setelah pengujian berpotensi menurun dibandingkan dengan data awal, perbandingan nilai error mencapa 24,33 % pada tahun 2018-2021, dengan menggunakan model auto ARIMA didapatkan nilai error 24,51%. Hasil daripada uji Box-Ljung-test adalah : Residual tidak mengalami autokorelasi sehingga asumsi pengujian terpenuhi.