Laporan ini membangun model prediksi persentase penduduk miskin
kabupaten/kota di Provinsi Jawa Timur tahun 2023. Target yang digunakan
adalah persentase penduduk miskin, bukan garis
kemiskinan nominal. Unit analisis adalah 38 kabupaten/kota; baris
agregat Jawa Timur dikeluarkan dari data modeling.
Karena data hanya terdiri dari satu tahun dan 38 observasi, evaluasi utama menggunakan repeated 5-fold cross-validation sebanyak 10 repeats. Hasil model dibaca sebagai performa prediktif pada data yang tersedia, bukan bukti hubungan kausal.
source("scripts/run_all.R")
dataset <- readr::read_csv("data/processed/dataset_final.csv", show_col_types = FALSE)
model_dataset <- readr::read_csv("data/processed/model_dataset.csv", show_col_types = FALSE)
missing_summary <- readr::read_csv("output/tables/missing_summary.csv", show_col_types = FALSE)
knitr::kable(head(dataset, 10), caption = "Cuplikan dataset final")
| wilayah | persentase_miskin | ipm | tpt | pdrb_per_kapita_ribu | rata_lama_sekolah | sanitasi_layak | jumlah_penduduk_ribu | laju_pertumbuhan_penduduk | persentase_penduduk | kepadatan_penduduk | rasio_jenis_kelamin |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Bangkalan | 19.35 | 66.82 | 6.18 | 25408 | 6.57 | 50.30 | 1091.8 | 1.07 | 2.63 | 839 | 97.6 |
| Banyuwangi | 7.34 | 73.79 | 4.75 | 58086 | 8.17 | 82.63 | 1743.9 | 0.76 | 4.20 | 485 | 100.1 |
| Blitar | 8.69 | 72.84 | 4.91 | 35812 | 8.04 | 82.50 | 1253.6 | 0.88 | 3.02 | 718 | 101.2 |
| Bojonegoro | 12.18 | 71.80 | 4.63 | 74242 | 7.88 | 92.63 | 1319.6 | 0.50 | 3.18 | 571 | 100.7 |
| Bondowoso | 13.34 | 70.56 | 4.15 | 31432 | 6.95 | 57.41 | 788.2 | 0.56 | 1.90 | 507 | 97.2 |
| Gresik | 10.96 | 78.44 | 6.82 | 130527 | 10.30 | 95.00 | 1350.4 | 1.08 | 3.25 | 1075 | 101.4 |
| Jember | 9.51 | 70.42 | 4.01 | 36837 | 6.97 | 64.47 | 2586.8 | 0.71 | 6.23 | 781 | 99.3 |
| Jombang | 9.15 | 75.16 | 4.66 | 36991 | 9.06 | 94.06 | 1351.3 | 0.91 | 3.25 | 1218 | 101.6 |
| Kediri | 10.72 | 74.68 | 5.79 | 30193 | 8.62 | 92.13 | 1677.2 | 0.92 | 4.04 | 1101 | 101.9 |
| Kota Batu | 3.31 | 79.07 | 4.52 | 93214 | 10.11 | 95.06 | 220.2 | 3.38 | 0.53 | 1134 | 101.3 |
knitr::kable(missing_summary, caption = "Ringkasan missing value")
| variable | missing_count |
|---|---|
| wilayah | 0 |
| persentase_miskin | 0 |
| ipm | 0 |
| tpt | 0 |
| pdrb_per_kapita_ribu | 0 |
| rata_lama_sekolah | 0 |
| sanitasi_layak | 0 |
| jumlah_penduduk_ribu | 0 |
| laju_pertumbuhan_penduduk | 0 |
| persentase_penduduk | 0 |
| kepadatan_penduduk | 0 |
| rasio_jenis_kelamin | 0 |
Dataset final memiliki 38 observasi dan 12 kolom. Dataset modeling memakai variabel target dan enam prediktor utama sesuai scope project.
descriptive_stats <- readr::read_csv("output/tables/descriptive_stats.csv", show_col_types = FALSE)
knitr::kable(head(descriptive_stats, 20), caption = "Statistik deskriptif")
| metric | value |
|---|---|
| persentase_miskin_mean | 1.029263e+01 |
| persentase_miskin_median | 9.665000e+00 |
| persentase_miskin_min | 3.310000e+00 |
| persentase_miskin_max | 2.176000e+01 |
| persentase_miskin_sd | 4.321289e+00 |
| ipm_mean | 7.468211e+01 |
| ipm_median | 7.390500e+01 |
| ipm_min | 6.619000e+01 |
| ipm_max | 8.400000e+01 |
| ipm_sd | 4.711228e+00 |
| tpt_mean | 4.662895e+00 |
| tpt_median | 4.665000e+00 |
| tpt_min | 1.710000e+00 |
| tpt_max | 8.050000e+00 |
| tpt_sd | 1.428829e+00 |
| pdrb_per_kapita_ribu_mean | 7.065947e+04 |
| pdrb_per_kapita_ribu_median | 3.723250e+04 |
| pdrb_per_kapita_ribu_min | 2.384200e+04 |
| pdrb_per_kapita_ribu_max | 5.410680e+05 |
| pdrb_per_kapita_ribu_sd | 8.945138e+04 |
Grafik distribusi menunjukkan variasi kemiskinan antarwilayah. Grafik 10 wilayah tertinggi membantu mengidentifikasi wilayah yang relatif lebih berat dalam indikator kemiskinan. Matriks korelasi digunakan sebagai eksplorasi awal untuk melihat asosiasi linear antarvariabel, bukan sebagai bukti kausal.
Regresi Linear digunakan sebagai baseline karena mudah diinterpretasikan dan menjadi pembanding awal terhadap Random Forest.
lm_coefficients <- readr::read_csv("output/tables/lm_coefficients.csv", show_col_types = FALSE)
knitr::kable(lm_coefficients, digits = 4, caption = "Koefisien Regresi Linear")
| variable | estimate | std_error | statistic | p_value |
|---|---|---|---|---|
| (Intercept) | 55.2588 | 22.5216 | 2.4536 | 0.0200 |
| ipm | -0.4601 | 0.4461 | -1.0314 | 0.3103 |
| tpt | -0.3261 | 0.3873 | -0.8422 | 0.4061 |
| pdrb_per_kapita_ribu | 0.0000 | 0.0000 | 0.5972 | 0.5547 |
| rata_lama_sekolah | -1.3358 | 1.2718 | -1.0503 | 0.3017 |
| sanitasi_layak | 0.0203 | 0.0560 | 0.3621 | 0.7197 |
| kepadatan_penduduk | 0.0003 | 0.0003 | 0.8893 | 0.3807 |
Interpretasi koefisien dilakukan secara hati-hati karena dataset bersifat observasional, cross-section, dan ukuran sampelnya kecil.
Random Forest digunakan untuk menangkap pola non-linear dan interaksi
antarvariabel yang mungkin tidak tertangkap oleh Regresi Linear. Tuning
dilakukan pada parameter mtry, sedangkan jumlah pohon
ditetapkan 500.
rf_importance <- readr::read_csv("output/tables/rf_feature_importance.csv", show_col_types = FALSE)
knitr::kable(rf_importance, digits = 4, caption = "Feature importance Random Forest")
| variable | importance |
|---|---|
| rata_lama_sekolah | 14.6685 |
| ipm | 12.2775 |
| kepadatan_penduduk | 10.2210 |
| tpt | 8.1197 |
| pdrb_per_kapita_ribu | 5.5210 |
| sanitasi_layak | 1.7648 |
Feature importance menunjukkan variabel yang paling informatif bagi prediksi model. Nilai ini tidak boleh ditulis sebagai bukti bahwa variabel tersebut menyebabkan kemiskinan.
model_comparison <- readr::read_csv("output/tables/model_comparison.csv", show_col_types = FALSE)
knitr::kable(model_comparison, digits = 4, caption = "Perbandingan model berdasarkan repeated 5-fold cross-validation")
| model | rmse | r2 | mae |
|---|---|---|---|
| Regresi Linear | 3.0684 | 0.5390 | 2.4520 |
| Random Forest | 2.7134 | 0.6401 | 2.1449 |
Berdasarkan repeated 5-fold cross-validation, model dengan RMSE lebih kecil memiliki error prediksi rata-rata yang lebih rendah. R² menunjukkan proporsi variasi target yang dapat dijelaskan secara prediktif oleh model pada skema validasi tersebut.
Model terbaik pada eksperimen ini adalah Random Forest dengan RMSE 2.713, MAE 2.145, dan R² 0.64. Regresi Linear menghasilkan RMSE 3.068, MAE 2.452, dan R² 0.539.
Rekomendasi berikut disusun dari variabel yang paling informatif dalam model dan tetap dibaca sebagai prioritas eksploratif, bukan klaim kausal final.
Pipeline berhasil menggabungkan tujuh sumber data BPS menjadi dataset kabupaten/kota Jawa Timur 2023, menjalankan EDA, membangun Regresi Linear dan Random Forest, mengevaluasi model dengan repeated k-fold cross-validation, serta menghasilkan feature importance dan rekomendasi kebijakan berbasis hasil prediktif.