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.
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)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.
colSums(is.na(kelahiran))#> tahun bulan kota_kabupaten kecamatan kelurahan
#> 0 0 0 0 0
#> jenis_kelamin jumlah
#> 0 0
Tidak adanya missing value.
lahir <- ts(data = kelahiran$jumlah,
start = range(kelahiran$bulan)[[1]],
frequency = 7) # 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
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
Data tidak terdistribusi normal dan kemungkinan akan terjadi banyak kelahiran pada semester kedua.