Study Case

Pada kesempatan kali ini saya akan forecast dengan time series, mengenai berapa jumlah kelahiran bayi yang akan lahir pada semester 2 pada tahun 2021 di Jakarta.

Library

Dalam kasus ini saya menggunakan beberapa package untuk melakukan pengujian

set.seed(666)
library(dplyr)
library(forecast)
library(plotly)
library(TTR)
library(MLmetrics)
library(tseries)

Read Data

kelahiran <- read.csv("data/data-jumlah-pelaporan-kelahiran-berdasarkan-jenis-kelamin-per-kelurahan-bulan-januari-tahun-2021.csv")
head(kelahiran,3)
glimpse(kelahiran)
#> Rows: 534
#> Columns: 7
#> $ tahun          <int> 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2~
#> $ bulan          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
#> $ kota_kabupaten <chr> "ADM. KEPULAUAN SERIBU", "ADM. KEPULAUAN SERIBU", "ADM.~
#> $ kecamatan      <chr> "KEPULAUAN SERIBU UTARA", "KEPULAUAN SERIBU UTARA", "KE~
#> $ kelurahan      <chr> "PULAU PANGGANG", "PULAU KELAPA", "PULAU HARAPAN", "PUL~
#> $ jenis_kelamin  <chr> "Laki-Laki", "Laki-Laki", "Laki-Laki", "Laki-Laki", "La~
#> $ jumlah         <int> 3, 1, 0, 0, 0, 0, 1, 2, 2, 5, 1, 4, 1, 8, 4, 7, 10, 6, ~

Berikut adalah penjelasan mengenai variable-variable yang terdapat dalam data yang di merge.
Tahun dan Bulan kelahiran: data tersebut diambil pada semester 1 tahun 2021.
Kota Kabupaten: Wilayah Jakarta pada bagian mana.
Kecamatan dan kelurahan: Wilayah administrasi dari kelahiran tersebut.
Jenis Kelamin: jenis dari kelahiran tersebut.
Jumlah: Jumlah dari kelahiran tersebut.

Check data

Check missing value

colSums(is.na(kelahiran))
#>          tahun          bulan kota_kabupaten      kecamatan      kelurahan 
#>              0              0              0              0              0 
#>  jenis_kelamin         jumlah 
#>              0              0

Tidak adanya missing value.

Pemodelan Data

lahir <- ts(data = kelahiran$jumlah,
   start = range(kelahiran$bulan)[[1]],
   frequency = 7) 

Time Series

Forecast

# forecast
a <- forecast(lahir)

a # the forecasted value + confidence interval from ETS model
#>          Point Forecast       Lo 80    Hi 80     Lo 95    Hi 95
#> 77.28571       6.513311  0.14355889 12.88306 -3.228384 16.25501
#> 77.42857       6.513311 -0.02779292 13.05441 -3.490444 16.51707
#> 77.57143       6.513311 -0.19476913 13.22139 -3.745812 16.77243
#> 77.71429       6.513311 -0.35768875 13.38431 -3.994976 17.02160
#> 77.85714       6.513311 -0.51683381 13.54346 -4.238368 17.26499
#> 78.00000       6.513311 -0.67245511 13.69908 -4.476370 17.50299
#> 78.14286       6.513311 -0.82477683 13.85140 -4.709326 17.73595
#> 78.28571       6.513311 -0.97400037 14.00062 -4.937544 17.96417
#> 78.42857       6.513311 -1.12030741 14.14693 -5.161301 18.18792
#> 78.57143       6.513311 -1.26386256 14.29048 -5.380850 18.40747
#> 78.71429       6.513311 -1.40481549 14.43144 -5.596418 18.62304
#> 78.85714       6.513311 -1.54330278 14.56992 -5.808216 18.83484
#> 79.00000       6.513311 -1.67944947 14.70607 -6.016435 19.04306
#> 79.14286       6.513311 -1.81337037 14.83999 -6.221249 19.24787

Assumption Check

Normality: Shapiro.test

H0 : residuals are normally distributed H1 : residuals are not normally distributed

shapiro.test(a$residuals) # p-value < 0.05; reject H0; accept H1 
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  a$residuals
#> W = 0.97022, p-value = 0.000000006031

Kesimpulannya, terima H1

hist(a$residuals, breaks = 20)

plot(a$residuals)

Autocorrelation: Box.test - Ljng-Box

H0 : No autocorrelation in the forecast errors H1 : there is an autocorrelation in the forecast errors

Box.test(a$residuals, type = "Ljung-Box") # there is not enough data to reject H0
#> 
#>  Box-Ljung test
#> 
#> data:  a$residuals
#> X-squared = 0.087126, df = 1, p-value = 0.7679

Conclusion

Data tidak terdistribusi normal dan kemungkinan akan terjadi banyak kelahiran pada semester kedua.