Pada project ini, kita akan melakukan analisis time series serta melakukan forecasting pada data tindak kejahatan per hari pada beberapa kota di Chicago, dari tahun 2001-2024.
Kita panggil setiap library yang dibutuhkan dalam proses pembuatan model time series hingga evaluasi dan hasil interpretasi model nantinya.
# load library
library(dplyr) # data wrangling
library(lubridate) # date manipulation
library(padr) # complete data frame
library(zoo) # Missing value imputation
library(forecast) # time series library
library(TTR) # for Simple moving average function
library(MLmetrics) # calculate error
library(tseries) # adf.test
library(fpp) # data for forecasting: principles and practice
library(TSstudio) # mempercantik visualisasi timeseries
library(ggplot2)
library(tidyr)Kita mulai dengan membaca dataset
dataset_crime_20240816.csv dan kita simpan dalam variabel
data_crime.
Berikut ini adalah penjelasan terkait variabel-variabel tersebut:
ID: Identifikasi unik untuk catatan.Case Number: Nomor RD Departemen Kepolisian Chicago
(Nomor Divisi Catatan), yang unik untuk insiden tersebut.Date: Tanggal kejadian itu terjadi. ini terkadang
merupakan perkiraan terbaik.Block: Alamat tempat kejadian terjadi telah disunting
sebagian, menempatkannya di blok yang sama dengan alamat
sebenarnya.IUCR: Kode Pelaporan Kejahatan Seragam Illinois. Ini
terkait langsung dengan Tipe dan Deskripsi Utama.Primary Type: Deskripsi utama kode IUCR.Description: Deskripsi sekunder dari kode IUCR,
subkategori dari deskripsi primer.Location Description: Deskripsi lokasi kejadian
kejadian.Arrest: Menunjukkan apakah penangkapan telah
dilakukan.Domestic: Menunjukkan apakah insiden tersebut berkaitan
dengan rumah tangga sebagaimana ditentukan oleh Undang-Undang KDRT
Illinois.Beat: Menunjukkan ketukan di mana insiden itu terjadi.
Satu ketukan adalah wilayah geografis polisi terkecil – setiap ketukan
memiliki mobil polisi khusus. Tiga sampai lima ketukan membentuk sektor
kepolisian, dan tiga sektor membentuk distrik kepolisian. Departemen
Kepolisian Chicago memiliki 22 distrik kepolisian.District: Menunjukkan distrik polisi tempat kejadian
itu terjadi.Ward: Lingkungan (distrik Dewan Kota) tempat kejadian
terjadi.Community Area: Menunjukkan area komunitas tempat
kejadian terjadi. Chicago memiliki 77 wilayah komunitas.FBI Code: Menunjukkan klasifikasi kejahatan sebagaimana
diuraikan dalam Sistem Pelaporan Berbasis Insiden Nasional (NIBRS) FBI.
*X Coordinate: Koordinat x lokasi terjadinya peristiwa
dalam proyeksi State Plane Illinois East NAD 1983. Lokasi ini digeser
dari lokasi sebenarnya untuk redaksi sebagian namun berada pada blok
yang sama.Y Coordinate: Koordinat y lokasi terjadinya peristiwa
dalam proyeksi State Plane Illinois East NAD 1983. Lokasi ini digeser
dari lokasi sebenarnya untuk redaksi sebagian namun berada pada blok
yang sama.Year: Tahun kejadian itu terjadi.Updated On: Tanggal dan waktu catatan terakhir
diperbarui.Latitude: Garis lintang lokasi kejadian terjadi. Lokasi
ini digeser dari lokasi sebenarnya untuk redaksi sebagian namun berada
pada blok yang sama.Longitude: Garis bujur lokasi terjadinya kejadian.
Lokasi ini digeser dari lokasi sebenarnya untuk redaksi sebagian namun
berada pada blok yang sama.Location: Lokasi terjadinya insiden dalam format yang
memungkinkan pembuatan peta dan operasi geografis lainnya di portal data
ini. Lokasi ini digeser dari lokasi sebenarnya untuk redaksi sebagian
namun berada pada blok yang sama.Kemudian kita cek setiap tipe data dengan fungsi
glimpse.
#> Rows: 8,131,156
#> Columns: 22
#> $ ID <int> 11037294, 11646293, 11645836, 11645959, 11645601,…
#> $ Case.Number <chr> "JA371270", "JC213749", "JC212333", "JC211511", "…
#> $ Date <chr> "03/18/2015 12:00:00 PM", "12/20/2018 03:00:00 PM…
#> $ Block <chr> "0000X W WACKER DR", "023XX N LOCKWOOD AVE", "055…
#> $ IUCR <chr> "1153", "1154", "1153", "2820", "1153", "0810", "…
#> $ Primary.Type <chr> "DECEPTIVE PRACTICE", "DECEPTIVE PRACTICE", "DECE…
#> $ Description <chr> "FINANCIAL IDENTITY THEFT OVER $ 300", "FINANCIAL…
#> $ Location.Description <chr> "BANK", "APARTMENT", "", "RESIDENCE", "RESIDENCE"…
#> $ Arrest <chr> "false", "false", "false", "false", "false", "fal…
#> $ Domestic <chr> "false", "false", "false", "false", "false", "tru…
#> $ Beat <int> 111, 2515, 824, 1724, 2222, 631, 2515, 631, 811, …
#> $ District <int> 1, 25, 8, 17, 22, 6, 25, 6, 8, 15, 19, 2, 9, 4, 7…
#> $ Ward <int> 42, 36, 15, 33, 21, 8, 30, 6, 23, 29, 44, 3, 11, …
#> $ Community.Area <int> 32, 19, 63, 14, 71, 44, 19, 44, 56, 25, 6, 35, 60…
#> $ FBI.Code <chr> "11", "11", "11", "08A", "11", "06", "11", "11", …
#> $ X.Coordinate <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 11781…
#> $ Y.Coordinate <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 18816…
#> $ Year <int> 2015, 2018, 2016, 2018, 2014, 2018, 2018, 2018, 2…
#> $ Updated.On <chr> "08/01/2017 03:52:26 PM", "04/06/2019 04:04:43 PM…
#> $ Latitude <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 41.83…
#> $ Longitude <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -87.6…
#> $ Location <chr> "", "", "", "", "", "", "", "", "", "", "", "(41.…
Untuk membuat model time series, pada data ini kita hanya perlu
menyesuaikan tipe data pada kolom Date yang sebelumnya
bertipe character menjadi tipe data date.
Ubah tipe data variabel Date:
data_crime <-
data_crime %>%
mutate(Date = mdy_hms(Date),
Date = floor_date(Date, unit = "day"))
data_crime <- data_crime %>%
mutate(Date = ymd(Date))
glimpse(data_crime)#> Rows: 8,131,156
#> Columns: 22
#> $ ID <int> 11037294, 11646293, 11645836, 11645959, 11645601,…
#> $ Case.Number <chr> "JA371270", "JC213749", "JC212333", "JC211511", "…
#> $ Date <date> 2015-03-18, 2018-12-20, 2016-05-01, 2018-12-20, …
#> $ Block <chr> "0000X W WACKER DR", "023XX N LOCKWOOD AVE", "055…
#> $ IUCR <chr> "1153", "1154", "1153", "2820", "1153", "0810", "…
#> $ Primary.Type <chr> "DECEPTIVE PRACTICE", "DECEPTIVE PRACTICE", "DECE…
#> $ Description <chr> "FINANCIAL IDENTITY THEFT OVER $ 300", "FINANCIAL…
#> $ Location.Description <chr> "BANK", "APARTMENT", "", "RESIDENCE", "RESIDENCE"…
#> $ Arrest <chr> "false", "false", "false", "false", "false", "fal…
#> $ Domestic <chr> "false", "false", "false", "false", "false", "tru…
#> $ Beat <int> 111, 2515, 824, 1724, 2222, 631, 2515, 631, 811, …
#> $ District <int> 1, 25, 8, 17, 22, 6, 25, 6, 8, 15, 19, 2, 9, 4, 7…
#> $ Ward <int> 42, 36, 15, 33, 21, 8, 30, 6, 23, 29, 44, 3, 11, …
#> $ Community.Area <int> 32, 19, 63, 14, 71, 44, 19, 44, 56, 25, 6, 35, 60…
#> $ FBI.Code <chr> "11", "11", "11", "08A", "11", "06", "11", "11", …
#> $ X.Coordinate <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 11781…
#> $ Y.Coordinate <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 18816…
#> $ Year <int> 2015, 2018, 2016, 2018, 2014, 2018, 2018, 2018, 2…
#> $ Updated.On <chr> "08/01/2017 03:52:26 PM", "04/06/2019 04:04:43 PM…
#> $ Latitude <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 41.83…
#> $ Longitude <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -87.6…
#> $ Location <chr> "", "", "", "", "", "", "", "", "", "", "", "(41.…
Melihat jenis / type crime:
#> [1] "DECEPTIVE PRACTICE" "OTHER OFFENSE"
#> [3] "THEFT" "BATTERY"
#> [5] "ASSAULT" "WEAPONS VIOLATION"
#> [7] "INTERFERENCE WITH PUBLIC OFFICER" "SEX OFFENSE"
#> [9] "BURGLARY" "NARCOTICS"
#> [11] "LIQUOR LAW VIOLATION" "CRIM SEXUAL ASSAULT"
#> [13] "MOTOR VEHICLE THEFT" "CRIMINAL DAMAGE"
#> [15] "OFFENSE INVOLVING CHILDREN" "CRIMINAL TRESPASS"
#> [17] "ROBBERY" "PUBLIC PEACE VIOLATION"
#> [19] "CRIMINAL SEXUAL ASSAULT" "PROSTITUTION"
#> [21] "STALKING" "HOMICIDE"
#> [23] "KIDNAPPING" "ARSON"
#> [25] "CONCEALED CARRY LICENSE VIOLATION" "GAMBLING"
#> [27] "OBSCENITY" "INTIMIDATION"
#> [29] "OTHER NARCOTIC VIOLATION" "PUBLIC INDECENCY"
#> [31] "NON-CRIMINAL" "HUMAN TRAFFICKING"
#> [33] "RITUALISM" "DOMESTIC VIOLENCE"
#> [35] "NON-CRIMINAL (SUBJECT SPECIFIED)" "NON - CRIMINAL"
Melihat proporsi data dari masing-masing jenis
crime:
Saya ingin mengambil data OFFENSE INVOLVING CHILDREN yaitu data tentang Pelanggaran yang Melibatkan Anak.
Untuk melihat range waktu dari data:
#> [1] "2001-01-01" "2024-08-06"
Menyiapkan dataset untuk model time series. Disini kita akan menjumlahkan data kriminal untuk tipe kriminal Offense Involving Children berdasarkan tanggal.
Karena range waktu data ini cukup panjang yaitu 24 tahun, jika menggunakan frekuensi harian maka akan sangat banyak. Oleh sebab itu, kita membuat interval datanya dalam bentuk bulanan.
Melakukan agregasi data oic dalam interval bulanan:
oic_month <- oic %>%
mutate(Date = floor_date(Date, unit = "month")) %>%
group_by(Date) %>%
summarise(cases = sum(cases)) %>%
ungroup()
oic_monthAgar dapat dilakukan analisis dan pemodelan dari data time series, terdapat beberapa tiga syarat utama yang harus dipenuhi, antara lain:
Mengisi deret bulan dari range waktu dari data oic.
# mendefinisikan deret waktu yang lengkap
complete_month <- seq.Date(from = min(oic_month$Date), # Waktu Awal
to = max(oic_month$Date), # Waktu Akhir
by = "month" ) # Interval Waktu
complete_month#> [1] "2001-01-01" "2001-02-01" "2001-03-01" "2001-04-01" "2001-05-01"
#> [6] "2001-06-01" "2001-07-01" "2001-08-01" "2001-09-01" "2001-10-01"
#> [11] "2001-11-01" "2001-12-01" "2002-01-01" "2002-02-01" "2002-03-01"
#> [16] "2002-04-01" "2002-05-01" "2002-06-01" "2002-07-01" "2002-08-01"
#> [21] "2002-09-01" "2002-10-01" "2002-11-01" "2002-12-01" "2003-01-01"
#> [26] "2003-02-01" "2003-03-01" "2003-04-01" "2003-05-01" "2003-06-01"
#> [31] "2003-07-01" "2003-08-01" "2003-09-01" "2003-10-01" "2003-11-01"
#> [36] "2003-12-01" "2004-01-01" "2004-02-01" "2004-03-01" "2004-04-01"
#> [41] "2004-05-01" "2004-06-01" "2004-07-01" "2004-08-01" "2004-09-01"
#> [46] "2004-10-01" "2004-11-01" "2004-12-01" "2005-01-01" "2005-02-01"
#> [51] "2005-03-01" "2005-04-01" "2005-05-01" "2005-06-01" "2005-07-01"
#> [56] "2005-08-01" "2005-09-01" "2005-10-01" "2005-11-01" "2005-12-01"
#> [61] "2006-01-01" "2006-02-01" "2006-03-01" "2006-04-01" "2006-05-01"
#> [66] "2006-06-01" "2006-07-01" "2006-08-01" "2006-09-01" "2006-10-01"
#> [71] "2006-11-01" "2006-12-01" "2007-01-01" "2007-02-01" "2007-03-01"
#> [76] "2007-04-01" "2007-05-01" "2007-06-01" "2007-07-01" "2007-08-01"
#> [81] "2007-09-01" "2007-10-01" "2007-11-01" "2007-12-01" "2008-01-01"
#> [86] "2008-02-01" "2008-03-01" "2008-04-01" "2008-05-01" "2008-06-01"
#> [91] "2008-07-01" "2008-08-01" "2008-09-01" "2008-10-01" "2008-11-01"
#> [96] "2008-12-01" "2009-01-01" "2009-02-01" "2009-03-01" "2009-04-01"
#> [101] "2009-05-01" "2009-06-01" "2009-07-01" "2009-08-01" "2009-09-01"
#> [106] "2009-10-01" "2009-11-01" "2009-12-01" "2010-01-01" "2010-02-01"
#> [111] "2010-03-01" "2010-04-01" "2010-05-01" "2010-06-01" "2010-07-01"
#> [116] "2010-08-01" "2010-09-01" "2010-10-01" "2010-11-01" "2010-12-01"
#> [121] "2011-01-01" "2011-02-01" "2011-03-01" "2011-04-01" "2011-05-01"
#> [126] "2011-06-01" "2011-07-01" "2011-08-01" "2011-09-01" "2011-10-01"
#> [131] "2011-11-01" "2011-12-01" "2012-01-01" "2012-02-01" "2012-03-01"
#> [136] "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
#> [141] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01"
#> [146] "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01"
#> [151] "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01"
#> [156] "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01"
#> [161] "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01" "2014-09-01"
#> [166] "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01"
#> [171] "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01" "2015-07-01"
#> [176] "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
#> [181] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01"
#> [186] "2016-06-01" "2016-07-01" "2016-08-01" "2016-09-01" "2016-10-01"
#> [191] "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01"
#> [196] "2017-04-01" "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01"
#> [201] "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01" "2018-01-01"
#> [206] "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01"
#> [211] "2018-07-01" "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01"
#> [216] "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
#> [221] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01"
#> [226] "2019-10-01" "2019-11-01" "2019-12-01" "2020-01-01" "2020-02-01"
#> [231] "2020-03-01" "2020-04-01" "2020-05-01" "2020-06-01" "2020-07-01"
#> [236] "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01" "2020-12-01"
#> [241] "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01"
#> [246] "2021-06-01" "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01"
#> [251] "2021-11-01" "2021-12-01" "2022-01-01" "2022-02-01" "2022-03-01"
#> [256] "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
#> [261] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01"
#> [266] "2023-02-01" "2023-03-01" "2023-04-01" "2023-05-01" "2023-06-01"
#> [271] "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01" "2023-11-01"
#> [276] "2023-12-01" "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01"
#> [281] "2024-05-01" "2024-06-01" "2024-07-01" "2024-08-01"
Cek kelengkapan data oic_month untuk memastikan apakah
ada data yang terlewat atau tidak.
#> [1] TRUE
Karena hasilnya TRUE maka semua periode data telah
complete (tidak ada yang terlewat).
Kemudian kita pastikan apakah terdapat missing value atau tidak pada data tersebut.
#> [1] FALSE
Hasilnya tidak ada missing value pada data.
ts()Data Offense Involving Children mengandung 284 observasi dan 2 variabel. Deskripsi pada masing-masing fitur dijelaskan di bawah ini:
Date: tanggal dari insiden terjadi (direkam per
hari)cases: total jumlah pelanggaran per hariSebagai seorang data scientist, saya akan mengembangkan
model peramalan yang akan membantu keamanan dan pihak terkait lainnya
dalam proses pengambilan keputusan. Berdasarkan data yang kita miliki,
kita akan melakukan peramalan banyaknya kejadian penyerangan
(cases) untuk mengantisipasi aktivitas kejahatan pada
tanggal tertentu dan membantu pihak keamanan untuk mengalokasikan jumlah
sumber daya yang tepat untuk kota-kota di Chicago.
Kita membuat object time series berdasarkan data
Offense Involving Children menggunakan fungsi
ts() dengan frekuensi yang digunakan adalah 12 dan
simpanlah ke dalam object oic_ts.
ts(data, start, frequency)
data = data (kolom) yang akan diprediksi (nilai
numerik)start = waktu awal mula data dalam bentuk vektor
c(year, month)frequency = pola berulang yang ingin dianalisis#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> 2001 247 153 195 196 213 216 212 186 174 143 159 171
#> 2002 286 152 204 200 208 247 247 226 209 221 205 191
#> 2003 305 202 246 215 268 251 280 278 273 252 252 225
#> 2004 333 283 251 245 262 247 263 236 255 242 247 239
#> 2005 350 194 204 246 239 283 241 265 244 227 195 221
#> 2006 327 195 234 177 246 242 247 235 216 224 214 230
#> 2007 313 175 254 263 265 238 202 287 235 236 225 226
#> 2008 293 190 207 196 228 215 218 247 234 207 199 233
#> 2009 325 216 211 224 220 243 188 210 212 181 193 211
#> 2010 315 190 233 221 243 203 214 236 196 180 200 205
#> 2011 254 158 207 222 221 228 209 168 196 190 167 219
#> 2012 275 168 217 152 194 215 212 190 163 203 175 174
#> 2013 303 203 228 175 209 212 192 173 202 196 192 216
#> 2014 315 172 227 208 211 248 171 223 182 198 183 207
#> 2015 329 190 206 193 205 217 211 192 187 198 173 191
#> 2016 303 183 235 221 224 227 185 204 197 201 149 155
#> 2017 335 136 190 186 225 198 182 202 191 201 174 215
#> 2018 287 170 204 201 219 220 187 193 195 216 181 180
#> 2019 224 195 203 249 251 185 178 200 189 201 195 178
#> 2020 248 208 173 133 156 167 168 124 167 160 149 169
#> 2021 175 119 146 168 203 172 169 145 164 149 168 167
#> 2022 156 157 161 158 188 133 181 188 157 139 126 123
#> 2023 177 146 138 163 164 130 133 130 145 126 145 117
#> 2024 135 147 138 170 183 146 136 15
Untuk mengetahui karakteristik dari objek time series
oic_ts, maka kita membuat visualisasinya menggunakan fungsi
autoplot().
Setelah kita membuat objek time series oic_ts,
mari melihat elemen time series di dalamnya. Kita ingin melihat
pola trend dan seasonality untuk menentukan model yang
tepat untuk meramalkan data oic_ts. Kita dapat menggunakan
fungsi decompose() untuk mengetahui pola trend,
seasonality, dan error pada data time series
dan memvisualisasikannya menggunakan fungsi autoplot().
Untuk dapat menguraikan object time series kita menjadi 3 komponen
tersebut, kita dapat menggunakan fungsi decompose().
#> $x
#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> 2001 247 153 195 196 213 216 212 186 174 143 159 171
#> 2002 286 152 204 200 208 247 247 226 209 221 205 191
#> 2003 305 202 246 215 268 251 280 278 273 252 252 225
#> 2004 333 283 251 245 262 247 263 236 255 242 247 239
#> 2005 350 194 204 246 239 283 241 265 244 227 195 221
#> 2006 327 195 234 177 246 242 247 235 216 224 214 230
#> 2007 313 175 254 263 265 238 202 287 235 236 225 226
#> 2008 293 190 207 196 228 215 218 247 234 207 199 233
#> 2009 325 216 211 224 220 243 188 210 212 181 193 211
#> 2010 315 190 233 221 243 203 214 236 196 180 200 205
#> 2011 254 158 207 222 221 228 209 168 196 190 167 219
#> 2012 275 168 217 152 194 215 212 190 163 203 175 174
#> 2013 303 203 228 175 209 212 192 173 202 196 192 216
#> 2014 315 172 227 208 211 248 171 223 182 198 183 207
#> 2015 329 190 206 193 205 217 211 192 187 198 173 191
#> 2016 303 183 235 221 224 227 185 204 197 201 149 155
#> 2017 335 136 190 186 225 198 182 202 191 201 174 215
#> 2018 287 170 204 201 219 220 187 193 195 216 181 180
#> 2019 224 195 203 249 251 185 178 200 189 201 195 178
#> 2020 248 208 173 133 156 167 168 124 167 160 149 169
#> 2021 175 119 146 168 203 172 169 145 164 149 168 167
#> 2022 156 157 161 158 188 133 181 188 157 139 126 123
#> 2023 177 146 138 163 164 130 133 130 145 126 145 117
#> 2024 135 147 138 170 183 146 136 15
#>
#> $seasonal
#> Jan Feb Mar Apr May Jun
#> 2001 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2002 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2003 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2004 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2005 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2006 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2007 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2008 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2009 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2010 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2011 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2012 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2013 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2014 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2015 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2016 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2017 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2018 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2019 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2020 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2021 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2022 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2023 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> 2024 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> Jul Aug Sep Oct Nov Dec
#> 2001 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2002 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2003 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2004 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2005 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2006 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2007 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2008 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2009 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2010 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2011 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2012 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2013 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2014 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2015 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2016 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2017 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2018 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2019 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2020 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2021 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2022 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2023 -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#> 2024 -3.1300780 -0.8293533
#>
#> $trend
#> Jan Feb Mar Apr May Jun Jul Aug
#> 2001 NA NA NA NA NA NA 190.3750 191.9583
#> 2002 196.6250 199.7500 202.8750 207.5833 212.7500 215.5000 217.1250 220.0000
#> 2003 233.5417 237.0833 241.9167 245.8750 249.1250 252.5000 255.0833 259.6250
#> 2004 264.3750 261.9167 259.4167 258.2500 257.6250 258.0000 259.2917 256.2917
#> 2005 248.9167 249.2083 249.9583 248.8750 246.0833 243.1667 241.4583 240.5417
#> 2006 234.7500 233.7500 231.3333 230.0417 230.7083 231.8750 231.6667 230.2500
#> 2007 237.6250 237.9167 240.8750 242.1667 243.1250 243.4167 242.4167 242.2083
#> 2008 229.0000 228.0000 226.2917 225.0417 222.7500 221.9583 223.5833 226.0000
#> 2009 230.1667 227.3750 224.9167 222.9167 221.5833 220.4167 219.0833 217.5833
#> 2010 217.7500 219.9167 220.3333 219.6250 219.8750 219.9167 217.1250 213.2500
#> 2011 209.8750 206.8333 204.0000 204.4167 203.4583 202.6667 204.1250 205.4167
#> 2012 197.6250 198.6667 198.2083 197.3750 198.2500 196.7083 196.0000 198.6250
#> 2013 203.0833 201.5417 202.4583 203.7917 204.2083 206.6667 208.9167 208.1250
#> 2014 211.7917 213.0000 214.2500 213.5000 213.2083 212.4583 212.6667 214.0000
#> 2015 210.3333 210.7083 209.6250 209.8333 209.4167 208.3333 206.5833 205.2083
#> 2016 211.0000 210.4167 211.3333 211.8750 211.0000 208.5000 208.3333 207.7083
#> 2017 196.6250 196.4167 196.0833 195.8333 196.8750 200.4167 200.9167 200.3333
#> 2018 205.7083 205.5417 205.3333 206.1250 207.0417 205.8750 201.7917 200.2083
#> 2019 204.5417 204.4583 204.5000 203.6250 203.5833 204.0833 205.0000 206.5417
#> 2020 185.0833 181.5000 177.4167 174.7917 171.1667 168.8750 165.4583 158.7083
#> 2021 160.0417 160.9583 161.7083 161.1250 161.4583 162.1667 161.2917 162.0833
#> 2022 160.0833 162.3750 163.8750 163.1667 161.0000 157.4167 156.4583 156.8750
#> 2023 150.6667 146.2500 143.3333 142.2917 142.5417 143.0833 141.0833 139.3750
#> 2024 143.0417 138.3750 NA NA NA NA NA NA
#> Sep Oct Nov Dec
#> 2001 192.2917 192.8333 192.7917 193.8750
#> 2002 223.8333 226.2083 229.3333 232.0000
#> 2003 263.2083 264.6667 265.6667 265.2500
#> 2004 250.6250 248.7083 247.7917 248.3333
#> 2005 241.8333 240.2083 237.6250 236.2083
#> 2006 230.2500 234.6667 239.0417 239.6667
#> 2007 240.8750 236.1250 231.7917 229.2917
#> 2008 227.2500 228.5833 229.4167 230.2500
#> 2009 217.4167 218.2083 219.0417 218.3333
#> 2010 210.8333 209.7917 208.9167 209.0417
#> 2011 206.2500 203.7500 199.7083 198.0417
#> 2012 200.5417 201.9583 203.5417 204.0417
#> 2013 206.7917 208.1250 209.5833 211.1667
#> 2014 213.8750 212.3750 211.5000 209.9583
#> 2015 206.1250 208.5000 210.4583 211.6667
#> 2016 203.8750 200.5417 199.1250 197.9583
#> 2017 202.3333 203.5417 203.9167 204.5833
#> 2018 201.2083 203.1667 206.5000 206.3750
#> 2019 205.8333 199.7500 190.9583 186.2500
#> 2020 153.8750 154.2083 157.6250 159.7917
#> 2021 164.2917 164.5000 163.4583 161.2083
#> 2022 155.4583 154.7083 153.9167 152.7917
#> 2023 139.4167 139.7083 140.7917 142.2500
#> 2024
#>
#> $random
#> Jan Feb Mar Apr May
#> 2001 NA NA NA NA NA
#> 2002 18.740585200 -22.571009003 1.459870444 0.073506807 -16.833690162
#> 2003 0.823918533 -9.904342336 4.418203777 -23.218159859 6.791309838
#> 2004 -2.009414800 46.262324330 -8.081796223 -5.593159859 -7.708690162
#> 2005 30.448918533 -30.029342336 -45.623462890 4.781840141 -19.167023496
#> 2006 21.615585200 -13.571009003 3.001537110 -45.384826526 3.207976504
#> 2007 4.740585200 -37.737675670 13.459870444 28.490173474 9.791309838
#> 2008 -6.634414800 -12.821009003 -18.956796223 -21.384826526 -6.833690162
#> 2009 24.198918533 13.803990997 -13.581796223 8.740173474 -13.667023496
#> 2010 26.615585200 -4.737675670 13.001537110 9.031840141 11.041309838
#> 2011 -26.509414800 -23.654342336 3.334870444 25.240173474 5.457976504
#> 2012 6.740585200 -5.487675670 19.126537110 -37.718159859 -16.333690162
#> 2013 29.282251866 26.637324330 25.876537110 -21.134826526 -7.292023496
#> 2014 32.573918533 -15.821009003 13.084870444 2.156840141 -14.292023496
#> 2015 48.032251866 4.470657664 -3.290129556 -9.176493193 -16.500356829
#> 2016 21.365585200 -2.237675670 24.001537110 16.781840141 0.916309838
#> 2017 67.740585200 -35.237675670 -5.748462890 -2.176493193 16.041309838
#> 2018 10.657251866 -10.362675670 -0.998462890 2.531840141 -0.125356829
#> 2019 -51.176081467 15.720657664 -1.165129556 53.031840141 35.332976504
#> 2020 -7.717748134 51.678990997 -4.081796223 -34.134826526 -27.250356829
#> 2021 -55.676081467 -16.779342336 -15.373462890 14.531840141 29.457976504
#> 2022 -74.717748134 19.803990997 -2.540129556 2.490173474 14.916309838
#> 2023 -44.301081467 24.928990997 -4.998462890 28.365173474 9.374643171
#> 2024 -78.676081467 33.803990997 NA NA NA
#> Jun Jul Aug Sep Oct
#> 2001 NA 24.755077953 -5.128980018 -10.837313351 -38.529342336
#> 2002 25.105703777 33.005077953 6.829353316 -7.378980018 6.095657664
#> 2003 -7.894296223 28.046744620 19.204353316 17.246019982 -1.362675670
#> 2004 -17.394296223 6.838411287 -19.462313351 11.829353316 4.595657664
#> 2005 33.439037110 2.671744620 25.287686649 9.621019982 -1.904342336
#> 2006 3.730703777 18.463411287 5.579353316 -6.795646684 0.637324330
#> 2007 -11.810962890 -37.286588713 45.621019982 1.579353316 11.178990997
#> 2008 -13.352629556 -2.453255380 21.829353316 14.204353316 -10.279342336
#> 2009 16.189037110 -27.953255380 -6.753980018 2.037686649 -25.904342336
#> 2010 -23.310962890 0.005077953 23.579353316 -7.378980018 -18.487675670
#> 2011 18.939037110 8.005077953 -36.587313351 -2.795646684 -2.446009003
#> 2012 11.897370444 19.130077953 -7.795646684 -30.087313351 12.345657664
#> 2013 -1.060962890 -13.786588713 -34.295646684 2.662686649 -0.821009003
#> 2014 29.147370444 -38.536588713 9.829353316 -24.420646684 -3.071009003
#> 2015 2.272370444 7.546744620 -12.378980018 -11.670646684 0.803990997
#> 2016 12.105703777 -20.203255380 -2.878980018 0.579353316 11.762324330
#> 2017 -8.810962890 -15.786588713 2.496019982 -3.878980018 8.762324330
#> 2018 7.730703777 -11.661588713 -6.378980018 1.246019982 24.137324330
#> 2019 -25.477629556 -23.869922047 -5.712313351 -9.378980018 12.553990997
#> 2020 -8.269296223 5.671744620 -33.878980018 20.579353316 17.095657664
#> 2021 3.439037110 10.838411287 -16.253980018 7.162686649 -4.196009003
#> 2022 -30.810962890 27.671744620 31.954353316 8.996019982 -4.404342336
#> 2023 -19.477629556 -4.953255380 -8.545646684 13.037686649 -2.404342336
#> 2024 NA NA NA
#> Nov Dec
#> 2001 -12.806516249 -10.636226394
#> 2002 -3.348182916 -28.761226394
#> 2003 7.318483751 -28.011226394
#> 2004 20.193483751 2.905440272
#> 2005 -21.639849583 -2.969559728
#> 2006 -4.056516249 2.572106939
#> 2007 14.193483751 8.947106939
#> 2008 -9.431516249 14.988773606
#> 2009 -5.056516249 4.905440272
#> 2010 12.068483751 8.197106939
#> 2011 -11.723182916 33.197106939
#> 2012 -7.556516249 -17.802893061
#> 2013 3.401817084 17.072106939
#> 2014 -7.514849583 9.280440272
#> 2015 -16.473182916 -8.427893061
#> 2016 -29.139849583 -30.719559728
#> 2017 -8.931516249 22.655440272
#> 2018 -4.514849583 -14.136226394
#> 2019 25.026817084 3.988773606
#> 2020 12.360150417 21.447106939
#> 2021 25.526817084 18.030440272
#> 2022 -6.931516249 -17.552893061
#> 2023 25.193483751 -13.011226394
#> 2024
#>
#> $figure
#> [1] 70.6344148 -25.1789910 -0.3348704 -7.6568401 12.0836902 6.3942962
#> [7] -3.1300780 -0.8293533 -7.4543533 -11.3039910 -20.9851504 -12.2387736
#>
#> $type
#> [1] "additive"
#>
#> attr(,"class")
#> [1] "decomposed.ts"
oic_ts memiliki jenis
seasonality “additive”.Memvisualisasikan hasil decompose menggunakan
autoplot().
Berdasarkan grafik dekomposisi di atas, pola trend
pada Offense Involving Children atau
Pelanggaran yang Melibatkan Anak di Chicago
menurun seiring berjalannya waktu, dan terdapat pola
berulang tahunan yang terjadi.
Kita sudah melihat pola trend dan seasonal pada
data oic_ts. Langkah selanjutnya adalah membangun model
time series. Sebelum membuat model, kita perlu memisahkan data
menjadi data train dan test. Kita pisahkan data
oic_ts menjadi test_oic yang mengandung data
20 bulan terakhir dari data asli menggunakan fungsi tail(),
kemudian gunakan sisa datanya sebagai train_oic dengan
menggunakan fungsi head().
#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> 2023 177 146 138 163 164 130 133 130 145 126 145 117
#> 2024 135 147 138 170 183 146 136 15
Pada data test tersebut, data terakhir (Agustus 2024) nilainya jauh lebih kecil dibandingkan bulan-bulan sebelumnya. Jika dilihat lebih dalam, hal itu disebabkan karena data pada bulan tersebut tidak sampai akhir bulan. Oleh karena itu, agar tidak menimbulkan bias / outlier pada data sehingga nilai evaluasi model kurang sesuai nantinya, maka kita hapus saja data terakhir tersebut.
#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> 2023 177 146 138 163 164 130 133 130 145 126 145 117
#> 2024 135 147 138 170 183 146 136
#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> 2001 247 153 195 196 213 216 212 186 174 143 159 171
#> 2002 286 152 204 200 208 247 247 226 209 221 205 191
#> 2003 305 202 246 215 268 251 280 278 273 252 252 225
#> 2004 333 283 251 245 262 247 263 236 255 242 247 239
#> 2005 350 194 204 246 239 283 241 265 244 227 195 221
#> 2006 327 195 234 177 246 242 247 235 216 224 214 230
#> 2007 313 175 254 263 265 238 202 287 235 236 225 226
#> 2008 293 190 207 196 228 215 218 247 234 207 199 233
#> 2009 325 216 211 224 220 243 188 210 212 181 193 211
#> 2010 315 190 233 221 243 203 214 236 196 180 200 205
#> 2011 254 158 207 222 221 228 209 168 196 190 167 219
#> 2012 275 168 217 152 194 215 212 190 163 203 175 174
#> 2013 303 203 228 175 209 212 192 173 202 196 192 216
#> 2014 315 172 227 208 211 248 171 223 182 198 183 207
#> 2015 329 190 206 193 205 217 211 192 187 198 173 191
#> 2016 303 183 235 221 224 227 185 204 197 201 149 155
#> 2017 335 136 190 186 225 198 182 202 191 201 174 215
#> 2018 287 170 204 201 219 220 187 193 195 216 181 180
#> 2019 224 195 203 249 251 185 178 200 189 201 195 178
#> 2020 248 208 173 133 156 167 168 124 167 160 149 169
#> 2021 175 119 146 168 203 172 169 145 164 149 168 167
#> 2022 156 157 161 158 188 133 181 188 157 139 126 123
Setelah memisahkan data oic_ts menjadi data
train dan test, kita analisis pola trend dan
seasonal pada data train_oic.
Kita akan coba melakukan forecasting pada data train_oic
yang sebelumnya sudah kita proses untuk memprediksi besar tingkat
pelanggaran yang melibatkan anak di kota Chicago pada 19 bulan kedepan
(sesuai test_oic).
Setelah kita menganalisis hasil dekomposisi pada data
train_oic, kita sudah siap untuk membangun model. Kita
bangun model pertama menggunakan algoritma Holt-Winters.
Berdasarkan hasil dekomposisi di atas, data train memiliki
trend menurun dan memiliki seasonality
sehingga cocok menggunakan metode Triple Exponential Smoothing
(Holt-Winters Exponential).
Kita dapat menggunakan fungsi HoltWinters() dan
menyimpannya ke dalam object oic_hw.
#> Holt-Winters exponential smoothing with trend and additive seasonal component.
#>
#> Call:
#> HoltWinters(x = train_oic, seasonal = "additive")
#>
#> Smoothing parameters:
#> alpha: 0.1675854
#> beta : 0.03985868
#> gamma: 0.3063588
#>
#> Coefficients:
#> [,1]
#> a 160.8847295
#> b -0.8098465
#> s1 30.1347012
#> s2 -23.2479935
#> s3 -9.9226728
#> s4 -9.8869468
#> s5 13.8191624
#> s6 -12.4083248
#> s7 -7.3924985
#> s8 -13.0826141
#> s9 -14.8579631
#> s10 -19.1010663
#> s11 -28.0215756
#> s12 -22.9672960
Lakukan differencing seasonality dan differencing trend menggunakan
diff() dan uji stasioner menggunakan visualisasi
autoplot() dan adf.test() pada data
train_oic dengan hipotesis:
Kondisi:
Secara visual, setelah dilakukan differencing data
train_oic tersebut sudah stasioner.
Kemudian, mari kita uji kembali apakah train_oic yang
telah dilakukan differencing telah lulus uji adf.test.
#>
#> Augmented Dickey-Fuller Test
#>
#> data: .
#> Dickey-Fuller = -10.798, Lag order = 6, p-value = 0.01
#> alternative hypothesis: stationary
Hasil adf.test menunjukkan nilai p-value < 0.05
(alpha), sehingga data train_oic sudah
stasioner. Jadi nilai parameter
d = 1.
Mari kita mengeksplorasi model lain untuk meramalkan data
train_oic menggunakan algoritma ARIMA. Kita bangun sebuah
model ARIMA menggunakan fungsi auto.arima()dan simpan
hasilnya ke dalam object oic_arima.
#> Series: train_oic
#> ARIMA(0,1,1)(1,1,1)[12]
#>
#> Coefficients:
#> ma1 sar1 sma1
#> -0.7926 0.0385 -0.8104
#> s.e. 0.0400 0.1277 0.1357
#>
#> sigma^2 = 586.4: log likelihood = -1161.16
#> AIC=2330.32 AICc=2330.48 BIC=2344.42
Berdasarkan perhitungan auto.arima(), diperoleh
parameter yang ditentukan secara otomatis yaitu
ARIMA(0,1,1)(1,1,1)[12], maka parameternya adalah:
p = 0 (tidak menggunakan AR)
d = 1
q = 1
P = 1
D = 1
Q = 1
[12] = Jumlah Frekuensi Seasonality
Sesuai dengan hasil perhitungan metode
auto.arima()tersebut, ternyata model yang didapatkan adalah model Seasonal ARIMA (SARIMA).
Pada bagian sebelumnya, kita telah membangun model peramalan
menggunakan Holt-Winters dan ARIMA, menggunakan model
oic_hw dan oic_arima. Sekarang kita coba untuk
meramalkan banyaknya pelanggaran dalam 19 bulan kedepan menggunakan
fungsi forecast(). Kita simpan hasilnya pada object
forecast_hw untuk oic_hw dan
arima_forecast untuk oic_arima.
Untuk melakukan prediksi masa depan menggunakan fungsi
forecast() dari library forecast.
Parameter forecast(object, h):
object = model time seriesh = berapa banyak data ke depan yang akan di
forecastBerikut adalah forecast dari metode Holt-Winters:
#> Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
#> Jan 2023 190.2096 158.50587 221.9133 141.72293 238.6962
#> Feb 2023 136.0170 103.83553 168.1986 86.79967 185.2344
#> Mar 2023 148.5325 115.84370 181.2213 98.53929 198.5257
#> Apr 2023 147.7584 114.53277 180.9840 96.94419 198.5726
#> May 2023 170.6547 136.86280 204.4465 118.97447 222.3348
#> Jun 2023 143.6173 109.22995 178.0047 91.02638 196.2083
#> Jul 2023 147.8233 112.81136 182.8353 94.27715 201.3695
#> Aug 2023 141.3233 105.65802 176.9887 86.77794 195.8687
#> Sep 2023 138.7381 102.39098 175.0853 83.14995 194.3264
#> Oct 2023 133.6852 96.62806 170.7423 77.01120 190.3592
#> Nov 2023 123.9548 86.16003 161.7497 66.15266 181.7570
#> Dec 2023 128.1993 89.63949 166.7591 69.22717 187.1714
#> Jan 2024 180.4914 138.76709 222.2158 116.67956 244.3033
#> Feb 2024 126.2989 83.80203 168.7957 61.30556 191.2922
#> Mar 2024 138.8144 95.51880 182.1099 72.59951 205.0292
#> Apr 2024 138.0402 93.92017 182.1603 70.56442 205.5161
#> May 2024 160.9365 115.96657 205.9064 92.16092 229.7121
#> Jun 2024 133.8992 88.05442 179.7439 63.78568 204.0127
#> Jul 2024 138.1051 91.36110 184.8492 66.61630 209.5940
Keterangan:
Point Forecast: nilai forecast untuk periode yang ingin
kita forecast ($mean)Lo 80 & Hi 80 : rentang tebakan dari
hasil forecast untuk confidence level 80%Lo 95 & Hi 95 : rentang tebakan dari
hasil forecast untuk confidence level 95%Mari kita bandingkan secara visualisasi. Gunakan fungsi
autolayer().
# tambahkan nilai forecast pada visualisasi sebelumnya
train_oic %>%
autoplot() +
autolayer(test_oic, series = "Data Test") +
autolayer(oic_hw$fitted[, 1], series = "Model") +
autolayer(forecast_hw$mean, series = "Forecast") Berikut adalah forecast dari model SARIMA:
#> Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
#> Jan 2023 200.0775 169.04450 231.1104 152.61663 247.5383
#> Feb 2023 130.5055 98.81199 162.1989 82.03449 178.9764
#> Mar 2023 148.0314 115.69094 180.3719 98.57094 197.4919
#> Apr 2023 144.8528 111.87801 177.8275 94.42222 195.2833
#> May 2023 167.6766 134.07948 201.2737 116.29425 219.0589
#> Jun 2023 146.0833 111.87518 180.2914 93.76650 198.4001
#> Jul 2023 145.7178 110.90936 180.5262 92.48290 198.9526
#> Aug 2023 143.9091 108.51061 179.3077 89.77177 198.0465
#> Sep 2023 140.4550 104.47603 176.4339 85.42992 195.4800
#> Oct 2023 137.4130 100.86283 173.9632 81.51434 193.3117
#> Nov 2023 125.5954 88.48283 162.7080 68.83660 182.3543
#> Dec 2023 132.1838 94.51715 169.8504 74.57764 189.7899
#> Jan 2024 194.6947 154.67652 234.7129 133.49216 255.8973
#> Feb 2024 122.4065 81.61500 163.1979 60.02131 184.7916
#> Mar 2024 140.4530 98.90268 182.0033 76.90727 203.9988
#> Apr 2024 137.2675 94.97192 179.5631 72.58199 201.9530
#> May 2024 159.8151 116.78718 202.8431 94.00956 225.6207
#> Jun 2024 139.5076 95.75959 183.2557 72.60078 206.4145
#> Jul 2024 137.2806 92.82409 181.7370 69.29025 205.2708
Mari kita bandingkan secara visualisasi. Gunakan fungsi
autolayer().
train_oic %>%
autoplot() +
autolayer(test_oic, series = "Data Test") +
autolayer(oic_arima$fitted, series = "Model") +
autolayer(arima_forecast$mean, series = "Forecast")Untuk membandingkan performa model mana yang lebih baik, kita dapat
menghitung besar error dari hasil forecast dibandingkan dengan nilai
sebenarnya. Mirip seperti regresi, kita dapat menggunakan metrics error
seperti MAE (Mean Absolute Error),
RMSE (Root Mean Squared Error), dan
MAPE (Mean Absolute Percentage Error). Sekarang kita
telah memiliki hasil peramalan dari model Holt-Winters
dan SARIMA. Untuk mengevaluasi model, kita menghitung
nilai MAPE (mean absolute percentage error) antara hasil
peramalan dan data aktual test_oic menggunakan fungsi
accuracy().
#> ME RMSE MAE MPE MAPE ACF1 Theil's U
#> Test set 0.1000336 17.79918 14.5691 -0.6706562 9.959897 -0.01417501 0.9950046
#> ME RMSE MAE MPE MAPE ACF1 Theil's U
#> Test set -1.311899 21.04514 16.53239 -1.725872 11.34311 -0.09019893 1.176001
Berdasarkan perbandingan nilai MAPE pada hasil peramalan dari kedua
model tersebut, didapatkan hasil nilai MAPE dari peramalan model
Holt-Winters lebih baik nilainya (lebih kecil nilai
errornya) yaitu dengan nilai MAPE = 9.959897.
Terdapat beberapa asumsi ketika kita menggunakan analisis time series. Asumsi ini digunakan untuk memastikan model yang telah kita buat cukup terpercaya untuk memprediksi data asli.
Memeriksa asumsi no-autocorrelation pada model
oic_arima menggunakan uji Ljung-Box:
#>
#> Box-Ljung test
#>
#> data: oic_arima$residuals
#> X-squared = 0.24057, df = 1, p-value = 0.6238
Yang diinginkan: p-value > 0.05 (alpha), no-autocorrelation
Hasil uji
Ljung-Boxmenunjukkan nilai p-value > 0.05 (alpha), sehingga kesimpulannya adalah model SARIMA tidak memiliki residual yang ber-autokorelasi (tidak terdapat autocorrelation pada error).