Contoh LBB TS
setup
call library
panggil library yang akan digunakan
read data
read data menggunakan fread(). fread() digunakan untuk data yang besar.
crime <- fread("../Materi/9. Time Series and Forecasting/lbb/Crimes_-_2001_to_present.csv")
str(crime)## Classes 'data.table' and 'data.frame': 6723202 obs. of 22 variables:
## $ ID : int 10000092 10000094 10000095 10000096 10000097 10000098 10000099 10000100 10000101 10000104 ...
## $ Case Number : chr "HY189866" "HY190059" "HY190052" "HY190054" ...
## $ Date : chr "03/18/2015 07:44:00 PM" "03/18/2015 11:00:00 PM" "03/18/2015 10:45:00 PM" "03/18/2015 10:30:00 PM" ...
## $ Block : chr "047XX W OHIO ST" "066XX S MARSHFIELD AVE" "044XX S LAKE PARK AVE" "051XX S MICHIGAN AVE" ...
## $ IUCR : chr "041A" "4625" "0486" "0460" ...
## $ Primary Type : chr "BATTERY" "OTHER OFFENSE" "BATTERY" "BATTERY" ...
## $ Description : chr "AGGRAVATED: HANDGUN" "PAROLE VIOLATION" "DOMESTIC BATTERY SIMPLE" "SIMPLE" ...
## $ Location Description: chr "STREET" "STREET" "APARTMENT" "APARTMENT" ...
## $ Arrest : logi FALSE TRUE FALSE FALSE FALSE FALSE ...
## $ Domestic : logi FALSE FALSE TRUE FALSE FALSE FALSE ...
## $ Beat : int 1111 725 222 225 1113 223 733 213 912 511 ...
## $ District : int 11 7 2 2 11 2 7 2 9 5 ...
## $ Ward : int 28 15 4 3 28 4 17 3 11 6 ...
## $ Community Area : int 25 67 39 40 25 39 68 38 59 49 ...
## $ FBI Code : chr "04B" "26" "08B" "08B" ...
## $ X Coordinate : int 1144606 1166468 1185075 1178033 1144920 1183018 1170859 1178746 1164279 1179637 ...
## $ Y Coordinate : int 1903566 1860715 1875622 1870804 1898709 1872537 1858210 1876914 1880656 1840444 ...
## $ Year : int 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
## $ Updated On : chr "02/10/2018 03:50:01 PM" "02/10/2018 03:50:01 PM" "02/10/2018 03:50:01 PM" "02/10/2018 03:50:01 PM" ...
## $ Latitude : num 41.9 41.8 41.8 41.8 41.9 ...
## $ Longitude : num -87.7 -87.7 -87.6 -87.6 -87.7 ...
## $ Location : chr "(41.891398861, -87.744384567)" "(41.773371528, -87.665319468)" "(41.81386068, -87.596642837)" "(41.800802415, -87.622619343)" ...
## - attr(*, ".internal.selfref")=<externalptr>
cek nilai yang ada pada Priary type
## [1] "BATTERY"
## [2] "OTHER OFFENSE"
## [3] "ROBBERY"
## [4] "NARCOTICS"
## [5] "CRIMINAL DAMAGE"
## [6] "WEAPONS VIOLATION"
## [7] "THEFT"
## [8] "BURGLARY"
## [9] "MOTOR VEHICLE THEFT"
## [10] "PUBLIC PEACE VIOLATION"
## [11] "DECEPTIVE PRACTICE"
## [12] "ASSAULT"
## [13] "CRIMINAL TRESPASS"
## [14] "CRIM SEXUAL ASSAULT"
## [15] "INTERFERENCE WITH PUBLIC OFFICER"
## [16] "ARSON"
## [17] "LIQUOR LAW VIOLATION"
## [18] "KIDNAPPING"
## [19] "SEX OFFENSE"
## [20] "OFFENSE INVOLVING CHILDREN"
## [21] "PROSTITUTION"
## [22] "HOMICIDE"
## [23] "GAMBLING"
## [24] "INTIMIDATION"
## [25] "STALKING"
## [26] "OBSCENITY"
## [27] "PUBLIC INDECENCY"
## [28] "HUMAN TRAFFICKING"
## [29] "CONCEALED CARRY LICENSE VIOLATION"
## [30] "OTHER NARCOTIC VIOLATION"
## [31] "NON - CRIMINAL"
## [32] "NON-CRIMINAL"
## [33] "RITUALISM"
## [34] "NON-CRIMINAL (SUBJECT SPECIFIED)"
## [35] "DOMESTIC VIOLENCE"
Preprocessing
Data Filtering
pada kasus ini saya mengambil nilai THEFT sebagai amatan saya.
crime_theft <- crime %>%
filter(`Primary Type`=="THEFT") %>%
select(Date, `Primary Type`)
head(crime_theft)## Date Primary Type
## 1 03/18/2015 10:31:00 PM THEFT
## 2 03/18/2015 09:00:00 PM THEFT
## 3 03/18/2015 10:45:00 PM THEFT
## 4 03/18/2015 10:00:00 PM THEFT
## 5 03/18/2015 10:30:00 PM THEFT
## 6 03/19/2015 02:00:00 AM THEFT
Data Aggregate
lakukan praproses terhadap date dan grouping data berdasarkan Date untuk menghitung banyaknya kejadian theft dalam 1 hari
crime_theft <- crime_theft %>%
mutate(Date = mdy_hms(Date),
Date = as.Date(Date)) %>%
group_by(Date) %>%
summarise(count = n()) %>%
ungroup() %>%
arrange(Date)
head(crime_theft)## # A tibble: 6 x 2
## Date count
## <date> <int>
## 1 2001-01-01 413
## 2 2001-01-02 221
## 3 2001-01-03 226
## 4 2001-01-04 243
## 5 2001-01-05 265
## 6 2001-01-06 246
Time series Object
create ts object and visualization
buat object time series menggunakan fungsi ts. frequency yang digunakan yaitu 365 (1 tahun). lalu lihat plot yang dihasilkan menggunakan fungsi autoplot
theft_ts <- ts(crime_theft$count, start = range(crime_theft$Date)[[1]], frequency = 365)
autoplot(theft_ts)decompose
dari plot diatas bisa dilihat bahwa data mempunyai trend dan seasonal, namun untuk membuktikannya perlu dilakukan decompose
dari hasil plot diatas bisa diketahui yaitu 1. punya seasonal 2. punya trend 3. additive
split data train dan tes menggunakan window data train adalah data yang akan digunakan dalam pembentukan model dan data test adalah data yang dipakai untuk validasi
cross validation
buat model dan evaluasi dengan MAPE (bisa dengan nilai error lainnya)
Modeling
Holtwinters
pembuatan model dilakukan terhadap data train
## [1] 0.1133559
Seasonal ARIMA
## [1] 0.1037118
Forecasting
forecast melakukan prediksi untuk 365 data kedepan
plot antara hasil forecast dan data test. dari plot dibawah bisa dilihat bahwa model arima tidak menangkap seasonal, hal ini bisa dilihat dari hasil forecast yang datar. oleh sebab itu perlu dilakukan perbaikan model dengan cara stlm
perbaiki model arima yang dilakuan oleh stlm adalah mengeluarkan seasonal terlebih dahulu baru dilakukan arima pada datanya (trend dan error)
forecasting_arima2 <- forecast(model_arima2, h = 365)
forecasting_arima2 %>%
autoplot() +
autolayer(test)Evaluation
Error Checking
cek nilai MAPE pada data test
## [1] 0.1160077
## [1] 0.1033244
Assumption Checking
kalau ingin bermain dengan analisis time series (tidak melakukan forecating) itu asumsi wajib dipenuhi karena kita tidak ingin salah menginterpretasikan model (trend dan seasional)
tapi
kalau ingin melakukan forecasting yang dilihat adalah nilai error (RMSE,MAE,..) error dari prediksi vs actual (data test)
lakukan uji asumsi menyebar normal. karena shapiro test tidak bisa untuk data yang besar, maka pengujian hanya dilakukan lewat plot histogram saja.
lakukan uji autocol menggunakan box.test()
##
## Box-Ljung test
##
## data: model_arima2$residuals
## X-squared = 0.00287, df = 1, p-value = 0.9573
p-value lebih besar dari 0.5 berarti tidak ada autocol di error
diatas merupakan contoh tahapan - tahapan dalan time series. dalam lbb Time series ini diharapkan mengikuti workflow yang telah diberikan dan memberikan narasi lebih baik berdasarkan analisis yang ada.
Time Series Data
berikut beberapa sumber data time series selain data crime
wikipedia
bisa gunakan library pageviews
library(pageviews)
indo <- article_pageviews(project = "en.wikipedia",
article = "Indonesia",
start =as.Date('2018-01-01'), end = as.Date("2019-01-01"))
head(indo)## project language article access agent granularity
## 1 wikipedia en Indonesia all-access all-agents daily
## 2 wikipedia en Indonesia all-access all-agents daily
## 3 wikipedia en Indonesia all-access all-agents daily
## 4 wikipedia en Indonesia all-access all-agents daily
## 5 wikipedia en Indonesia all-access all-agents daily
## 6 wikipedia en Indonesia all-access all-agents daily
## date views
## 1 2018-01-01 8924
## 2 2018-01-02 10383
## 3 2018-01-03 10279
## 4 2018-01-04 10617
## 5 2018-01-05 10313
## 6 2018-01-06 10072
Stocks
library yang digunanakan yaitu tidyquant dengan fungsi tq_get()
## # A tibble: 6 x 7
## date open high low close volume adjusted
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2009-01-02 51.3 54.5 51.1 54.4 7296400 54.4
## 2 2009-01-05 55.7 55.7 53.0 54.1 9509800 54.1
## 3 2009-01-06 54.5 58.2 53.8 57.4 11080100 57.4
## 4 2009-01-07 56.3 57.0 55.3 56.2 7942700 56.2
## 5 2009-01-08 55.0 57.3 54.6 57.2 6577900 57.2
## 6 2009-01-09 56.9 57 54.7 55.5 6684100 55.5