MAGISTER INOVASI REGIONAL · SEKOLAH PASCASARJANA · UNIVERSITAS PADJADJARAN

Sains Data untuk Inovasi dan Pembangunan Regional

E-Book Pendamping Mata Kuliah Statistics for Data Science

Outcome-Based Education · Case-Based Learning · Project-Based Learning · Responsible Generative AI

PenulisI Gede Nyoman Mindra Jaya

Dokumen Mata Kuliah

Dokumen resmi mata kuliah. Rencana Pembelajaran Semester (RPS) dan Kontrak Perkuliahan menjadi acuan pembelajaran, asesmen, capstone project, penggunaan Generative AI, serta ketentuan akademik sepanjang semester. Dokumen dapat dibuka langsung di Google Drive atau diunduh melalui tombol yang tersedia.

Rencana Pembelajaran Semester

Memuat CPL, CPMK, Sub-CPMK, bahan kajian, strategi pembelajaran, rencana 16 pertemuan, asesmen, rubrik, serta integrasi capstone project.

Kontrak Perkuliahan

Memuat tata tertib pembelajaran, sistem penilaian, ketentuan tugas dan project, academic integrity, penggunaan Generative AI, serta hak dan kewajiban mahasiswa.

0. Pendahuluan

Kata Pengantar

E-book ini disusun untuk mendukung pembelajaran Sains Data/Statistics for Data Science pada Program Magister Inovasi Regional, Sekolah Pascasarjana, Universitas Padjadjaran. Orientasi utamanya bukan menjadikan mahasiswa sebagai pengguna algoritma yang mengejar kompleksitas model, tetapi membentuk kemampuan untuk mengubah persoalan pembangunan wilayah menjadi pertanyaan analitik yang dapat dipertanggungjawabkan, memilih dan memeriksa data yang relevan, menggunakan metode statistik serta machine learning secara proporsional, memvalidasi hasil, dan menerjemahkan temuan menjadi rekomendasi inovasi atau kebijakan regional.

Program Magister Inovasi Regional menempatkan kompetensi berbasis data pada inti profil lulusan: administrator/manajer publik berbasis data, analis kebijakan publik berbasis data, policy entrepreneur yang digital dan inovatif, serta peneliti kebijakan publik berbasis data. CPL program secara eksplisit memuat kemampuan mendesain pengambilan keputusan dengan big data dan machine learning, menyusun kebijakan berbasis bukti dan proyeksi, menangkap peluang inovasi melalui data-driven decision making, menggunakan metode kuantitatif dan sains data untuk evaluasi kebijakan, serta mempublikasikan hasil penelitian berbasis bukti empiris. Karena itu, mata kuliah ini dirancang sebagai jembatan antara metode kuantitatif, komputasi, konteks regional, dan keputusan publik. (Sekolah Pascasarjana Universitas Padjadjaran 2026)

Buku ini memakai prinsip Outcome-Based Education (OBE), case-based learning, dan satu capstone project yang berkembang sepanjang semester. Setiap metode diperkenalkan melalui urutan: konteks masalah → konsep → formulasi matematis → intuisi → simulasi → data nyata → implementasi R → validasi → interpretasi substantif → implikasi regional. Rumus dituliskan secara eksplisit agar mahasiswa memahami asumsi dan mekanisme metode; kode R diberikan sebagai alat untuk melakukan eksperimen dan memastikan reproducibility. (Wickham, Çetinkaya-Rundel, dan Grolemund 2023; James dkk. 2021; Kuhn dan Silge 2022)

Penggunaan Generative AI diperbolehkan secara terarah untuk membantu memahami dokumentasi, merancang kerangka kode, debugging, membuat alternatif visualisasi, atau menyusun dokumentasi teknis. Namun tanggung jawab ilmiah tetap berada pada mahasiswa: sumber data harus diverifikasi, kode harus diuji, hasil harus divalidasi, interpretasi harus dikerjakan secara substantif, dan penggunaan AI harus dideklarasikan. Pendekatan ini mengikuti prinsip penggunaan AI yang manusia-sentris, transparan, aman, dan dapat dipertanggungjawabkan. (Miao dan Holmes 2023; Tabassi 2023; Autio dkk. 2024)

Buku ini sengaja cukup rinci untuk jenjang magister, tetapi tetap memberi jalur belajar bertahap bagi mahasiswa dengan latar statistika dan pemrograman yang beragam. Mahasiswa yang sudah kuat secara teknis dapat memperdalam bagian formulasi dan eksperimen model; mahasiswa yang masih berkembang dalam R dapat mengikuti kode secara bertahap. Yang tidak boleh hilang pada kedua kelompok adalah kemampuan menjawab tiga pertanyaan: (1) apakah analisisnya benar secara metodologis, (2) apakah datanya mendukung klaim yang dibuat, dan (3) apakah hasilnya bermakna bagi wilayah dan keputusan yang sedang dibahas?

Tujuan akhir mata kuliah. Mahasiswa mampu menyusun alur yang utuh: masalah regional → data → eksplorasi → model → validasi → interpretasi → insight → rekomendasi kebijakan/inovasi, serta mempertahankan seluruh keputusan analitiknya secara ilmiah dan reproducible.

Peta Mata Kuliah, Asesmen, dan Capstone Project

Orientasi Kompetensi

Mata kuliah ini mengembangkan lima kelompok kompetensi yang saling terhubung.

  1. Problem framing regional: mengenali unit analisis, stakeholder, outcome, horizon waktu, dan keputusan yang hendak didukung.
  2. Data literacy dan data engineering dasar: provenance, metadata, kualitas, integrasi, tidy data, transformasi, dan feature construction.
  3. Statistical and machine-learning reasoning: eksplorasi, inferensi, regresi, klasifikasi, tree-based methods, clustering, PCA, dan analisis spasial.
  4. Model validation dan decision translation: resampling, ketidakpastian, fairness, robustness, interpretasi, dan sensitivitas rekomendasi.
  5. Communication and reproducibility: visualisasi, policy storytelling, dashboard, laporan reproducible, sitasi, serta deklarasi penggunaan AI.

Struktur Penilaian Semester

Komponen Bobot Implementasi yang disarankan
Capstone Project 30% 7 milestone, kerja kelompok, audit kontribusi individu
Partisipasi 10% diskusi kasus, kritik grafik/model, peer review, studio project
Kuis 10% 4 kuis formatif × 2,5%
Tugas 10% 4 tugas analitik × 2,5%
UTS 20% individual integrative regional data case
UAS 20% individual analytical synthesis + oral defense
Total 100%
Prinsip asesmen: nilai tinggi tidak diberikan hanya karena model canggih. Mahasiswa dinilai pada ketepatan problem framing, kualitas data, validitas metode, ketepatan evaluasi, transparansi asumsi, interpretasi regional, dan kemampuan mempertahankan keputusan analitik.

Galeri Contoh Capstone Project

Mahasiswa memilih satu persoalan sejak awal semester. Tema berikut adalah contoh, bukan daftar tertutup. Setiap tim wajib mempersempit isu menjadi pertanyaan yang dapat dianalisis dengan data dan memiliki stakeholder yang jelas.

Project 1 — Peta Prioritas Pengurangan Kemiskinan Multidimensi

Pertanyaan kebijakan: wilayah mana yang perlu diprioritaskan, dan kombinasi deprivasi apa yang membedakan satu wilayah dengan wilayah lain?

Data yang mungkin digunakan: kemiskinan, pendidikan, akses kesehatan, sanitasi, internet, PDRB per kapita, dan data spasial batas administrasi dari BPS/Open Data Jawa Barat/World Bank. Data kemiskinan kabupaten/kota Jawa Barat tersedia sebagai seri tahunan 2002–2025; karena unitnya ribu jiwa, mahasiswa harus membedakan jumlah absolut dari tingkat kemiskinan. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026a)

Metode: EDA, standardisasi indikator, indeks komposit dengan analisis sensitivitas bobot, PCA, clustering, pemetaan choropleth, Moran’s II bila struktur spasial dianalisis.

Produk akhir: policy brief, atlas prioritas, dashboard filter kabupaten/kota, serta daftar rekomendasi yang menjelaskan bahwa prioritas tinggi dapat muncul karena mekanisme yang berbeda.

Project 2 — Pengangguran, Struktur Ekonomi, dan Mismatch Pasar Kerja

Pertanyaan kebijakan: apakah wilayah dengan pertumbuhan ekonomi lebih tinggi selalu memiliki TPT lebih rendah, dan kelompok wilayah mana yang membutuhkan strategi ketenagakerjaan berbeda?

Data: TPT kabupaten/kota Jawa Barat 2007–2024 dan laju pertumbuhan PDRB ADHK 2011–2024, ditambah indikator pendidikan atau struktur lapangan usaha bila tersedia. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026d, 2026b)

Metode: tren, korelasi, regresi, model dengan interaksi, clustering, model prediksi, evaluasi out-of-time.

Catatan substantif: hubungan PDRB–TPT tidak boleh langsung ditafsirkan kausal; struktur industri, partisipasi angkatan kerja, urbanisasi, dan shock ekonomi dapat menjadi penjelasan alternatif.

Project 3 — Segmentasi Ekosistem UMKM dan Strategi Digitalisasi Daerah

Pertanyaan kebijakan: wilayah mana yang memiliki basis UMKM besar tetapi indikator digital/akses pasarnya masih tertinggal?

Data: proyeksi jumlah UMKM Jawa Barat 2016–2023, akses internet, penduduk, PDRB, atau data infrastruktur. Karena dataset UMKM berstatus proyeksi, status ini harus muncul pada metadata, visualisasi, dan interpretasi. (Dinas Koperasi dan Usaha Kecil Provinsi Jawa Barat 2026)

Metode: indikator per 1.000 penduduk, PCA, clustering, profil cluster, dashboard.

Project 4 — Prediksi dan Prioritisasi Risiko Stunting

Pertanyaan kebijakan: indikator apa yang berkaitan dengan tingginya prevalensi stunting dan bagaimana mengidentifikasi wilayah untuk pemeriksaan lebih lanjut?

Data: prevalensi balita stunting kabupaten/kota Jawa Barat 2019–2024 atau jumlah balita stunting 2014–2024, ditambah indikator sanitasi, kemiskinan, fasilitas kesehatan, dan pendidikan. (Kementerian Kesehatan Republik Indonesia dan Pemerintah Provinsi Jawa Barat 2026)

Metode: regresi/klasifikasi, calibration, threshold berbasis biaya kebijakan, pemetaan, analisis sensitivitas. Model bukan diagnosis klinis dan tidak menggantikan verifikasi lapangan.

Project 5 — Ketahanan Pangan dan Perubahan Kapasitas Produksi Padi

Pertanyaan kebijakan: wilayah mana yang menunjukkan penurunan kapasitas tanam atau ketergantungan yang tinggi, dan apakah pola tersebut membentuk klaster spasial?

Data: luas areal tanam padi sawah kabupaten/kota Jawa Barat 2013–2020, data penduduk, produksi, curah hujan atau penggunaan lahan jika tersedia. (Pemerintah Provinsi Jawa Barat 2026a)

Metode: indikator per kapita/per luas wilayah, tren, clustering, pemetaan, Moran’s II, skenario sensitivitas.

Project 6 — Ketimpangan Akses Layanan Publik dan Digital Connectivity

Pertanyaan kebijakan: apakah pertumbuhan konektivitas digital diikuti penyempitan kesenjangan akses layanan dan outcome sosial?

Metode: EDA longitudinal, regresi, interaksi urban/rural bila indikator tersedia, segmentasi wilayah, dashboard.

Risiko analitik: ecological fallacy—hubungan pada level kabupaten tidak selalu berlaku pada individu.

Project 7 — Pariwisata: Demand Recovery dan Diversifikasi Destinasi

Pertanyaan kebijakan: wilayah mana yang memiliki potensi kunjungan tinggi tetapi kapasitas ekonomi lokal atau konektivitasnya belum memadai?

Metode: indeks intensitas kunjungan, pertumbuhan tahunan, clustering, model prediksi sederhana, visualisasi spasial. Data harus dibedakan antara kunjungan, tamu, okupansi, dan jumlah objek wisata.

Project 8 — Indeks Kapasitas Inovasi Daerah

Pertanyaan kebijakan: bagaimana membangun indeks kapasitas inovasi yang transparan dan sensitif terhadap pilihan indikator/bobot?

Metode: normalisasi, PCA sebagai pembanding indeks berbobot, analisis sensitivitas, ranking stability, clustering, dashboard. Praktik penyusunan indeks komposit harus memisahkan pilihan normatif dari pilihan statistik. (OECD dan Joint Research Centre, European Commission 2008)

Project 9 — Investasi dan Daya Tarik Wilayah

Pertanyaan kebijakan: karakteristik wilayah apa yang berasosiasi dengan realisasi investasi dan bagaimana mengidentifikasi wilayah dengan investment gap?

Metode: regresi, regularisasi, model pohon, SHAP/feature importance secara hati-hati, klasifikasi wilayah berpotensi tinggi namun realisasi rendah.

Project 10 — Transportasi, Aksesibilitas, dan Pusat Pertumbuhan

Pertanyaan kebijakan: apakah waktu/jarak akses menuju pusat ekonomi dan layanan berkaitan dengan outcome pembangunan wilayah?

Metode: feature engineering berbasis jarak, visualisasi peta, regresi, clustering, analisis sensitivitas terhadap definisi aksesibilitas.

Aturan pemilihan project. Project harus memiliki: satu stakeholder nyata atau realistis; satu keputusan yang hendak dibantu; minimal dua sumber data atau satu dataset multidimensi; satu komponen validasi; satu bagian interpretasi kebijakan; dokumentasi provenance; dan artefak reproducible. Model yang tidak menambah nilai terhadap pertanyaan kebijakan boleh ditolak meskipun secara teknis menarik.

Empat Blueprint Project Siap Diadaptasi

Blueprint berikut lebih rinci daripada galeri tema. Mahasiswa tidak harus memilih blueprint ini, tetapi dapat menggunakannya untuk memahami level kedalaman yang diharapkan sejak pertemuan pertama.

Blueprint A — Sistem Prioritas Kemiskinan Multidimensi Kabupaten/Kota

Stakeholder: Bappeda, dinas sosial, dinas kesehatan, dinas pendidikan.
Decision question: kabupaten/kota mana yang memerlukan review prioritas lintas-sektor pada siklus perencanaan berikut, dan dimensi apa yang paling menjelaskan prioritas tiap wilayah?
Unit analisis: kabupaten/kota–tahun.
Outcome utama: tingkat/jumlah kemiskinan atau indeks deprivasi yang dirancang transparan.
Kandidat data: jumlah penduduk miskin kabupaten/kota Jawa Barat 2002–2025, TPT 2007–2024, indikator pendidikan/kesehatan/internet yang tersedia, serta batas administrasi. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026a, 2026d)

Feature construction: povertyrate=poorpopulationpopulation×100, poverty\ rate=\frac{poor\ population}{population}\times100, growthit=xitxi,t1xi,t1, growth_{it}=\frac{x_{it}-x_{i,t-1}}{x_{i,t-1}}, zij=xijxjsj, z_{ij}=\frac{x_{ij}-\bar x_j}{s_j}, deprivationi=jwjzijoriented. deprivation_i=\sum_jw_j z_{ij}^{oriented}.

Workflow minimum: audit metadata → harmonisasi periode → feature rate/growth → EDA disparity → indeks teori → PCA sebagai pembanding → clustering profile → peta → sensitivity bobot → optional predictive model → policy memo.

Validation: ranking stability terhadap bobot; bootstrap/temporal sensitivity; cek apakah top-10 berubah bila satu indikator dikeluarkan; bandingkan indeks berbobot dengan PC1.
Policy interpretation: jangan hanya memberi daftar top-10. Kelompokkan alasan: kemiskinan–pengangguran tinggi, layanan rendah, digital gap, atau kombinasi. Rekomendasi harus berbeda menurut profil.
Dashboard: map + profile card + trend + decomposition indikator.
Risiko: denominator tidak konsisten; angka jumlah vs persen; indikator berbeda tahun; ranking false precision; stigma wilayah.
Deliverable final: reproducible report 20–30 halaman ekuivalen, dashboard beta, policy brief 2 halaman, data dictionary, provenance, AI log.

Blueprint B — Pengangguran dan Transformasi Ekonomi Regional

Stakeholder: Bappeda, dinas tenaga kerja, dinas perindustrian/perdagangan.
Decision question: wilayah mana yang menunjukkan persistensi TPT tinggi meskipun pertumbuhan ekonomi relatif baik, dan apakah pola tersebut mengindikasikan kebutuhan strategi pasar kerja yang berbeda?
Data inti: TPT 2007–2024 dan pertumbuhan PDRB ADHK 2011–2024 dari Open Data Jawa Barat/BPS. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026d, 2026b)

Hipotesis analitik contoh: hubungan pertumbuhan dan TPT dapat non-linear serta berbeda menurut tipe wilayah. Model associational: TPTit=β0+β1Growthit+β2Educationit+β3Urbani+β4(Growthit×Urbani)+εit. TPT_{it}=\beta_0+\beta_1Growth_{it}+\beta_2Education_{it}+\beta_3Urban_i+\beta_4(Growth_{it}\times Urban_i)+\varepsilon_{it}. Untuk prediksi satu tahun ke depan, gunakan lag: TPTi,t+1=f(TPTit,Growthit,Educationit,Digitalit,). TPT_{i,t+1}=f(TPT_{it},Growth_{it},Education_{it},Digital_{it},\ldots).

Workflow: time-series profile per wilayah → shock detection → scatter/faceting → baseline OLS → temporal validation → random forest/boosting bila memberi nilai tambah → clustering residual profile → spatial map residual → recommendation.

Pertanyaan interpretasi: wilayah dengan TPT aktual jauh di atas prediksi baseline dapat menjadi “positive/negative residual case” untuk diagnostic review. Residual bukan bukti kegagalan kebijakan; ia menunjukkan outcome tidak dijelaskan penuh oleh fitur model.

Validation: train ≤2021, validation 2022–2023, test 2024 sebagai contoh; jangan random split jika target masa depan. Bandingkan naive baseline ŷt+1=yt\hat y_{t+1}=y_t dengan regression/ML.
Policy outputs: empat tipologi: high TPT–high growth, high TPT–low growth, low TPT–high growth, low TPT–low growth; kemudian interpretasikan dengan indikator tambahan.
Risiko: pandemi, perubahan survei/metode, pooled ecological inference, target leakage.

Blueprint C — Segmentasi UMKM dan Kesiapan Digital Regional

Stakeholder: dinas koperasi/UMKM, dinas komunikasi/informatika, pemerintah kabupaten/kota.
Decision question: paket dukungan apa yang berbeda untuk wilayah dengan basis UMKM besar tetapi readiness digital/akses pasar yang berbeda?
Data inti: proyeksi UMKM kabupaten/kota 2016–2023—status proyeksi harus dipertahankan pada seluruh dokumentasi. (Dinas Koperasi dan Usaha Kecil Provinsi Jawa Barat 2026)

Feature contoh: UMKMpci=UMKMipopulationi×1000, UMKMpc_i=\frac{UMKM_i}{population_i}\times1000, DigitalGapi=100Interneti, DigitalGap_i=100-Internet_i, LQik=sectorshareikprovincesectorsharek. LQ_{ik}=\frac{sector\ share_{ik}}{province\ sector\ share_k}.

Metode: EDA → robust scaling → PCA untuk reduksi collinearity → k-means/hierarchical clustering → silhouette/stability → map cluster → profile → policy package. Jika tersedia outcome digital adoption, classification dapat ditambahkan.

Pertanyaan penting: apakah cluster stabil jika variabel count diganti per-capita? Jika tidak, cluster awal mungkin hanya mengelompokkan ukuran populasi.
Policy package contoh: cluster 1 basis usaha besar–digital tinggi → market expansion; cluster 2 basis usaha besar–digital rendah → onboarding/infra; cluster 3 basis kecil–akses rendah → ecosystem building; cluster 4 basis kecil–akses tinggi → entrepreneurship/product development. Ini hanyalah contoh interpretasi dan harus mengikuti hasil aktual.

Validation: silhouette, multiple starts, alternative K, removal of one dominant feature, scaling alternatives.
Dashboard: cluster map; radar/profile plot secukupnya; table indikator; filter tahun.
Risiko: proyeksi dianggap real count; cluster labels normatif; outlier metropolitan mendominasi; data UMKM formal/informal berbeda cakupan.

Blueprint D — Stunting Risk Screening dan Prioritas Verifikasi

Stakeholder: dinas kesehatan/Bappeda.
Decision question: wilayah mana yang memiliki probabilitas tinggi terhadap kategori prevalensi stunting tinggi dan membutuhkan review data/intervensi lebih lanjut?
Data: prevalensi stunting 2019–2024 atau jumlah stunting 2014–2024 dari Open Data Jawa Barat, plus indikator kemiskinan, sanitasi, kesehatan, pendidikan. (Kementerian Kesehatan Republik Indonesia dan Pemerintah Provinsi Jawa Barat 2026)

Label contoh—hanya bila ada threshold kebijakan/akademik yang sah: Yi=I(prevalenceic). Y_i=I(prevalence_i\ge c). Jangan menciptakan threshold seolah resmi. Jika cc hanya untuk latihan, tulis “analytical threshold for classroom demonstration”.

Model baseline: logistic regression logpi1pi=β0+β1Povertyi+β2Sanitationi+β3HealthAccessi+. \log\frac{p_i}{1-p_i}=\beta_0+\beta_1Poverty_i+\beta_2Sanitation_i+\beta_3HealthAccess_i+\cdots. Bandingkan random forest bila ada cukup observasi dan fitur. Untuk data hanya 27 kabupaten × beberapa tahun, kompleksitas model harus sangat hati-hati; effective sample size dan dependence perlu dibahas.

Metric: sensitivity, precision, calibration, PR/ROC; threshold dipilih dengan cost false negative/kapasitas review.
Spatial: peta prevalensi dan residual/risk; Moran diagnostic jika layak.
Interpretasi: model adalah screening analytic, bukan alat diagnosis anak/rumah tangga dan bukan pengganti survei/verifikasi kesehatan.
Fairness/coverage: cek perform menurut urban/rural atau region group bila sample memungkinkan; hindari klaim subgroup dengan n terlalu kecil.
Policy output: prioritas verifikasi, data gaps, dan opsi penguatan surveillance; bukan automatic funding allocation tanpa review manusia.

Standar proposal capstone minggu 2. Proposal dianggap siap bila dapat menjawab: siapa stakeholder; keputusan apa; data apa dan sampai tahun berapa; outcome apa; unit analisis apa; metode baseline apa; metode alternatif apa; bagaimana validasi; apa risiko bias; dan produk kebijakan apa. Jika satu poin belum dapat dijawab, milestone harus merekamnya sebagai pertanyaan terbuka dengan rencana penyelesaian.

Milestone Capstone Minggu 1–16

Minggu Milestone Deliverable utama Bobot project
1 Tema dan stakeholder 1 paragraf masalah + calon sumber data formatif
2 M1 Problem Framing one-page problem brief, decision question, unit analisis 3%
3 Data inventory metadata, lisensi, definisi indikator, join key formatif
4 M2 Data Dossier data dictionary, audit kualitas, cleaning log 4%
5 EDA draft 3–5 grafik yang menjawab pertanyaan formatif
6 M3 Evidence Story EDA, deskriptif/inferensial awal, narasi regional 5%
7 Baseline model model sederhana + split/resampling formatif
8 UTS + project clinic revisi problem framing berdasarkan umpan balik
9 Model alternatif tree/ensemble atau model lain yang relevan formatif
10 M4 Predictive/Classification Model perbandingan model + evaluasi 5%
11 Segmentasi cluster profile atau heterogenitas wilayah formatif
12 M5 Regional Heterogeneity PCA/cluster/segmentasi + interpretasi 4%
13 Spatial evidence peta, neighborhood definition, spatial diagnostic formatif
14 Robustness/fairness sensitivity analysis + uncertainty formatif
15 M6 Policy & Dashboard Beta policy options + dashboard beta 4%
16 M7 Final Reproducible Package report, code, data dictionary, dashboard, AI log 5%
Total Project 30%

Rubrik Capstone Project

Dimensi Bobot di dalam Project Kriteria unggul
Relevansi masalah & pertanyaan 15% Masalah nyata, unit analisis dan keputusan jelas, stakeholder terpetakan
Data provenance & quality 15% Sumber kredibel, metadata lengkap, cleaning terdokumentasi, keterbatasan eksplisit
Metode & validasi 25% Metode proporsional, baseline tersedia, leakage dicegah, metrik sesuai, uncertainty dibahas
Interpretasi regional 20% Menghubungkan hasil dengan heterogenitas wilayah dan mekanisme substantif tanpa overclaim
Rekomendasi kebijakan/inovasi 10% Spesifik, feasible, target dan indikator monitoring jelas, risiko dibahas
Visualisasi/dashboard 5% Akurat, terbaca, metadata terlihat, dan tidak misleading
Reproducibility & AI integrity 5% Kode dapat dijalankan, seed/dependency tercatat, AI-use log lengkap
Presentasi & respons kritik 5% Narasi terstruktur dan mampu mempertahankan metodologi serta keterbatasan
Total 100% dari Project = 30% MK

Template Capstone Project Terintegrasi

Template berikut merupakan bagian dari e-book ini. Mahasiswa tidak perlu menggunakan file template terpisah. Struktur ini digunakan sejak minggu pertama dan diperbarui pada setiap milestone. Tujuannya adalah menjaga evidence chain: masalah → data → metode → validasi → interpretasi → rekomendasi → monitoring.

Halaman Identitas Project

Tuliskan judul project, nama anggota tim, stakeholder sasaran, wilayah studi, periode data, tanggal pembaruan terakhir, serta tautan repositori/penyimpanan data jika diizinkan. Judul harus menyatakan masalah regional dan tujuan analitik, bukan hanya nama algoritma.

Ringkasan Eksekutif

Maksimum 300 kata yang memuat: masalah, keputusan yang didukung, data, metode utama, tiga temuan, dua keterbatasan, dan rekomendasi. Ringkasan ini ditulis terakhir, walaupun ditempatkan di awal laporan.

Problem Framing dan Stakeholder

Gunakan tabel berikut.

Elemen Isian wajib
Masalah regional Masalah spesifik, terukur, dan relevan bagi wilayah
Stakeholder Instansi/kelompok yang menggunakan hasil
Decision question Keputusan apa yang akan dibantu oleh analisis
Unit analisis Desa, kecamatan, kabupaten/kota, provinsi, wilayah-tahun, dsb.
Outcome/indikator Definisi operasional, satuan, denominator
Horizon Deskriptif saat ini, prediksi tahun depan, monitoring multi-tahun, dsb.
Risiko salah keputusan Konsekuensi false positive/false negative atau salah ranking

Data Dossier dan Provenance

Dataset Produsen URL/Sumber Tahun Unit Variabel kunci Status Keterbatasan
Dataset 1 final/proyeksi/sementara
Dataset 2

Setiap dataset wajib memiliki access date, lisensi jika tersedia, perubahan definisi, dan catatan transformasi. Tidak diperkenankan menyalin data dari agregator sekunder jika sumber resmi masih tersedia.

Import Data dan Reproducibility Check

panel_capstone <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)
tibble::tibble(
  n_baris = nrow(panel_capstone),
  n_wilayah = dplyr::n_distinct(panel_capstone$wilayah),
  tahun_min = min(panel_capstone$tahun),
  tahun_maks = max(panel_capstone$tahun),
  missing_total = sum(is.na(panel_capstone))
) |>
  knitr::kable(caption = "Output awal: audit struktur dataset capstone")
Table 0.1: Output awal: audit struktur dataset capstone
n_baris n_wilayah tahun_min tahun_maks missing_total
189 27 2019 2025 0

Data Cleaning dan Quality Audit

Laporan minimal memuat duplicate key, missingness, range check, consistency check, join mismatch, perubahan kode wilayah, dan keputusan outlier. Semua transformasi harus dilakukan melalui kode, bukan melalui edit manual spreadsheet yang tidak terdokumentasi.

cap_qc <- panel_capstone |>
  dplyr::group_by(tahun) |>
  dplyr::summarise(
    n = dplyr::n(),
    missing_kemiskinan = mean(is.na(kemiskinan_persen)),
    min_kemiskinan = min(kemiskinan_persen, na.rm = TRUE),
    max_kemiskinan = max(kemiskinan_persen, na.rm = TRUE),
    .groups = "drop"
  )
knitr::kable(cap_qc, digits = 3, caption = "Output quality audit per tahun")
Table 0.2: Output quality audit per tahun
tahun n missing_kemiskinan min_kemiskinan max_kemiskinan
2019 27 0 12.056 17.664
2020 27 0 10.589 18.048
2021 27 0 10.734 17.976
2022 27 0 8.477 16.303
2023 27 0 8.570 15.518
2024 27 0 8.636 13.924
2025 27 0 6.006 13.055

Exploratory Data Analysis dan Evidence Board

Minimal terdapat empat jenis bukti: distribusi, perbandingan antardaerah, hubungan antarindikator, dan perubahan waktu. Setiap grafik harus memiliki take-away sentence satu atau dua kalimat.

panel_capstone |>
  dplyr::filter(tahun == max(tahun)) |>
  ggplot2::ggplot(ggplot2::aes(internet_persen, kemiskinan_persen)) +
  ggplot2::geom_point(size = 2.4, alpha = .75) +
  ggplot2::geom_smooth(method = "lm", se = TRUE) +
  ggplot2::labs(
    title = "Contoh evidence board: internet dan kemiskinan",
    subtitle = "Data simulasi; hubungan tidak otomatis bersifat kausal",
    x = "Akses internet (%)", y = "Kemiskinan (%)"
  )

Baseline Model

Model pertama harus sederhana dan dapat dijelaskan. Baseline berfungsi sebagai pembanding terhadap model yang lebih kompleks.

cap_latest <- panel_capstone |> dplyr::filter(tahun == max(tahun))
cap_lm <- lm(kemiskinan_persen ~ internet_persen + pdrb_perkapita_juta + tpt_persen + ipm,
             data = cap_latest)
broom::tidy(cap_lm, conf.int = TRUE) |>
  knitr::kable(digits = 3, caption = "Output baseline regression")
Table 0.3: Output baseline regression
term estimate std.error statistic p.value conf.low conf.high
(Intercept) 7.522 23.830 0.316 0.755 -41.897 56.941
internet_persen -0.012 0.068 -0.180 0.859 -0.152 0.128
pdrb_perkapita_juta -0.102 0.060 -1.697 0.104 -0.226 0.023
tpt_persen -0.233 0.282 -0.826 0.417 -0.818 0.352
ipm 0.145 0.343 0.423 0.677 -0.567 0.857

Model Alternatif dan Evaluasi

Jika model alternatif digunakan, tunjukkan nilai tambah terhadap baseline. Pilih metrik berdasarkan tujuan keputusan; gunakan data validasi untuk pemilihan model/hyperparameter dan simpan data test untuk evaluasi akhir.

set.seed(260826)
cap_train <- panel_capstone |> dplyr::filter(tahun <= 2023)
cap_test  <- panel_capstone |> dplyr::filter(tahun >= 2024)
cap_fit <- lm(kemiskinan_persen ~ internet_persen + pdrb_perkapita_juta + tpt_persen + ipm,
              data = cap_train)
cap_eval <- cap_test |>
  dplyr::mutate(pred = predict(cap_fit, newdata = cap_test)) |>
  dplyr::summarise(
    RMSE = sqrt(mean((kemiskinan_persen - pred)^2)),
    MAE  = mean(abs(kemiskinan_persen - pred))
  )
knitr::kable(cap_eval, digits = 3, caption = "Output evaluasi out-of-time")
Table 0.4: Output evaluasi out-of-time
RMSE MAE
1.413 1.096

Robustness, Sensitivity, dan Subgroup Analysis

Uji minimal satu keputusan analitik: bobot indeks, threshold, pilihan fitur, tahun holdout, jumlah cluster, seed, atau definisi matriks bobot spasial. Jelaskan bagian kesimpulan yang stabil dan yang sensitif.

Interpretasi Regional

Gunakan format empat lapis:

  1. Temuan statistik: apa pola/output yang diperoleh?
  2. Makna substantif: apa arti pola itu bagi karakteristik wilayah?
  3. Batas klaim: deskriptif, asosiasional, prediktif, atau kausal?
  4. Implikasi keputusan: tindakan atau investigasi apa yang masuk akal?

Rekomendasi Kebijakan atau Strategi Inovasi

Setiap rekomendasi harus mempunyai rantai: evidence → target → instrumen → risiko → indikator monitoring. Hindari kalimat generik seperti “pemerintah perlu meningkatkan perhatian”.

Dashboard atau Visualisasi Interaktif

Dashboard bersifat opsional jika tidak menambah nilai keputusan. Jika digunakan, minimal memiliki filter wilayah/periode, definisi indikator, sumber data, catatan terakhir diperbarui, dan caveat interpretasi.

Deklarasi Penggunaan Generative AI

Tanggal Tool/model Tujuan Output AI yang digunakan Cara verifikasi Modifikasi manusia

AI tidak boleh menjadi sumber angka faktual tanpa verifikasi sumber primer. Seluruh kode yang dibantu AI tetap menjadi tanggung jawab mahasiswa.

Reproducibility Handover

Project dinyatakan siap bila anggota tim lain dapat membuka folder project dan menjalankan ulang analisis hanya dari README dan kode yang tersedia.

cat("R version dan package yang digunakan pada saat knit:\n")
#> R version dan package yang digunakan pada saat knit:
sessionInfo()
#> R version 4.5.1 (2025-06-13)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sonoma 14.5
#> 
#> Matrix products: default
#> BLAS:   /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib 
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
#> 
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#> 
#> time zone: Asia/Jakarta
#> tzcode source: internal
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#>  [1] httr2_1.2.3        jsonlite_2.0.0     leaflet_2.2.2      tmap_4.1          
#>  [5] spdep_1.3-13       spData_2.3.4       sf_1.0-21          factoextra_1.0.7  
#>  [9] cluster_2.1.8.1    ranger_0.17.0      yardstick_1.3.2    workflowsets_1.1.1
#> [13] workflows_1.3.0    tune_2.0.1         tailor_0.1.0       rsample_1.3.1     
#> [17] recipes_1.3.1      parsnip_1.4.1      modeldata_1.5.1    infer_1.1.0       
#> [21] dials_1.4.2        scales_1.4.0       tidymodels_1.4.1   broom_1.0.12      
#> [25] knitr_1.50         skimr_2.2.2        janitor_2.2.1      lubridate_1.9.5   
#> [29] forcats_1.0.1      stringr_1.6.0      dplyr_1.2.1        purrr_1.2.0       
#> [33] readr_2.2.0        tidyr_1.3.1        tibble_3.3.1       ggplot2_4.0.1     
#> [37] tidyverse_2.0.0   
#> 
#> loaded via a namespace (and not attached):
#>   [1] RColorBrewer_1.1-3      rstudioapi_0.17.1       wk_0.9.4               
#>   [4] magrittr_2.0.4          farver_2.1.2            rmarkdown_2.30         
#>   [7] vctrs_0.7.3             base64enc_0.1-3         terra_1.8-54           
#>  [10] htmltools_0.5.8.1       leafsync_0.1.0          raster_3.6-32          
#>  [13] s2_1.1.9                sass_0.4.10             parallelly_1.45.0      
#>  [16] KernSmooth_2.23-26      bslib_0.11.0            htmlwidgets_1.6.4      
#>  [19] stars_0.6-8             cachem_1.1.0            lifecycle_1.0.5        
#>  [22] pkgconfig_2.0.3         cols4all_0.9            Matrix_1.7-3           
#>  [25] R6_2.6.1                fastmap_1.2.0           future_1.58.0          
#>  [28] snakecase_0.11.1        digest_0.6.38           colorspace_2.1-2       
#>  [31] furrr_0.3.1             leafem_0.2.4            crosstalk_1.2.1        
#>  [34] labeling_0.4.3          lwgeom_0.2-14           spacesXYZ_1.6-0        
#>  [37] timechange_0.4.0        mgcv_1.9-3              abind_1.4-8            
#>  [40] compiler_4.5.1          microbenchmark_1.5.0    proxy_0.4-27           
#>  [43] bit64_4.6.0-1           withr_3.0.2             S7_0.2.1               
#>  [46] backports_1.5.0         DBI_1.2.3               logger_0.4.0           
#>  [49] maptiles_0.10.0         MASS_7.3-65             lava_1.8.1             
#>  [52] rappdirs_0.3.3          tmaptools_3.2           classInt_0.4-11        
#>  [55] tools_4.5.1             units_0.8-7             otel_0.2.0             
#>  [58] leaflegend_1.2.1        future.apply_1.20.0     nnet_7.3-20            
#>  [61] glue_1.8.0              nlme_3.1-168            grid_4.5.1             
#>  [64] generics_0.1.4          leaflet.providers_2.0.0 gtable_0.3.6           
#>  [67] tzdb_0.5.0              class_7.3-23            data.table_1.18.2.1    
#>  [70] hms_1.1.4               sp_2.2-0                ggrepel_0.9.6          
#>  [73] pillar_1.11.1           vroom_1.7.1             splines_4.5.1          
#>  [76] lhs_1.2.0               lattice_0.22-7          bit_4.6.0              
#>  [79] survival_3.8-3          deldir_2.0-4            tidyselect_1.2.1       
#>  [82] bookdown_0.43           xfun_0.54               hardhat_1.4.2          
#>  [85] timeDate_4051.111       stringi_1.8.7           DiceDesign_1.10        
#>  [88] yaml_2.3.10             boot_1.3-31             evaluate_1.0.5         
#>  [91] codetools_0.2-20        cli_3.6.5               rpart_4.1.24           
#>  [94] repr_1.1.7              jquerylib_0.1.4         dichromat_2.0-0.1      
#>  [97] Rcpp_1.1.0              globals_0.18.0          png_0.1-8              
#> [100] XML_3.99-0.18           parallel_4.5.1          gower_1.0.2            
#> [103] GPfit_1.0-9             listenv_0.10.0          viridisLite_0.4.2      
#> [106] ipred_0.9-15            prodlim_2025.04.28      e1071_1.7-16           
#> [109] crayon_1.5.3            rlang_1.3.0

Checklist Deliverable Final

  • Laporan reproducible HTML.
  • Policy brief maksimum dua halaman.
  • Data dictionary dan provenance register.
  • Folder R/ atau script analisis yang terstruktur.
  • Folder data dengan penjelasan sumber/lisensi; data sensitif tidak dibagikan tanpa izin.
  • Dashboard/visual interaktif bila relevan.
  • AI-use log.
  • README untuk menjalankan ulang analisis.
  • Slide presentasi dan lampiran metodologis.
  • Pernyataan kontribusi anggota tim.

Peta Bacaan, Rumus Kunci, dan Target Akademik per Pertemuan

Bagian ini berfungsi sebagai reading map agar mahasiswa tidak membaca e-book secara linear tanpa prioritas. Setiap pertemuan memiliki tiga lapis target: minimum competency (wajib dikuasai seluruh mahasiswa), analytical competency (mampu memilih dan menguji metode), dan master-level competency (mampu menjelaskan asumsi, keterbatasan, serta konsekuensi keputusan). Bacaan utama harus dipakai untuk memahami logika metode; dokumentasi package dipakai untuk implementasi, bukan sebagai pengganti referensi metodologis.

Minggu Fokus Rumus/konsep yang wajib dikuasai Bacaan inti Bukti belajar
1 Problem framing empirical risk, loss, indeks komposit, utility Provost dan Fawcett (2013); James dkk. (2021); OECD dan Joint Research Centre, European Commission (2008) problem canvas + pertanyaan analitik
2 Ekosistem/open data rate, proportion, growth, CAGR, missingness Wickham, Çetinkaya-Rundel, dan Grolemund (2023); Gebru dkk. (2021) data dossier + metadata
3 Wrangling & quality z-score, robust z, IQR, MAD, LQ Wickham (2014); Little dan Rubin (2019) reproducible cleaning log
4 EDA mean/median, variance, covariance, correlation, Gini, Theil Tukey (1977); Wickham, Çetinkaya-Rundel, dan Grolemund (2023) EDA notebook + anomaly log
5 Visualization slope, index, uncertainty interval, denominator awareness Wilkinson (2005); Tufte (2001) evidence story
6 Inferensi & regresi OLS, sampling uncertainty, CI, R2R^2, VIF, interaction Harrell (2015); James dkk. (2021) model card awal
7 Predictive modeling RMSE/MAE, CV, regularization, ridge/lasso Kuhn dan Silge (2022); Hastie, Tibshirani, dan Friedman (2009) validation memo
8 UTS integrasi minggu 1–7 seluruh bacaan minggu 1–7 individual case analysis
9 Tree-based ML impurity, bagging, random forest, boosting Breiman (2001); Friedman (2001); Chen dan Guestrin (2016) baseline-vs-ML comparison
10 Classification logit, likelihood, sensitivity/specificity, F1, AUC, calibration Fawcett (2006); James dkk. (2021) threshold decision memo
11 Clustering distance, within-cluster SS, silhouette, Ward Kaufman dan Rousseeuw (1990) segment profile
12 PCA covariance/correlation matrix, eigenvalue, PVE, score/loading Jolliffe dan Cadima (2016) dimensionality memo
13 Spatial data CRS, neighborhood, Moran’s II, Local Moran Pebesma (2018); Moran (1950); Anselin (1995) spatial diagnostic
14 Evaluation/robustness bootstrap, rank stability, fairness, leakage, out-of-time validation Hardt, Price, dan Srebro (2016); Kuhn dan Silge (2022) robustness audit
15 Policy translation utility, uncertainty, causal caution, DiD overview Hernán dan Robins (2020); Callaway dan Sant’Anna (2021) policy brief + dashboard beta
16 UAS/defense synthesis, reproducibility, uncertainty, AI disclosure Gebru dkk. (2021); Mitchell dkk. (2019); Miao dan Holmes (2023) final package + oral defense

Cara Membaca Rumus pada E-Book

Setiap persamaan perlu dibaca melalui empat lapisan. Pertama, identifikasi objek matematisnya: apakah skalar, vektor, matriks, probabilitas, atau fungsi. Kedua, jelaskan apa yang dioptimalkan atau diringkas. Ketiga, sebutkan asumsi yang diperlukan agar interpretasi sah. Keempat, terjemahkan kembali hasil ke konteks regional. Sebagai contoh, persamaan regresi

𝐲=𝐗𝛃+𝛆 \mathbf{y}=\mathbf{X}\boldsymbol\beta+\boldsymbol\varepsilon

bukan sekadar instruksi menjalankan lm(). Mahasiswa harus mampu menjelaskan bahwa 𝐲n\mathbf{y}\in\mathbb{R}^{n} adalah vektor outcome, 𝐗n×p\mathbf{X}\in\mathbb{R}^{n\times p} adalah matriks desain, 𝛃p\boldsymbol\beta\in\mathbb{R}^{p} adalah koefisien populasi yang ingin dipelajari, dan 𝛆\boldsymbol\varepsilon merepresentasikan variasi yang belum dijelaskan model. Jika unit observasi adalah kabupaten-tahun, asumsi independensi sederhana dapat terganggu oleh pengulangan wilayah dan korelasi temporal; jika unit berdekatan secara geografis, residual juga dapat berkorelasi spasial. Karena itu, kemampuan membaca struktur data harus mendahului interpretasi koefisien.

Standar Penulisan Jawaban Matematis

Untuk kuis, tugas, UTS, dan UAS, jawaban matematis yang dinilai penuh harus memuat: (1) rumus, (2) definisi seluruh simbol, (3) substitusi nilai bila tersedia, (4) hasil numerik dengan satuan, dan (5) interpretasi substantif. Contoh jawaban yang hanya menulis “RMSE = 2,7 dan model A lebih baik” belum lengkap. Jika outcome adalah TPT dalam persen, jawaban yang lebih tepat adalah: “RMSE 2,7 berarti besar kesalahan prediksi tipikal dalam skala akar-kuadrat sekitar 2,7 poin persentase TPT; dibanding baseline 3,5, model memberi peningkatan prediksi, tetapi kegunaan kebijakannya tetap perlu dinilai terhadap variasi antardaerah dan biaya salah prioritas.”

Standar Sitasi Akademik dan Sitasi Dataset

Mahasiswa wajib membedakan referensi metode dan referensi data. Referensi metode menjelaskan teori atau algoritma; sitasi dataset menjelaskan asal bukti empiris. Mengutip buku machine learning tidak menggantikan kewajiban mengutip BPS/Open Data Jawa Barat sebagai pemilik atau penyedia data. Untuk dataset dinamis, catat judul dataset, instansi penghasil, portal, URL, cakupan tahun yang benar-benar digunakan, tanggal akses, unit observasi, satuan, serta status angka (misalnya final, sementara, estimasi, atau proyeksi).

Contoh format dokumentasi data yang direkomendasikan:

Dataset: Tingkat Pengangguran Terbuka Berdasarkan Kabupaten/Kota di Jawa Barat. Penghasil: Badan Pusat Statistik; portal: Open Data Jawa Barat; cakupan portal: 2007–2024; unit analisis: kabupaten/kota-tahun; variabel outcome: tingkat_pengangguran_terbuka; satuan: persen; tanggal akses: dicatat saat pengunduhan. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026d)

Dalam laporan, mahasiswa tidak boleh menyalin definisi portal tanpa memeriksa denominator dan konteks statistiknya. Misalnya, TPT adalah persentase penganggur terhadap angkatan kerja, bukan terhadap seluruh penduduk. Prinsip yang sama berlaku untuk jumlah penduduk miskin: angka absolut dalam ribu jiwa tidak identik dengan persentase kemiskinan. Perbedaan denominator dapat mengubah ranking wilayah dan rekomendasi kebijakan.

Target Kedalaman Jenjang Magister

Pada level magister, mahasiswa diharapkan bergerak melampaui eksekusi software. Untuk setiap metode utama, mahasiswa harus dapat menjawab setidaknya enam pertanyaan berikut.

  1. Apa estimand atau target prediksinya? Contoh: rata-rata outcome, koefisien parsial, probabilitas kelas, cluster membership, atau skor komponen utama.
  2. Apa asumsi pentingnya? Contoh: linearitas, independensi, representativitas, stabilitas distribusi, atau definisi neighborhood spasial.
  3. Bagaimana model divalidasi? Training error tidak cukup untuk menilai generalisasi.
  4. Apa bentuk ketidakpastian? Sampling uncertainty, model uncertainty, measurement error, atau uncertainty akibat pilihan preprocessing dapat berbeda.
  5. Apa konsekuensi substantif salah model? False negative dalam prioritisasi stunting berbeda implikasinya dengan kesalahan prediksi PDRB.
  6. Apa batas klaim? Prediksi, asosiasi, dan kausalitas adalah tiga jenis klaim yang tidak boleh dipertukarkan.
Standar kelulusan konseptual. Mahasiswa tidak cukup mengatakan “saya menggunakan Random Forest karena akurasinya tinggi.” Mereka harus menjelaskan baseline pembanding, skema resampling, hyperparameter, risiko leakage, metrik yang dipakai, uncertainty, interpretability, dan mengapa peningkatan performa tersebut cukup relevan untuk keputusan regional.

Panduan Tugas dan Kuis Mingguan

Selain empat tugas besar dan empat kuis berbobot yang dijelaskan pada bagian asesmen, dosen dapat menggunakan latihan berikut sebagai formative checkpoints. Nilainya dapat dimasukkan ke partisipasi atau dipakai sebagai latihan tanpa bobot. Setiap checkpoint dirancang agar mahasiswa terus mengembangkan capstone.

Checkpoint Minggu 1–4

Minggu 1 — Problem framing clinic. Setiap tim membawa dua kandidat masalah regional. Dalam 5 menit, tim harus menjelaskan stakeholder, keputusan, unit observasi, outcome, horizon waktu, dan alasan data science diperlukan. Kelas memberikan kritik apakah pertanyaan terlalu luas, normatif, atau tidak dapat diuji.

Minggu 2 — Metadata challenge. Mahasiswa menerima tiga dataset yang kelihatannya kompatibel, tetapi berbeda cakupan tahun, satuan, atau kode wilayah. Tugasnya adalah menemukan minimal lima risiko integrasi sebelum melakukan join. Kuis singkat meminta mahasiswa menghitung rate, growth, dan CAGR serta menjelaskan kapan masing-masing ukuran menyesatkan.

Minggu 3 — Data-quality audit. Mahasiswa membuat audit table berisi duplicate, missingness, range violation, impossible value, join mismatch, dan perubahan definisi. Setiap keputusan cleaning harus disertai alasan; penghapusan observasi tanpa dokumentasi dinilai sebagai kegagalan reproducibility.

Minggu 4 — EDA evidence board. Setiap tim menghasilkan empat visual/summary yang menjawab empat fungsi berbeda: distribusi, perbandingan, hubungan, dan perubahan waktu. Tim juga harus menuliskan satu temuan yang awalnya tampak menarik tetapi ternyata dapat dijelaskan oleh denominator atau outlier.

Checkpoint Minggu 5–7

Minggu 5 — Visualization red-team. Mahasiswa saling menukar grafik dan mencari potensi manipulasi: truncated axis, kategori terlalu banyak, penggunaan warna tanpa fungsi, agregasi yang menutupi heterogenitas, atau label yang membuat korelasi tampak kausal. Revisi grafik menjadi bagian dari evidence story.

Minggu 6 — Regression defense. Mahasiswa harus memilih satu spesifikasi regresi dan satu alternatif. Mereka menjelaskan arti βj\beta_j, asumsi, potensi confounding, multicollinearity, residual pattern, dan mengapa interaksi digunakan atau tidak digunakan. Fokusnya bukan “semua variabel signifikan”, melainkan konsistensi model dengan pertanyaan.

Minggu 7 — Validation lab. Mahasiswa membandingkan baseline mean/median, regresi, serta satu model regularized. Mereka harus menetapkan split sebelum tuning dan menjelaskan mengapa random split atau time-based split lebih sesuai. Jika data panel, mahasiswa mendiskusikan risiko satu wilayah muncul di train dan test dengan observasi tahun berbeda.

Checkpoint Minggu 9–12

Minggu 9 — Complexity budget. Tim hanya boleh memakai model tree-based yang lebih rumit jika dapat menunjukkan peningkatan out-of-sample yang bermakna dibanding baseline dan model sederhana. Selisih metrik harus diterjemahkan ke unit outcome, bukan hanya persen peningkatan abstrak.

Minggu 10 — Threshold workshop. Untuk kasus klasifikasi prioritas intervensi, mahasiswa menghitung confusion matrix pada beberapa threshold dan menyusun tabel konsekuensi kebijakan. Pilihan threshold harus mengacu pada false-positive/false-negative cost dan kapasitas intervensi.

Minggu 11 — Cluster naming discipline. Cluster dilarang diberi nama normatif seperti “maju” dan “tertinggal” sebelum profil indikator diperiksa. Tim harus memberikan nama deskriptif yang berasal dari centroid/medoid atau distribusi indikator, lalu menguji stabilitas cluster terhadap scaling dan jumlah cluster.

Minggu 12 — PCA interpretation. Mahasiswa menjelaskan loadings, scores, eigenvalues, dan explained variance tanpa menyebut PC1 sebagai “indeks pembangunan” secara otomatis. Label substantif hanya boleh diberikan jika pola loading dan konstruk teoritis mendukungnya.

Checkpoint Minggu 13–16

Minggu 13 — Spatial-neighbor challenge. Setiap tim membandingkan minimal dua definisi WW (misalnya queen contiguity dan k-nearest neighbors) dan menjelaskan perubahan Moran’s II atau local pattern. Tujuannya menunjukkan bahwa hasil spasial dipengaruhi definisi neighborhood.

Minggu 14 — Robustness red-team. Tim lain mencoba “merusak” kesimpulan dengan mengganti seed, indikator, bobot, threshold, jumlah cluster, atau spesifikasi model. Kesimpulan yang berubah drastis harus dinyatakan sebagai sensitif, bukan disembunyikan.

Minggu 15 — Policy translation studio. Setiap rekomendasi harus terhubung ke satu temuan, satu kelompok sasaran, satu instrumen, satu risiko implementasi, dan satu indikator monitoring. Kalimat rekomendasi yang generik seperti “pemerintah perlu meningkatkan perhatian” harus direvisi menjadi tindakan yang dapat dinilai.

Minggu 16 — Reproducibility handover. Seorang mahasiswa dari tim lain mencoba membuka dan menjalankan paket project dengan hanya membaca README. Kegagalan karena path lokal, objek yang belum dibuat, file tidak tersedia, atau langkah manual yang tidak terdokumentasi masuk ke reproducibility defect log.

Contoh Pertanyaan Kuis Tambahan

  1. Sebuah kabupaten memiliki 20.000 penganggur dan angkatan kerja 250.000 orang. Hitung TPT dan jelaskan mengapa membagi dengan total penduduk adalah keliru.
  2. Jika indikator kemiskinan memiliki mean 8,2 dan simpangan baku 2,0, berapa z-score untuk wilayah dengan nilai 11,2? Interpretasikan relatif terhadap distribusi sampel.
  3. Mengapa korelasi Pearson tinggi antara PDRB per kapita dan penetrasi internet tidak membuktikan efek kausal internet terhadap PDRB?
  4. Kapan median lebih relevan daripada mean untuk merangkum distribusi pendapatan regional?
  5. Jelaskan perbedaan training error, validation error, dan test error. Data mana yang boleh digunakan untuk memilih hyperparameter?
  6. Pada klasifikasi wilayah prioritas, kapan recall lebih penting daripada precision? Berikan contoh kebijakan.
  7. Mengapa standardisasi fitur penting sebelum k-means? Tunjukkan pengaruh skala pada Euclidean distance.
  8. Apa konsekuensi menggunakan PCA pada covariance matrix ketika satu indikator memiliki satuan dan variance jauh lebih besar dibanding indikator lain?
  9. Jelaskan mengapa Moran’s II bergantung pada definisi matriks bobot spasial WW.
  10. Sebutkan tiga bentuk data leakage yang mungkin terjadi pada prediksi indikator kabupaten-tahun.
  11. Mengapa model dengan RMSE minimum belum tentu merupakan pilihan kebijakan terbaik?
  12. Apa yang harus dicantumkan dalam deklarasi penggunaan Generative AI agar proses analisis tetap transparan?

Kisi-Kisi Evaluasi yang Lebih Operasional

Kisi-Kisi UTS 20%

UTS bersifat individual, open-resource terbatas, berbentuk satu kasus data regional terintegrasi. Data disediakan dalam keadaan belum sepenuhnya bersih agar mahasiswa menunjukkan kemampuan audit, bukan sekadar menjalankan model. Distribusi yang disarankan adalah: 15% problem framing dan metadata; 20% cleaning/data quality; 20% EDA/visualisasi; 25% inferensi/regresi; 10% validasi dan diagnostic; 10% interpretasi kebijakan. Nilai UTS dalam komponen akhir tetap 20%; persentase di atas adalah distribusi di dalam skor UTS.

Rumus yang boleh/harus dikuasai: rate/proportion, growth dan CAGR, mean/variance/covariance/correlation, z-score, confidence interval dasar, OLS, R2R^2, adjusted R2R^2, RMSE dan MAE. Mahasiswa dapat diberikan satu halaman formula sheet, tetapi harus mampu menjelaskan setiap simbol dan memilih formula yang sesuai.

Contoh stimulus UTS: dataset 27 kabupaten/kota dengan TPT, pertumbuhan PDRB, kemiskinan, dan pendidikan untuk beberapa tahun. Mahasiswa diminta mengaudit denominator, membuat dua visual evidence, mengestimasi regresi, memeriksa minimal dua diagnostic, membandingkan baseline, lalu menulis rekomendasi maksimum 250 kata yang tidak melakukan klaim kausal berlebihan.

Kisi-Kisi UAS 20%

UAS menilai sintesis individual dan dipisahkan dari nilai produk kelompok capstone. Distribusi yang disarankan: 20% problem-method alignment; 20% formulasi dan penjelasan metode; 20% validasi/robustness; 20% interpretasi regional dan rekomendasi; 10% reproducibility/data provenance; 10% oral defense dan responsible AI disclosure.

Mahasiswa harus siap menurunkan atau menjelaskan minimal satu rumus yang benar-benar digunakan dalam project, misalnya OLS, logistic likelihood, k-means objective, PCA eigenproblem, atau Moran’s II. Pertanyaan lisan diarahkan pada keputusan yang dibuat mahasiswa: “mengapa threshold ini?”, “mengapa k=4k=4?”, “apa akibat mengganti WW?”, “apa bukti bahwa model menggeneralisasi?”, “bagian mana yang dibantu AI dan bagaimana diverifikasi?”.

Pemisahan Project dan UAS. Project 30% menilai kualitas produk kelompok dan milestone sepanjang semester. UAS 20% menilai penguasaan individual terhadap logika, matematika, validasi, interpretasi, dan integritas proses. Dengan desain ini, kontribusi individual tetap dapat diverifikasi.

Standar Output Analisis pada E-Book

Setiap analisis kuantitatif pada buku ini mengikuti urutan keluaran yang konsisten agar mahasiswa tidak berhenti pada sintaks. Urutan minimal adalah (1) pemeriksaan data, (2) statistik deskriptif, (3) visualisasi eksploratif, (4) estimasi/model, (5) diagnostik atau evaluasi, (6) visualisasi hasil, dan (7) interpretasi regional. Untuk metode yang tidak memerlukan model prediktif, bagian evaluasi diganti dengan quality check, sensitivity analysis, atau pemeriksaan asumsi yang relevan.

Kode R sengaja ditulis sehingga objek yang penting dicetak langsung di bawah code chunk melalui knitr::kable(), print(), yardstick, atau objek grafik ggplot2. Dengan demikian mahasiswa dapat membaca hubungan antara kode dan hasil, bukan hanya menyalin script.

Aturan pedagogis. Setiap angka atau visual yang dipakai dalam kesimpulan harus dapat ditelusuri ke data, definisi variabel, transformasi, metode, dan kode yang menghasilkan output tersebut.

Protokol Audit Analitik Umum

Protokol berikut berlaku untuk seluruh bab dan tidak diulang pada setiap pertemuan.

  1. Replikasi: jalankan ulang analisis dari sesi R baru dan pastikan output utama dapat direproduksi.
  2. Alternative specification: ubah satu keputusan penting—fitur, scaling, threshold, bobot, split, atau definisi neighborhood—kemudian periksa apakah kesimpulan berubah.
  3. Policy translation: terjemahkan output menjadi implikasi regional tanpa melebihkan jenis bukti. Bedakan klaim deskriptif, asosiasional, prediktif, kausal, dan rekomendasi.
  4. Reproducibility: dokumentasikan package, versi data, seed, dan dependency yang diperlukan.
  5. AI audit: bila Generative AI digunakan, simpan prompt atau ringkasan penggunaannya dan tunjukkan verifikasi manusia terhadap kode, sumber, dan interpretasi.
  6. Evidence tag: selama drafting, tandai klaim sebagai D (descriptive), A (associational), P (predictive), C (causal), atau R (recommendation) untuk mencegah claim inflation.

Pada jenjang magister, jawaban “package menghasilkan output tersebut” tidak cukup. Setiap output harus dapat dijelaskan melalui definisi → asumsi → keputusan analitik → hasil → ketidakpastian → implikasi regional.

Cara Menggunakan E-Book

E-book ini dirancang untuk membangun alur berpikir masalah regional → data → eksplorasi → model → validasi → interpretasi → insight → rekomendasi kebijakan/inovasi. R digunakan sebagai computational laboratory, bukan sebagai tujuan akhir. Karena itu, setiap bab selalu menghubungkan metode dengan pertanyaan substantif: apa masalah wilayahnya, indikator apa yang relevan, unit analisisnya apa, apa sumber ketidakpastiannya, dan keputusan apa yang akan didukung oleh hasil analisis?

Mahasiswa Magister Inovasi Regional tidak diwajibkan menjadi machine-learning engineer. Namun, mahasiswa harus mampu menjadi pengguna analitik yang kritis: dapat membedakan analisis deskriptif, inferensial, prediktif, dan kausal; memahami konsekuensi kualitas data; memilih model yang proporsional dengan masalah; mengevaluasi model secara tepat; serta menerjemahkan keluaran statistik menjadi rekomendasi yang dapat dipertanggungjawabkan. Pendekatan ini konsisten dengan orientasi program pada kebijakan publik berbasis data, data-driven decision making, evaluasi kebijakan, dan inovasi regional.

Paket Berkas

  • Sains_Data_Inovasi_Regional.Rmd: naskah utama e-book.
  • references.bib: pustaka untuk sitasi otomatis.
  • R/00_setup.R: konfigurasi package dan fungsi utilitas.
  • R/01_generate_simulation_data.R: pembangkit data simulasi dengan set.seed().
  • R/02_download_real_data.R: pengunduh INDO-DAPOER World Bank.
  • R/03_prepare_indodapoer.R: penataan data INDO-DAPOER ke format tidy.
  • R/04_open_data_jabar.R: pola impor Open Data Jawa Barat.
  • data/: snapshot data simulasi dan katalog sumber data nyata.

Prinsip Reproducibility

Setiap analisis minimal mencatat: (1) sumber data dan tanggal akses, (2) definisi unit observasi, (3) kode pembersihan data, (4) aturan penanganan missing value/outlier, (5) pemisahan data training-test bila prediktif, (6) seed untuk proses acak, (7) package dan versi, dan (8) deklarasi penggunaan Generative AI. Untuk proyek akhir, hasil yang tidak dapat direproduksi dari kode dan data yang tersedia dianggap belum selesai, meskipun visualisasinya menarik.

Catatan Data Nyata

Contoh utama menggunakan INDO-DAPOER, basis data subnasional Indonesia dari World Bank yang mencakup lebih dari 200 indikator fiskal, ekonomi, sosial-demografi, dan infrastruktur pada level provinsi/distrik. Data ini sangat baik untuk latihan karena struktur panelnya kaya, tetapi cakupan waktunya berakhir pada 2018 sehingga tidak boleh dipresentasikan sebagai gambaran kondisi terkini. Untuk isu terbaru Jawa Barat, mahasiswa diarahkan ke Open Data Jawa Barat/BPS dan wajib mencatat status angka (final, sementara, proyeksi) serta perubahan definisi/kode wilayah. (World Bank 2026; Pemerintah Provinsi Jawa Barat 2026b; Badan Pusat Statistik 2026)

1 Sains Data dan Inovasi Regional

1.1 Pendahuluan

Sains data untuk inovasi regional dimulai bukan dari algoritma, melainkan dari masalah keputusan. Ketimpangan antarwilayah, kemiskinan, akses layanan, produktivitas UMKM, mobilitas, kualitas lingkungan, dan daya inovasi memiliki mekanisme berbeda. Data science membantu menyatukan data administratif, survei, geospasial, sensor, dan sumber digital menjadi bukti yang dapat diuji. Pada jenjang magister, mahasiswa perlu bergerak dari pertanyaan “metode apa yang bisa digunakan?” ke pertanyaan “bukti apa yang dibutuhkan untuk keputusan ini, dengan asumsi dan keterbatasan apa?”. (Provost dan Fawcett 2013)

1.2 Tujuan Pembelajaran

Setelah bab ini, mahasiswa mampu: membedakan analisis deskriptif, diagnostik, prediktif, dan preskriptif; merumuskan masalah regional menjadi pertanyaan analitik; menentukan unit analisis; mengidentifikasi stakeholder; dan merancang minimum viable analysis untuk capstone.

1.3 Definisi dan Konsep

Sains data adalah praktik interdisipliner yang menggabungkan pemahaman substantif, statistika, komputasi, dan komunikasi untuk mengekstraksi informasi yang dapat digunakan dari data. Dalam konteks regional, “wilayah” bukan hanya label administratif; wilayah dapat memuat kedekatan spasial, jaringan ekonomi, arus komuter, struktur demografi, dan kapasitas kelembagaan. Karena itu, dua kabupaten dengan indikator rata-rata serupa belum tentu memiliki kebutuhan kebijakan yang sama.

Empat mode analitik yang penting adalah: deskriptif (apa yang terjadi?), diagnostik (pola apa yang menyertainya?), prediktif (apa yang mungkin terjadi pada observasi baru?), dan preskriptif (alternatif tindakan apa yang layak dipertimbangkan?). Analisis prediktif yang akurat tidak otomatis menghasilkan kesimpulan kausal. Korelasi antara internet dan kemiskinan, misalnya, belum membuktikan bahwa peningkatan internet menyebabkan penurunan kemiskinan.

1.4 Formulasi Matematis

Secara sederhana, data dapat ditulis sebagai matriks

𝐗=[xij],i=1,,n,j=1,,p, \mathbf{X}=[x_{ij}], \qquad i=1,\ldots,n,\; j=1,\ldots,p,

di mana nn adalah jumlah unit observasi (misalnya kabupaten-tahun), pp jumlah variabel, dan xijx_{ij} nilai variabel ke-jj pada observasi ke-ii. Outcome yang ingin dijelaskan/prediksi ditulis yiy_i. Sebuah model prediktif mencari fungsi

ŷi=f(𝐱i), \hat y_i=f(\mathbf{x}_i),

dengan 𝐱i\mathbf{x}_i vektor fitur wilayah ke-ii dan ŷi\hat y_i prediksi. Kualitas model tidak hanya ditentukan oleh kedekatan ŷi\hat y_i terhadap yiy_i, tetapi juga relevansi fitur, kualitas data, stabilitas, fairness, serta kegunaan keputusan.

1.4.1 Dari masalah keputusan ke fungsi objektif

Dalam pembelajaran tingkat magister, algoritma dapat dipandang sebagai prosedur untuk memilih fungsi ff dari suatu kelas fungsi \mathcal{F}. Jika L(y,ŷ)L(y,\hat y) adalah fungsi kerugian (loss function), risiko populasi didefinisikan sebagai

R(f)=𝔼(X,Y)P[L{Y,f(X)}]. R(f)=\mathbb{E}_{(X,Y)\sim P}\left[L\{Y,f(X)\}\right].

Distribusi populasi PP tidak diketahui, sehingga pada data pelatihan (𝐱i,yi)i=1n(\mathbf{x}_i,y_i)_{i=1}^{n} kita menggunakan empirical risk

R̂n(f)=1ni=1nL{yi,f(𝐱i)}. \widehat R_n(f)=\frac{1}{n}\sum_{i=1}^{n}L\{y_i,f(\mathbf{x}_i)\}.

Untuk outcome kontinu, pilihan yang umum adalah squared-error loss

L(y,ŷ)=(yŷ)2, L(y,\hat y)=(y-\hat y)^2,

sedangkan untuk keputusan klasifikasi biner dapat digunakan 0–1 loss

L(y,ŷ)=I(yŷ). L(y,\hat y)=I(y\neq \hat y).

Namun biaya kebijakan sering tidak simetris. Misalkan CFNC_{FN} adalah biaya false negative (wilayah membutuhkan intervensi tetapi tidak diprioritaskan) dan CFPC_{FP} biaya false positive. Kerugian keputusan dapat ditulis

L(y,ŷ)=CFNI(y=1,ŷ=0)+CFPI(y=0,ŷ=1). L(y,\hat y)=C_{FN}I(y=1,\hat y=0)+C_{FP}I(y=0,\hat y=1).

Konsekuensinya penting: threshold terbaik secara kebijakan tidak harus 0,5. Nilai threshold harus mempertimbangkan biaya, kapasitas intervensi, serta konsekuensi salah klasifikasi. (James dkk. 2021; Hastie, Tibshirani, dan Friedman 2009)

1.4.2 Indikator, normalisasi, dan indeks komposit

Banyak persoalan regional menggunakan beberapa indikator. Jika indikator xijx_{ij} memiliki unit yang berbeda, dua transformasi umum adalah min–max scaling

zij(mm)=xijmini(xij)maxi(xij)mini(xij), z_{ij}^{(mm)}=\frac{x_{ij}-\min_i(x_{ij})}{\max_i(x_{ij})-\min_i(x_{ij})},

dan z-score standardization

zij=xijxjsj,sj=1n1i=1n(xijxj)2. z_{ij}=\frac{x_{ij}-\bar x_j}{s_j}, \qquad s_j=\sqrt{\frac{1}{n-1}\sum_{i=1}^n(x_{ij}-\bar x_j)^2}.

Indeks komposit berbobot dapat ditulis

Si=j=1pwjzij,wj0,j=1pwj=1. S_i=\sum_{j=1}^{p} w_j z_{ij},\qquad w_j\ge 0,\qquad \sum_{j=1}^{p}w_j=1.

Jika indikator “lebih tinggi = lebih buruk”, sedangkan indikator lain “lebih tinggi = lebih baik”, arah harus diseragamkan sebelum agregasi. Untuk skala 0–1, pembalikan sederhana adalah zij*=1zijz_{ij}^{*}=1-z_{ij}. Pilihan bobot wjw_j adalah bagian dari desain kebijakan dan harus diuji dengan sensitivity analysis. OECD/JRC menekankan pentingnya kerangka teori, seleksi indikator, normalisasi, pembobotan, agregasi, serta analisis ketidakpastian pada indeks komposit. (OECD dan Joint Research Centre, European Commission 2008)

1.4.3 Dari prediksi menuju keputusan

Misalkan a𝒜a\in\mathcal{A} adalah alternatif tindakan dan θ\theta keadaan dunia yang tidak diketahui. Dalam kerangka keputusan sederhana, kita memilih

a*=argmaxa𝒜𝔼{U(a,θ)𝒟}, a^{*}=\arg\max_{a\in\mathcal{A}}\mathbb{E}\{U(a,\theta)\mid \mathcal{D}\},

di mana U(a,θ)U(a,\theta) adalah utilitas tindakan dan 𝒟\mathcal{D} adalah data. Rumus ini mengingatkan bahwa prediksi ŷ\hat y hanyalah salah satu input keputusan. Kapasitas anggaran, risiko, fairness, implementability, dan preferensi stakeholder dapat mengubah pilihan tindakan walaupun prediksi sama.

1.4.4 Notasi inti yang akan dipakai sepanjang buku

Simbol Makna
nn jumlah unit observasi
pp jumlah fitur/variabel prediktor
𝐗n×p\mathbf{X}\in\mathbb{R}^{n\times p} matriks fitur
𝐱i\mathbf{x}_i vektor fitur observasi/wilayah ke-ii
yiy_i outcome aktual
ŷi\hat y_i outcome prediksi
f()f(\cdot) fungsi/model prediksi
L()L(\cdot) fungsi kerugian
R(f)R(f) risiko populasi
R̂n(f)\widehat R_n(f) empirical risk
wjw_j bobot indikator ke-jj

1.4.5 Kesalahan konseptual yang harus dihindari

  1. Prediction ≠ causation. Model yang dapat memprediksi kemiskinan tidak otomatis menjelaskan intervensi apa yang akan menurunkannya. (Hernán dan Robins 2020)
  2. Administrative unit ≠ mechanism. Kabupaten/kota adalah unit pelaporan; mekanisme sosial-ekonomi dapat melintasi batas tersebut.
  3. Ranking ≠ diagnosis. Peringkat tinggi hanyalah sinyal prioritas; diagnosis kebijakan membutuhkan pembacaan indikator penyusun dan konteks lokal.
  4. Model accuracy ≠ policy value. Perbaikan RMSE yang sangat kecil dapat tidak bernilai jika interpretasi, biaya implementasi, atau fairness memburuk.
  5. Open data ≠ ready-to-model data. Ketersediaan publik tidak menjamin definisi stabil, lengkap, dan kompatibel antarsumber.

1.5 Intuisi Metode

Bayangkan pemerintah daerah harus menentukan 20 kecamatan prioritas. “Memilih model” baru relevan setelah definisi prioritas disepakati: apakah berdasarkan tingkat kemiskinan, tren memburuk, kerentanan guncangan, kekurangan layanan, atau kombinasi beberapa indikator? Sains data yang baik membuat definisi tersebut eksplisit sehingga hasil dapat diaudit.

1.5.1 Worked Example — dari isu kebijakan ke target analitik

Misalkan Bappeda memiliki tiga kabupaten hipotetis A, B, dan C. Outcome yang ingin diprioritaskan adalah multiple deprivation. Tiga indikator setelah orientasi “lebih tinggi = lebih buruk” adalah kemiskinan z1z_1, kekurangan internet z2z_2, dan kekurangan akses kesehatan z3z_3. Setelah min–max scaling diperoleh:

Wilayah z1z_1 z2z_2 z3z_3
A 0.90 0.70 0.40
B 0.55 0.85 0.80
C 0.35 0.30 0.90

Dengan bobot (0.50,0.30,0.20)(0.50,0.30,0.20), SA=0.50(0.90)+0.30(0.70)+0.20(0.40)=0.74, S_A=0.50(0.90)+0.30(0.70)+0.20(0.40)=0.74, SB=0.50(0.55)+0.30(0.85)+0.20(0.80)=0.69, S_B=0.50(0.55)+0.30(0.85)+0.20(0.80)=0.69, SC=0.50(0.35)+0.30(0.30)+0.20(0.90)=0.445. S_C=0.50(0.35)+0.30(0.30)+0.20(0.90)=0.445.

Ranking awal adalah A–B–C. Tetapi bila stakeholder menyatakan akses layanan dasar lebih kritis dan bobot menjadi (0.35,0.25,0.40)(0.35,0.25,0.40), maka SA=0.35(0.90)+0.25(0.70)+0.40(0.40)=0.650, S_A=0.35(0.90)+0.25(0.70)+0.40(0.40)=0.650, SB=0.35(0.55)+0.25(0.85)+0.40(0.80)=0.725, S_B=0.35(0.55)+0.25(0.85)+0.40(0.80)=0.725, SC=0.35(0.35)+0.25(0.30)+0.40(0.90)=0.558. S_C=0.35(0.35)+0.25(0.30)+0.40(0.90)=0.558. Ranking berubah menjadi B–A–C. Pelajaran: ranking bukan fakta alam; ia merupakan konsekuensi data, definisi indikator, transformasi, dan preferensi bobot. Maka laporan harus memisahkan hasil empiris dari pilihan normatif. (OECD dan Joint Research Centre, European Commission 2008)

1.5.2 Problem-framing canvas

Sebelum membuka R, isi enam kotak berikut.

Pertanyaan Contoh jawaban
Siapa pengambil keputusan? Bappeda provinsi + dinas terkait
Keputusan apa? memilih 10 kabupaten untuk diagnostic review lanjutan
Unit analisis? kabupaten–tahun
Outcome? indeks kerentanan atau TPT tahun berikutnya
Horizon? alokasi program tahun anggaran berikut
Kesalahan paling mahal? tidak memasukkan wilayah benar-benar rentan

Bila jawaban “keputusan apa?” masih berupa “mengetahui kondisi”, project belum cukup tajam. Ubah menjadi keputusan yang dapat ditindaklanjuti: prioritas, alokasi, screening, evaluasi, pemantauan, atau desain inovasi.

1.5.3 Empirical-risk example dengan cost tidak simetris

Anggap 100 wilayah: 20 benar-benar prioritas. Model A menghasilkan FN=2 dan FP=20; model B FN=7 dan FP=5. Jika CFN=5C_{FN}=5 dan CFP=1C_{FP}=1: CA=5(2)+1(20)=30, C_A=5(2)+1(20)=30, CB=5(7)+1(5)=40. C_B=5(7)+1(5)=40. Walau model B mempunyai lebih sedikit false positive, model A lebih baik menurut cost policy yang ditetapkan. Jika cost berubah, pilihan dapat berubah. Karena itu pemilihan metric dan threshold harus mengikuti konsekuensi keputusan, bukan kebiasaan default software.

1.5.4 Implementasi R langkah demi langkah

set.seed(260811)
idx <- tibble::tribble(
  ~wilayah, ~kemiskinan, ~internet, ~akses,
  "A", 19, 45, 60,
  "B", 14, 35, 45,
  "C", 10, 70, 40
) |>
  mutate(
    kemiskinan_mm = (kemiskinan-min(kemiskinan))/(max(kemiskinan)-min(kemiskinan)),
    kurang_internet = 1-(internet-min(internet))/(max(internet)-min(internet)),
    kurang_akses = 1-(akses-min(akses))/(max(akses)-min(akses)),
    score_s1 = .50*kemiskinan_mm + .30*kurang_internet + .20*kurang_akses,
    score_s2 = .35*kemiskinan_mm + .25*kurang_internet + .40*kurang_akses
  )
knitr::kable(idx, digits = 3, caption = "Sensitivity of regional priority scores")
Table 1.1: Sensitivity of regional priority scores
wilayah kemiskinan internet akses kemiskinan_mm kurang_internet kurang_akses score_s1 score_s2
A 19 45 60 1.000 0.714 0.00 0.714 0.529
B 14 35 45 0.444 1.000 0.75 0.672 0.706
C 10 70 40 0.000 0.000 1.00 0.200 0.400

Perhatikan bahwa kode menyimpan indikator asli dan indikator tertransformasi. Jangan menimpa kolom mentah karena audit trail akan hilang.

1.5.5 Pertanyaan refleksi tingkat magister

  • Apakah target yang dipilih merupakan outcome yang memang dapat dipengaruhi oleh kebijakan dalam horizon yang tersedia?
  • Apakah unit analisis terlalu agregat untuk mekanisme yang ingin dijelaskan?
  • Apakah ranking diperlukan, atau interval/cluster lebih jujur terhadap uncertainty?
  • Apa baseline keputusan tanpa model? Misalnya aturan existing atau indikator tunggal.
  • Berapa minimum useful improvement yang membuat model baru layak dipakai?
  • Siapa yang dapat dirugikan jika model salah?

1.6 Contoh dengan Data Simulasi

set.seed(260801)
contoh_wilayah <- tibble(
  wilayah = paste0("W", 1:12),
  kemiskinan = runif(12, 4, 20),
  internet = runif(12, 35, 95),
  akses_layanan = runif(12, 40, 90)
) |>
  mutate(skor_prioritas = 0.6*kemiskinan + 0.25*(100-internet) + 0.15*(100-akses_layanan)) |>
  arrange(desc(skor_prioritas))
knitr::kable(contoh_wilayah, digits = 2, caption = "Contoh pembentukan skor prioritas wilayah (simulasi)")
Table 1.2: Contoh pembentukan skor prioritas wilayah (simulasi)
wilayah kemiskinan internet akses_layanan skor_prioritas
W6 19.53 44.94 70.63 29.89
W5 17.09 55.12 49.86 28.99
W12 14.64 43.64 70.98 27.23
W3 10.65 48.82 52.30 26.34
W1 4.49 36.43 59.87 24.61
W8 15.68 57.89 69.55 24.50
W4 4.01 40.70 66.96 22.18
W2 16.44 90.05 56.19 18.92
W10 11.79 90.01 44.67 17.87
W7 6.21 54.16 83.45 17.67
W11 9.46 91.96 41.85 16.41
W9 5.16 79.46 84.76 10.52

1.6.1 Visualisasi Output: Prioritas Wilayah

contoh_wilayah |>
  dplyr::slice_head(n = 8) |>
  ggplot2::ggplot(ggplot2::aes(x = reorder(wilayah, skor_prioritas), y = skor_prioritas)) +
  ggplot2::geom_col(fill = "#145B8C") +
  ggplot2::coord_flip() +
  ggplot2::labs(
    title = "Skor prioritas delapan wilayah teratas — data simulasi",
    subtitle = "Skor merupakan alat screening; bobot tetap harus diuji sensitivitasnya",
    x = NULL, y = "Skor prioritas"
  )

Contoh ini menunjukkan bahwa definisi indeks adalah keputusan normatif-analitik. Bobot 0,60; 0,25; dan 0,15 bukan “ditemukan” oleh R. Bobot harus dibenarkan dengan teori, proses kebijakan, atau analisis sensitivitas.

1.7 Contoh dengan Data Nyata

INDO-DAPOER menyediakan indikator provinsi dan kabupaten/kota Indonesia dalam kelompok fiskal, ekonomi, sosial-demografi, dan infrastruktur, dengan cakupan historis 1976-2018. Unit observasi praktisnya adalah wilayah-tahun-indikator. Sumber aslinya antara lain BPS dan kementerian/lembaga Indonesia. Lisensinya CC BY 4.0. Kelebihannya adalah keluasan indikator dan format panel; keterbatasan utamanya adalah data tidak mutakhir dan konsistensi definisi perlu diperiksa antarperiode. (World Bank 2026)

Kartu dataset real.

  • Nama: Indonesia Database for Policy and Economic Research (INDO-DAPOER).
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: 1976–2018 (cakupan keseluruhan; ketersediaan aktual berbeda per indikator).
  • Unit observasi: provinsi/kabupaten/kota–tahun–indikator.
  • Variabel yang digunakan: kode/nama wilayah; tahun; kode indikator; nilai indikator. Contoh: SI.POV.NAPR.ZS = poverty rate (% penduduk), IDX.HDI = Human Development Index, SP.POP.TOTL = total population.
  • Alasan digunakan: panel subnasional lintas-sektor cocok untuk melatih problem framing, integrasi indikator, dan analisis disparitas.
  • Keterbatasan: bukan data terkini; missingness dan cakupan indikator tidak seragam; perubahan definisi/kode wilayah harus diaudit. (World Bank 2026)

1.8 Analisis Menggunakan R

# Jika INDO-DAPOER sudah diunduh, gunakan data resmi; bila belum, tampilkan
# struktur indikator dari data simulasi agar e-book tetap dapat diknit offline.
if (dir.exists("data/raw/indodapoer") && length(list.files("data/raw/indodapoer")) > 0) {
  source("R/03_prepare_indodapoer.R")
  indo <- load_indodapoer()
  out <- indo |>
    dplyr::distinct(kode_indikator, indikator) |>
    dplyr::filter(stringr::str_detect(indikator, stringr::regex("poverty|unemploy|development|GDP", ignore_case = TRUE))) |>
    dplyr::arrange(indikator) |>
    head(15)
} else {
  out <- tibble::tribble(
    ~kode_indikator, ~indikator,
    "SIM.POV", "Kemiskinan (%) — simulasi",
    "SIM.TPT", "Tingkat pengangguran terbuka (%) — simulasi",
    "SIM.HDI", "Indeks pembangunan manusia — simulasi",
    "SIM.GDPPC", "PDRB per kapita (juta) — simulasi"
  )
}
knitr::kable(out, caption = "Output: daftar indikator yang relevan dengan problem framing")
Table 1.3: Output: daftar indikator yang relevan dengan problem framing
kode_indikator indikator
SIM.POV Kemiskinan (%) — simulasi
SIM.TPT Tingkat pengangguran terbuka (%) — simulasi
SIM.HDI Indeks pembangunan manusia — simulasi
SIM.GDPPC PDRB per kapita (juta) — simulasi

Langkah pertama bukan langsung memodelkan, tetapi membaca metadata dan mengecek apakah indikator benar-benar merepresentasikan konsep yang sedang dibahas.

1.9 Interpretasi dalam Konteks Regional

Jika suatu wilayah memiliki kemiskinan tinggi tetapi akses internet dan layanan dasar juga rendah, masalahnya dapat mengarah pada multiple deprivation. Sebaliknya, pengangguran tinggi di kota dengan PDRB tinggi dapat menunjukkan mismatch tenaga kerja, struktur industri, atau tekanan urbanisasi. Rekomendasi kebijakan harus mengikuti pola substantif ini, bukan sekadar ranking algoritmik.

1.10 Latihan

  1. Jelaskan perbedaan pertanyaan deskriptif dan prediktif untuk masalah pengangguran.
  2. Mengapa unit “kabupaten” dan “kabupaten-tahun” menghasilkan struktur analisis berbeda?
  3. Berikan contoh korelasi yang tidak boleh langsung dibaca sebagai hubungan kausal.
  4. Analisis data: gunakan simulasi_panel_regional.csv untuk memilih lima wilayah yang tampak paling tertinggal pada 2025 berdasarkan minimal tiga indikator.
  5. Analisis data: lakukan analisis sensitivitas dengan dua skema bobot indeks prioritas.
  6. Mini-case: Bappeda meminta “model AI untuk menentukan desa prioritas”. Susun lima pertanyaan klarifikasi sebelum Anda menulis satu baris kode pun.

1.10.1 Tugas Terstruktur Pertemuan 1

Studio problem framing (formatif menuju M1). Pilih satu dari sepuluh contoh capstone atau usulkan tema lain. Buat 1 halaman yang memuat: masalah publik; stakeholder; decision question; unit analisis; outcome; minimal 5 kandidat indikator; horizon waktu; risiko salah keputusan; serta satu kalimat yang menjelaskan mengapa analisis tersebut bukan sekadar membuat dashboard.

Rubrik (100): problem significance 20; analytical question 20; unit/outcome clarity 15; data plausibility 15; decision relevance 20; caveat/ethics 10.

1.10.2 Kuis Formatif Pertemuan 1

  1. Apa perbedaan prediction target dan policy target?
  2. Mengapa korelasi yang kuat tidak cukup untuk rekomendasi intervensi?
  3. Jika cost false negative lima kali false positive, apa konsekuensi terhadap threshold?
  4. Mengapa bobot indeks prioritas perlu sensitivity analysis?
  5. Tulis satu contoh unit analisis yang salah untuk pertanyaan “perubahan pengangguran kabupaten 2015–2024”, lalu perbaiki.

1.11 Hubungan dengan Capstone Project

Milestone awal: pilih satu masalah regional, tentukan stakeholder, unit analisis, outcome/indikator utama, dan keputusan yang hendak didukung. Hasilnya berupa one-page problem brief.

1.12 Kesimpulan

Sains data regional adalah disiplin pengambilan keputusan berbasis bukti. Algoritma penting, tetapi kualitas formulasi masalah, definisi indikator, data provenance, dan interpretasi kebijakan menentukan apakah analisis benar-benar berguna.

1.13 Pendalaman Magister — Problem framing dan decision science

1.13.1 Audit metodologis

  1. Outcome terlalu jauh dari keputusan aktual.
  2. Unit administrasi dipakai tanpa alasan.
  3. Indikator normatif dicampur dengan fitur prediktif.
  4. Ranking diperlakukan sebagai kebenaran absolut.
  5. Stakeholder tidak menentukan false-positive/false-negative cost.
  6. Model dipilih sebelum masalah dirumuskan.

1.13.2 Pertanyaan viva / diskusi kelas

  1. Apa baseline keputusan tanpa model?
  2. Klaim apa yang hanya deskriptif dan mana yang prediktif?
  3. Bagaimana bobot indeks dipertanggungjawabkan?
  4. Siapa yang menanggung kerugian jika ranking salah?
  5. Bagaimana menguji stabilitas ranking?
  6. Apa bukti bahwa outcome relevan dengan horizon kebijakan?

2 Ekosistem Data, Open Data, dan Data Provenance

2.1 Pendahuluan

Analisis regional sering gagal bukan karena model, melainkan karena data berasal dari sistem yang berbeda: kode wilayah berubah, definisi indikator tidak identik, periode pencatatan tidak sinkron, dan angka proyeksi diperlakukan seperti hasil observasi. Bab ini menempatkan provenance dan metadata sebagai bagian dari metode ilmiah, bukan urusan administratif.

2.2 Tujuan Pembelajaran

Mahasiswa mampu memetakan ekosistem data regional, mengevaluasi kualitas sumber, membuat data inventory, membedakan data primer/sekunder/administratif/open data, dan menyusun dokumentasi dataset (datasheet).

2.3 Definisi dan Konsep

Data provenance adalah jejak asal-usul data: siapa produsen data, bagaimana data dikumpulkan, kapan diperbarui, transformasi apa yang dilakukan, dan lisensi apa yang berlaku. Datasheets for datasets membantu mendokumentasikan motivasi, komposisi, proses pengumpulan, preprocessing, penggunaan yang direkomendasikan, serta keterbatasan. (Gebru dkk. 2021)

Dalam analisis regional, cek minimal: unit geografis, kode wilayah, frekuensi waktu, definisi denominator, perubahan metodologi, status angka sementara/final, missingness, dan revision policy. “Jumlah penduduk miskin” tidak sama dengan “persentase penduduk miskin”; perbandingan antarkabupaten membutuhkan denominator.

2.4 Formulasi Matematis

Untuk indikator berbasis rasio,

ri=aibi×c, r_i=\frac{a_i}{b_i}\times c,

di mana aia_i adalah pembilang, bib_i denominator, dan cc konstanta skala (misalnya 100 untuk persen atau 1.000 untuk per seribu). Membandingkan aia_i tanpa mempertimbangkan bib_i dapat menimbulkan size bias.

Missingness dapat diringkas sebagai

mj=1ni=1nI(xijmissing), m_j=\frac{1}{n}\sum_{i=1}^n I(x_{ij}\;\text{missing}),

dengan I()I(\cdot) fungsi indikator. Nilai mjm_j adalah proporsi missing untuk variabel jj.

2.4.1 Struktur indikator: count, rate, proportion, index, dan stock–flow

Mahasiswa harus membedakan tipe indikator karena operasi matematis yang sah berbeda. Count adalah jumlah kejadian/unit, rate menghubungkan kejadian dengan populasi berisiko dan periode waktu, proportion adalah bagian dari keseluruhan, sedangkan index biasanya merupakan transformasi beberapa komponen.

Proporsi: pi=aini,0pi1. p_i=\frac{a_i}{n_i},\qquad 0\le p_i\le 1.

Rate per kk penduduk: ri=aini×k. r_i=\frac{a_i}{n_i}\times k.

Perubahan absolut dan relatif: Δxt=xtxt1,gt=xtxt1xt1×100%.\Delta x_t=x_t-x_{t-1},\qquad g_t=\frac{x_t-x_{t-1}}{x_{t-1}}\times100\%.

Jika interval lebih dari satu tahun, compound annual growth rate (CAGR) adalah CAGR=(xTx0)1/T1. \operatorname{CAGR}=\left(\frac{x_T}{x_0}\right)^{1/T}-1.

Stock diukur pada titik waktu (misalnya jumlah penduduk pada pertengahan tahun), sedangkan flow diakumulasi selama periode (misalnya investasi selama tahun). Menjumlahkan atau membagi stock dan flow tanpa memperhatikan waktu dapat menghasilkan indikator yang menyesatkan.

2.4.2 Kelengkapan, duplikasi, dan konsistensi

Untuk variabel jj, completeness dapat diringkas sebagai

Cj=1mj=11ni=1nI(xij missing). C_j=1-m_j=1-\frac{1}{n}\sum_{i=1}^n I(x_{ij}\text{ missing}).

Jika kunci yang diharapkan unik adalah kombinasi wilayah–tahun, tingkat duplikasi dapat ditulis

D=nnunikn. D=\frac{n-n_{\text{unik}}}{n}.

Ketika dua sumber digabungkan dengan kunci KK, match rate adalah

M=nmatchedntarget. M=\frac{n_{\text{matched}}}{n_{\text{target}}}.

Nilai M<1M<1 bukan sekadar masalah teknis. Penyebabnya dapat berupa perubahan kode wilayah, pemekaran, perbedaan kapitalisasi nama, atau cakupan unit yang tidak sama. Join harus didiagnosis sebelum baris tak cocok dihapus.

2.4.3 Mekanisme missing data

Gunakan Rij=1R_{ij}=1 bila XijX_{ij} teramati dan 00 bila hilang. Secara konseptual:

  • MCAR: P(RXobs,Xmis)=P(R)P(R\mid X_{obs},X_{mis})=P(R);
  • MAR: P(RXobs,Xmis)=P(RXobs)P(R\mid X_{obs},X_{mis})=P(R\mid X_{obs});
  • MNAR: probabilitas missing tetap bergantung pada nilai yang tidak teramati.

Klasifikasi ini penting karena complete-case analysis dapat bias ketika missing terkait dengan karakteristik wilayah. Wilayah dengan kapasitas pelaporan rendah, misalnya, mungkin memiliki missingness lebih tinggi. (Little dan Rubin 2019)

Imputasi mean sederhana xijimp=xj x_{ij}^{imp}=\bar x_j mempertahankan rata-rata tetapi cenderung mengecilkan varians dan merusak hubungan antarvariabel. Untuk analisis serius, pertimbangkan multiple imputation atau model yang secara eksplisit menangani missingness, disertai sensitivity analysis. (Little dan Rubin 2019)

2.4.4 Harmonisasi lintas waktu dan wilayah

Jika batas wilayah berubah, indikator historis mungkin harus dikonversi ke constant geography. Secara abstrak, jika 𝐱old\mathbf{x}^{old} adalah nilai pada unit lama dan 𝐀\mathbf{A} matriks alokasi dari unit lama ke unit baru, maka

𝐱new=𝐀𝐱old. \mathbf{x}^{new}=\mathbf{A}\mathbf{x}^{old}.

Elemen akja_{kj} menyatakan proporsi unit lama jj yang dialokasikan ke unit baru kk. Untuk count, bobot dapat berbasis populasi/area sesuai konsep; untuk rate, jangan langsung mengalikan tanpa merekonstruksi numerator dan denominator jika memungkinkan.

2.4.5 Provenance sebagai objek yang dapat diaudit

Untuk setiap dataset, simpan minimal tuple 𝒫=(producer,URL,access date,version,license,unit,period,transformation). \mathcal{P}=(\text{producer},\text{URL},\text{access date},\text{version},\text{license},\text{unit},\text{period},\text{transformation}).

Prinsip ini konsisten dengan datasheets for datasets: dokumentasi harus menjelaskan motivasi, komposisi, proses pengumpulan, preprocessing, penggunaan yang direkomendasikan, dan keterbatasan. (Gebru dkk. 2021)

2.5 Intuisi Metode

Data berkualitas tidak selalu berarti “tanpa missing”. Yang lebih penting adalah mengetahui mengapa missing terjadi. Wilayah terpencil mungkin lebih sering tidak melaporkan data; jika demikian, menghapus baris missing dapat secara sistematis menghilangkan wilayah yang justru paling membutuhkan kebijakan.

2.5.1 Worked Example — denominator mengubah cerita

Dua wilayah melaporkan 5.000 dan 3.000 penganggur. Tanpa denominator, wilayah pertama tampak lebih buruk. Jika angkatan kerja masing-masing 100.000 dan 40.000: TPTA=5,000100,000×100=5%, TPT_A=\frac{5{,}000}{100{,}000}\times100=5\%, TPTB=3,00040,000×100=7.5%. TPT_B=\frac{3{,}000}{40{,}000}\times100=7.5\%. Maka cerita berubah. Untuk kebijakan tenaga kerja, count berguna untuk memperkirakan volume layanan; rate berguna untuk membandingkan tingkat masalah. Keduanya dapat diperlukan, tetapi menjawab pertanyaan berbeda.

2.5.2 Worked Example — weighted rate tidak sama dengan mean rate

Misalkan rate tiga kabupaten adalah 4%, 8%, 12% dengan angkatan kerja 1 juta, 100 ribu, dan 50 ribu. Mean sederhana adalah 8%. Weighted rate: rw=0.04(1,000,000)+0.08(100,000)+0.12(50,000)1,150,000=4.70%. \bar r_w=\frac{0.04(1{,}000{,}000)+0.08(100{,}000)+0.12(50{,}000)}{1{,}150{,}000}=4.70\%. Perbedaan besar terjadi karena ukuran denominator tidak sama. Agregasi rate tingkat provinsi sebaiknya direkonstruksi dari numerator/denominator yang sesuai jika tersedia, bukan selalu mean kabupaten.

2.5.3 Missingness sebagai informasi substantif

Bayangkan missing rate pelaporan fasilitas kesehatan adalah 5% di perkotaan dan 35% di daerah terpencil. Jika seluruh baris missing dihapus, dataset analitik menjadi lebih “urban” daripada populasi target. Untuk mendiagnosis, modelkan indikator missing: P(Ri=1Xi)=logit1(γ0+γ1Remotei+γ2Capacityi). P(R_i=1\mid X_i)=\operatorname{logit}^{-1}(\gamma_0+\gamma_1Remote_i+\gamma_2Capacity_i). Tujuannya bukan selalu mengestimasi mekanisme missing secara formal, tetapi melihat apakah missingness berpola. (Little dan Rubin 2019)

2.5.4 Data provenance table yang wajib ada pada capstone

provenance <- tibble::tribble(
  ~dataset, ~producer, ~period, ~unit, ~status, ~access_date,
  "TPT", "BPS / Open Data Jabar", "2007-2024", "kab/kota-tahun", "published", "2026-08-07",
  "UMKM", "Dinas KUK / Open Data Jabar", "2016-2023", "kab/kota-tahun", "projection", "2026-08-07",
  "INDO-DAPOER", "World Bank", "1976-2018", "subnational-year", "historical", "2026-08-07"
)
knitr::kable(provenance, caption = "Contoh minimum provenance register")
Table 2.1: Contoh minimum provenance register
dataset producer period unit status access_date
TPT BPS / Open Data Jabar 2007-2024 kab/kota-tahun published 2026-08-07
UMKM Dinas KUK / Open Data Jabar 2016-2023 kab/kota-tahun projection 2026-08-07
INDO-DAPOER World Bank 1976-2018 subnational-year historical 2026-08-07

2.5.5 Checklist validasi sumber

Sebelum data dimodelkan, jawab ya/tidak:

  1. Producer resmi dapat diidentifikasi?
  2. Definisi indikator tertulis?
  3. Unit/satuan jelas?
  4. Periodisitas jelas?
  5. Angka final/sementara/proyeksi diketahui?
  6. Kode wilayah dan versi nomenklatur diketahui?
  7. Lisensi/ketentuan penggunaan diperiksa?
  8. Perubahan metodologi dicari?
  9. Tanggal akses dicatat?
  10. URL landing page disimpan selain direct-download URL?

Jika beberapa jawaban “tidak”, masalah tersebut harus masuk limitation dan dapat mengubah metode. Sumber data yang kredibel tidak berarti setiap field otomatis siap dipakai.

2.6 Contoh dengan Data Simulasi

set.seed(260802)
dq <- tibble(
  wilayah = sprintf("W%02d", 1:40),
  populasi = round(runif(40, 100000, 3000000)),
  kasus = rpois(40, lambda = 200),
  akses_data = runif(40)
) |>
  mutate(
    kasus = if_else(akses_data < .12, NA_integer_, kasus),
    rate_per_100k = kasus/populasi*100000
  )

dq |>
  summarise(n = n(), missing_kasus = mean(is.na(kasus)), median_rate = median(rate_per_100k, na.rm = TRUE)) |>
  knitr::kable(digits = 3, caption = "Audit kualitas data sederhana")
Table 2.2: Audit kualitas data sederhana
n missing_kasus median_rate
40 0.125 12.573

2.6.1 Visualisasi Output: Pola Missingness

tibble::tibble(
  status = ifelse(is.na(dq$kasus), "Missing", "Tersedia")
) |>
  dplyr::count(status) |>
  ggplot2::ggplot(ggplot2::aes(status, n, fill = status)) +
  ggplot2::geom_col(show.legend = FALSE) +
  ggplot2::scale_fill_manual(values = c("Missing" = "#C99A17", "Tersedia" = "#145B8C")) +
  ggplot2::labs(title = "Ketersediaan data kasus — simulasi", x = NULL, y = "Jumlah observasi")

2.7 Contoh dengan Data Nyata

Open Data Jawa Barat menyediakan dataset mentah dari perangkat daerah dan BPS, dengan pilihan CSV/Excel/API. Contoh yang relevan adalah TPT kabupaten/kota 2007-2024, jumlah penduduk miskin 2002-2025, dan proyeksi UMKM 2016-2023. Perhatikan bahwa dataset UMKM secara eksplisit berstatus proyeksi, sehingga tidak boleh ditafsirkan identik dengan sensus usaha aktual. (Pemerintah Provinsi Jawa Barat 2026b)

Kartu dataset real.

2.8 Analisis Menggunakan R

katalog <- read_csv("data/katalog_data_real.csv", show_col_types = FALSE)
knitr::kable(katalog[, c("dataset","sumber","cakupan_tahun","unit_observasi")],
             caption = "Katalog sumber data nyata untuk mata kuliah")
Table 2.3: Katalog sumber data nyata untuk mata kuliah
dataset sumber cakupan_tahun unit_observasi
Tingkat Pengangguran Terbuka berdasarkan Kabupaten/Kota di Jawa Barat Open Data Jawa Barat / BPS 2007-2024 Kabupaten/kota-tahun
Jumlah Penduduk Miskin berdasarkan Kabupaten/Kota di Jawa Barat Open Data Jawa Barat / BPS 2002-2025 Kabupaten/kota-tahun
Proyeksi Jumlah UMKM berdasarkan Kabupaten/Kota di Jawa Barat Open Data Jawa Barat / Dinas Koperasi dan Usaha Kecil 2016-2023 Kabupaten/kota-tahun
Jumlah Penduduk berdasarkan Kabupaten/Kota di Jawa Barat Open Data Jawa Barat / BPS 2010-2025 Kabupaten/kota-tahun
Indonesia Database for Policy and Economic Research (INDO-DAPOER) World Bank Data Catalog; sumber indikator terutama BPS dan kementerian/lembaga Indonesia 1976-2018 Provinsi/kabupaten/kota-tahun-indikator
World Bank Official Boundaries World Bank Data Catalog diperbarui berkala Geometri admin 0/1/2
if (dir.exists("data/raw/indodapoer") && length(list.files("data/raw/indodapoer")) > 0) {
  source("R/03_prepare_indodapoer.R")
  indo <- load_indodapoer()
  quality <- indo |>
    dplyr::group_by(kode_indikator, indikator) |>
    dplyr::summarise(
      prop_missing = mean(is.na(nilai)),
      tahun_min = min(tahun[!is.na(nilai)], na.rm = TRUE),
      tahun_max = max(tahun[!is.na(nilai)], na.rm = TRUE),
      .groups = "drop"
    ) |>
    dplyr::arrange(prop_missing) |>
    head(20)
} else {
  demo <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)
  quality <- tibble::tibble(
    variabel = names(demo),
    prop_missing = purrr::map_dbl(demo, ~mean(is.na(.x))),
    kelas = purrr::map_chr(demo, ~class(.x)[1])
  )
}
knitr::kable(quality, digits = 3, caption = "Output: audit kelengkapan dan struktur data")
Table 2.4: Output: audit kelengkapan dan struktur data
variabel prop_missing kelas
wilayah 0 character
tahun 0 numeric
urban 0 numeric
longitude 0 numeric
latitude 0 numeric
pdrb_perkapita_juta 0 numeric
kemiskinan_persen 0 numeric
tpt_persen 0 numeric
ipm 0 numeric
internet_persen 0 numeric
umkm_per_1000 0 numeric
indeks_pendidikan 0 numeric
akses_kesehatan 0 numeric
indeks_inovasi 0 numeric

2.9 Interpretasi dalam Konteks Regional

Audit metadata dapat mengubah keputusan analitik. Jika data pengangguran tersedia tahunan tetapi indikator inovasi hanya tersedia pada tahun tertentu, memaksakan model panel tahunan dapat menghasilkan banyak imputasi dan asumsi. Pilihan yang lebih defensible mungkin mengubah unit waktu atau membatasi pertanyaan pada cross-section tertentu.

2.10 Latihan

  1. Apa perbedaan data provenance dan data quality?
  2. Mengapa angka proyeksi harus diberi label eksplisit dalam dashboard?
  3. Sebutkan tiga risiko ketika kode wilayah berubah karena pemekaran.
  4. Analisis: buat data inventory dari minimal tiga dataset Open Data Jabar.
  5. Analisis: hitung persentase missing per variabel pada data simulasi setelah sengaja menambahkan missing 10%.
  6. Mini-case: dua dinas melaporkan angka UMKM berbeda. Susun prosedur rekonsiliasi sebelum memilih salah satu sumber.

2.10.1 Tugas Terstruktur Pertemuan 2

Buat data dossier untuk tiga sumber data calon capstone. Setiap sumber harus memuat producer, URL, access date, periode, unit observasi, definisi variabel, status angka (final/sementara/proyeksi), lisensi, update frequency, missingness yang terlihat, dan risiko integrasi. Pilih satu sumber yang tidak jadi digunakan dan jelaskan alasan penolakannya.

2.10.2 Kuis Formatif Pertemuan 2

  1. Bedakan count, rate, proportion, dan index.
  2. Mengapa jumlah penganggur tidak dapat selalu diperoleh dari TPT × total penduduk?
  3. Apa perbedaan MCAR, MAR, dan MNAR?
  4. Apa yang harus dilakukan bila kode kabupaten berbeda antardataset?
  5. Mengapa angka proyeksi harus diberi label eksplisit?

2.11 Hubungan dengan Capstone Project

Milestone 2 dimulai di sini: mahasiswa menyiapkan data dossier berisi sumber, URL, tanggal akses, definisi variabel, periode, unit observasi, lisensi, dan keterbatasan.

2.12 Kesimpulan

Model yang canggih tidak dapat memperbaiki provenance yang tidak jelas. Metadata, denominator, definisi indikator, dan perubahan metodologi adalah bagian inti dari validitas analisis regional.

2.13 Pendalaman Magister — Data governance, provenance, dan measurement

2.13.1 Audit metodologis

  1. Denominator tidak sesuai definisi indikator.
  2. Seri historis digabung tanpa cek perubahan metodologi.
  3. Proyeksi dianggap observasi aktual.
  4. Missingness sistematis diabaikan.
  5. Kode wilayah beda versi.
  6. Lisensi dan tanggal akses tidak dicatat.

2.13.2 Pertanyaan viva / diskusi kelas

  1. Apa unit pengukuran vs unit observasi?
  2. Mengapa rate tidak boleh dirata-ratakan sembarang?
  3. Bagaimana mendeteksi missingness yang berpola?
  4. Apa tindakan bila kode wilayah berubah?
  5. Bagaimana membedakan revision data dan data error?
  6. Mengapa provenance bagian metode ilmiah?

3 Data Wrangling, Data Quality, dan Feature Construction

3.1 Pendahuluan

Data kebijakan hampir selalu memerlukan penataan: nama wilayah tidak konsisten, angka tersimpan sebagai teks, struktur wide/long bercampur, dan indikator harus dinormalisasi. Bab ini memperlakukan data wrangling sebagai proses analitik yang terdokumentasi.

3.2 Tujuan Pembelajaran

Mahasiswa mampu melakukan import, tipe data, reshape, join, deduplikasi, penanganan missing, deteksi outlier, serta konstruksi indikator yang sesuai unit dan denominator.

3.3 Definisi dan Konsep

Data tidy memiliki satu variabel per kolom, satu observasi per baris, dan satu jenis unit observasi per tabel. (Wickham, Çetinkaya-Rundel, dan Grolemund 2023) Kunci join harus mencerminkan identitas observasi; untuk panel kabupaten/kota biasanya kombinasi kode_wilayah + tahun, bukan hanya nama wilayah.

Feature construction harus mempunyai makna substantif. UMKM per 1.000 penduduk sering lebih dapat dibandingkan antardaerah daripada jumlah UMKM mentah. Transformasi log dapat mengurangi skewness pada nilai ekonomi yang sangat lebar, tetapi interpretasinya berubah.

3.4 Formulasi Matematis

Standardisasi z-score:

zij=xijxjsj, z_{ij}=\frac{x_{ij}-\bar x_j}{s_j},

dengan xj\bar x_j mean dan sjs_j simpangan baku variabel jj. Transformasi log yang sering digunakan:

x*=log(1+x), x^{*}=\log(1+x),

terutama bila x0x\ge0 dan distribusi sangat skewed. Penambahan 1 mencegah masalah log(0)\log(0), tetapi harus dinyatakan secara eksplisit.

3.4.1 Prinsip tidy data dan transformasi yang dapat dilacak

Dalam tidy data, setiap variabel berada pada kolom, setiap observasi pada baris, dan setiap jenis unit observasi pada tabel tersendiri. Struktur ini mengurangi ambiguitas saat agregasi dan pemodelan. (Wickham 2014; Wickham, Çetinkaya-Rundel, dan Grolemund 2023)

Jika xix_i adalah nilai mentah, transformasi log sering dipakai untuk distribusi sangat menceng: xi*=log(xi+c), x_i^{*}=\log(x_i+c), dengan c>0c>0 ketika nol mungkin muncul. Perubahan unit harus dinyatakan: koefisien pada skala log tidak identik dengan koefisien skala asli.

3.4.2 Standardisasi dan robust scaling

Z-score: zi=xixs. z_i=\frac{x_i-\bar x}{s}.

Robust z-score berbasis median dan MAD: zirob=ximedian(x)1.4826MAD(x), z_i^{rob}=\frac{x_i-\operatorname{median}(x)}{1.4826\operatorname{MAD}(x)},

di mana MAD(x)=mediani{|ximedian(x)|}. \operatorname{MAD}(x)=\operatorname{median}_i\{|x_i-\operatorname{median}(x)|\}.

Konstanta 1,4826 membuat MAD mendekati simpangan baku untuk data normal. Robust scaling berguna ketika terdapat outlier yang valid secara substantif—misalnya kota metropolitan memang ekstrem dibanding kabupaten rural—dan kita tidak ingin ekstrem tersebut otomatis dianggap kesalahan.

3.4.3 Deteksi outlier: rule bukan vonis

IQR: IQR=Q0.75Q0.25. \operatorname{IQR}=Q_{0.75}-Q_{0.25}.

Aturan boxplot menandai observasi potensial di luar [Q0.251.5IQR,Q0.75+1.5IQR]. [Q_{0.25}-1.5\operatorname{IQR},\;Q_{0.75}+1.5\operatorname{IQR}].

Outlier tidak boleh langsung dihapus. Klasifikasikan: (a) data entry error, (b) definisi unit berbeda, (c) kejadian ekstrem nyata, atau (d) perubahan metodologi. Dalam data regional, ekstrem yang nyata sering justru menjadi objek analisis.

3.4.4 Feature engineering untuk regional analytics

Beberapa fitur yang sering lebih bermakna daripada count mentah:

Per kapita xipc=xiNi×k. x_i^{pc}=\frac{x_i}{N_i}\times k.

Density di=NiAi, d_i=\frac{N_i}{A_i}, dengan AiA_i luas wilayah.

Share sik=xikkxik. s_{ik}=\frac{x_{ik}}{\sum_k x_{ik}}.

Lag temporal xi,t1=L(xit). x_{i,t-1}=L(x_{it}).

Growth git=xitxi,t1xi,t1. g_{it}=\frac{x_{it}-x_{i,t-1}}{x_{i,t-1}}.

Difference Δxit=xitxi,t1. \Delta x_{it}=x_{it}-x_{i,t-1}.

Location quotient (LQ) untuk konsentrasi sektor kk di wilayah ii: LQik=xik/kxikixik/ikxik. LQ_{ik}=\frac{x_{ik}/\sum_k x_{ik}}{\sum_i x_{ik}/\sum_i\sum_k x_{ik}}. LQ>1LQ>1 menunjukkan konsentrasi relatif di atas rata-rata wilayah pembanding. Interpretasi bergantung pada definisi variabel—tenaga kerja, output, atau unit usaha.

3.4.5 Transformasi sebelum split dapat menyebabkan leakage

Jika parameter preprocessing (mean, SD, imputation value, PCA loading) dihitung dari seluruh data sebelum train/test split, informasi test set bocor ke proses training. Secara benar, parameter transformasi θ̂\widehat\theta harus dihitung hanya dari training: θ̂=g(𝒟train),X̃test=T(Xtest;θ̂). \widehat\theta=g(\mathcal{D}_{train}),\qquad \widetilde X_{test}=T(X_{test};\widehat\theta).

Framework recipes pada tidymodels membantu menerapkan prinsip ini secara sistematis. (Kuhn dan Silge 2022)

3.5 Intuisi Metode

Jika Kabupaten A memiliki 200 ribu UMKM dan Kabupaten B 80 ribu UMKM, belum tentu A lebih “entrepreneurial”. Setelah dibagi populasi usia kerja, ranking dapat berubah. Feature engineering yang baik mengubah data menjadi ukuran yang lebih dekat dengan konsep kebijakan.

3.5.1 Worked Example — growth dan division by zero

Jika UMKM suatu wilayah meningkat dari 10.000 menjadi 11.500 unit, g=11,50010,00010,000=0.15=15%. g=\frac{11{,}500-10{,}000}{10{,}000}=0.15=15\%. Jika baseline xt1=0x_{t-1}=0, growth rate tidak terdefinisi. Jangan mengganti denominator nol dengan angka kecil tanpa justifikasi karena dapat menciptakan pertumbuhan ekstrem artifisial. Gunakan perubahan absolut atau definisi alternatif.

3.5.2 Worked Example — Location Quotient

Wilayah A memiliki 20.000 pekerja manufaktur dari total 100.000 pekerja; provinsi memiliki 300.000 pekerja manufaktur dari 3.000.000 pekerja. LQA=20,000/100,000300,000/3,000,000=0.200.10=2. LQ_A=\frac{20{,}000/100{,}000}{300{,}000/3{,}000{,}000}=\frac{0.20}{0.10}=2. Artinya konsentrasi tenaga kerja manufaktur dua kali share provinsi. Bukan berarti produktivitas dua kali lebih tinggi, dan bukan bukti sektor tersebut “lebih baik”.

3.5.3 Join audit

Jika tabel A memiliki 27 kabupaten/kota × 10 tahun = 270 key dan tabel B setelah join hanya match 258 key: M=258/270=95.56%. M=258/270=95.56\%. 12 key yang tidak match harus diperiksa. Contoh R:

a <- tibble(wilayah=c("A","B","C"), tahun=2024, x=1:3)
b <- tibble(wilayah=c("A","B","D"), tahun=2024, y=11:13)
anti_join(a,b,by=c("wilayah","tahun"))
#> # A tibble: 1 × 3
#>   wilayah tahun     x
#>   <chr>   <dbl> <int>
#> 1 C        2024     3
anti_join(b,a,by=c("wilayah","tahun"))
#> # A tibble: 1 × 3
#>   wilayah tahun     y
#>   <chr>   <dbl> <int>
#> 1 D        2024    13

anti_join() sering lebih penting daripada left_join() karena mengungkap observasi yang hilang akibat perbedaan key.

3.5.4 Outlier decision log

Gunakan kategori keputusan berikut:

Temuan Diagnosis Tindakan
nilai negatif pada jumlah penduduk impossible cek source/parse; jangan imputasi diam-diam
PDRB per kapita sangat tinggi plausible structural extreme pertahankan; pertimbangkan log/robust scaling
TPT 850 kemungkinan decimal/unit error cek metadata/satuan
lon/lat di luar Indonesia coordinate error koreksi dari sumber atau exclude terdocumentasi

3.5.5 Leakage-safe recipe

set.seed(260813)
dat <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  dplyr::filter(tahun == 2025) |>
  dplyr::select(kemiskinan_persen, pdrb_perkapita_juta, internet_persen, tpt_persen, ipm)
split <- initial_split(dat, prop = .8, strata = kemiskinan_persen)
train <- training(split); test <- testing(split)
rec <- recipe(kemiskinan_persen ~ ., data = train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())
prep_rec <- prep(rec, training = train)
train_baked <- bake(prep_rec, new_data = NULL)
test_baked  <- bake(prep_rec, new_data = test)
knitr::kable(head(train_baked, 6), digits = 3, caption = "Output: data training setelah preprocessing leakage-safe")
Table 3.1: Output: data training setelah preprocessing leakage-safe
pdrb_perkapita_juta internet_persen tpt_persen ipm kemiskinan_persen
-1.476 -0.628 -0.719 -0.328 9.992
0.459 0.524 1.979 0.718 6.006
0.643 0.396 -0.477 -0.561 8.570
-0.070 0.398 0.303 0.000 10.076
-0.391 0.275 -0.596 -0.468 11.637
-0.546 -1.018 -0.758 -0.899 8.979

Mean/median dan SD dipelajari dari training. Inilah alasan workflow modeling sebaiknya menyatukan preprocessing dan model. (Kuhn dan Silge 2022)

3.5.6 Checklist feature engineering

Setiap fitur baru harus memiliki: formula; denominator; unit; temporal alignment; rationale; potential leakage; dan interpretasi. Fitur growth_2024 tidak boleh digunakan untuk memprediksi outcome 2023; fitur “jumlah penerima program” dapat menjadi post-treatment variable bila digunakan untuk menjelaskan outcome setelah program.

3.6 Contoh dengan Data Simulasi

set.seed(260803)
raw <- tibble(
  kab_kota = c("Kab. A", "kab a ", "KOTA B", "Kota C"),
  tahun = c("2024", "2024", "2024", "2024"),
  penduduk = c("1,200,000", "1,200,000", "850,000", NA),
  umkm = c(85000, 85000, 62000, 21000)
)

clean <- raw |>
  clean_names() |>
  mutate(
    kab_kota = str_to_title(str_squish(kab_kota)),
    tahun = as.integer(tahun),
    penduduk = parse_number(penduduk),
    umkm_per_1000 = umkm/penduduk*1000
  ) |>
  distinct(kab_kota, tahun, .keep_all = TRUE)
knitr::kable(clean, digits = 2, caption = "Contoh cleaning dan konstruksi rate")
Table 3.2: Contoh cleaning dan konstruksi rate
kab_kota tahun penduduk umkm umkm_per_1000
Kab. A 2024 1200000 85000 70.83
Kab A 2024 1200000 85000 70.83
Kota B 2024 850000 62000 72.94
Kota C 2024 NA 21000 NA

3.7 Contoh dengan Data Nyata

Dataset TPT Open Data Jawa Barat memuat kode provinsi, nama provinsi, kode kabupaten/kota, nama kabupaten/kota, TPT (%), satuan, dan tahun. Kode wilayah sebaiknya dijadikan kunci utama saat menggabungkannya dengan data penduduk atau kemiskinan. Periksa apakah standar kode wilayah konsisten antarversi dataset. (Pemerintah Provinsi Jawa Barat 2026b)

Kartu dataset real.

  • Nama: Tingkat Pengangguran Terbuka Berdasarkan Kabupaten/Kota di Jawa Barat.
  • Sumber dan URL: Open Data Jawa Barat; produsen BPS, https://opendata.jabarprov.go.id/id/dataset/tingkat-pengangguran-terbuka-berdasarkan-kabupatenkota-di-jawa-barat.
  • Tahun: 2007–2024; periode tahunan.
  • Unit observasi: kabupaten/kota–tahun.
  • Variabel/definisi: kode_provinsi, nama_provinsi, kode_kabupaten_kota, nama_kabupaten_kota, tingkat_pengangguran_terbuka = persentase TPT, satuan = persen, tahun.
  • Alasan digunakan: struktur long/panel sederhana ideal untuk latihan type conversion, key checking, join, dan harmonisasi data regional.
  • Keterbatasan: seri ini memberikan persentase, bukan jumlah penganggur; validasi kode wilayah diperlukan ketika digabung dengan dataset lain. (Pemerintah Provinsi Jawa Barat 2026b)

3.8 Analisis Menggunakan R

panel <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)

panel_2025 <- panel |>
  filter(tahun == 2025) |>
  mutate(
    pdrb_log = log1p(pdrb_perkapita_juta),
    kemiskinan_z = as.numeric(scale(kemiskinan_persen))
  )

panel_2025 |>
  select(wilayah, pdrb_perkapita_juta, pdrb_log, kemiskinan_persen, kemiskinan_z) |>
  head() |>
  knitr::kable(digits = 3)
wilayah pdrb_perkapita_juta pdrb_log kemiskinan_persen kemiskinan_z
Wilayah_01 31.612 3.485 9.992 0.061
Wilayah_02 65.249 4.193 7.681 -1.257
Wilayah_03 52.521 3.980 6.006 -2.212
Wilayah_04 54.513 4.017 8.570 -0.750
Wilayah_05 46.803 3.867 10.076 0.109
Wilayah_06 43.338 3.792 11.637 0.999

3.8.1 Visualisasi Output: Dampak Transformasi

panel_2025 |>
  ggplot2::ggplot(ggplot2::aes(pdrb_perkapita_juta, pdrb_log)) +
  ggplot2::geom_point(size = 2.2, colour = "#145B8C") +
  ggplot2::labs(
    title = "Transformasi log pada PDRB per kapita — simulasi",
    subtitle = "Transformasi mengompresi nilai besar dan dapat membantu stabilisasi skala",
    x = "PDRB per kapita (juta)", y = "log(1 + PDRB per kapita)"
  )

if (file.exists("data/raw/tpt_jabar.csv") && file.exists("data/raw/penduduk_jabar.csv")) {
  tpt <- readr::read_csv("data/raw/tpt_jabar.csv", show_col_types = FALSE) |> janitor::clean_names()
  penduduk <- readr::read_csv("data/raw/penduduk_jabar.csv", show_col_types = FALSE) |> janitor::clean_names()
  regional <- tpt |>
    dplyr::inner_join(penduduk, by = c("kode_kabupaten_kota", "tahun"), suffix = c("_tpt", "_pop"))
  out <- head(regional, 8)
} else {
  out <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
    dplyr::select(wilayah, tahun, tpt_persen, pdrb_perkapita_juta, kemiskinan_persen) |>
    head(8)
}
knitr::kable(out, digits = 2, caption = "Output: hasil integrasi data; gunakan data simulasi bila raw data resmi belum tersedia")
Table 3.3: Output: hasil integrasi data; gunakan data simulasi bila raw data resmi belum tersedia
wilayah tahun tpt_persen pdrb_perkapita_juta kemiskinan_persen
Wilayah_01 2019 7.01 17.25 17.55
Wilayah_01 2020 9.29 18.82 16.01
Wilayah_01 2021 8.16 32.33 15.19
Wilayah_01 2022 7.82 29.36 15.32
Wilayah_01 2023 7.89 23.84 15.52
Wilayah_01 2024 6.99 28.46 12.75
Wilayah_01 2025 7.12 31.61 9.99
Wilayah_02 2019 9.07 44.30 13.41

3.9 Interpretasi dalam Konteks Regional

Cleaning adalah bagian dari argumentasi. Menghapus duplikat tanpa memahami penyebabnya dapat menghapus kategori yang sebenarnya berbeda. Mengimputasi missing dengan mean provinsi dapat meratakan disparitas dan membuat wilayah ekstrem tampak “normal”. Setiap keputusan cleaning perlu log perubahan.

3.10 Latihan

  1. Mengapa join dengan nama wilayah lebih berisiko daripada kode wilayah?
  2. Kapan transformasi log berguna dan apa konsekuensi interpretasinya?
  3. Bedakan outlier karena error dengan outlier yang merupakan fenomena kebijakan penting.
  4. Analisis: buat pipeline cleaning untuk simulasi_panel_regional.csv dan tambahkan unit pada nama variabel.
  5. Analisis: buat tabel audit duplikasi dan missing per tahun.
  6. Mini-case: satu kabupaten mengalami lonjakan PDRB 5 kali lipat karena perubahan unit dari juta ke ribu. Tunjukkan bagaimana Anda mendeteksi dan memperbaikinya.

3.10.1 Tugas 1 — Data Quality & Wrangling (2,5%)

Gunakan dua tabel regional yang memiliki kunci wilayah–tahun. Lakukan: cleaning nama kolom; audit duplicate; audit missing; validasi join; minimal tiga feature engineering (per capita/rate, growth, lag/LQ); dokumentasikan setiap keputusan. Serahkan .Rmd dan HTML.

Rubrik: audit data 25; correctness transform 25; join validation 20; reproducibility 15; interpretasi 15.

3.10.2 Kuis 1 — Minggu 1–3 (2,5%)

Kuis 10–15 soal campuran konsep dan potongan kode. Kisi-kisi: unit analisis; denominator; provenance; tidy data; missingness; scaling; outlier; feature engineering; leakage preprocessing.

3.11 Hubungan dengan Capstone Project

Mahasiswa menyerahkan data cleaning log: input, transformasi, alasan, jumlah baris sebelum/sesudah, dan isu yang belum terselesaikan.

3.12 Kesimpulan

Wrangling bukan kosmetik. Kesalahan unit, denominator, kode wilayah, dan join dapat menghasilkan kesimpulan kebijakan yang salah meskipun model dihitung dengan benar.

3.13 Pendalaman Magister — Wrangling sebagai bagian inferensi

3.13.1 Audit metodologis

  1. Cleaning menghapus observasi valid.
  2. Join many-to-many tidak disadari.
  3. Feature menggunakan informasi masa depan.
  4. Outlier dihapus karena ekstrem.
  5. Growth dihitung dari denominator nol.
  6. Transformasi tidak disimpan dalam script.

3.13.2 Pertanyaan viva / diskusi kelas

  1. Apa konsekuensi many-to-many join?
  2. Kapan robust scaling lebih tepat?
  3. Bagaimana membedakan data error dan structural extreme?
  4. Apa risiko feature engineering pasca-outcome?
  5. Mengapa anti_join wajib saat integrasi?
  6. Bagaimana membangun cleaning log?

4 Exploratory Data Analysis dan Statistika Deskriptif Regional

4.1 Pendahuluan

EDA adalah proses menguji struktur data sebelum memaksakan model. Untuk data regional, EDA harus melihat distribusi, tren, heterogenitas antardaerah, hubungan antarindikator, missingness, dan kemungkinan struktur spasial/temporal. (Tukey 1977)

4.2 Tujuan Pembelajaran

Mahasiswa mampu menyusun ringkasan numerik dan grafis, membandingkan distribusi antarwilayah/waktu, mendeteksi pola nonlinier/outlier, dan merumuskan hipotesis analitik dari EDA.

4.3 Definisi dan Konsep

Ukuran pemusatan (mean, median), penyebaran (SD, IQR), quantile, dan korelasi harus dipilih sesuai distribusi dan tujuan. Untuk data skewed, median sering lebih stabil daripada mean. Korelasi Pearson mengukur asosiasi linear, sedangkan Spearman berbasis ranking dan lebih robust terhadap nonnormalitas tertentu.

4.4 Formulasi Matematis

Mean dan variance sampel:

x=1ni=1nxi,s2=1n1i=1n(xix)2. \bar x=\frac{1}{n}\sum_{i=1}^{n}x_i,\qquad s^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar x)^2.

Korelasi Pearson:

rxy=i(xix)(yiy)i(xix)2i(yiy)2. r_{xy}=\frac{\sum_i(x_i-\bar x)(y_i-\bar y)}{\sqrt{\sum_i(x_i-\bar x)^2\sum_i(y_i-\bar y)^2}}.

4.4.1 Ukuran lokasi dan penyebaran

Rata-rata aritmetik: x=1ni=1nxi. \bar x=\frac{1}{n}\sum_{i=1}^{n}x_i.

Rata-rata tertimbang—misalnya rata-rata provinsi dari rate kabupaten dengan bobot populasi yang relevan: xw=i=1nwixii=1nwi. \bar x_w=\frac{\sum_{i=1}^{n}w_i x_i}{\sum_{i=1}^{n}w_i}.

Varians sampel dan simpangan baku: s2=1n1i=1n(xix)2,s=s2. s^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar x)^2,\qquad s=\sqrt{s^2}.

Coefficient of variation: CV=sx×100%, CV=\frac{s}{\bar x}\times100\%, berguna untuk membandingkan dispersi relatif pada variabel dengan skala berbeda ketika mean positif dan bermakna.

4.4.2 Covariance dan correlation

Cov(X,Y)=1n1i=1n(xix)(yiy), \operatorname{Cov}(X,Y)=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar x)(y_i-\bar y),

rXY=Cov(X,Y)sXsY. r_{XY}=\frac{\operatorname{Cov}(X,Y)}{s_Xs_Y}.

Pearson correlation mengukur hubungan linear, bukan hubungan kausal. Spearman correlation adalah Pearson correlation pada ranks dan lebih sesuai ketika hubungan monotonic tetapi tidak linear atau ketika robust terhadap skala ordinal dibutuhkan.

4.4.3 Ukuran ketimpangan: Gini dan Theil

Untuk nilai non-negatif yang diurutkan x(1)x(n)x_{(1)}\le\cdots\le x_{(n)}, salah satu bentuk koefisien Gini adalah G=2i=1nix(i)ni=1nx(i)n+1n. G=\frac{2\sum_{i=1}^{n} i x_{(i)}}{n\sum_{i=1}^{n}x_{(i)}}-\frac{n+1}{n}.

G=0G=0 menunjukkan kesetaraan sempurna; nilai lebih tinggi menunjukkan konsentrasi lebih besar. Pada indikator regional, jelaskan apa yang didistribusikan—pendapatan, PDRB per kapita, kapasitas layanan, atau investasi—karena makna normatifnya berbeda.

Theil TT index: T=1ni=1nxixln(xix). T=\frac{1}{n}\sum_{i=1}^{n}\frac{x_i}{\bar x}\ln\left(\frac{x_i}{\bar x}\right).

Keunggulan Theil adalah dekomposabilitas antar dan dalam kelompok, bermanfaat saat membedakan ketimpangan antarkawasan metropolitan/nonmetropolitan atau antar koridor pembangunan.

4.4.4 Quantile dan robust summaries

Quantile QpQ_p memenuhi secara konseptual P(XQp)=pP(X\le Q_p)=p. Median adalah Q0.5Q_{0.5}. Untuk distribusi menceng, laporkan median dan IQR selain mean dan SD. Perbedaan mean–median sendiri dapat memberi sinyal konsentrasi ekstrem.

4.4.5 EDA sebagai proses iteratif

EDA bukan “membuat banyak grafik”, tetapi siklus QuestionVisualization/SummaryPatternNew Question. \text{Question}\rightarrow \text{Visualization/Summary}\rightarrow \text{Pattern}\rightarrow \text{New Question}.

Tukey menekankan EDA sebagai eksplorasi yang membuka struktur data sebelum pemodelan konfirmatori. (Tukey 1977) Untuk konteks regional, minimal bedakan variasi antarwilayah, antarwaktu, dan interaksi wilayah–waktu.

4.4.6 Decomposition sederhana panel regional

Untuk indikator yity_{it}, dekomposisi konseptual yit=μ+αi+γt+eit y_{it}=\mu+\alpha_i+\gamma_t+e_{it} memisahkan rata-rata umum μ\mu, efek wilayah αi\alpha_i, efek waktu γt\gamma_t, dan residual. Walaupun belum menjadi model panel formal, struktur ini membantu mahasiswa bertanya apakah perbedaan didominasi karakteristik persisten wilayah atau shock waktu bersama.

4.5 Intuisi Metode

Dua provinsi dapat memiliki mean kemiskinan sama tetapi distribusi kabupaten sangat berbeda. Salah satu homogen, yang lain memiliki beberapa kantong kemiskinan ekstrem. Kebijakan yang hanya melihat mean provinsi akan kehilangan informasi target.

4.5.1 Worked Example — mean vs median pada distribusi regional

Pendapatan per kapita hipotetis lima wilayah: 20, 22, 24, 26, 100. Mean: x=20+22+24+26+1005=38.4, \bar x=\frac{20+22+24+26+100}{5}=38.4, median = 24. Satu wilayah ekstrem menggeser mean jauh dari mayoritas. Tidak ada statistik yang “lebih benar” secara universal: mean relevan untuk total/expectation; median lebih representatif untuk typical region saat skew tinggi.

4.5.2 Worked Example — weighted mean

Jika indikator A=60 dengan populasi 1 juta dan B=80 dengan populasi 100 ribu, mean sederhana 70, tetapi xw=60(1,000,000)+80(100,000)1,100,000=61.82. \bar x_w=\frac{60(1{,}000{,}000)+80(100{,}000)}{1{,}100{,}000}=61.82. Pertanyaan substantif menentukan bobot: populasi, rumah tangga, angkatan kerja, atau bobot sampling.

4.5.3 Worked Example — Gini kecil

Untuk tiga nilai x=(10,20,30)x=(10,20,30) yang sudah diurutkan: G=2[1(10)+2(20)+3(30)]3(60)43=2801801.3333=0.2222.G=\frac{2[1(10)+2(20)+3(30)]}{3(60)}-\frac{4}{3} =\frac{280}{180}-1.3333=0.2222. Gini sensitif pada keseluruhan distribusi. Jika satu wilayah melonjak menjadi 100, Gini meningkat. Tetapi Gini tidak memberi tahu wilayah mana yang tertinggal; selalu kombinasikan dengan distribusi/ranking/peta.

4.5.4 Worked Example — Theil dan dekomposisi pemikiran

Theil memberi nol ketika semua xi=xx_i=\bar x. Karena term xi/xln(xi/x)x_i/\bar x\ln(x_i/\bar x) bertambah untuk nilai yang menyimpang, indeks meningkat dengan ketimpangan. Kelebihan untuk regional analytics adalah dekomposisi: T=Tbetween+Twithin, T=T_{between}+T_{within}, sehingga kita dapat bertanya apakah ketimpangan provinsi terutama berasal dari perbedaan antar-kawasan atau variasi di dalam kawasan.

4.5.5 EDA matrix

Untuk capstone, minimal isi matriks berikut.

Perspektif Pertanyaan Statistik/grafik
cross-section wilayah mana ekstrem? boxplot, rank, map
temporal membaik/memburuk? line, growth, slope
bivariate variabel bergerak bersama? scatter/correlation
multivariate pola gabungan? pairwise, PCA/cluster kemudian
uncertainty seberapa stabil? CI, sensitivity, missing analysis

4.5.6 EDA R workflow

panel <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types=FALSE)
panel_2025 <- panel |> filter(tahun==2025)
panel_2025 |>
  summarise(
    n=n(),
    mean_pov=mean(kemiskinan_persen),
    median_pov=median(kemiskinan_persen),
    sd_pov=sd(kemiskinan_persen),
    iqr_pov=IQR(kemiskinan_persen),
    cv_pov=sd_pov/mean_pov
  ) |> knitr::kable(digits=3)
n mean_pov median_pov sd_pov iqr_pov cv_pov
27 9.886 9.837 1.753 2.329 0.177

Setelah statistik keluar, tugas mahasiswa bukan membaca angka satu per satu, tetapi menghubungkan: apakah mean–median berbeda? apakah CV besar? apakah outlier valid? apakah tahun 2025 representatif atau shock?

4.6 Contoh dengan Data Simulasi

panel <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)
latest <- panel |> filter(tahun == max(tahun))

latest |>
  summarise(across(c(kemiskinan_persen, tpt_persen, ipm, internet_persen),
                   list(mean = mean, median = median, sd = sd))) |>
  pivot_longer(everything()) |>
  knitr::kable(digits = 2, caption = "Ringkasan indikator regional 2025 (simulasi)")
Table 4.1: Ringkasan indikator regional 2025 (simulasi)
name value
kemiskinan_persen_mean 9.89
kemiskinan_persen_median 9.84
kemiskinan_persen_sd 1.75
tpt_persen_mean 8.07
tpt_persen_median 7.75
tpt_persen_sd 1.10
ipm_mean 70.74
ipm_median 70.68
ipm_sd 1.18
internet_persen_mean 83.44
internet_persen_median 85.60
internet_persen_sd 8.19
latest |>
  ggplot(aes(internet_persen, kemiskinan_persen)) +
  geom_point() +
  geom_smooth(method = "lm", se = TRUE) +
  labs(x = "Akses internet (%)", y = "Kemiskinan (%)",
       title = "EDA: hubungan internet dan kemiskinan - data simulasi")

4.7 Contoh dengan Data Nyata

Gunakan Poverty Rate (SI.POV.NAPR.ZS), HDI (IDX.HDI), populasi (SP.POP.TOTL), dan literacy rate (SE.LITR.15UP.ZS) dari INDO-DAPOER. Metadata World Bank menyatakan sumber indikator tersebut terutama BPS/SUSENAS. Data historis dapat digunakan untuk mengamati disparitas, tetapi batas periode harus dicantumkan. (World Bank 2026)

Kartu dataset real.

  • Nama: subset indikator sosial-ekonomi INDO-DAPOER.
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: maksimum 1976–2018; contoh EDA menggunakan tahun yang memiliki overlap indikator memadai.
  • Unit observasi: wilayah–tahun setelah indikator di-pivot menjadi kolom.
  • Variabel/definisi: SI.POV.NAPR.ZS = poverty rate (%), IDX.HDI = HDI, SP.POP.TOTL = total population, SE.LITR.15UP.ZS = literacy rate usia 15+.
  • Alasan digunakan: memungkinkan EDA multivariat untuk melihat tren, dispersi, outlier, dan disparitas antardaerah.
  • Keterbatasan: indikator dapat berasal dari sumber/survei berbeda dan tidak selalu tersedia pada tahun yang sama; analisis harus melaporkan analytic sample. (World Bank 2026)

4.8 Analisis Menggunakan R

if (dir.exists("data/raw/indodapoer") && length(list.files("data/raw/indodapoer")) > 0) {
  source("R/03_prepare_indodapoer.R")
  indo <- load_indodapoer()
  eda <- indo |>
    dplyr::filter(kode_indikator %in% c("SI.POV.NAPR.ZS", "IDX.HDI"), tahun == 2018) |>
    dplyr::select(wilayah, kode_indikator, nilai) |>
    tidyr::pivot_wider(names_from = kode_indikator, values_from = nilai)
  ggplot2::ggplot(eda, ggplot2::aes(IDX.HDI, SI.POV.NAPR.ZS)) +
    ggplot2::geom_point(alpha = .65) + ggplot2::geom_smooth(method = "lm") +
    ggplot2::labs(x = "HDI", y = "Poverty rate (%)", title = "EDA data INDO-DAPOER 2018")
} else {
  eda <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |> dplyr::filter(tahun == 2025)
  ggplot2::ggplot(eda, ggplot2::aes(ipm, kemiskinan_persen)) +
    ggplot2::geom_point(alpha = .7) + ggplot2::geom_smooth(method = "lm") +
    ggplot2::labs(x = "IPM", y = "Kemiskinan (%)", title = "Output fallback: EDA data simulasi")
}

4.9 Paket Output Analisis Lengkap

eda4 <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  dplyr::filter(tahun == 2025)
vars4 <- c("pdrb_perkapita_juta", "kemiskinan_persen", "tpt_persen", "ipm", "internet_persen", "indeks_inovasi")
summary4 <- eda4 |>
  dplyr::summarise(dplyr::across(dplyr::all_of(vars4), list(mean=mean, median=median, sd=sd, min=min, q1=~quantile(.x,.25), q3=~quantile(.x,.75), max=max))) |>
  tidyr::pivot_longer(dplyr::everything(), names_to=c("indikator","stat"), names_pattern="(.*)_(mean|median|sd|min|q1|q3|max)") |>
  tidyr::pivot_wider(names_from=stat, values_from=value)
knitr::kable(summary4, digits=2, caption="Ringkasan lengkap indikator regional tahun 2025")
Table 4.2: Ringkasan lengkap indikator regional tahun 2025
indikator mean median sd min q1 q3 max
pdrb_perkapita_juta 49.22 50.90 10.86 24.04 41.56 56.10 66.15
kemiskinan_persen 9.89 9.84 1.75 6.01 8.77 11.10 13.05
tpt_persen 8.07 7.75 1.10 6.69 7.19 8.72 10.35
ipm 70.74 70.68 1.18 67.78 70.02 71.50 73.42
internet_persen 83.44 85.60 8.19 65.66 76.90 88.74 96.99
indeks_inovasi 68.25 69.00 4.12 60.29 65.42 71.06 76.82
ggplot2::ggplot(eda4, ggplot2::aes(kemiskinan_persen)) +
  ggplot2::geom_histogram(ggplot2::aes(y=ggplot2::after_stat(density)), bins=10) +
  ggplot2::geom_density(linewidth=1) +
  ggplot2::geom_vline(xintercept=median(eda4$kemiskinan_persen), linetype=2) +
  ggplot2::labs(title="Distribusi kemiskinan regional", subtitle="Histogram, density, dan median", x="Kemiskinan (%)", y="Density")

ggplot2::ggplot(eda4, ggplot2::aes(pdrb_perkapita_juta, kemiskinan_persen, shape=factor(urban))) +
  ggplot2::geom_point(size=2.7, alpha=.8) +
  ggplot2::geom_smooth(method="lm", se=TRUE) +
  ggplot2::labs(title="PDRB per kapita dan kemiskinan", x="PDRB per kapita (juta)", y="Kemiskinan (%)", shape="Urban")

cor4 <- cor(eda4 |> dplyr::select(dplyr::all_of(vars4)), use="pairwise.complete.obs")
cor_long4 <- as.data.frame(as.table(cor4))
ggplot2::ggplot(cor_long4, ggplot2::aes(Var1,Var2,fill=Freq)) +
  ggplot2::geom_tile() + ggplot2::geom_text(ggplot2::aes(label=sprintf("%.2f",Freq)), size=3) +
  ggplot2::scale_fill_gradient2(limits=c(-1,1), midpoint=0) +
  ggplot2::coord_equal() + ggplot2::labs(title="Matriks korelasi indikator regional",x=NULL,y=NULL,fill="r") +
  ggplot2::theme(axis.text.x=ggplot2::element_text(angle=45,hjust=1))

4.10 Interpretasi dalam Konteks Regional

Jika hubungan HDI-kemiskinan negatif tetapi terdapat wilayah yang jauh dari pola umum, outlier tersebut justru menarik untuk case tracing: apakah ada struktur ekonomi khusus, kualitas layanan, urbanisasi, atau masalah measurement? EDA menghasilkan pertanyaan baru, bukan hanya grafik.

4.11 Latihan

  1. Kapan median lebih informatif daripada mean?
  2. Apa yang tidak dapat disimpulkan dari korelasi tinggi?
  3. Mengapa agregasi provinsi dapat menyembunyikan disparitas kabupaten?
  4. Analisis: buat small multiples tren kemiskinan untuk 9 wilayah simulasi.
  5. Analisis: hitung matriks korelasi dan identifikasi pasangan variabel yang berpotensi multikolinear.
  6. Mini-case: rata-rata pengangguran turun, tetapi 25% kabupaten justru naik. Bagaimana Anda menyampaikan temuan ini kepada pengambil kebijakan?

4.11.1 Tugas Terstruktur Pertemuan 4

Susun regional disparity profile untuk satu indikator utama dan minimal dua indikator penjelas. Wajib menyajikan mean/median/SD/IQR, CV atau ukuran ketimpangan, top–bottom regions, trend, serta dua hipotesis substantif yang belum diklaim sebagai kausal.

4.11.2 Kuis Formatif Pertemuan 4

  1. Kapan median lebih informatif daripada mean?
  2. Apa arti G=0G=0 pada koefisien Gini?
  3. Mengapa korelasi pada pooled panel dapat berbeda dari korelasi per tahun?
  4. Apa manfaat Theil dibanding satu ukuran dispersi biasa?
  5. Bedakan pola antarwilayah dan pola antarwaktu.

4.12 Hubungan dengan Capstone Project

Milestone EDA harus menghasilkan 3-5 temuan yang dapat ditindaklanjuti, bukan puluhan grafik tanpa narasi. Setiap grafik perlu menjawab pertanyaan tertentu.

4.13 Kesimpulan

EDA adalah mekanisme quality control dan pembentuk hipotesis. Untuk konteks regional, selalu lihat distribusi, waktu, dan heterogenitas antarwilayah sebelum membangun model.

4.14 Pendalaman Magister — EDA dan ketimpangan regional

4.14.1 Audit metodologis

  1. Pooled pattern menutupi heterogenitas waktu.
  2. Mean menutupi skew/outlier.
  3. Korelasi ekologis dianggap individual.
  4. Ranking tanpa uncertainty.
  5. Ketimpangan disimpulkan dari satu statistic.
  6. Multiple comparisons tanpa konteks.

4.14.2 Pertanyaan viva / diskusi kelas

  1. Mengapa mean dan median dapat memberi cerita berbeda?
  2. Apa yang Gini tidak beritahu?
  3. Bagaimana Theil membantu dekomposisi?
  4. Apa Simpson’s paradox secara intuitif?
  5. Bagaimana memisahkan efek wilayah dan waktu secara deskriptif?
  6. Kapan weighted mean diperlukan?

5 Visualisasi Data dan Data Storytelling untuk Kebijakan

5.1 Pendahuluan

Visualisasi kebijakan harus cepat dipahami, tetapi tidak boleh mengorbankan ketepatan. Grafik yang baik mengarahkan perhatian pada pesan substantif sekaligus menyediakan konteks: unit, baseline, skala, denominator, dan ketidakpastian. Grammar of Graphics menyediakan kerangka sistematis untuk memetakan data ke estetika visual. (Wilkinson 2005; Tufte 2001)

5.2 Tujuan Pembelajaran

Mahasiswa mampu memilih bentuk grafik sesuai pertanyaan, menghindari visual yang menyesatkan, membangun data story, dan merancang prototipe dashboard regional.

5.3 Definisi dan Konsep

Data storytelling menggabungkan evidence, narrative, dan visual design. Narasi kebijakan umumnya mengikuti: konteks → gap/disparitas → siapa/di mana → faktor terkait → implikasi → opsi tindakan. Dashboard berbeda dari laporan: dashboard membantu monitoring/eksplorasi, sedangkan laporan dapat memuat argumentasi lebih panjang.

5.4 Formulasi Matematis

Perubahan absolut dan relatif:

Δx=xtxt1,g=xtxt1xt1×100%. \Delta x=x_t-x_{t-1}, \qquad g=\frac{x_t-x_{t-1}}{x_{t-1}}\times100\%.

Keduanya dapat menghasilkan pesan berbeda. Kenaikan 2 poin persentase dari 4% ke 6% adalah +2 pp tetapi +50% secara relatif.

5.4.1 Transformasi visual sebagai transformasi analitik

Jika grafik menggunakan log scale, hubungan visual berubah. Untuk x>0x>0, x*=log(x). x^{*}=\log(x). Perbedaan pada skala log berhubungan dengan rasio pada skala asli: logx2logx1=log(x2x1). \log x_2-\log x_1=\log\left(\frac{x_2}{x_1}\right). Karena itu, setiap transformasi sumbu harus disebutkan dan dipahami, bukan dianggap dekorasi.

5.4.2 Rates, indexes, dan baseline

Indeks dengan tahun dasar 00: It=xtx0×100. I_t=\frac{x_t}{x_0}\times100. Nilai It=125I_t=125 berarti 25% di atas level tahun dasar, bukan “naik 125%”. Untuk membandingkan trajectory kabupaten dengan skala absolut sangat berbeda, indeks dapat lebih informatif daripada plot count.

5.4.3 Slope dan annualized change

Untuk dua titik waktu, slope=yt2yt1t2t1. \text{slope}=\frac{y_{t_2}-y_{t_1}}{t_2-t_1}. Jika model tren linear yt=β0+β1t+εty_t=\beta_0+\beta_1t+\varepsilon_t, maka β1\beta_1 adalah perubahan rata-rata per unit waktu, dengan asumsi tren linear memadai.

5.4.4 Encoding visual dan risiko distorsi

Dalam Grammar of Graphics, grafik adalah pemetaan data ke aesthetics—position, length, color, shape, size—plus geometric objects dan coordinate system. (Wilkinson 2005) Untuk perbandingan presisi, posisi pada skala bersama umumnya lebih mudah dibaca dibanding area/volume. Karena itu bubble chart yang menarik secara visual belum tentu tepat untuk membandingkan perbedaan kecil.

Untuk choropleth, klasifikasi nilai dapat menggunakan quantile. Jika KK kelas, batas kuantil adalah Qk/KQ_{k/K}. Namun klasifikasi quantile membuat tiap kelas berisi jumlah wilayah relatif sama dan dapat menyembunyikan gap substantif; equal interval dan natural breaks memberi pesan berbeda. Metode klasifikasi wajib dilaporkan.

5.4.5 Uncertainty dalam visualisasi

Jika estimasi θ̂\hat\theta memiliki standard error SE(θ̂)SE(\hat\theta), interval aproksimasi 95% adalah θ̂±1.96SE(θ̂), \hat\theta\pm 1.96\,SE(\hat\theta), untuk kondisi asimtotik yang memadai. Menampilkan ribbon/interval membantu mencegah pembaca memperlakukan estimasi sebagai angka pasti.

5.4.6 Data storytelling untuk kebijakan

Satu evidence story yang kuat memiliki struktur:

Claim+Evidence+Context+Uncertainty+Decision implication. \text{Claim} + \text{Evidence} + \text{Context} + \text{Uncertainty} + \text{Decision implication}.

“Pengangguran turun” adalah claim; grafik trend adalah evidence; perubahan definisi atau shock pandemi adalah context; interval atau sensitivitas adalah uncertainty; implikasi target program adalah decision implication. Visualisasi yang indah tanpa lima komponen ini berisiko menjadi poster, bukan alat kebijakan. (Tufte 2001)

5.5 Intuisi Metode

Grafik bar cocok untuk membandingkan kategori; line chart untuk tren waktu; scatterplot untuk hubungan; peta untuk pola geografis. Peta bukan default untuk semua indikator regional. Jika tujuan hanya ranking 27 kabupaten, sorted dot plot sering lebih mudah dibaca daripada choropleth.

5.5.1 Worked Example — indeks tahun dasar

Jika TPT wilayah A adalah 10% pada 2020 dan 7% pada 2024, indeks basis 2020: I2024=710×100=70. I_{2024}=\frac{7}{10}\times100=70. Artinya level 2024 adalah 70% dari level 2020 atau turun 30% relatif terhadap baseline. Jangan menulis “TPT menjadi 70%” tanpa menyebut bahwa 70 adalah indeks, bukan rate aktual.

5.5.2 Worked Example — slope vs percent change

Dari 10% menjadi 7% selama 4 tahun: slope=7104=0.75 percentage point/year. \text{slope}=\frac{7-10}{4}=-0.75\text{ percentage point/year}. Perubahan relatif: 71010=30%. \frac{7-10}{10}=-30\%. “Turun 3 percentage points” berbeda dari “turun 30 persen”. Bahasa kebijakan harus membedakan percentage point dan percent change.

5.5.3 Visual encoding audit

Sebelum menggunakan grafik, cek:

  • position/length untuk perbandingan presisi;
  • color hue untuk kategori;
  • color luminance untuk ordered values;
  • area hanya jika pembaca tidak perlu membandingkan nilai kecil dengan presisi;
  • shape untuk sedikit kategori;
  • animation hanya jika dinamika waktu tidak lebih jelas dengan small multiples.

Peta sebaiknya tidak digunakan hanya karena data memiliki nama wilayah. Jika pertanyaan adalah tren 20 tahun, line chart sering lebih efektif; peta membantu ketika spatial pattern substantif.

5.5.4 Worked R story

sel <- panel |> filter(wilayah %in% unique(wilayah)[1:5])
ggplot(sel, aes(tahun, kemiskinan_persen, group=wilayah, color=wilayah)) +
  geom_line(linewidth=.8) + geom_point(size=1.5) +
  labs(title="Perubahan kemiskinan lima wilayah simulasi",
       subtitle="Bandingkan arah dan kecepatan perubahan, bukan hanya ranking tahun terakhir",
       x=NULL, y="Kemiskinan (%)", color="Wilayah") +
  theme(legend.position="bottom")

Setelah grafik, tulis tiga jenis kalimat: pattern (“semua turun tetapi kecepatannya berbeda”), exception (“wilayah X stagnan”), dan implication (“intervensi seragam mungkin kurang tepat”).

5.5.5 Checklist caption yang kuat

Caption seharusnya menjawab: apa yang diukur; unit; periode; denominator; sumber; dan caveat. Contoh: “TPT kabupaten/kota Jawa Barat, persen angkatan kerja, 2007–2024; sumber BPS melalui Open Data Jawa Barat. Perubahan seri perlu dibaca bersama metadata dan kondisi pasar kerja.” (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026d)

5.5.6 Anti-pattern visualisasi

  1. Sumbu dipotong untuk bar chart sehingga perbedaan tampak dramatis.
  2. Warna diverging tanpa titik tengah bermakna.
  3. Menggunakan 27 warna kategori pada satu grafik.
  4. Dual axis tanpa hubungan transformasi eksplisit.
  5. Choropleth count tanpa standardisasi populasi ketika tujuan membandingkan risiko.
  6. Peta dengan kelas quantile tetapi narasi seolah kelas merepresentasikan threshold substantif.

5.6 Contoh dengan Data Simulasi

latest <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  filter(tahun == 2025) |>
  arrange(desc(kemiskinan_persen)) |>
  slice_head(n = 12)

ggplot(latest, aes(x = reorder(wilayah, kemiskinan_persen), y = kemiskinan_persen)) +
  geom_col() +
  coord_flip() +
  labs(x = NULL, y = "Kemiskinan (%)",
       title = "12 wilayah dengan kemiskinan tertinggi (simulasi)",
       subtitle = "Ranking digunakan untuk screening awal, bukan otomatis penetapan prioritas")

5.7 Contoh dengan Data Nyata

TPT Open Data Jawa Barat memiliki seri tahunan 2007-2024, sehingga cocok untuk visualisasi tren dan perbandingan kabupaten/kota. Dataset menghasilkan persentase TPT, bukan jumlah penganggur; untuk beban absolut perlu sumber jumlah angkatan kerja atau jumlah penganggur. (Pemerintah Provinsi Jawa Barat 2026b)

Kartu dataset real.

  • Nama: Tingkat Pengangguran Terbuka Berdasarkan Kabupaten/Kota di Jawa Barat.
  • Sumber dan URL: Open Data Jawa Barat/BPS, https://opendata.jabarprov.go.id/id/dataset/tingkat-pengangguran-terbuka-berdasarkan-kabupatenkota-di-jawa-barat.
  • Tahun: 2007–2024.
  • Unit observasi: kabupaten/kota–tahun.
  • Variabel/definisi: identitas wilayah; tingkat_pengangguran_terbuka = persentase angkatan kerja yang menganggur menurut definisi statistik produsen; satuan = persen; tahun.
  • Alasan digunakan: seri waktu lintas wilayah cocok untuk latihan small multiples, ranking yang bertanggung jawab, dan storytelling perubahan.
  • Keterbatasan: persentase tidak menunjukkan beban absolut; perubahan kecil tidak selalu substantif; narasi harus menyebut tahun dan sumber. (Pemerintah Provinsi Jawa Barat 2026b)

5.8 Analisis Menggunakan R

if (file.exists("data/raw/tpt_jabar.csv")) {
  tpt <- readr::read_csv("data/raw/tpt_jabar.csv", show_col_types = FALSE) |> janitor::clean_names()
  dat_plot <- tpt |> dplyr::group_by(nama_kabupaten_kota) |> dplyr::filter(dplyr::n() >= 3) |> dplyr::ungroup() |> dplyr::slice_head(n = 80)
  ggplot2::ggplot(dat_plot, ggplot2::aes(tahun, tingkat_pengangguran_terbuka, group = nama_kabupaten_kota)) +
    ggplot2::geom_line(alpha=.55) + ggplot2::labs(y="TPT (%)", title="Tren TPT — data resmi yang tersedia")
} else {
  dat_plot <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
    dplyr::filter(wilayah %in% unique(wilayah)[1:5])
  ggplot2::ggplot(dat_plot, ggplot2::aes(tahun, tpt_persen, group=wilayah, color=wilayah)) +
    ggplot2::geom_line(linewidth=.9) + ggplot2::geom_point() +
    ggplot2::labs(y="TPT (%)", title="Output fallback: tren TPT lima wilayah simulasi", color="Wilayah")
}

5.9 Paket Visual Evidence Lengkap

vis5 <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)
sel5 <- unique(vis5$wilayah)[1:6]
ggplot2::ggplot(vis5 |> dplyr::filter(wilayah %in% sel5), ggplot2::aes(tahun, kemiskinan_persen, group=wilayah, colour=wilayah)) +
  ggplot2::geom_line(linewidth=.9) + ggplot2::geom_point(size=1.8) +
  ggplot2::labs(title="Perubahan kemiskinan: contoh enam wilayah", y="Kemiskinan (%)", colour="Wilayah")

rank5 <- vis5 |> dplyr::filter(tahun==max(tahun)) |> dplyr::arrange(dplyr::desc(kemiskinan_persen)) |>
  dplyr::select(wilayah, kemiskinan_persen, tpt_persen, ipm, internet_persen)
knitr::kable(rank5, digits=2, caption="Evidence table untuk mendampingi visual ranking")
Table 5.1: Evidence table untuk mendampingi visual ranking
wilayah kemiskinan_persen tpt_persen ipm internet_persen
Wilayah_23 13.05 7.05 69.78 72.33
Wilayah_07 12.94 8.68 71.95 78.72
Wilayah_15 12.64 7.56 69.35 75.14
Wilayah_19 11.81 7.54 70.19 76.92
Wilayah_25 11.67 6.69 71.38 69.83
Wilayah_06 11.64 7.25 69.97 84.58
Wilayah_21 11.24 6.74 67.78 65.66
Wilayah_09 10.97 9.63 70.38 85.60
Wilayah_17 10.55 7.31 70.99 79.71
Wilayah_27 10.10 7.65 69.34 90.37
Wilayah_05 10.08 8.20 70.43 85.62
Wilayah_24 10.06 8.67 71.73 88.05
Wilayah_01 9.99 7.12 70.11 76.88
Wilayah_18 9.84 7.75 70.68 84.59
Wilayah_20 9.66 6.79 70.86 93.39
Wilayah_26 9.61 9.63 71.71 75.11
Wilayah_16 9.53 9.09 70.26 87.40
Wilayah_22 9.44 8.76 71.33 89.43
Wilayah_13 8.99 7.88 70.08 82.50
Wilayah_08 8.98 7.08 69.54 73.56
Wilayah_04 8.57 7.38 69.88 85.61
Wilayah_10 8.52 8.09 71.62 96.99
Wilayah_14 8.19 10.03 72.54 95.23
Wilayah_12 7.98 10.35 71.12 93.96
Wilayah_02 7.68 7.01 73.42 91.38
Wilayah_11 7.16 7.94 72.38 87.64
Wilayah_03 6.01 9.96 71.13 86.70
ggplot2::ggplot(rank5, ggplot2::aes(reorder(wilayah, kemiskinan_persen), kemiskinan_persen)) +
  ggplot2::geom_col() + ggplot2::coord_flip() +
  ggplot2::labs(title="Ranking kemiskinan pada tahun terakhir", x=NULL, y="Kemiskinan (%)")

5.10 Interpretasi dalam Konteks Regional

Visualisasi harus membedakan “nilai tinggi” dan “masalah besar”. Kota kecil dengan TPT tinggi mungkin memiliki jumlah penganggur absolut lebih sedikit daripada kabupaten besar dengan TPT sedang. Dashboard yang baik memungkinkan pembaca melihat rate dan count secara berdampingan.

5.11 Latihan

  1. Mengapa sumbu y yang dipotong dapat menyesatkan pada bar chart?
  2. Kapan peta lebih informatif daripada ranking plot?
  3. Bedakan perubahan persentase dan poin persentase.
  4. Analisis: buat tiga jenis grafik untuk indikator yang sama dan evaluasi mana paling komunikatif.
  5. Analisis: buat visual before-after untuk dua tahun pada data simulasi.
  6. Mini-case: kepala daerah hanya punya 30 detik melihat dashboard. Rancang tiga KPI dan jelaskan alasan pemilihannya.

5.11.1 Tugas 2 — Evidence Visualization (2,5%)

Buat satu halaman policy evidence story berisi maksimal empat grafik. Setiap grafik harus memiliki: pertanyaan, caption substantif, sumber, unit/satuan, periode, dan satu kalimat caveat. Sertakan satu grafik yang sengaja buruk, kemudian revisi dan jelaskan mengapa versi kedua lebih tepat.

5.11.2 Kuis Formatif Pertemuan 5

Fokus: transformasi log; indeks tahun dasar; slope; pilihan visual encoding; masalah dual-axis; choropleth classification; uncertainty; claim–evidence–context–decision implication.

5.12 Hubungan dengan Capstone Project

Mahasiswa membuat storyboard 5 panel: masalah, disparitas, driver/pola, model/evidence, dan rekomendasi. Ini menjadi kerangka dashboard dan presentasi akhir.

5.13 Kesimpulan

Visualisasi kebijakan adalah alat penalaran dan komunikasi. Pilih bentuk grafik berdasarkan pertanyaan, bukan karena efek visualnya menarik.

5.14 Pendalaman Magister — Visual evidence dan policy storytelling

5.14.1 Audit metodologis

  1. Grafik menjawab pertanyaan yang salah.
  2. Sumbu/warna memperbesar perbedaan.
  3. Count dipetakan tanpa denominator.
  4. Peta dipakai saat time trend lebih relevan.
  5. Uncertainty dihilangkan.
  6. Caption tidak memuat sumber/periode.

5.14.2 Pertanyaan viva / diskusi kelas

  1. Apa unit pesan satu grafik?
  2. Kapan choropleth tidak tepat?
  3. Apa beda percent dan percentage point?
  4. Bagaimana klasifikasi peta memengaruhi cerita?
  5. Mengapa uncertainty perlu divisualisasikan?
  6. Apa struktur claim–evidence–context–decision?

6 Statistika Inferensial dan Regresi untuk Data Regional

6.1 Pendahuluan

Regresi menghubungkan outcome dengan satu atau lebih prediktor dan menyediakan kerangka untuk estimasi, ketidakpastian, dan prediksi. Pada data regional, regresi sangat berguna, tetapi interpretasi harus membedakan asosiasi dari efek kausal.

6.2 Tujuan Pembelajaran

Mahasiswa mampu merumuskan model regresi, menginterpretasi koefisien dan interval kepercayaan, mengecek residual secara dasar, mengenali multikolinearitas, dan menjelaskan keterbatasan inferensi observasional.

6.3 Definisi dan Konsep

Model linear berganda menaksir hubungan kondisional: perubahan ekspektasi outcome ketika satu prediktor berubah, dengan prediktor lain ditahan konstan. Asumsi penting meliputi spesifikasi mean yang memadai, independensi/struktur error yang sesuai, serta stabilitas hubungan. Data panel dan spasial sering melanggar independensi sederhana sehingga regresi OLS harus dilihat sebagai baseline, bukan akhir analisis.

6.4 Formulasi Matematis

yi=β0+β1xi1++βpxip+εi, y_i=\beta_0+\beta_1x_{i1}+\cdots+\beta_px_{ip}+\varepsilon_i,

dengan yiy_i outcome, xijx_{ij} prediktor, βj\beta_j koefisien, dan εi\varepsilon_i error. Estimator OLS dalam notasi matriks:

𝛃̂=(𝐗𝐗)1𝐗𝐲. \hat{\boldsymbol\beta}=(\mathbf X^\top\mathbf X)^{-1}\mathbf X^\top\mathbf y.

Interval kepercayaan koefisien secara umum:

β̂j±tα/2,dfSE(β̂j). \hat\beta_j \pm t_{\alpha/2,df}\,SE(\hat\beta_j).

6.4.1 Estimasi, standard error, dan confidence interval

Misalkan X1,,XnX_1,\dots,X_n i.i.d. dengan mean μ\mu dan varians σ2\sigma^2. Rata-rata sampel X=1ni=1nXi \bar X=\frac{1}{n}\sum_{i=1}^nX_i memiliki E(X)=μ,Var(X)=σ2n. E(\bar X)=\mu,\qquad \operatorname{Var}(\bar X)=\frac{\sigma^2}{n}. Standard error diestimasi oleh SE(X)=sn. SE(\bar X)=\frac{s}{\sqrt n}. Untuk populasi normal atau sampel yang memadai, CI mean dengan tt adalah x±t1α/2,n1sn. \bar x\pm t_{1-\alpha/2,n-1}\frac{s}{\sqrt n}. Interpretasi frequentist: prosedur interval tersebut memiliki coverage 1α1-\alpha pada repeated sampling; bukan probabilitas posterior bahwa μ\mu berada di interval tertentu.

6.4.2 Uji hipotesis

Untuk H0:μ=μ0H_0:\mu=\mu_0, t=xμ0s/n. t=\frac{\bar x-\mu_0}{s/\sqrt n}. pp-value adalah probabilitas memperoleh statistik uji setidaknya se-ekstrem yang teramati jika H0H_0 dan asumsi model benar. pp-value bukan ukuran besar efek, bukan probabilitas H0H_0 benar, dan bukan pengganti relevansi kebijakan.

6.4.3 Regresi linear sederhana dan berganda

Model: yi=β0+β1xi1++βpxip+εi,E(εiX)=0. y_i=\beta_0+\beta_1x_{i1}+\cdots+\beta_px_{ip}+\varepsilon_i, \qquad E(\varepsilon_i\mid X)=0. Dalam bentuk matriks: 𝐲=𝐗𝛃+𝛆. \mathbf y=\mathbf X\boldsymbol\beta+\boldsymbol\varepsilon. OLS memilih 𝛃̂=argmin𝛃(𝐲𝐗𝛃)(𝐲𝐗𝛃), \widehat{\boldsymbol\beta}=\arg\min_{\boldsymbol\beta}(\mathbf y-\mathbf X\boldsymbol\beta)'(\mathbf y-\mathbf X\boldsymbol\beta), yang, jika 𝐗𝐗\mathbf X'\mathbf X invertibel, memiliki solusi 𝛃̂=(𝐗𝐗)1𝐗𝐲. \widehat{\boldsymbol\beta}=(\mathbf X'\mathbf X)^{-1}\mathbf X'\mathbf y. Residual: ei=yiŷi. e_i=y_i-\hat y_i. Estimator varians error: σ̂2=i=1nei2np1. \hat\sigma^2=\frac{\sum_{i=1}^{n}e_i^2}{n-p-1}. Varian koefisien di bawah homoskedastisitas: Var(𝛃̂X)=σ2(𝐗𝐗)1. \operatorname{Var}(\widehat{\boldsymbol\beta}\mid X)=\sigma^2(\mathbf X'\mathbf X)^{-1}.

6.4.4 Goodness of fit dan penalti kompleksitas

SST=i(yiy)2,SSE=i(yiŷi)2. SST=\sum_i(y_i-\bar y)^2,\qquad SSE=\sum_i(y_i-\hat y_i)^2.

R2=1SSESST. R^2=1-\frac{SSE}{SST}.

Adjusted R2R^2: R2=1SSE/(np1)SST/(n1). \bar R^2=1-\frac{SSE/(n-p-1)}{SST/(n-1)}. R2R^2 tinggi tidak menjamin model memiliki error prediksi kecil pada data baru atau memiliki interpretasi kausal yang valid. (Harrell 2015)

6.4.5 Multikolinearitas dan VIF

Untuk prediktor XjX_j, regresikan XjX_j terhadap prediktor lain dan peroleh Rj2R_j^2. Variance Inflation Factor: VIFj=11Rj2. VIF_j=\frac{1}{1-R_j^2}. VIF menunjukkan inflasi varians koefisien akibat hubungan linear antarfitur; threshold seperti 5 atau 10 hanyalah rule-of-thumb, bukan hukum universal.

6.4.6 Interaksi dan nonlinearity

Model interaksi: y=β0+β1x1+β2x2+β3x1x2+ε. y=\beta_0+\beta_1x_1+\beta_2x_2+\beta_3x_1x_2+\varepsilon. Efek marginal x1x_1 adalah E(YX)x1=β1+β3x2. \frac{\partial E(Y\mid X)}{\partial x_1}=\beta_1+\beta_3x_2. Artinya efek x1x_1 bergantung pada x2x_2. Dalam konteks regional, dampak asosiasional digital connectivity terhadap outcome dapat berbeda menurut tingkat urbanisasi atau kapasitas fiskal.

6.4.7 Prediksi bukan klaim kausal

Koefisien OLS bersifat kausal hanya di bawah asumsi identifikasi yang kuat. Jika variabel tak teramati UU memengaruhi XX dan YY, maka asosiasi dapat mengalami confounding. Buku kausal modern menekankan pemisahan pertanyaan prediktif dan kausal. (Hernán dan Robins 2020) Dalam mata kuliah ini, regresi terutama digunakan untuk deskripsi kondisional dan prediksi, kecuali desain identifikasi dijelaskan eksplisit.

6.5 Intuisi Metode

Koefisien internet -0,05 pada model kemiskinan berarti bahwa, dalam model dan skala yang digunakan, peningkatan 1 poin persentase internet diasosiasikan dengan penurunan rata-rata 0,05 poin kemiskinan ketika variabel lain tetap. Ini bukan bukti efek kausal jika faktor confounding tidak ditangani.

6.5.1 Worked Example — interpretasi koefisien

Model hipotetis: Povertŷ=180.08Internet0.04PDRBpc+0.30TPT. \widehat{Poverty}=18-0.08\,Internet-0.04\,PDRBpc+0.30\,TPT. Jika internet diukur persen, koefisien 0.08-0.08 berarti pada data/model tersebut, kenaikan 1 percentage point internet berasosiasi dengan penurunan rata-rata 0,08 percentage point poverty, conditional on PDRBpc dan TPT. Kenaikan 10 points berasosiasi dengan 0,8 points lebih rendah. Kata “menyebabkan” tidak dibenarkan tanpa desain kausal.

6.5.2 Matrix OLS miniature

Untuk model tanpa intercept yang sangat sederhana dengan X=[123],y=[245], X=\begin{bmatrix}1\\2\\3\end{bmatrix},\quad y=\begin{bmatrix}2\\4\\5\end{bmatrix}, XX=12+22+32=14,Xy=1(2)+2(4)+3(5)=25. X'X=1^2+2^2+3^2=14,\qquad X'y=1(2)+2(4)+3(5)=25. Maka β̂=25/14=1.786. \hat\beta=25/14=1.786. Prediksi ŷ=(1.786,3.571,5.357)\hat y=(1.786,3.571,5.357)'. Contoh ini membantu melihat bahwa formula matriks adalah generalisasi prosedur minimisasi squared residual.

6.5.3 Confidence interval vs prediction interval

Untuk mean response pada x0x_0: SE{ŷ(x0)}=σ̂x0(XX)1x0. SE\{\hat y(x_0)\}=\hat\sigma\sqrt{x_0'(X'X)^{-1}x_0}. Untuk observasi baru: SEpred=σ̂1+x0(XX)1x0. SE_{pred}=\hat\sigma\sqrt{1+x_0'(X'X)^{-1}x_0}. Prediction interval lebih lebar karena mencakup irreducible individual error selain uncertainty mean. Ini penting saat memberi range outcome satu wilayah, bukan hanya expected mean.

6.5.4 Residual diagnostics

Empat pertanyaan minimum:

  1. Linearity: residual vs fitted menunjukkan pola melengkung?
  2. Homoskedastisitas: spread residual meningkat pada fitted besar?
  3. Influence: adakah wilayah ekstrem dengan leverage besar?
  4. Dependence: residual mungkin berkorelasi antarwaktu/spasial?

Pada panel regional, asumsi independence sering paling rapuh. Jika observasi wilayah berulang, standard error OLS biasa dapat tidak memadai. Mata kuliah ini mengenalkan diagnosis; model panel/spatial formal dapat menjadi studi lanjut.

6.5.5 R implementation

d <- panel |> filter(tahun==2025)
fit6 <- lm(kemiskinan_persen ~ internet_persen + pdrb_perkapita_juta + tpt_persen,
           data=d)
broom::tidy(fit6, conf.int=TRUE) |> knitr::kable(digits=3)
term estimate std.error statistic p.value conf.low conf.high
(Intercept) 17.477 3.581 4.880 0.000 10.068 24.886
internet_persen -0.020 0.064 -0.309 0.760 -0.152 0.113
pdrb_perkapita_juta -0.086 0.047 -1.834 0.080 -0.184 0.011
tpt_persen -0.209 0.271 -0.771 0.449 -0.771 0.352
broom::glance(fit6) |> select(r.squared, adj.r.squared, sigma, AIC) |> knitr::kable(digits=3)
r.squared adj.r.squared sigma AIC
0.464 0.394 1.365 99.102

Gunakan broom::augment() untuk residual/fitted. Setelah output, tulis effect scale, uncertainty, dan limitation. Koefisien kecil belum tentu tidak substantif bila satu unit perubahan variabel sangat besar; sebaliknya koefisien “signifikan” dapat tidak relevan secara kebijakan.

6.5.6 Pertanyaan kritik regresi

  • Apakah outcome continuous dan model linear masuk akal?
  • Adakah rate bounded 0–100 yang mendekati boundary?
  • Adakah denominator sangat berbeda sehingga weighting relevan?
  • Adakah omitted variable yang membuat interpretasi kausal berbahaya?
  • Apakah data pooled time menyebabkan pseudo-replication?
  • Apakah hubungan nonlinear/interaksi didukung teori?

6.6 Contoh dengan Data Simulasi

panel <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  filter(tahun == 2025)

m1 <- lm(kemiskinan_persen ~ pdrb_perkapita_juta + internet_persen + ipm + tpt_persen,
         data = panel)
broom::tidy(m1, conf.int = TRUE) |>
  knitr::kable(digits = 3, caption = "Regresi kemiskinan pada data simulasi")
Table 6.1: Regresi kemiskinan pada data simulasi
term estimate std.error statistic p.value conf.low conf.high
(Intercept) 7.522 23.830 0.316 0.755 -41.897 56.941
pdrb_perkapita_juta -0.102 0.060 -1.697 0.104 -0.226 0.023
internet_persen -0.012 0.068 -0.180 0.859 -0.152 0.128
ipm 0.145 0.343 0.423 0.677 -0.567 0.857
tpt_persen -0.233 0.282 -0.826 0.417 -0.818 0.352
augment(m1) |>
  ggplot(aes(.fitted, .resid)) +
  geom_hline(yintercept = 0, linetype = 2) +
  geom_point() +
  labs(x = "Fitted", y = "Residual", title = "Pemeriksaan residual dasar")

6.7 Contoh dengan Data Nyata

INDO-DAPOER memiliki poverty rate (SI.POV.NAPR.ZS), HDI (IDX.HDI), literacy (SE.LITR.15UP.ZS), populasi (SP.POP.TOTL), unemployment counts (SL.UEM.TOTL) dan labor force (SL.TLF). TPT dapat dikonstruksi dari SL.UEM.TOTL/SL.TLF*100 jika definisi dan periode kompatibel. (World Bank 2026)

Kartu dataset real.

  • Nama: subset kemiskinan, pembangunan manusia, literasi, populasi, pengangguran dan angkatan kerja INDO-DAPOER.
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: sampai 2018, dipilih periode dengan overlap data.
  • Unit observasi: kabupaten/kota–tahun.
  • Variabel/definisi: poverty rate (%), HDI (indeks), literacy 15+ (%), total population, number unemployed, labor force; TPT latihan dapat dihitung sebagai unemployed/labor_force*100 bila definisinya kompatibel.
  • Alasan digunakan: menyediakan outcome dan covariates untuk regresi/inferensi dengan konteks pembangunan regional.
  • Keterbatasan: regresi observasional menunjukkan asosiasi, bukan efek kebijakan kausal; denominator dan kompatibilitas definisi harus diverifikasi. (World Bank 2026)

6.8 Analisis Menggunakan R

if (dir.exists("data/raw/indodapoer") && length(list.files("data/raw/indodapoer")) > 0) {
  source("R/03_prepare_indodapoer.R")
  indo <- load_indodapoer()
  sel <- indo |>
    dplyr::filter(kode_indikator %in% c("SI.POV.NAPR.ZS", "IDX.HDI", "SE.LITR.15UP.ZS", "SL.UEM.TOTL", "SL.TLF"), tahun == 2018) |>
    dplyr::select(wilayah, kode_indikator, nilai) |>
    tidyr::pivot_wider(names_from = kode_indikator, values_from = nilai) |>
    dplyr::mutate(tpt_constructed = 100 * SL.UEM.TOTL / SL.TLF)
  fit_real <- lm(SI.POV.NAPR.ZS ~ IDX.HDI + SE.LITR.15UP.ZS + tpt_constructed, data = sel)
} else {
  sel <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |> dplyr::filter(tahun == 2025)
  fit_real <- lm(kemiskinan_persen ~ ipm + indeks_pendidikan + tpt_persen, data = sel)
}
broom::tidy(fit_real, conf.int = TRUE) |> knitr::kable(digits = 3, caption = "Output: estimasi model dan interval kepercayaan")
Table 6.2: Output: estimasi model dan interval kepercayaan
term estimate std.error statistic p.value conf.low conf.high
(Intercept) 17.875 22.593 0.791 0.437 -28.863 64.612
ipm 0.146 0.392 0.372 0.714 -0.665 0.957
indeks_pendidikan -0.187 0.084 -2.212 0.037 -0.361 -0.012
tpt_persen -0.640 0.299 -2.138 0.043 -1.259 -0.021

6.9 Paket Output Regresi Lengkap

reg6 <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  dplyr::filter(tahun == 2025)
fit6 <- stats::lm(kemiskinan_persen ~ pdrb_perkapita_juta + tpt_persen + internet_persen + ipm + urban, data=reg6)
coef6 <- broom::tidy(fit6, conf.int=TRUE)
knitr::kable(coef6, digits=3, caption="Koefisien OLS, standard error, p-value, dan 95% CI")
Table 6.3: Koefisien OLS, standard error, p-value, dan 95% CI
term estimate std.error statistic p.value conf.low conf.high
(Intercept) 2.866 24.361 0.118 0.907 -47.796 53.528
pdrb_perkapita_juta -0.125 0.065 -1.929 0.067 -0.259 0.010
tpt_persen -0.434 0.352 -1.234 0.231 -1.165 0.297
internet_persen -0.017 0.068 -0.254 0.802 -0.158 0.124
ipm 0.248 0.360 0.689 0.498 -0.501 0.997
urban 0.888 0.926 0.959 0.348 -1.038 2.815
glance6 <- broom::glance(fit6) |> dplyr::select(r.squared, adj.r.squared, sigma, statistic, p.value, AIC, BIC, df.residual)
knitr::kable(glance6, digits=3, caption="Ringkasan goodness-of-fit model regresi")
Table 6.4: Ringkasan goodness-of-fit model regresi
r.squared adj.r.squared sigma statistic p.value AIC BIC df.residual
0.49 0.369 1.393 4.043 0.01 101.726 110.797 21
aug6 <- broom::augment(fit6)
metric6 <- tibble::tibble(
  RMSE = rmse_manual(reg6$kemiskinan_persen, aug6$.fitted),
  MAE = mae_manual(reg6$kemiskinan_persen, aug6$.fitted),
  mean_residual = mean(aug6$.resid),
  max_cooks_d = max(aug6$.cooksd)
)
knitr::kable(metric6, digits=3, caption="Ukuran error dan influence pada data estimasi")
Table 6.5: Ukuran error dan influence pada data estimasi
RMSE MAE mean_residual max_cooks_d
1.228 0.942 0 0.256
ggplot2::ggplot(aug6, ggplot2::aes(.fitted, .resid)) +
  ggplot2::geom_hline(yintercept=0, linetype=2) + ggplot2::geom_point(alpha=.8) +
  ggplot2::geom_smooth(se=FALSE) + ggplot2::labs(title="Residual versus fitted", x="Fitted", y="Residual")

ggplot2::ggplot(aug6, ggplot2::aes(sample=.std.resid)) +
  ggplot2::stat_qq() + ggplot2::stat_qq_line() +
  ggplot2::labs(title="Normal Q–Q plot standardized residual")

ggplot2::ggplot(aug6, ggplot2::aes(kemiskinan_persen, .fitted)) +
  ggplot2::geom_abline(slope=1,intercept=0,linetype=2) + ggplot2::geom_point(size=2.5) +
  ggplot2::labs(title="Aktual versus fitted OLS", x="Aktual (%)", y="Fitted (%)")

6.10 Interpretasi dalam Konteks Regional

Koefisien harus dibaca bersama skala, interval ketidakpastian, dan plausibilitas substantif. Jika model menunjukkan HDI dan literacy sama-sama kuat tetapi sangat berkorelasi, koefisien individual dapat menjadi tidak stabil. Untuk kebijakan, fokus pada evidence pattern dan ketidakpastian, bukan pada signifikansi p-value saja.

6.11 Latihan

  1. Apa arti “mengontrol variabel lain” dalam regresi?
  2. Mengapa p-value kecil tidak sama dengan dampak kebijakan besar?
  3. Apa risiko multikolinearitas pada indikator pembangunan yang saling tumpang tindih?
  4. Analisis: bandingkan model sederhana dan model berganda pada data simulasi.
  5. Analisis: buat interval kepercayaan prediksi untuk lima wilayah.
  6. Mini-case: koefisien investasi positif terhadap pengangguran. Susun minimal tiga penjelasan selain “investasi meningkatkan pengangguran”.

6.11.1 Tugas Terstruktur Pertemuan 6

Bangun baseline regression untuk outcome regional. Laporkan model equation, coefficient table, CI, residual diagnostics, VIF, satu interaction term yang punya justifikasi, dan interpretasi substantif. Tuliskan satu paragraf berjudul “Apa yang tidak dapat saya simpulkan secara kausal dari model ini.”

6.11.2 Kuis Formatif Pertemuan 6

  1. Interpretasi βj\beta_j pada multiple regression.
  2. Perbedaan CI koefisien dan prediction interval.
  3. Apa arti VIF besar?
  4. Bagaimana membaca interaction x1x2x_1x_2?
  5. Mengapa R2R^2 tinggi tidak menjamin model bagus untuk data baru?

6.12 Hubungan dengan Capstone Project

Kelompok menyusun baseline statistical model dan mendokumentasikan asumsi. Baseline dibutuhkan agar model ML yang lebih kompleks memiliki pembanding yang bermakna.

6.13 Kesimpulan

Regresi adalah alat dasar yang sangat kuat untuk regional analytics jika digunakan dengan disiplin interpretasi, diagnostik, dan kesadaran terhadap confounding serta struktur data.

6.14 Pendalaman Magister — Inferensi dan regression reasoning

6.14.1 Audit metodologis

  1. P-value dijadikan ukuran importance.
  2. R2 dijadikan ukuran kausalitas.
  3. Multikolinearitas diabaikan.
  4. Nonlinearity/interaksi tidak diperiksa.
  5. Dependence panel/spasial diabaikan.
  6. Koefisien asosiasi disebut dampak kebijakan.

6.14.2 Pertanyaan viva / diskusi kelas

  1. Apa makna conditional coefficient?
  2. Mengapa CI bukan probabilitas parameter frequentist?
  3. Apa yang dilakukan VIF?
  4. Bagaimana interaction mengubah marginal effect?
  5. Kapan prediction interval lebih relevan?
  6. Apa asumsi tambahan untuk causal interpretation?

7 Predictive Modeling, Resampling, dan Pencegahan Data Leakage

7.1 Pendahuluan

Prediksi menilai kemampuan model untuk bekerja pada data yang tidak digunakan saat fitting. Kesalahan umum dalam proyek regional adalah mengevaluasi model pada data training atau melakukan preprocessing menggunakan seluruh data sebelum split, sehingga kinerja terlihat terlalu baik.

7.2 Tujuan Pembelajaran

Mahasiswa mampu membangun workflow train/test, cross-validation, baseline, feature preprocessing, serta mendeteksi leakage temporal dan geografis.

7.3 Definisi dan Konsep

Generalization error adalah error pada observasi baru. Data leakage terjadi ketika informasi yang seharusnya tidak tersedia saat prediksi masuk ke proses training. Untuk forecast atau panel waktu, random split dapat membocorkan informasi masa depan. Untuk wilayah, random split juga dapat terlalu optimistis bila wilayah tetangga sangat serupa.

7.4 Formulasi Matematis

MSE dan RMSE:

MSE=1ni=1n(yiŷi)2,RMSE=MSE. MSE=\frac{1}{n}\sum_{i=1}^n(y_i-\hat y_i)^2,\qquad RMSE=\sqrt{MSE}.

MAE:

MAE=1ni=1n|yiŷi|. MAE=\frac{1}{n}\sum_{i=1}^n|y_i-\hat y_i|.

Dalam KK-fold cross-validation,

CVK=1Kk=1KLk, CV_K=\frac{1}{K}\sum_{k=1}^K L_k,

dengan LkL_k loss pada fold ke-kk.

7.4.1 Generalization error

Tujuan prediksi bukan meminimalkan training error, tetapi error pada data baru: Errgen=𝔼(X,Y)Pnew[L{Y,f̂(X)}]. Err_{gen}=\mathbb{E}_{(X,Y)\sim P_{new}}[L\{Y,\hat f(X)\}]. Test error adalah estimator praktis dari kuantitas ini ketika test set benar-benar independen dari proses training/tuning.

7.4.2 K-fold cross-validation

Data training dibagi menjadi KK fold 1,,K\mathcal{I}_1,\dots,\mathcal{I}_K. Model f̂(k)\hat f^{(-k)} dilatih tanpa fold kk. Estimator CV risk: R̂CV=1nk=1KikL{yi,f̂(k)(xi)}. \widehat R_{CV}=\frac{1}{n}\sum_{k=1}^{K}\sum_{i\in\mathcal I_k}L\{y_i,\hat f^{(-k)}(x_i)\}. Untuk panel regional, random CV dapat terlalu optimistis bila observasi wilayah yang sama muncul di train dan validation. Gunakan grouped CV, spatial blocking, atau rolling/temporal split sesuai target deployment. (Kuhn dan Silge 2022)

7.4.3 Metrik regresi

RMSE=1ni(yiŷi)2, RMSE=\sqrt{\frac{1}{n}\sum_i(y_i-\hat y_i)^2},

MAE=1ni|yiŷi|, MAE=\frac{1}{n}\sum_i|y_i-\hat y_i|,

MAPE=100%ni|yiŷiyi|. MAPE=\frac{100\%}{n}\sum_i\left|\frac{y_i-\hat y_i}{y_i}\right|. MAPE bermasalah saat yiy_i dekat nol. Untuk indikator seperti growth yang dapat nol/negatif, MAE/RMSE atau scaled errors biasanya lebih aman.

7.4.4 Bias–variance decomposition

Untuk squared error pada titik x0x_0, E[(Yf̂(x0))2]=σ2+{Bias[f̂(x0)]}2+Var[f̂(x0)]. E[(Y-\hat f(x_0))^2] =\sigma^2+\{Bias[\hat f(x_0)]\}^2+Var[\hat f(x_0)]. Model sangat fleksibel dapat menurunkan bias tetapi meningkatkan variance. Resampling membantu memilih kompleksitas yang memberi trade-off generalization terbaik. (Hastie, Tibshirani, dan Friedman 2009)

7.4.5 Ridge dan lasso sebagai regularized regression

Ridge: β̂ridge=argminβ0,𝛃{i(yiβ0𝐱i𝛃)2+λj=1pβj2}. \widehat\beta^{ridge}=\arg\min_{\beta_0,\boldsymbol\beta} \left\{\sum_i(y_i-\beta_0-\mathbf x_i'\boldsymbol\beta)^2+\lambda\sum_{j=1}^{p}\beta_j^2\right\}. Lasso: β̂lasso=argminβ0,𝛃{i(yiβ0𝐱i𝛃)2+λj=1p|βj|}. \widehat\beta^{lasso}=\arg\min_{\beta_0,\boldsymbol\beta} \left\{\sum_i(y_i-\beta_0-\mathbf x_i'\boldsymbol\beta)^2+\lambda\sum_{j=1}^{p}|\beta_j|\right\}. Ridge mengecilkan koefisien; lasso dapat menghasilkan beberapa koefisien tepat nol. Prediktor sebaiknya distandardisasi sebelum regularisasi. (Hoerl dan Kennard 1970; Tibshirani 1996)

7.4.6 Data leakage formal

Misalkan transformasi preprocessing memiliki parameter θ\theta. Leakage terjadi jika θ̂=g(𝒟train𝒟test) \widehat\theta=g(\mathcal D_{train}\cup\mathcal D_{test}) ketika seharusnya θ̂=g(𝒟train). \widehat\theta=g(\mathcal D_{train}). Contoh: standardisasi, imputasi, feature selection, PCA, atau tuning threshold menggunakan test set. Test set baru “dibuka” setelah seluruh keputusan model selesai.

7.5 Intuisi Metode

RMSE lebih memberi penalti pada error besar. Jika kebijakan sangat sensitif terhadap kegagalan memprediksi wilayah ekstrem, RMSE bisa lebih relevan daripada MAE. Tetapi metric harus terkait keputusan, bukan dipilih hanya karena umum digunakan.

7.5.1 Worked Example — split temporal

Tujuan: memprediksi indikator 2025 menggunakan informasi hingga 2024. Maka split random yang memasukkan observasi 2025 ke training melanggar deployment. Gunakan 𝒟train={t2023},𝒟valid={t=2024},𝒟test={t=2025}. \mathcal D_{train}=\{t\le2023\},\quad \mathcal D_{valid}=\{t=2024\},\quad \mathcal D_{test}=\{t=2025\}. Validation dipakai tuning; test hanya evaluasi final.

7.5.2 RMSE vs MAE numeric

Error model A: (1,1,1,5)(1,1,1,5). MAE=22, RMSE=(1+1+1+25)/4=7=2.646\sqrt{(1+1+1+25)/4}=\sqrt7=2.646. Error ekstrem mendapat penalti lebih kuat pada RMSE. Jika kebijakan sangat sensitif terhadap miss besar, RMSE mungkin lebih sesuai; jika robust typical absolute error lebih penting, MAE informatif.

7.5.3 Cross-validation manual intuition

Untuk 5-fold CV, setiap observasi menjadi validation tepat sekali. Jika fold RMSE = 2.1, 2.4, 1.9, 2.6, 2.2: RMSE=2.24, \bar{RMSE}=2.24, s=k(RMSEk2.24)2/(51)0.27. s=\sqrt{\sum_k(RMSE_k-2.24)^2/(5-1)}\approx0.27. Laporkan distribusi, bukan hanya mean. Variability tinggi berarti model sensitif terhadap sample composition.

7.5.4 Ridge shrinkage intuition

Jika dua prediktor sangat berkorelasi, OLS dapat menghasilkan koefisien besar dengan tanda tidak stabil. Ridge menambah λβj2\lambda\sum\beta_j^2, sehingga solusi menerima sedikit bias untuk mengurangi variance. lambda bukan dipilih dari test set; gunakan resampling training.

7.5.5 R workflow dengan tidymodels

set.seed(260817)
dat <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  dplyr::select(kemiskinan_persen, pdrb_perkapita_juta, tpt_persen, internet_persen, ipm, umkm_per_1000)
spl <- initial_split(dat, prop = .8)
tr <- training(spl)
folds <- vfold_cv(tr, v = 5)
rec <- recipe(kemiskinan_persen ~ ., data = tr) |> step_normalize(all_numeric_predictors())
mod <- linear_reg() |> set_engine("lm")
wf <- workflow() |> add_recipe(rec) |> add_model(mod)
res <- fit_resamples(wf, resamples = folds, metrics = metric_set(rmse, mae, rsq))
collect_metrics(res) |> knitr::kable(digits = 3, caption = "Output: 5-fold cross-validation baseline")
Table 7.1: Output: 5-fold cross-validation baseline
.metric .estimator mean n std_err .config
mae standard 1.024 5 0.030 pre0_mod0_post0
rmse standard 1.313 5 0.050 pre0_mod0_post0
rsq standard 0.711 5 0.027 pre0_mod0_post0

7.5.6 Leakage audit table

Komponen Fit hanya pada train/resample? Risiko jika tidak
median imputation ya test distribution bocor
normalization ya mean/SD test bocor
feature selection ya selection optimism
PCA ya loading memakai test
hyperparameter tuning ya overfit test
threshold selection validation inflated test metric

7.5.7 Deployment realism

Pertanyaan validasi bukan “split mana yang paling mudah”, tetapi “data apa yang akan tersedia saat model benar-benar dipakai?”. Untuk prediksi wilayah baru, group split by region mungkin tepat. Untuk masa depan, temporal split. Untuk generalisasi geografis, spatial block. (Kuhn dan Silge 2022)

7.6 Contoh dengan Data Simulasi

panel <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)
train <- panel |> filter(tahun <= 2023)
test  <- panel |> filter(tahun >= 2024)

fit <- lm(kemiskinan_persen ~ pdrb_perkapita_juta + tpt_persen + internet_persen + ipm,
          data = train)

pred <- test |> mutate(.pred = predict(fit, newdata = test))
pred |>
  summarise(RMSE = rmse_manual(kemiskinan_persen, .pred),
            MAE = mae_manual(kemiskinan_persen, .pred)) |>
  knitr::kable(digits = 3)
RMSE MAE
1.413 1.096

7.6.1 Visualisasi Output: Aktual versus Prediksi

pred |>
  ggplot2::ggplot(ggplot2::aes(kemiskinan_persen, .pred)) +
  ggplot2::geom_abline(slope = 1, intercept = 0, linetype = 2, colour = "#C99A17") +
  ggplot2::geom_point(alpha = .7, colour = "#145B8C") +
  ggplot2::labs(
    title = "Evaluasi out-of-time: aktual versus prediksi",
    x = "Kemiskinan aktual (%)", y = "Kemiskinan prediksi (%)"
  )

7.7 Contoh dengan Data Nyata

Data panel INDO-DAPOER dapat dibagi berdasarkan waktu, misalnya training sampai 2015 dan test 2016-2018, selama indikator memiliki kelengkapan memadai. Karena data historis, tujuan latihan adalah mengevaluasi pipeline, bukan memberi rekomendasi kebijakan terkini.

Kartu dataset real.

  • Nama: panel indikator subnasional INDO-DAPOER untuk latihan time-aware validation.
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: hingga 2018; contoh split: training ≤2015 dan test 2016–2018 jika data tersedia.
  • Unit observasi: wilayah–tahun.
  • Variabel/definisi: outcome regional dipilih dari indikator numerik; predictors berupa indikator ekonomi/sosial yang diketahui sebelum outcome pada horizon prediksi.
  • Alasan digunakan: struktur waktu memungkinkan demonstrasi perbedaan random split dan temporal holdout serta risiko leakage.
  • Keterbatasan: data historis tidak digunakan untuk klaim kondisi terkini; fitur dengan publikasi terlambat dapat menyebabkan look-ahead bias. (World Bank 2026)

7.8 Analisis Menggunakan R

library(tidymodels)
set.seed(260807)
reg <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |> filter(tahun == 2025)
split <- initial_split(reg, prop = .8, strata = kemiskinan_persen)
tr <- training(split); te <- testing(split)

rec <- recipe(kemiskinan_persen ~ pdrb_perkapita_juta + tpt_persen + internet_persen + ipm + umkm_per_1000,
              data = tr) |>
  step_normalize(all_numeric_predictors())

mod <- linear_reg() |> set_engine("lm")
wf <- workflow() |> add_recipe(rec) |> add_model(mod) |> fit(tr)
p <- predict(wf, te) |> bind_cols(te |> select(kemiskinan_persen))
yardstick::metrics(p, truth = kemiskinan_persen, estimate = .pred)
#> # A tibble: 3 × 3
#>   .metric .estimator .estimate
#>   <chr>   <chr>          <dbl>
#> 1 rmse    standard       1.66 
#> 2 rsq     standard       0.369
#> 3 mae     standard       1.42

7.9 Paket Output Validasi Lengkap

set.seed(260817)
dat7 <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  dplyr::select(kemiskinan_persen, pdrb_perkapita_juta, tpt_persen, internet_persen, ipm, umkm_per_1000)
split7 <- rsample::initial_split(dat7, prop=.8)
tr7 <- rsample::training(split7); te7 <- rsample::testing(split7)
folds7 <- rsample::vfold_cv(tr7, v=5)
wf7 <- workflows::workflow() |>
  workflows::add_recipe(recipes::recipe(kemiskinan_persen ~ ., data=tr7) |> recipes::step_normalize(recipes::all_numeric_predictors())) |>
  workflows::add_model(parsnip::linear_reg() |> parsnip::set_engine("lm"))
res7 <- tune::fit_resamples(wf7, resamples=folds7, metrics=yardstick::metric_set(yardstick::rmse, yardstick::mae, yardstick::rsq))
fold_metric7 <- tune::collect_metrics(res7, summarize=FALSE)
knitr::kable(fold_metric7, digits=3, caption="Metric setiap fold — bukan hanya rata-rata")
Table 7.2: Metric setiap fold — bukan hanya rata-rata
id .metric .estimator .estimate .config
Fold1 rmse standard 1.123 pre0_mod0_post0
Fold1 mae standard 0.926 pre0_mod0_post0
Fold1 rsq standard 0.802 pre0_mod0_post0
Fold2 rmse standard 1.346 pre0_mod0_post0
Fold2 mae standard 1.086 pre0_mod0_post0
Fold2 rsq standard 0.647 pre0_mod0_post0
Fold3 rmse standard 1.328 pre0_mod0_post0
Fold3 mae standard 1.084 pre0_mod0_post0
Fold3 rsq standard 0.667 pre0_mod0_post0
Fold4 rmse standard 1.356 pre0_mod0_post0
Fold4 mae standard 1.016 pre0_mod0_post0
Fold4 rsq standard 0.724 pre0_mod0_post0
Fold5 rmse standard 1.414 pre0_mod0_post0
Fold5 mae standard 1.007 pre0_mod0_post0
Fold5 rsq standard 0.714 pre0_mod0_post0
ggplot2::ggplot(fold_metric7 |> dplyr::filter(.metric %in% c("rmse","mae")), ggplot2::aes(.metric,.estimate)) +
  ggplot2::geom_boxplot(width=.45) + ggplot2::geom_jitter(width=.08, size=2) +
  ggplot2::labs(title="Variabilitas metric antar-fold", x=NULL, y="Nilai metric")

fit7 <- generics::fit(wf7, data = tr7)
pred7 <- predict(fit7, te7) |> dplyr::bind_cols(te7 |> dplyr::select(kemiskinan_persen))
yardstick::metrics(pred7, truth=kemiskinan_persen, estimate=.pred) |>
  knitr::kable(digits=3, caption="Final test metrics setelah resampling selesai")
Table 7.3: Final test metrics setelah resampling selesai
.metric .estimator .estimate
rmse standard 1.096
rsq standard 0.719
mae standard 0.870

7.10 Interpretasi dalam Konteks Regional

Model dengan RMSE 1,2 poin kemiskinan berarti error tipikal berada pada skala sekitar satu poin persentase, tetapi implikasinya berbeda bagi wilayah 3% dan 20%. Evaluasi perlu melihat error menurut kelompok: urban/rural, wilayah miskin/nonmiskin, dan wilayah dengan data terbatas.

7.11 Latihan

  1. Apa perbedaan training error dan test error?
  2. Berikan contoh data leakage dalam monitoring kemiskinan.
  3. Mengapa random split dapat bermasalah untuk data time series?
  4. Analisis: bandingkan split acak dan split waktu pada data simulasi.
  5. Analisis: hitung RMSE per kelompok urban/nonurban.
  6. Mini-case: model nasional bagus tetapi buruk di wilayah timur. Apa evaluasi tambahan yang wajib dilakukan sebelum deployment?

7.11.1 Tugas 3 — Validation & Leakage Audit (2,5%)

Bandingkan minimal dua model pada split yang sesuai dengan deployment (random/group/time). Laporkan baseline, CV metric distribution, final test metric, dan tabel leakage audit. Setiap transformasi harus dikerjakan hanya pada training/resample yang relevan.

7.11.2 Kuis 2 — Minggu 4–7 (2,5%)

Kisi-kisi: summary/inequality; visualisasi; OLS; CI; interaction; RMSE/MAE; cross-validation; bias–variance; ridge/lasso; leakage; baseline comparison.

7.12 Hubungan dengan Capstone Project

Kelompok harus menetapkan evaluation protocol sebelum mencoba banyak model: unit split, metric utama, metric sekunder, baseline, dan subgroup check.

7.13 Kesimpulan

Evaluasi yang jujur lebih penting daripada skor spektakuler. Leakage dapat membuat model tampak hebat namun gagal saat digunakan untuk keputusan nyata.

7.14 Pendalaman Magister — Generalization dan resampling

7.14.1 Audit metodologis

  1. Random split tidak sesuai deployment.
  2. Test set dipakai tuning.
  3. Preprocessing fit pada seluruh data.
  4. Hanya melaporkan satu metric.
  5. Resample dependence diabaikan.
  6. Model kompleks tanpa baseline.

7.14.2 Pertanyaan viva / diskusi kelas

  1. Apa target generalization?
  2. Mengapa temporal split berbeda dari random split?
  3. Apa bias–variance trade-off?
  4. Bagaimana ridge dan lasso berbeda?
  5. Mengapa test set hanya sekali?
  6. Apa arti variability antar-fold?

8 UTS: Integrative Regional Data Case

8.1 Pendahuluan

UTS menguji integrasi kompetensi minggu 1-7. Fokusnya bukan menghafal sintaks, melainkan membuat keputusan analitik yang dapat dipertanggungjawabkan.

8.2 Tujuan Pembelajaran

Mahasiswa mampu mengaudit dataset, merumuskan pertanyaan, melakukan EDA, membangun baseline model, mengevaluasi, dan menulis interpretasi kebijakan singkat secara individual.

8.3 Definisi dan Konsep

UTS menggunakan open-book analytical case. Mahasiswa dapat melihat dokumentasi R, tetapi harus menjelaskan alasan pilihan metode dan interpretasi. Data dapat berupa potongan indikator kabupaten/kota dengan masalah kualitas yang sengaja disisipkan.

8.4 Formulasi Matematis

Formula yang diujikan berasal dari bab 1-7: rate, standardisasi, mean/variance, korelasi, regresi, RMSE, dan MAE. Mahasiswa tidak dinilai karena menghafal formula, tetapi karena memilih formula yang sesuai dan menjelaskan simbol serta unitnya.

8.4.1 Formula sheet UTS yang harus dipahami, bukan dihafal tanpa konteks

UTS mengintegrasikan materi minggu 1–7. Mahasiswa harus dapat menjelaskan kapan setiap rumus relevan dan asumsi apa yang menyertainya.

Rate dan growth r=abk,gt=xtxt1xt1. r=\frac{a}{b}k,\qquad g_t=\frac{x_t-x_{t-1}}{x_{t-1}}.

Z-score z=xxs. z=\frac{x-\bar x}{s}.

Correlation r=i(xix)(yiy)(n1)sxsy. r=\frac{\sum_i(x_i-\bar x)(y_i-\bar y)}{(n-1)s_xs_y}.

OLS β̂=(XX)1Xy. \hat\beta=(X'X)^{-1}X'y.

RMSE/MAE RMSE=n1iei2,MAE=n1i|ei|. RMSE=\sqrt{n^{-1}\sum_i e_i^2},\qquad MAE=n^{-1}\sum_i|e_i|.

CV risk R̂CV=n1kikL(yi,f̂(k)(xi)). \widehat R_{CV}=n^{-1}\sum_{k}\sum_{i\in\mathcal I_k}L(y_i,\hat f^{(-k)}(x_i)).

8.4.2 Filosofi soal UTS

UTS bukan ujian “mengetik kode tercepat”. Sebuah jawaban lengkap memiliki empat lapis:

  1. analytical framing — apa unit analisis dan target keputusan;
  2. statistical correctness — metode, asumsi, dan metrik tepat;
  3. computational reproducibility — kode dapat dijalankan dan transformasi terdokumentasi;
  4. regional interpretation — temuan diterjemahkan ke karakter wilayah, bukan sekadar angka model.

8.4.3 Kisi-kisi UTS (20% nilai akhir)

Area Proporsi skor UTS Kemampuan yang diuji
Problem framing & metadata 15% unit analisis, outcome, provenance, keterbatasan
Data quality & wrangling 20% missing, duplicate, join, feature construction
EDA & visualization 20% memilih ringkasan/grafik dan membaca disparitas
Inferensi/regresi 20% formulasi, asumsi, interpretasi koefisien/CI
Prediction & validation 15% split/CV, RMSE/MAE, leakage
Policy interpretation 10% insight, caveat, recommendation

8.4.4 Bentuk UTS yang disarankan

  • Individual, open-book, akses dokumentasi R diperbolehkan.
  • Dataset regional baru yang strukturnya serupa dengan latihan tetapi angka/topiknya berbeda.
  • Durasi 150–180 menit atau take-home controlled window sesuai kebijakan program.
  • Jawaban: .Rmd/.qmd atau notebook + PDF/HTML hasil render.
  • Generative AI tidak digunakan untuk menghasilkan jawaban selama ujian, kecuali dosen secara eksplisit menetapkan mode AI-assisted; kebijakan harus diumumkan sebelum ujian.

8.4.5 Rubrik ringkas UTS

Setiap bagian dinilai: ketepatan (40%) + alasan metodologis (25%) + interpretasi regional (25%) + reproducibility/komunikasi (10%). Kesalahan yang menghasilkan klaim kebijakan tidak valid dapat menurunkan skor lebih besar daripada kesalahan sintaks kecil yang mudah diperbaiki.

8.5 Intuisi Metode

UTS mensimulasikan situasi analis: data belum sempurna, waktu terbatas, dan stakeholder membutuhkan ringkasan yang akurat. Jawaban terbaik bukan yang memakai model paling kompleks, tetapi yang menjaga validitas dari awal sampai interpretasi.

8.5.1 Mock UTS Case — struktur jawaban ideal

Kasus: dataset 27 kabupaten/kota × 2016–2024 berisi TPT, kemiskinan, pertumbuhan PDRB, internet, dan pendidikan. Ada duplikasi 6 key, missing internet 2020 untuk 4 wilayah, dan satu nilai TPT=82 akibat salah decimal.

Langkah 1 — audit. Jangan langsung drop_na(). Identifikasi duplicate key dan nilai impossible. Verifikasi dari source sebelum koreksi.

Langkah 2 — feature. Untuk memprediksi TPT 2024, fitur yang berasal dari outcome 2024 tidak boleh digunakan. Gunakan lag 2023 atau indikator yang tersedia sebelum keputusan.

Langkah 3 — EDA. Minimal satu grafik trend, satu cross-sectional relationship, satu regional ranking/map. Setiap grafik punya source/unit.

Langkah 4 — baseline. Fit model linear pada ≤2022, validasi 2023, test 2024. Interpretasikan conditional associations.

Langkah 5 — metric. Jika RMSE 1.4 percentage points, terjemahkan: “typical squared-error scale sekitar 1.4 poin TPT”, bukan “akurasi 98.6%”.

Langkah 6 — policy memo. Pisahkan observation, hypothesis, dan recommendation.

8.5.2 Contoh scoring jawaban

Jawaban dengan kode sempurna tetapi menggunakan data 2024 untuk feature yang memprediksi 2024 dapat kehilangan skor besar karena target leakage. Sebaliknya syntax kecil yang tidak memengaruhi kesimpulan dapat mendapat penalti lebih ringan. Ini menegaskan prioritas validitas dibanding kosmetika.

8.5.3 Mini formula drill

  1. Dari 12 ke 9: relative change =(912)/12=25%=(9-12)/12=-25\%.
  2. Error (1,2,3)(1,-2,3): MAE=2MAE=2, RMSE=14/3=2.160RMSE=\sqrt{14/3}=2.160.
  3. Jika Rj2=0.9R_j^2=0.9, VIF=10VIF=10.
  4. Jika mean=50, SD=10, x=70x=70, z-score=2.
  5. Jika SSE=200, SST=500, R2=0.6R^2=0.6.

Mahasiswa seharusnya mampu menghitung dan menjelaskan makna tiap hasil.

8.5.4 UTS reproducibility checklist

File harus dapat di-knit dari awal. Gunakan path relatif; jangan menggunakan setwd("/Users/nama/Desktop"); jangan menyunting angka output secara manual; dan catat package yang dipakai. Bila data ujian disediakan lokal, gunakan here atau struktur folder sederhana.

8.6 Contoh dengan Data Simulasi

set.seed(260808)
uts_case <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  filter(tahun %in% c(2023, 2024, 2025)) |>
  sample_n(60) |>
  mutate(internet_persen = if_else(row_number() %% 13 == 0, NA_real_, internet_persen))
knitr::kable(head(uts_case, 8), digits = 2, caption = "Contoh struktur data case UTS")
Table 8.1: Contoh struktur data case UTS
wilayah tahun urban longitude latitude pdrb_perkapita_juta kemiskinan_persen tpt_persen ipm internet_persen umkm_per_1000 indeks_pendidikan akses_kesehatan indeks_inovasi
Wilayah_23 2025 0 106.92 -6.89 41.20 13.05 7.05 69.78 72.33 35.41 65.93 70.35 70.57
Wilayah_27 2023 1 107.67 -6.04 42.78 12.10 8.44 67.63 77.99 31.82 65.90 59.45 66.14
Wilayah_08 2023 0 106.96 -6.76 32.64 12.09 6.92 68.94 64.86 30.16 70.45 60.78 59.17
Wilayah_18 2025 1 107.84 -7.68 53.71 9.84 7.75 70.68 84.59 40.48 64.91 63.78 67.93
Wilayah_24 2024 1 108.35 -6.50 52.89 11.27 7.99 68.66 82.10 38.27 62.40 60.52 63.88
Wilayah_16 2023 1 107.54 -7.54 46.36 9.45 9.43 65.87 77.38 32.02 59.58 55.15 64.34
Wilayah_21 2025 0 107.06 -6.75 24.04 11.24 6.74 67.78 65.66 31.20 60.43 64.54 60.84
Wilayah_10 2025 1 107.47 -7.51 66.15 8.52 8.09 71.62 96.99 46.95 77.19 76.32 70.22

8.6.1 Visualisasi Output: Audit Missing Data untuk Kasus UTS

uts_case |>
  dplyr::summarise(dplyr::across(dplyr::everything(), ~mean(is.na(.x)))) |>
  tidyr::pivot_longer(dplyr::everything(), names_to = "variabel", values_to = "prop_missing") |>
  dplyr::filter(prop_missing > 0) |>
  ggplot2::ggplot(ggplot2::aes(reorder(variabel, prop_missing), prop_missing)) +
  ggplot2::geom_col(fill = "#C99A17") +
  ggplot2::coord_flip() +
  ggplot2::scale_y_continuous(labels = scales::percent) +
  ggplot2::labs(title = "Proporsi missing pada data kasus UTS", x = NULL, y = "Proporsi missing")

8.7 Contoh dengan Data Nyata

Dosen dapat mengganti case dengan subset Open Data Jabar yang diunduh sebelum ujian. Dataset dan metadata diberikan bersama agar ujian mengukur analisis, bukan kemampuan mencari URL.

Kartu dataset real untuk UTS.

8.8 Analisis Menggunakan R

Template minimum jawaban:

dat <- uts_case |> tidyr::drop_na()
fit <- lm(kemiskinan_persen ~ internet_persen + pdrb_perkapita_juta + tpt_persen, data = dat)
broom::glance(fit) |>
  dplyr::select(r.squared, adj.r.squared, sigma, AIC) |>
  knitr::kable(digits = 3, caption = "Output contoh UTS: ringkasan baseline regression")
Table 8.2: Output contoh UTS: ringkasan baseline regression
r.squared adj.r.squared sigma AIC
0.573 0.549 1.246 189.426

8.9 Interpretasi dalam Konteks Regional

Nilai tinggi diberikan untuk interpretasi yang mengenali trade-off dan ketidakpastian. Mahasiswa harus menghindari kalimat kausal jika desain data hanya observasional.

8.10 Latihan

  1. Buat checklist 10 menit pertama saat menerima dataset baru.
  2. Apa bukti minimal bahwa model baseline layak?
  3. Apa tiga hal yang harus ada dalam executive summary analitik?
  4. Analisis: kerjakan ulang salah satu mini-case bab 1-7 tanpa melihat solusi.
  5. Analisis: buat fungsi R untuk audit missing dan duplikasi.
  6. Mini-case: tulis policy note 200 kata dari satu grafik dan satu model.

8.10.1 Latihan Pra-UTS

Kerjakan satu mock case 90 menit: data kabupaten–tahun dengan dua masalah kualitas, satu missing mechanism yang perlu didiskusikan, satu visualisasi yang salah, dan satu baseline regression. Jawaban harus memuat kode serta policy interpretation.

8.10.2 Checklist Sebelum UTS

Mahasiswa harus dapat menjelaskan tanpa membuka catatan: unit analisis; denominator; z-score; correlation; OLS objective; arti CI; RMSE vs MAE; K-fold CV; data leakage; dan mengapa prediksi tidak identik dengan kausalitas.

8.11 Hubungan dengan Capstone Project

UTS menjadi quality gate: kelemahan individu yang muncul pada UTS harus diperbaiki sebelum tim masuk ke model ML capstone.

8.12 Kesimpulan

UTS menilai integrasi, bukan potongan teknik. Kemampuan mendokumentasikan keputusan analitik sama pentingnya dengan mendapatkan output model.

8.13 Pendalaman Magister — Integrasi pra-UTS

8.13.1 Audit metodologis

  1. Syntax diprioritaskan di atas validitas.
  2. Metadata dilewati.
  3. Jawaban tidak membedakan association/prediction.
  4. Metric tanpa unit.
  5. Kode tidak reproducible.
  6. Rekomendasi tidak traceable ke hasil.

8.13.2 Pertanyaan viva / diskusi kelas

  1. Bagaimana mengaudit kasus baru dalam 10 menit pertama?
  2. Rumus apa yang harus dipahami bukan dihafal?
  3. Bagaimana menemukan leakage?
  4. Apa bentuk jawaban policy interpretation yang baik?
  5. Bagaimana memprioritaskan waktu ujian?
  6. Apa bukti minimal sebelum recommendation?

9 Machine Learning untuk Data Regional

9.1 Pendahuluan

Machine learning berguna ketika hubungan antarvariabel kompleks, interaksi banyak, atau tujuan utama adalah prediksi. Namun model harus dibandingkan dengan baseline yang sederhana dan dipilih berdasarkan generalisasi, interpretabilitas, biaya kesalahan, serta konteks implementasi. (James dkk. 2021; Kuhn dan Silge 2022)

9.2 Tujuan Pembelajaran

Mahasiswa mampu menjelaskan bias-variance trade-off, membangun workflow ML dengan resampling, menggunakan tree-based model, dan membandingkan kinerja dengan regresi baseline.

9.3 Definisi dan Konsep

Bias adalah error sistematis dari model yang terlalu sederhana; variance adalah sensitivitas model terhadap perubahan sampel. Random forest menggabungkan banyak pohon dengan bootstrap dan random feature selection sehingga variance berkurang. (Breiman 2001)

9.4 Formulasi Matematis

Dekomposisi error prediksi secara konseptual:

E[(Yf̂(X))2]=σ2+Bias[f̂(X)]2+Var[f̂(X)]. E[(Y-\hat f(X))^2]=\sigma^2 + Bias[\hat f(X)]^2 + Var[\hat f(X)].

Untuk random forest regresi, prediksi adalah rata-rata pohon:

f̂RF(x)=1Bb=1Bf̂(b)(x), \hat f_{RF}(x)=\frac{1}{B}\sum_{b=1}^{B}\hat f^{(b)}(x),

dengan BB jumlah pohon.

9.4.1 Decision tree untuk regresi

Pada node RR, prediksi konstan terbaik untuk squared error adalah mean ĉR=1|R|i:xiRyi. \hat c_R=\frac{1}{|R|}\sum_{i:x_i\in R}y_i. Split (j,s)(j,s) dipilih untuk meminimalkan i:xiR1(j,s)(yiĉ1)2+i:xiR2(j,s)(yiĉ2)2. \sum_{i:x_i\in R_1(j,s)}(y_i-\hat c_1)^2+ \sum_{i:x_i\in R_2(j,s)}(y_i-\hat c_2)^2. Tree yang terlalu dalam cenderung overfit; hyperparameter seperti min_n, depth, atau cost complexity mengendalikan kompleksitas. (James dkk. 2021)

9.4.2 Classification tree: Gini dan entropy

Jika node mm memiliki proporsi kelas p̂mk\hat p_{mk}, Gini(m)=k=1Kp̂mk(1p̂mk)=1kp̂mk2. Gini(m)=\sum_{k=1}^{K}\hat p_{mk}(1-\hat p_{mk})=1-\sum_k\hat p_{mk}^2. Entropy: H(m)=k=1Kp̂mklogp̂mk. H(m)=-\sum_{k=1}^{K}\hat p_{mk}\log\hat p_{mk}. Split dicari untuk menurunkan impurity tertimbang.

9.4.3 Bagging dan random forest

Untuk bootstrap sample b=1,,Bb=1,\ldots,B, fit tree f̂(b)\hat f^{(b)}. Prediksi regresi bagging: f̂bag(x)=1Bb=1Bf̂(b)(x). \hat f_{bag}(x)=\frac{1}{B}\sum_{b=1}^{B}\hat f^{(b)}(x). Random forest menambahkan random subset fitur pada setiap split untuk mengurangi korelasi antar-tree; prinsip ini dapat menurunkan variance ensemble. (Breiman 2001)

Untuk klasifikasi, probabilitas dapat diperkirakan dari rata-rata probabilitas tree atau proporsi votes: p̂k(x)=1Bb=1BI{f̂(b)(x)=k}. \hat p_k(x)=\frac{1}{B}\sum_{b=1}^{B}I\{\hat f^{(b)}(x)=k\}.

9.4.4 Gradient boosting

Boosting membangun model aditif FM(x)=F0(x)+m=1Mνρmhm(x), F_M(x)=F_0(x)+\sum_{m=1}^{M}\nu\rho_m h_m(x), dengan weak learner hmh_m, step size ρm\rho_m, dan learning rate 0<ν10<\nu\le1. Pada setiap iterasi, learner baru diarahkan untuk mengurangi loss melalui negative gradient. (Friedman 2001)

XGBoost menambahkan regularization pada objective: (t)=il(yi,ŷi(t1)+ft(xi))+Ω(ft), \mathcal L^{(t)}=\sum_i l(y_i,\hat y_i^{(t-1)}+f_t(x_i))+\Omega(f_t), dengan penalti kompleksitas tree Ω(ft)\Omega(f_t). (Chen dan Guestrin 2016)

9.4.5 Variable importance bukan bukti sebab-akibat

Permutation importance untuk fitur jj dapat diringkas sebagai kenaikan error setelah nilai fitur tersebut diacak: VIj=Errperm(j)Errbase. VI_j=Err_{perm(j)}-Err_{base}. Jika dua prediktor sangat berkorelasi, importance dapat tersebar/tidak stabil. Importance menunjukkan kontribusi prediktif dalam model dan distribusi data tertentu, bukan efek intervensi. Untuk kebijakan, gunakan sebagai alat diagnosis model, bukan klaim kausal.

9.4.6 Baseline-first principle

Model kompleks M1M_1 harus dibandingkan dengan baseline M0M_0. Perbaikan relatif error: Δrel=Err(M0)Err(M1)Err(M0)×100%. \Delta_{rel}=\frac{Err(M_0)-Err(M_1)}{Err(M_0)}\times100\%. Jika perbaikan sangat kecil tetapi kompleksitas, biaya komputasi, dan kesulitan interpretasi meningkat tajam, baseline dapat lebih layak untuk sistem kebijakan.

9.5 Intuisi Metode

Satu pohon mudah dijelaskan tetapi tidak stabil. Random forest membuat banyak pohon yang berbeda dan merata-ratakan keputusan. Kinerja dapat meningkat, tetapi interpretasi kebijakan menjadi lebih tidak langsung; gunakan variable importance atau partial dependence secara hati-hati, bukan sebagai bukti kausal.

9.5.1 Worked Example — mencari split tree

Node memiliki outcome (3,4,5,10,12,13)(3,4,5,10,12,13) dan satu fitur yang memungkinkan split setelah observasi ke-3. Mean kiri =4, mean kanan =11.667. SSE split: SSEL=(34)2+(44)2+(54)2=2, SSE_L=(3-4)^2+(4-4)^2+(5-4)^2=2, SSER=(1011.667)2+(1211.667)2+(1311.667)24.667. SSE_R=(10-11.667)^2+(12-11.667)^2+(13-11.667)^2\approx4.667. Total 6.667. Tree membandingkan candidate split lain dan memilih penurunan impurity terbesar.

9.5.2 Gini impurity numeric

Node memiliki 8 prioritas dan 2 non-prioritas: Gini=1(0.82+0.22)=0.32. Gini=1-(0.8^2+0.2^2)=0.32. Node pure 10/0 memiliki Gini=0. Split yang menghasilkan child lebih pure menurunkan weighted impurity.

9.5.3 Bagging variance intuition

Jika BB estimator individual memiliki variance σ2\sigma^2 dan pairwise correlation ρ\rho, variance rata-rata kira-kira Var(f)=ρσ2+1ρBσ2. Var(\bar f)=\rho\sigma^2+\frac{1-\rho}{B}\sigma^2. Menambah BB mengurangi komponen kedua, tetapi tidak menghilangkan komponen korelasi. Random feature selection pada random forest bertujuan menurunkan correlation antartree. (Breiman 2001)

9.5.4 Boosting learning rate

Learning rate kecil ν\nu memerlukan lebih banyak trees tetapi sering memberi regularization lebih baik. Ada trade-off antara trees, tree_depth, dan learn_rate. Tuning harus dilakukan pada resamples training; jangan memilih parameter karena satu test metric terlihat paling baik.

9.5.5 Model card ringkas

Untuk model project, buat tabel:

Elemen Isi
Intended use screening wilayah untuk review
Not intended menentukan penerima individu
Training period contoh 2015–2022
Target TPT 2023 atau prioritas biner
Metrics RMSE/MAE atau PR-AUC/calibration
Key limitations historical coverage, spatial dependence
Fairness slices urban/rural atau kawasan bila justified

Dokumentasi model semacam ini sejalan dengan gagasan model cards. (Mitchell dkk. 2019)

9.5.6 R comparison template

models <- tibble::tribble(
  ~model, ~kompleksitas, ~kekuatan, ~risiko,
  "Linear regression", "Rendah", "Interpretabel; baseline kuat", "Nonlinearitas tidak tertangkap",
  "Decision tree", "Sedang", "Aturan keputusan mudah dijelaskan", "Tidak stabil; mudah overfit",
  "Random forest", "Tinggi", "Menangkap nonlinearitas/interaksi", "Interpretasi lebih sulit"
)
knitr::kable(models, caption = "Output: model comparison matrix sebelum tuning")
Table 9.1: Output: model comparison matrix sebelum tuning
model kompleksitas kekuatan risiko
Linear regression Rendah Interpretabel; baseline kuat Nonlinearitas tidak tertangkap
Decision tree Sedang Aturan keputusan mudah dijelaskan Tidak stabil; mudah overfit
Random forest Tinggi Menangkap nonlinearitas/interaksi Interpretasi lebih sulit

9.5.7 Interpretability hierarchy

Gunakan tiga lapis: (1) global performance, (2) global structure/importance, (3) local prediction explanation. Jangan meloncat ke local explanation bila model global tidak tervalidasi. Penjelasan model tidak memperbaiki model yang salah atau data yang tidak relevan.

9.6 Contoh dengan Data Simulasi

library(tidymodels)
set.seed(260809)
dat <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |> filter(tahun == 2025)
s <- initial_split(dat, prop = .8)
tr <- training(s); te <- testing(s)

rf_spec <- rand_forest(trees = 500, mtry = 4, min_n = 3) |>
  set_engine("ranger", importance = "permutation") |>
  set_mode("regression")

rf_fit <- workflow() |>
  add_formula(kemiskinan_persen ~ pdrb_perkapita_juta + tpt_persen + ipm + internet_persen + umkm_per_1000 + akses_kesehatan) |>
  add_model(rf_spec) |>
  fit(tr)

predict(rf_fit, te) |>
  bind_cols(te |> select(kemiskinan_persen)) |>
  yardstick::metrics(truth = kemiskinan_persen, estimate = .pred)
#> # A tibble: 3 × 3
#>   .metric .estimator .estimate
#>   <chr>   <chr>          <dbl>
#> 1 rmse    standard     1.90   
#> 2 rsq     standard     0.00147
#> 3 mae     standard     1.51

9.7 Contoh dengan Data Nyata

INDO-DAPOER dapat menyediakan fitur sosial-ekonomi lintas kabupaten. Karena jumlah indikator sangat banyak dan missingness bervariasi, pemilihan fitur harus mengikuti teori dan data availability; memasukkan semua indikator tanpa screening dapat meningkatkan leakage dan instability.

Kartu dataset real.

  • Nama: panel multivariat INDO-DAPOER.
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: hingga 2018; satu rentang waktu konsisten dipilih setelah audit missingness.
  • Unit observasi: kabupaten/kota–tahun.
  • Variabel/definisi: outcome (mis. poverty rate/HDI) dan features fiskal, ekonomi, sosial-demografi, atau infrastruktur; setiap feature mempertahankan kode indikator dan metadata aslinya.
  • Alasan digunakan: jumlah indikator memungkinkan perbandingan model linear dengan tree-based/nonlinear model tanpa kehilangan konteks regional.
  • Keterbatasan: high-dimensional missingness, collinearity, dan leakage; feature screening harus berbasis teori dan availability pada waktu prediksi. (World Bank 2026)

9.8 Analisis Menggunakan R

# Bandingkan model sederhana dan RF pada split yang sama.
lm_fit <- linear_reg() |> set_engine("lm") |>
  fit(kemiskinan_persen ~ pdrb_perkapita_juta + tpt_persen + ipm + internet_persen + umkm_per_1000 + akses_kesehatan,
      data = tr)

lm_pred <- predict(lm_fit, te) |> bind_cols(te |> select(kemiskinan_persen))
rf_pred <- predict(rf_fit, te) |> bind_cols(te |> select(kemiskinan_persen))

bind_rows(
  yardstick::metrics(lm_pred, kemiskinan_persen, .pred) |> mutate(model = "Linear"),
  yardstick::metrics(rf_pred, kemiskinan_persen, .pred) |> mutate(model = "Random forest")
) |>
  filter(.metric %in% c("rmse", "mae")) |>
  select(model, .metric, .estimate) |>
  knitr::kable(digits = 3)
model .metric .estimate
Linear rmse 2.114
Linear mae 1.797
Random forest rmse 1.896
Random forest mae 1.510

9.8.1 Visualisasi Output: Perbandingan Prediksi Model

vis_compare <- dplyr::bind_rows(
  lm_pred |> dplyr::transmute(actual = kemiskinan_persen, pred = .pred, model = "Linear regression"),
  rf_pred |> dplyr::transmute(actual = kemiskinan_persen, pred = .pred, model = "Random forest")
)
ggplot2::ggplot(vis_compare, ggplot2::aes(actual, pred)) +
  ggplot2::geom_abline(slope = 1, intercept = 0, linetype = 2, colour = "#C99A17") +
  ggplot2::geom_point(alpha = .7, colour = "#145B8C") +
  ggplot2::facet_wrap(~model) +
  ggplot2::labs(title = "Aktual versus prediksi pada split yang sama", x = "Aktual", y = "Prediksi")

9.9 Paket Output Machine Learning Lengkap

rf_engine9 <- workflows::extract_fit_engine(rf_fit)
imp9 <- tibble::enframe(rf_engine9$variable.importance, name="feature", value="importance") |>
  dplyr::arrange(dplyr::desc(importance))
knitr::kable(imp9, digits=3, caption="Permutation variable importance Random Forest")
Table 9.2: Permutation variable importance Random Forest
feature importance
pdrb_perkapita_juta 2.214
internet_persen 0.132
umkm_per_1000 0.032
akses_kesehatan 0.014
tpt_persen -0.060
ipm -0.071
ggplot2::ggplot(imp9, ggplot2::aes(reorder(feature, importance), importance)) +
  ggplot2::geom_col() + ggplot2::coord_flip() +
  ggplot2::labs(title="Variable importance Random Forest", x=NULL, y="Permutation importance")

error9 <- dplyr::bind_rows(
  lm_pred |> dplyr::mutate(model="Linear"),
  rf_pred |> dplyr::mutate(model="Random forest")
) |> dplyr::mutate(error=.pred-kemiskinan_persen)
err_summary9 <- error9 |> dplyr::group_by(model) |>
  dplyr::summarise(RMSE=sqrt(mean(error^2)), MAE=mean(abs(error)), Bias=mean(error), MaxAbs=max(abs(error)), .groups="drop")
knitr::kable(err_summary9, digits=3, caption="Perbandingan distribusi error model")
Table 9.3: Perbandingan distribusi error model
model RMSE MAE Bias MaxAbs
Linear 2.114 1.797 0.401 3.534
Random forest 1.896 1.510 0.464 3.876
ggplot2::ggplot(error9, ggplot2::aes(.pred, error)) +
  ggplot2::geom_hline(yintercept=0,linetype=2) + ggplot2::geom_point(alpha=.75) +
  ggplot2::facet_wrap(~model) + ggplot2::labs(title="Residual diagnostic pada holdout", x="Prediksi", y="Error prediksi")

9.10 Interpretasi dalam Konteks Regional

Jika random forest hanya memperbaiki RMSE sedikit tetapi jauh lebih sulit dijelaskan, model linear mungkin lebih berguna untuk dialog kebijakan. Sebaliknya, jika tujuan operasional adalah screening ribuan unit dan RF mengurangi false negatives secara substansial, kompleksitas tambahan dapat dibenarkan.

9.11 Latihan

  1. Jelaskan bias-variance trade-off dengan bahasa nonteknis.
  2. Mengapa variable importance bukan ukuran kausal?
  3. Kapan baseline sederhana sebaiknya dipertahankan?
  4. Analisis: variasikan mtry dan min_n lalu bandingkan kinerja.
  5. Analisis: evaluasi error model pada 20% wilayah dengan kemiskinan tertinggi.
  6. Mini-case: model RF naik 2% akurasi tetapi tidak dapat dijelaskan kepada dinas pelaksana. Tentukan kriteria keputusan apakah model baru layak dipakai.

9.11.1 Tugas Terstruktur Pertemuan 9

Gunakan dataset yang sama untuk baseline linear model, regression tree, dan random forest. Pastikan split sama. Bandingkan RMSE/MAE, training time secara sederhana, dan interpretability. Beri rekomendasi model untuk deployment pemerintah daerah—boleh memilih model yang bukan paling akurat bila alasannya kuat.

9.11.2 Kuis Formatif Pertemuan 9

  1. Apa fungsi bootstrap dalam bagging?
  2. Mengapa random subset fitur dipakai pada random forest?
  3. Apa beda bagging dan boosting?
  4. Mengapa variable importance bukan causal effect?
  5. Apa makna relative error improvement 3% terhadap baseline?

9.12 Hubungan dengan Capstone Project

Milestone model dimulai: minimal satu baseline interpretable dan satu model alternatif. Tim harus mendokumentasikan alasan perbandingan, bukan sekadar menambah algoritma.

9.13 Kesimpulan

Machine learning memberi fleksibilitas, bukan otomatis validitas. Keunggulannya harus dibuktikan pada data holdout dan dikaitkan dengan keputusan kebijakan.

9.14 Pendalaman Magister — Tree-based machine learning

9.14.1 Audit metodologis

  1. Tuning pada test.
  2. Importance ditafsirkan kausal.
  3. Lebih banyak trees dianggap selalu lebih baik secara substantif.
  4. Imbalance diabaikan.
  5. Model card tidak dibuat.
  6. Baseline sederhana tidak dibandingkan.

9.14.2 Pertanyaan viva / diskusi kelas

  1. Bagaimana tree memilih split?
  2. Mengapa RF menurunkan korelasi tree?
  3. Apa beda bagging dan boosting?
  4. Apa fungsi learning rate?
  5. Apa keterbatasan permutation importance?
  6. Kapan model linear lebih layak dipilih?

10 Classification dan Prioritisasi Intervensi

10.1 Pendahuluan

Classification relevan saat outcome bersifat kategori: desa prioritas/nonprioritas, risiko tinggi/rendah, UMKM potensial/tidak, atau keberhasilan program. Namun threshold classification adalah keputusan yang membawa konsekuensi alokasi sumber daya.

10.2 Tujuan Pembelajaran

Mahasiswa mampu menerapkan logistic regression dan classifier, membaca confusion matrix, precision, recall, specificity, F1, ROC-AUC, dan memilih threshold berdasarkan biaya kesalahan.

10.3 Definisi dan Konsep

False negative dapat lebih mahal daripada false positive jika model digunakan untuk mendeteksi wilayah yang sangat rentan. Karena itu, accuracy saja tidak cukup, terutama bila kelas tidak seimbang.

10.4 Formulasi Matematis

Logistic regression:

log(pi1pi)=β0+𝛃𝐱i, \log\left(\frac{p_i}{1-p_i}\right)=\beta_0+\boldsymbol\beta^\top\mathbf x_i,

dengan pi=P(Yi=1Xi)p_i=P(Y_i=1\mid X_i).

Precision dan recall:

Precision=TPTP+FP,Recall=TPTP+FN. Precision=\frac{TP}{TP+FP},\qquad Recall=\frac{TP}{TP+FN}.

F1:

F1=2Precision×RecallPrecision+Recall. F1=2\frac{Precision\times Recall}{Precision+Recall}.

10.4.1 Logistic regression

Untuk Yi{0,1}Y_i\in\{0,1\}, pi=P(Yi=1Xi). p_i=P(Y_i=1\mid X_i). Logit model: log(pi1pi)=β0+j=1pβjxij. \log\left(\frac{p_i}{1-p_i}\right)=\beta_0+\sum_{j=1}^{p}\beta_jx_{ij}. Sehingga pi=exp(ηi)1+exp(ηi),ηi=β0+𝐱iβ. p_i=\frac{\exp(\eta_i)}{1+\exp(\eta_i)},\qquad \eta_i=\beta_0+\mathbf x_i'\beta. Odds ratio untuk kenaikan satu unit xjx_j adalah exp(βj)\exp(\beta_j), dengan prediktor lain tetap. Interpretasi odds ratio bukan perubahan probabilitas absolut yang konstan.

10.4.2 Likelihood dan cross-entropy

Likelihood Bernoulli: L(β)=i=1npiyi(1pi)1yi. L(\beta)=\prod_{i=1}^{n}p_i^{y_i}(1-p_i)^{1-y_i}. Negative log-likelihood / binary cross-entropy: (β)=i[yilogpi+(1yi)log(1pi)]. -\ell(\beta)=-\sum_i\left[y_i\log p_i+(1-y_i)\log(1-p_i)\right].

10.4.3 Confusion matrix dan metrik

Dengan TP, TN, FP, FN: Accuracy=TP+TNTP+TN+FP+FN, Accuracy=\frac{TP+TN}{TP+TN+FP+FN}, Sensitivity=Recall=TPTP+FN, Sensitivity=Recall=\frac{TP}{TP+FN}, Specificity=TNTN+FP, Specificity=\frac{TN}{TN+FP}, Precision=TPTP+FP, Precision=\frac{TP}{TP+FP}, F1=2Precision×RecallPrecision+Recall. F_1=2\frac{Precision\times Recall}{Precision+Recall}.

Balanced accuracy: BA=Sensitivity+Specificity2. BA=\frac{Sensitivity+Specificity}{2}. Untuk kelas prioritas yang jarang, accuracy dapat tinggi walaupun seluruh kasus prioritas gagal ditemukan.

10.4.4 Threshold berbasis biaya

Jika tindakan diberikan saat p̂it\hat p_i\ge t, expected classification cost pada validation data: C(t)=CFNFN(t)+CFPFP(t). C(t)=C_{FN}FN(t)+C_{FP}FP(t). Pilih tt yang meminimalkan biaya atau memenuhi kapasitas intervensi. Jika pemerintah hanya mampu menangani 15% wilayah, threshold dapat dikaitkan dengan kuantil risk score, tetapi keputusan itu harus transparan.

10.4.5 ROC, AUC, dan precision-recall

ROC memplot TPR vs FPR dengan FPR=1Specificity. FPR=1-Specificity. AUC dapat dipahami sebagai AUC=P(p̂+>p̂), AUC=P(\hat p^{+}>\hat p^{-}), probabilitas satu observasi positif acak memperoleh score lebih tinggi daripada observasi negatif acak. (Fawcett 2006)

AUC mengukur ranking discrimination, bukan calibration dan bukan manfaat kebijakan. Untuk kelas sangat imbalanced, precision–recall curve sering lebih informatif.

10.4.6 Calibration

Prediksi terkalibrasi berarti di antara unit dengan p̂0.2\hat p\approx0.2, sekitar 20% benar-benar positif pada data serupa. Calibration intercept/slope dapat diperiksa melalui model logitP(Y=1)=α+γlogit(p̂). \operatorname{logit}P(Y=1)=\alpha+\gamma\operatorname{logit}(\hat p). Idealnya α=0\alpha=0 dan γ=1\gamma=1. Calibration penting jika probabilitas dipakai untuk alokasi sumber daya, bukan hanya ranking.

10.5 Intuisi Metode

Threshold 0,5 bukan hukum alam. Jika anggaran hanya mampu mengintervensi 15% desa, threshold dapat ditetapkan berdasarkan kapasitas program dan tujuan, lalu kinerja serta fairness dinilai pada threshold itu.

10.5.1 Worked Example — confusion matrix

Dari 200 wilayah/desa: TP=30, FN=10, FP=40, TN=120. Sensitivity=30/(30+10)=0.75, Sensitivity=30/(30+10)=0.75, Specificity=120/(120+40)=0.75, Specificity=120/(120+40)=0.75, Precision=30/(30+40)=0.429, Precision=30/(30+40)=0.429, Accuracy=(30+120)/200=0.75, Accuracy=(30+120)/200=0.75, F1=2(0.429)(0.75)/(0.429+0.75)=0.545. F_1=2(0.429)(0.75)/(0.429+0.75)=0.545. Interpretasi: model menemukan 75% kasus prioritas, tetapi hanya 43% dari unit yang ditandai benar-benar prioritas berdasarkan label. Jika verifikasi lapangan murah, precision ini mungkin dapat diterima; jika intervensi mahal, threshold perlu ditinjau.

10.5.2 Threshold trade-off

Jika threshold turun, secara umum sensitivity naik dan specificity turun. Pilih threshold dari validation, bukan test. Bila CFN=4C_{FN}=4, CFP=1C_{FP}=1: C(t)=4FN(t)+FP(t). C(t)=4FN(t)+FP(t). Bandingkan beberapa tt, lalu lakukan sanity check apakah jumlah unit terpilih sesuai kapasitas program.

10.5.3 Odds ratio vs probability

Jika β=log(2)\beta=\log(2), odds ratio=2. Bila baseline probability 0.10, odds=0.111; setelah dua kali odds=0.222, probability=0.182. Kenaikan probability hanya 8.2 points. Bila baseline probability 0.50, odds=1 →2, probability=0.667, naik 16.7 points. Efek probability bergantung baseline.

10.5.4 Calibration bins

Bagi prediksi menjadi deciles/bin. Untuk bin bb: pb=1nbibp̂i,yb=1nbibyi.\bar p_b=\frac{1}{n_b}\sum_{i\in b}\hat p_i,\qquad \bar y_b=\frac{1}{n_b}\sum_{i\in b}y_i. Plot pb\bar p_b vs yb\bar y_b; garis ideal y=xy=x. Untuk kebijakan risk-based, calibration dapat lebih penting daripada sedikit perbedaan AUC.

10.5.5 R threshold table

set.seed(260820)
prob <- runif(200)
y <- rbinom(200,1,prob)
thresholds <- c(.2,.3,.4,.5,.6)
threshold_table <- purrr::map_dfr(thresholds, function(t){
  pred <- as.integer(prob>=t)
  TP <- sum(pred==1 & y==1); FN <- sum(pred==0 & y==1)
  FP <- sum(pred==1 & y==0); TN <- sum(pred==0 & y==0)
  tibble(threshold=t,
         sensitivity=TP/(TP+FN), specificity=TN/(TN+FP),
         precision=ifelse(TP+FP==0,NA,TP/(TP+FP)),
         selected=TP+FP, cost=4*FN+FP)
})
knitr::kable(threshold_table, digits=3)
threshold sensitivity specificity precision selected cost
0.2 0.980 0.314 0.578 166 78
0.3 0.939 0.500 0.643 143 75
0.4 0.898 0.588 0.677 130 82
0.5 0.827 0.735 0.750 108 95
0.6 0.724 0.833 0.807 88 125

10.5.6 Policy question before metric

  • Jika tujuan screening, false negative biasanya lebih mahal → sensitivity.
  • Jika intervensi mahal dan kapasitas terbatas → precision/PPV + cost.
  • Jika ranking untuk manual review → AUC/PR + top-k capture.
  • Jika probability masuk formula alokasi → calibration.

Tidak ada “metric terbaik” tanpa decision context. (Fawcett 2006)

10.6 Contoh dengan Data Simulasi

library(tidymodels)
set.seed(260810)

# Membaca data simulasi dan menstandarkan label kelas.
# "prioritas" sengaja ditempatkan sebagai level pertama karena dalam yardstick
# level pertama adalah event class secara default.
desa <- read_csv("data/simulasi_klasifikasi_desa.csv", show_col_types = FALSE) |>
  mutate(
    .label_raw = tolower(trimws(as.character(prioritas_intervensi))),
    prioritas_intervensi = case_when(
      .label_raw %in% c("1", "prioritas", "ya", "yes", "true") ~ "prioritas",
      .label_raw %in% c("0", "non", "non-prioritas", "tidak", "no", "false") ~ "non",
      TRUE ~ NA_character_
    )
  ) |>
  select(-.label_raw)

# Guardrail pedagogis: ROC hanya terdefinisi jika kedua kelas tersedia.
# Jika file simulasi lama memiliki kelas yang terlalu timpang atau labelnya tidak
# dikenali, label simulasi dibentuk ulang dari skor kerentanan regional.
zscore_safe <- function(x) {
  sx <- stats::sd(x, na.rm = TRUE)
  mx <- mean(x, na.rm = TRUE)
  if (!is.finite(sx) || sx == 0) return(rep(0, length(x)))
  (x - mx) / sx
}

class_count <- desa |>
  filter(!is.na(prioritas_intervensi)) |>
  count(prioritas_intervensi, name = "n")

if (nrow(class_count) < 2 || min(class_count$n) < 8 || anyNA(desa$prioritas_intervensi)) {
  skor_kerentanan <- with(
    desa,
    1.00 * zscore_safe(kemiskinan_persen) +
    0.55 * zscore_safe(jarak_pusat_km) -
    0.45 * zscore_safe(akses_kesehatan) -
    0.40 * zscore_safe(kualitas_jalan) -
    0.50 * zscore_safe(internet_persen)
  )

  batas_prioritas <- as.numeric(stats::quantile(
    skor_kerentanan, probs = 0.70, na.rm = TRUE, names = FALSE
  ))

  desa <- desa |>
    mutate(
      prioritas_intervensi = if_else(
        skor_kerentanan >= batas_prioritas, "prioritas", "non"
      )
    )
}

desa <- desa |>
  mutate(
    prioritas_intervensi = factor(
      prioritas_intervensi,
      levels = c("prioritas", "non")
    )
  )

# Tampilkan keseimbangan kelas sebelum pemodelan.
class_count <- desa |>
  count(prioritas_intervensi, name = "n") |>
  mutate(proporsi = n / sum(n))

knitr::kable(
  class_count, digits = 3,
  caption = "Distribusi kelas sebelum train-test split"
)
Table 10.1: Distribusi kelas sebelum train-test split
prioritas_intervensi n proporsi
prioritas 240 0.3
non 560 0.7
# Stratified split mempertahankan proporsi kelas pada training dan testing.
sp <- initial_split(desa, prop = .8, strata = prioritas_intervensi)
trc <- training(sp)
tec <- testing(sp)

# Pemeriksaan eksplisit agar evaluasi classification tidak berjalan pada test set
# yang hanya berisi satu kelas.
if (dplyr::n_distinct(tec$prioritas_intervensi) < 2) {
  stop(
    "Testing set hanya memiliki satu kelas. Periksa distribusi prioritas_intervensi ",
    "atau gunakan data simulasi yang telah diperbarui."
  )
}

knitr::kable(
  tec |> count(prioritas_intervensi, name = "n_test"),
  caption = "Distribusi kelas pada testing set"
)
Table 10.1: Distribusi kelas pada testing set
prioritas_intervensi n_test
prioritas 48
non 112
logit <- logistic_reg() |>
  set_engine("glm") |>
  fit(
    prioritas_intervensi ~ kemiskinan_persen + jarak_pusat_km +
      akses_kesehatan + kualitas_jalan + internet_persen,
    data = trc
  )

pr <- predict(logit, tec, type = "prob") |>
  bind_cols(predict(logit, tec, type = "class")) |>
  bind_cols(tec |> select(prioritas_intervensi))

conf_mat(pr, truth = prioritas_intervensi, estimate = .pred_class)
#>            Truth
#> Prediction  prioritas non
#>   prioritas        47   0
#>   non               1 112
metric_set(accuracy, sens, spec, precision, recall, f_meas)(
  pr,
  truth = prioritas_intervensi,
  estimate = .pred_class
)
#> # A tibble: 6 × 3
#>   .metric   .estimator .estimate
#>   <chr>     <chr>          <dbl>
#> 1 accuracy  binary         0.994
#> 2 sens      binary         0.979
#> 3 spec      binary         1    
#> 4 precision binary         1    
#> 5 recall    binary         0.979
#> 6 f_meas    binary         0.989

10.6.1 Visualisasi Output: ROC Curve

# AUC dan ROC menggunakan "prioritas" sebagai event class.
auc_out <- yardstick::roc_auc(
  pr,
  truth = prioritas_intervensi,
  .pred_prioritas,
  event_level = "first"
)

knitr::kable(auc_out, digits = 3, caption = "ROC AUC pada testing set")
Table 10.2: ROC AUC pada testing set
.metric .estimator .estimate
roc_auc binary 1
roc_out <- yardstick::roc_curve(
  pr,
  truth = prioritas_intervensi,
  .pred_prioritas,
  event_level = "first"
)

autoplot(roc_out) +
  ggplot2::geom_abline(linetype = 2, alpha = .6) +
  ggplot2::labs(
    title = "ROC Curve — Klasifikasi Prioritas Intervensi",
    subtitle = "Event class: prioritas; data simulasi",
    x = "1 - Specificity",
    y = "Sensitivity"
  )

10.7 Contoh dengan Data Nyata

Classification dapat dibentuk dari data nyata dengan mendefinisikan label kebijakan, misalnya kabupaten dengan poverty rate di atas quantile 75 sebagai screening target. Tetapi label berbasis cut-off statistik bukan ground truth kebijakan; mahasiswa wajib menjelaskan bahwa label dibuat untuk latihan dan tidak otomatis valid untuk penetapan program.

Kartu dataset real.

  • Nama: INDO-DAPOER—classification exercise berbasis poverty rate.
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: hingga 2018; gunakan satu periode/holdout yang konsisten.
  • Unit observasi: wilayah–tahun.
  • Variabel/definisi: SI.POV.NAPR.ZS = poverty rate; label latihan prioritas=1 dibuat dari cut-off eksplisit (mis. kuantil 75), sementara predictors dipilih dari indikator yang tersedia sebelum keputusan.
  • Alasan digunakan: memperlihatkan confusion matrix, probability, threshold, calibration, dan cost-sensitive decision.
  • Keterbatasan: label cut-off adalah konstruksi pedagogis, bukan ground truth kebijakan; threshold harus diuji sensitivitasnya dan tidak boleh dipakai untuk keputusan nyata tanpa proses substantif. (World Bank 2026)

10.8 Analisis Menggunakan R

# Threshold 0.30 untuk meningkatkan sensitivitas terhadap kelas prioritas.
pr2 <- pr |>
  mutate(.pred_30 = factor(if_else(.pred_prioritas >= .30, "prioritas", "non"),
                           levels = c("prioritas", "non")))
conf_mat(pr2, truth = prioritas_intervensi, estimate = .pred_30)
#>            Truth
#> Prediction  prioritas non
#>   prioritas        47   0
#>   non               1 112

10.9 Paket Output Klasifikasi Lengkap

class10 <- pr |>
  dplyr::mutate(.pred_class = factor(ifelse(.pred_prioritas >= .5, "prioritas", "non"), levels=levels(prioritas_intervensi)))
cm10 <- yardstick::conf_mat(class10, truth=prioritas_intervensi, estimate=.pred_class)
cm10
#>            Truth
#> Prediction  prioritas non
#>   prioritas        47   0
#>   non               1 112
yardstick::metric_set(yardstick::accuracy, yardstick::sens, yardstick::spec, yardstick::ppv, yardstick::npv, yardstick::f_meas)(
  class10, truth=prioritas_intervensi, estimate=.pred_class, event_level="first"
) |> knitr::kable(digits=3, caption="Metric klasifikasi pada threshold 0,50")
Table 10.3: Metric klasifikasi pada threshold 0,50
.metric .estimator .estimate
accuracy binary 0.994
sens binary 0.979
spec binary 1.000
ppv binary 1.000
npv binary 0.991
f_meas binary 0.989
ggplot2::ggplot(pr, ggplot2::aes(.pred_prioritas, fill=prioritas_intervensi)) +
  ggplot2::geom_histogram(position="identity", alpha=.55, bins=12) +
  ggplot2::labs(title="Distribusi probabilitas prediksi menurut kelas aktual", x="Predicted probability: prioritas", fill="Aktual")

cal10 <- pr |>
  dplyr::mutate(bin=dplyr::ntile(.pred_prioritas, 5), y=as.integer(prioritas_intervensi=="prioritas")) |>
  dplyr::group_by(bin) |>
  dplyr::summarise(mean_pred=mean(.pred_prioritas), observed_rate=mean(y), n=dplyr::n(), .groups="drop")
knitr::kable(cal10, digits=3, caption="Calibration table per kuintil probabilitas")
Table 10.4: Calibration table per kuintil probabilitas
bin mean_pred observed_rate n
1 0.000 0.0 32
2 0.000 0.0 32
3 0.000 0.0 32
4 0.469 0.5 32
5 1.000 1.0 32
ggplot2::ggplot(cal10, ggplot2::aes(mean_pred, observed_rate)) +
  ggplot2::geom_abline(slope=1,intercept=0,linetype=2) + ggplot2::geom_point(size=3) + ggplot2::geom_line() +
  ggplot2::coord_equal(xlim=c(0,1),ylim=c(0,1)) +
  ggplot2::labs(title="Calibration plot", x="Mean predicted probability", y="Observed event rate")

10.10 Interpretasi dalam Konteks Regional

Jika recall meningkat dari 0,60 menjadi 0,82 setelah threshold diturunkan, lebih banyak wilayah rentan berhasil terdeteksi, tetapi false positives juga naik. Implikasinya adalah kebutuhan verifikasi lapangan lebih besar. Pilihan threshold harus dibahas bersama kapasitas program.

10.11 Latihan

  1. Mengapa accuracy dapat menyesatkan pada kelas imbalanced?
  2. Bedakan precision dan recall dalam bahasa kebijakan.
  3. Apa konsekuensi etis false negative untuk program perlindungan sosial?
  4. Analisis: bandingkan threshold 0,3; 0,5; 0,7.
  5. Analisis: buat kurva ROC dan precision-recall.
  6. Mini-case: pemerintah hanya mampu memverifikasi 100 dari 1.000 desa. Rancang strategi threshold/ranking dan mekanisme human review.

10.11.1 Tugas 4 — Classification for Prioritization (2,5%)

Definisikan binary priority outcome dari kasus regional secara transparan. Fit logistic regression dan satu model non-linear. Bandingkan ROC-AUC, PR behavior, sensitivity, precision, calibration, dan minimal tiga threshold. Pilih threshold dengan alasan kapasitas/biaya kebijakan.

10.11.2 Kuis 3 — Minggu 9–10 (2,5%)

Kisi-kisi: tree impurity; random forest; boosting; logistic probability/odds; confusion matrix; sensitivity/specificity; precision/F1; ROC-AUC; calibration; threshold berbasis cost.

10.12 Hubungan dengan Capstone Project

Jika proyek menggunakan classification, tim harus menyertakan cost-of-error statement: siapa yang dirugikan oleh FP/FN dan bagaimana threshold dipilih.

10.13 Kesimpulan

Classification adalah mekanisme keputusan. Metric dan threshold harus dikaitkan dengan kapasitas program, risiko, fairness, dan prosedur verifikasi manusia.

10.14 Pendalaman Magister — Classification dan decision threshold

10.14.1 Audit metodologis

  1. Accuracy dipakai pada kelas jarang.
  2. Threshold 0.5 dianggap universal.
  3. Auc dianggap calibration.
  4. Label prioritas dibuat setelah melihat outcome test.
  5. Probability tidak dikalibrasi.
  6. Cost kebijakan tidak dibahas.

10.14.2 Pertanyaan viva / diskusi kelas

  1. Apa beda discrimination dan calibration?
  2. Kapan PR curve lebih informatif?
  3. Bagaimana cost mengubah threshold?
  4. Apa beda odds ratio dan probability difference?
  5. Mengapa sensitivity tinggi dapat menurunkan precision?
  6. Bagaimana kapasitas program masuk keputusan threshold?

11 Clustering dan Segmentasi Wilayah

11.1 Pendahuluan

Clustering digunakan untuk menyusun tipologi wilayah berdasarkan kemiripan profil indikator, bukan untuk menentukan peringkat “baik–buruk”. Dalam inovasi regional, segmentasi dapat membantu pemerintah merancang paket intervensi yang berbeda untuk kelompok daerah dengan kebutuhan berbeda. Karena hasil cluster sensitif terhadap pemilihan indikator, skala, distance metric, jumlah cluster, dan initialization, analisis harus menampilkan proses pemilihan cluster dan profil akhirnya secara transparan. (Kaufman dan Rousseeuw 1990; Hastie, Tibshirani, dan Friedman 2009; James dkk. 2021)

11.2 Tujuan Pembelajaran

Setelah pertemuan ini mahasiswa mampu:

  1. menjelaskan fungsi objektif K-means dan hierarchical clustering;
  2. melakukan standardisasi indikator regional secara benar;
  3. membandingkan beberapa nilai KK menggunakan WSS dan silhouette;
  4. menampilkan keanggotaan dan profil setiap cluster secara rinci;
  5. memvisualisasikan cluster melalui PCA dan heatmap profil;
  6. melakukan pemeriksaan sensitivitas terhadap pilihan KK dan metode pengelompokan; dan
  7. menerjemahkan tipologi menjadi strategi regional yang tidak stigmatis.

11.3 Definisi dan Konsep

Untuk wilayah i=1,,ni=1,\ldots,n dengan pp indikator, tulis vektor fitur sebagai 𝐱i=(xi1,,xip)\mathbf{x}_i=(x_{i1},\ldots,x_{ip})^\top. Karena indikator memiliki unit berbeda, fitur umumnya distandardisasi:

zij=xijxjsj, z_{ij}=\frac{x_{ij}-\bar{x}_j}{s_j},

dengan xj\bar{x}_j rata-rata indikator jj dan sjs_j simpangan bakunya.

K-means membagi observasi ke KK cluster C1,,CKC_1,\ldots,C_K dengan meminimumkan within-cluster sum of squares:

WSS(K)=k=1KiCk𝐳i𝛍k22, \operatorname{WSS}(K)=\sum_{k=1}^{K}\sum_{i\in C_k}\|\mathbf z_i-\boldsymbol\mu_k\|_2^2,

di mana 𝛍k\boldsymbol\mu_k adalah centroid cluster kk.

Untuk observasi ii, silhouette didefinisikan sebagai

s(i)=b(i)a(i)max{a(i),b(i)}, s(i)=\frac{b(i)-a(i)}{\max\{a(i),b(i)\}},

dengan a(i)a(i) rata-rata jarak ke anggota cluster sendiri dan b(i)b(i) rata-rata jarak minimum ke cluster lain. Nilai mendekati 1 menunjukkan pemisahan yang baik, mendekati 0 menunjukkan observasi berada di perbatasan, dan negatif mengindikasikan kemungkinan salah pengelompokan. (Rousseeuw 1987)

Hierarchical clustering dengan Ward meminimumkan kenaikan variasi dalam-cluster ketika dua kelompok digabung. Untuk dua cluster AA dan BB, perubahan error sum of squares dapat ditulis secara intuitif sebagai fungsi jarak centroid dan ukuran kedua cluster. Karena itu Ward cocok sebagai pembanding K-means ketika tujuan utamanya adalah cluster kompak.

11.4 Intuisi Metode

Cluster merupakan ringkasan geometri data yang dipilih analis. Jika fitur hanya ekonomi, hasilnya terutama tipologi ekonomi; jika ditambah pendidikan, kesehatan, digitalisasi, dan UMKM, definisi “kemiripan wilayah” berubah. Karena itu pemilihan fitur adalah keputusan substantif, bukan sekadar teknis.

Prinsip interpretasi: beri nama cluster berdasarkan pola indikator, misalnya “kemiskinan tinggi–akses digital rendah”, bukan “wilayah gagal” atau “wilayah tertinggal”.

11.5 Data Simulasi dan Pemeriksaan Awal

reg11 <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  dplyr::filter(tahun == 2025) |>
  dplyr::select(
    wilayah, pdrb_perkapita_juta, kemiskinan_persen, tpt_persen,
    ipm, internet_persen, umkm_per_1000, indeks_inovasi
  ) |>
  tidyr::drop_na()

vars11 <- c("pdrb_perkapita_juta", "kemiskinan_persen", "tpt_persen",
            "ipm", "internet_persen", "umkm_per_1000", "indeks_inovasi")

ringkas11 <- reg11 |>
  dplyr::summarise(dplyr::across(
    dplyr::all_of(vars11),
    list(mean = mean, sd = sd, min = min, median = median, max = max)
  )) |>
  tidyr::pivot_longer(dplyr::everything(), names_to = c("indikator", ".value"), names_pattern = "(.*)_(mean|sd|min|median|max)$")

knitr::kable(ringkas11, digits = 2, caption = "Statistik deskriptif indikator sebelum clustering")
Table 11.1: Statistik deskriptif indikator sebelum clustering
indikator mean sd min median max
pdrb_perkapita_juta 49.22 10.86 24.04 50.90 66.15
kemiskinan_persen 9.89 1.75 6.01 9.84 13.05
tpt_persen 8.07 1.10 6.69 7.75 10.35
ipm 70.74 1.18 67.78 70.68 73.42
internet_persen 83.44 8.19 65.66 85.60 96.99
umkm_per_1000 38.60 5.12 29.37 39.66 48.99
indeks_inovasi 68.25 4.12 60.29 69.00 76.82

Output ini wajib dibaca sebelum standardisasi. Perbedaan rentang yang besar menjelaskan mengapa Euclidean distance pada skala asli dapat didominasi variabel tertentu.

cor11 <- cor(reg11 |> dplyr::select(dplyr::all_of(vars11)), use = "pairwise.complete.obs")
cor_long11 <- as.data.frame(as.table(cor11))

ggplot2::ggplot(cor_long11, ggplot2::aes(Var1, Var2, fill = Freq)) +
  ggplot2::geom_tile() +
  ggplot2::geom_text(ggplot2::aes(label = sprintf("%.2f", Freq)), size = 3) +
  ggplot2::scale_fill_gradient2(limits = c(-1, 1), midpoint = 0) +
  ggplot2::coord_equal() +
  ggplot2::labs(title = "Korelasi antarindikator sebelum clustering", x = NULL, y = NULL, fill = "r") +
  ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 45, hjust = 1))

Korelasi tinggi tidak otomatis membuat indikator harus dibuang, tetapi fitur yang sangat redundan dapat memberi bobot geometris berlebih pada satu dimensi substantif.

11.6 Standardisasi dan Pemilihan Jumlah Cluster

X11 <- scale(reg11 |> dplyr::select(dplyr::all_of(vars11)))
scale_check11 <- tibble::tibble(
  indikator = colnames(X11),
  mean_z = apply(X11, 2, mean),
  sd_z = apply(X11, 2, sd)
)
knitr::kable(scale_check11, digits = 4, caption = "Pemeriksaan hasil standardisasi")
Table 11.2: Pemeriksaan hasil standardisasi
indikator mean_z sd_z
pdrb_perkapita_juta 0 1
kemiskinan_persen 0 1
tpt_persen 0 1
ipm 0 1
internet_persen 0 1
umkm_per_1000 0 1
indeks_inovasi 0 1

Secara numerik, setiap kolom hasil z-score seharusnya memiliki rata-rata mendekati 0 dan simpangan baku mendekati 1.

set.seed(260811)
d11 <- stats::dist(X11)

eval_k11 <- purrr::map_dfr(2:6, function(k) {
  km_tmp <- stats::kmeans(X11, centers = k, nstart = 100)
  sil_tmp <- cluster::silhouette(km_tmp$cluster, d11)
  tibble::tibble(
    K = k,
    total_WSS = km_tmp$tot.withinss,
    avg_silhouette = mean(sil_tmp[, "sil_width"]),
    betweenSS_ratio = km_tmp$betweenss / km_tmp$totss
  )
})

knitr::kable(eval_k11, digits = 3, caption = "Perbandingan kandidat jumlah cluster")
Table 11.3: Perbandingan kandidat jumlah cluster
K total_WSS avg_silhouette betweenSS_ratio
2 97.396 0.372 0.465
3 72.859 0.290 0.600
4 62.985 0.265 0.654
5 54.639 0.202 0.700
6 47.707 0.196 0.738
ggplot2::ggplot(eval_k11, ggplot2::aes(K, total_WSS)) +
  ggplot2::geom_line(linewidth = 1) +
  ggplot2::geom_point(size = 2.7) +
  ggplot2::scale_x_continuous(breaks = 2:6) +
  ggplot2::labs(title = "Elbow plot", subtitle = "WSS selalu turun; cari perubahan kemiringan yang masuk akal", y = "Total within-cluster SS")

ggplot2::ggplot(eval_k11, ggplot2::aes(K, avg_silhouette)) +
  ggplot2::geom_line(linewidth = 1) +
  ggplot2::geom_point(size = 2.7) +
  ggplot2::scale_x_continuous(breaks = 2:6) +
  ggplot2::labs(title = "Rata-rata silhouette untuk beberapa nilai K", y = "Average silhouette width")

Pemilihan KK tidak didasarkan pada satu grafik saja. Dalam contoh ini, kandidat awal dipilih dari silhouette tertinggi, lalu diperiksa kembali dari sisi interpretabilitas dan kegunaan kebijakan.

11.7 Model K-Means Final dan Output Lengkap

k11 <- eval_k11 |> dplyr::slice_max(avg_silhouette, n = 1, with_ties = FALSE) |> dplyr::pull(K)
set.seed(260811)
km11 <- stats::kmeans(X11, centers = k11, nstart = 200)

fit_summary11 <- tibble::tibble(
  jumlah_cluster = k11,
  total_SS = km11$totss,
  within_SS = km11$tot.withinss,
  between_SS = km11$betweenss,
  proporsi_between_SS = km11$betweenss / km11$totss
)
knitr::kable(fit_summary11, digits = 3, caption = "Ringkasan fit K-means final")
Table 11.4: Ringkasan fit K-means final
jumlah_cluster total_SS within_SS between_SS proporsi_between_SS
2 182 97.396 84.604 0.465
membership11 <- reg11 |>
  dplyr::mutate(cluster = factor(km11$cluster)) |>
  dplyr::arrange(cluster, dplyr::desc(kemiskinan_persen)) |>
  dplyr::select(wilayah, cluster, dplyr::all_of(vars11))
knitr::kable(membership11, digits = 2, caption = "Keanggotaan cluster dan indikator setiap wilayah")
Table 11.5: Keanggotaan cluster dan indikator setiap wilayah
wilayah cluster pdrb_perkapita_juta kemiskinan_persen tpt_persen ipm internet_persen umkm_per_1000 indeks_inovasi
Wilayah_23 1 41.20 13.05 7.05 69.78 72.33 35.41 70.57
Wilayah_15 1 36.80 12.64 7.56 69.35 75.14 30.74 63.42
Wilayah_19 1 34.46 11.81 7.54 70.19 76.92 31.66 63.60
Wilayah_25 1 41.46 11.67 6.69 71.38 69.83 33.05 64.86
Wilayah_06 1 43.34 11.64 7.25 69.97 84.58 36.00 60.29
Wilayah_21 1 24.04 11.24 6.74 67.78 65.66 31.20 60.84
Wilayah_17 1 39.58 10.55 7.31 70.99 79.71 35.69 69.55
Wilayah_01 1 31.61 9.99 7.12 70.11 76.88 33.97 63.79
Wilayah_08 1 41.66 8.98 7.08 69.54 73.56 29.37 61.57
Wilayah_07 2 44.19 12.94 8.68 71.95 78.72 43.01 67.37
Wilayah_09 2 45.12 10.97 9.63 70.38 85.60 40.47 68.69
Wilayah_27 2 52.01 10.10 7.65 69.34 90.37 40.48 69.92
Wilayah_05 2 46.80 10.08 8.20 70.43 85.62 40.55 69.04
Wilayah_24 2 53.89 10.06 8.67 71.73 88.05 36.22 71.50
Wilayah_18 2 53.71 9.84 7.75 70.68 84.59 40.48 67.93
Wilayah_20 2 62.74 9.66 6.79 70.86 93.39 41.84 71.42
Wilayah_26 2 54.20 9.61 9.63 71.71 75.11 38.96 65.99
Wilayah_16 2 50.13 9.53 9.09 70.26 87.40 40.24 67.09
Wilayah_22 2 59.50 9.44 8.76 71.33 89.43 44.67 74.23
Wilayah_13 2 50.90 8.99 7.88 70.08 82.50 39.66 69.00
Wilayah_04 2 54.51 8.57 7.38 69.88 85.61 37.62 71.90
Wilayah_10 2 66.15 8.52 8.09 71.62 96.99 46.95 70.22
Wilayah_14 2 64.33 8.19 10.03 72.54 95.23 42.66 71.74
Wilayah_12 2 57.69 7.98 10.35 71.12 93.96 48.99 72.47
Wilayah_02 2 65.25 7.68 7.01 73.42 91.38 41.63 70.70
Wilayah_11 2 61.14 7.16 7.94 72.38 87.64 45.55 76.82
Wilayah_03 2 52.52 6.01 9.96 71.13 86.70 35.17 68.19

Tabel di atas sengaja ditampilkan lengkap. Pada HTML, tabel lebar dapat digeser ke kiri–kanan sehingga nama wilayah dan seluruh indikator tetap dapat diperiksa.

profile11 <- membership11 |>
  dplyr::group_by(cluster) |>
  dplyr::summarise(
    n = dplyr::n(),
    dplyr::across(dplyr::all_of(vars11), mean),
    .groups = "drop"
  )
knitr::kable(profile11, digits = 2, caption = "Profil rata-rata setiap cluster pada skala asli")
Table 11.6: Profil rata-rata setiap cluster pada skala asli
cluster n pdrb_perkapita_juta kemiskinan_persen tpt_persen ipm internet_persen umkm_per_1000 indeks_inovasi
1 9 37.13 11.29 7.15 69.90 74.96 33.01 64.28
2 18 55.27 9.19 8.53 71.16 87.68 41.40 70.24
profile_z11 <- as.data.frame(X11) |>
  dplyr::mutate(cluster = factor(km11$cluster)) |>
  dplyr::group_by(cluster) |>
  dplyr::summarise(dplyr::across(dplyr::everything(), mean), .groups = "drop") |>
  tidyr::pivot_longer(-cluster, names_to = "indikator", values_to = "mean_z")

ggplot2::ggplot(profile_z11, ggplot2::aes(indikator, cluster, fill = mean_z)) +
  ggplot2::geom_tile() +
  ggplot2::geom_text(ggplot2::aes(label = sprintf("%.2f", mean_z)), size = 3.2) +
  ggplot2::scale_fill_gradient2(midpoint = 0) +
  ggplot2::labs(title = "Heatmap profil cluster", subtitle = "Nilai adalah rata-rata z-score; positif berarti di atas rata-rata keseluruhan", x = NULL, y = "Cluster", fill = "Mean z") +
  ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 45, hjust = 1))

Heatmap lebih berguna untuk penamaan cluster daripada centroid mentah karena seluruh indikator telah berada pada skala yang sebanding.

11.8 Silhouette Setiap Wilayah

sil11 <- cluster::silhouette(km11$cluster, d11)
sil_tbl11 <- tibble::as_tibble(as.data.frame(sil11)) |>
  dplyr::mutate(wilayah = reg11$wilayah) |>
  dplyr::arrange(sil_width)

knitr::kable(
  sil_tbl11 |> dplyr::select(wilayah, cluster, neighbor, sil_width),
  digits = 3,
  caption = "Silhouette setiap wilayah; nilai rendah/negatif perlu diperiksa"
)
Table 11.7: Silhouette setiap wilayah; nilai rendah/negatif perlu diperiksa
wilayah cluster neighbor sil_width
Wilayah_07 2 1 0.037
Wilayah_17 1 2 0.171
Wilayah_26 2 1 0.213
Wilayah_09 2 1 0.252
Wilayah_27 2 1 0.252
Wilayah_13 2 1 0.254
Wilayah_04 2 1 0.278
Wilayah_05 2 1 0.280
Wilayah_18 2 1 0.302
Wilayah_03 2 1 0.319
Wilayah_16 2 1 0.344
Wilayah_23 1 2 0.362
Wilayah_06 1 2 0.367
Wilayah_24 2 1 0.381
Wilayah_20 2 1 0.389
Wilayah_02 2 1 0.389
Wilayah_25 1 2 0.456
Wilayah_11 2 1 0.456
Wilayah_08 1 2 0.456
Wilayah_12 2 1 0.472
Wilayah_21 1 2 0.483
Wilayah_14 2 1 0.489
Wilayah_10 2 1 0.494
Wilayah_01 1 2 0.511
Wilayah_22 2 1 0.520
Wilayah_15 1 2 0.560
Wilayah_19 1 2 0.568
ggplot2::ggplot(sil_tbl11, ggplot2::aes(reorder(wilayah, sil_width), sil_width, fill = factor(cluster))) +
  ggplot2::geom_col() +
  ggplot2::coord_flip() +
  ggplot2::geom_hline(yintercept = 0, linetype = 2) +
  ggplot2::labs(title = "Silhouette per wilayah", x = NULL, y = "Silhouette width", fill = "Cluster")

Wilayah dengan silhouette dekat nol adalah kasus transisi; kebijakan sebaiknya tidak memperlakukan batas cluster sebagai kategori keras.

11.9 Visualisasi Cluster pada Ruang PCA

pca11 <- stats::prcomp(X11, center = FALSE, scale. = FALSE)
pca_score11 <- tibble::as_tibble(pca11$x[, 1:2]) |>
  dplyr::mutate(wilayah = reg11$wilayah, cluster = factor(km11$cluster))

ggplot2::ggplot(pca_score11, ggplot2::aes(PC1, PC2, colour = cluster)) +
  ggplot2::geom_point(size = 3, alpha = .85) +
  ggplot2::labs(
    title = "Visualisasi cluster pada dua komponen utama",
    subtitle = paste0("PC1 + PC2 menjelaskan ", round(100 * sum(summary(pca11)$importance[2,1:2]), 1), "% variasi terstandardisasi"),
    colour = "Cluster"
  )

Plot PCA hanya proyeksi dua dimensi; keputusan K-means tetap menggunakan seluruh indikator terstandardisasi, bukan hanya PC1–PC2.

11.10 Pembanding: Hierarchical Clustering Ward

hc11 <- stats::hclust(d11, method = "ward.D2")
plot(hc11, labels = reg11$wilayah, cex = .65,
     main = "Dendrogram hierarchical clustering — Ward.D2", xlab = "", sub = "")
rect.hclust(hc11, k = k11, border = 2:(k11 + 1))

hc_group11 <- stats::cutree(hc11, k = k11)
agreement11 <- table(KMeans = km11$cluster, Ward = hc_group11)
knitr::kable(as.data.frame.matrix(agreement11), caption = "Tabulasi silang K-means versus Ward")
Table 11.8: Tabulasi silang K-means versus Ward
1 2
9 0
0 18

Perbedaan keanggotaan tidak selalu berarti salah. Ia menunjukkan bahwa tipologi sensitif terhadap definisi cluster dan perlu dibaca sebagai alat eksplorasi.

11.11 Interpretasi dalam Konteks Regional

Interpretasi dilakukan dari tabel profil dan heatmap, bukan dari nomor cluster. Misalnya, sebuah cluster dengan kemiskinan dan TPT di atas rata-rata serta internet dan IPM di bawah rata-rata dapat diberi label “tekanan sosial-ekonomi tinggi–kapabilitas layanan lebih rendah”. Cluster dengan PDRB dan internet tinggi tetapi TPT tetap tinggi dapat menunjukkan “ekonomi kuat–mismatch pasar kerja”. Kebijakan untuk kedua kelompok tidak seharusnya sama.

Cluster tidak membuktikan mekanisme sebab-akibat. Setelah tipologi terbentuk, mahasiswa harus kembali ke data sektoral, konteks institusi, dan informasi lapangan untuk memeriksa apakah paket kebijakan yang diusulkan masuk akal.

11.12 Latihan

  1. Mengapa K-means perlu standardisasi ketika unit indikator berbeda?
  2. Apa perbedaan informasi yang diberikan elbow plot dan silhouette?
  3. Mengapa cluster dengan silhouette negatif perlu diperiksa?
  4. Ulangi analisis dengan mengeluarkan satu indikator yang sangat berkorelasi. Bandingkan profil dan membership.
  5. Bandingkan K=3K=3, K=4K=4, dan K=5K=5. Apakah rekomendasi kebijakan berubah secara substantif?
  6. Buat nama deskriptif untuk setiap cluster tanpa menggunakan istilah normatif seperti “buruk”, “gagal”, atau “tertinggal”.

11.12.1 Tugas Terstruktur Pertemuan 11

Gunakan 5–8 indikator pada capstone project. Tampilkan statistik deskriptif, korelasi, alasan standardisasi, evaluasi KK, tabel membership lengkap, profil cluster, silhouette, heatmap, dan minimal satu sensitivity check. Akhiri dengan satu halaman strategi kebijakan yang berbeda untuk setiap tipologi.

11.12.2 Kuis Formatif Pertemuan 11

  1. Tuliskan fungsi objektif K-means.
  2. Apa makna s(i)<0s(i)<0 pada silhouette?
  3. Mengapa WSS selalu turun ketika KK bertambah?
  4. Apa implikasi dua indikator yang hampir redundan terhadap Euclidean distance?
  5. Mengapa cluster tidak boleh ditafsirkan sebagai kelas sosial yang “alamiah”?

11.13 Hubungan dengan Capstone Project

Milestone minggu ini adalah regional segmentation package: fitur terpilih, hasil evaluasi KK, membership, profil, visualisasi, sensitivity analysis, dan satu set rekomendasi berbeda menurut tipologi.

11.14 Kesimpulan

Clustering bernilai ketika ia mengubah data multivariat menjadi tipologi yang dapat dipahami dan diuji. Analisis yang hanya menghasilkan nomor cluster tanpa profil, silhouette, membership, dan sensitivity check belum cukup untuk jenjang magister.

11.15 Pendalaman Magister — Clustering dan Regional Typology

11.15.1 Audit metodologis

  1. Apakah pilihan indikator memiliki justifikasi substantif?
  2. Apakah standardisasi dan distance metric sesuai?
  3. Apakah KK dipilih dari lebih dari satu bukti?
  4. Apakah cluster stabil terhadap perubahan seed, fitur, dan metode?
  5. Apakah label cluster bersifat deskriptif dan non-stigmatis?
  6. Apakah rekomendasi dibangun dari profil indikator, bukan nomor cluster semata?

11.15.2 Pertanyaan Viva

  1. Apa yang sebenarnya diminimumkan K-means?
  2. Mengapa silhouette dapat negatif?
  3. Kapan Ward memberi hasil berbeda dari K-means?
  4. Mengapa PCA plot tidak identik dengan ruang clustering penuh?
  5. Bagaimana Anda menjelaskan ketidakstabilan cluster kepada pembuat kebijakan?

12 Dimension Reduction dan PCA untuk Indikator Pembangunan

12.1 Pendahuluan

Indikator pembangunan sering saling berkorelasi: pendidikan, kesehatan, internet, pendapatan, dan layanan dasar bergerak bersama. PCA membantu mereduksi dimensi dan mengidentifikasi kombinasi laten, tetapi komponen harus ditafsirkan dengan hati-hati.

12.2 Tujuan Pembelajaran

Mahasiswa mampu melakukan PCA pada data yang distandardisasi, membaca variance explained dan loadings, serta menggunakan komponen untuk visualisasi/segmentasi tanpa kehilangan interpretasi kebijakan.

12.3 Definisi dan Konsep

PCA mencari arah linear yang menjelaskan variasi maksimum. PC1 adalah kombinasi linear dengan variance terbesar, PC2 orthogonal terhadap PC1 dan menjelaskan variance terbesar berikutnya. PCA tidak secara otomatis menghasilkan “indeks pembangunan” yang normatif.

12.4 Formulasi Matematis

Untuk data terpusat 𝐗\mathbf X, covariance matrix

𝐒=1n1𝐗𝐗. \mathbf S=\frac{1}{n-1}\mathbf X^\top\mathbf X.

PCA menyelesaikan

𝐒𝐯k=λk𝐯k, \mathbf S\mathbf v_k=\lambda_k\mathbf v_k,

di mana 𝐯k\mathbf v_k eigenvector/loading PC ke-kk dan λk\lambda_k variance yang dijelaskan. Skor komponen:

zik=𝐱i𝐯k. z_{ik}=\mathbf x_i^\top\mathbf v_k.

12.4.1 Matriks data terpusat dan covariance

Untuk data XX berukuran n×pn\times p, pusatkan setiap kolom: Xc=X𝟏x. X_c=X-\mathbf 1\bar x'. Covariance matrix: S=1n1XcXc. S=\frac{1}{n-1}X_c'X_c. Jika variabel memiliki unit/skala sangat berbeda, gunakan correlation PCA dengan data standardisasi ZZ.

12.4.2 Eigen decomposition

PCA mencari arah unit vkv_k yang memaksimalkan variance proyeksi: v1=argmaxv=1Var(Xcv). v_1=\arg\max_{\|v\|=1}Var(X_cv). Solusinya adalah eigenvector dari SS: Svk=λkvk, Sv_k=\lambda_kv_k, dengan λ1λ20\lambda_1\ge\lambda_2\ge\cdots\ge0.

Score principal component: zik=xicvk. z_{ik}=x_{ic}'v_k. Loading vjkv_{jk} menunjukkan kontribusi variabel jj pada komponen kk.

12.4.3 Explained variance

PVEk=λkj=1pλj, PVE_k=\frac{\lambda_k}{\sum_{j=1}^{p}\lambda_j}, CPVEK=k=1KPVEk. CPVE_K=\sum_{k=1}^{K}PVE_k. Pemilihan jumlah komponen tidak boleh hanya berdasarkan threshold 80%/90%; interpretability dan tujuan project harus dipertimbangkan. (Jolliffe dan Cadima 2016)

12.4.4 Rekonstruksi dan information loss

Dengan K<pK<p komponen: X̂c=ZKVK. \widehat X_c=Z_KV_K'. Reconstruction error: EK=XcX̂cF2. E_K=\|X_c-\widehat X_c\|_F^2. PCA memilih subspace linear yang meminimalkan squared reconstruction error, tetapi komponen yang menjelaskan variance tinggi belum tentu paling relevan untuk outcome kebijakan tertentu.

12.4.5 PCA untuk indeks regional: peluang dan batasan

Skor PC1 dapat dipakai sebagai data-driven index: PC1i=jvj1zij. PC1_i=\sum_j v_{j1}z_{ij}. Namun tanda eigenvector dapat terbalik tanpa mengubah solusi; orientasi indeks harus ditentukan agar “lebih tinggi” memiliki arti substantif konsisten. PCA juga menimbang berdasarkan struktur covariance, bukan prioritas normatif. Bandingkan dengan indeks berbobot teori dan lakukan sensitivity analysis. (OECD dan Joint Research Centre, European Commission 2008)

12.4.6 Biplot interpretation

Sudut antar loading vector secara kasar berkaitan dengan korelasi: arah sejalan ≈ korelasi positif, berlawanan ≈ negatif, hampir tegak lurus ≈ korelasi kecil. Panjang dan skala biplot bergantung implementasi, jadi interpretasi harus mengikuti definisi scaling perangkat lunak.

12.5 Intuisi Metode

Jika internet, IPM, pendidikan, dan akses kesehatan semuanya tinggi bersama, PC1 dapat menangkap “kapabilitas layanan/manusia” secara statistik. Tetapi penamaan tersebut harus didukung pola loading, bukan asumsi.

12.5.1 Worked Example — PCA dua variabel

Misalkan covariance matrix standardized dua indikator adalah S=[10.80.81]. S=\begin{bmatrix}1&0.8\\0.8&1\end{bmatrix}. Eigenvalue memenuhi |SλI|=0|S-\lambda I|=0: (1λ)20.64=0λ1=1.8,λ2=0.2. (1-\lambda)^2-0.64=0 \Rightarrow \lambda_1=1.8,\;\lambda_2=0.2. Total variance=2, sehingga PVE1=1.8/2=90%,PVE2=10%. PVE_1=1.8/2=90\%,\qquad PVE_2=10\%. Eigenvector pertama proporsional (1,1)(1,1), artinya PC1 kira-kira rata-rata standardized kedua indikator; PC2 menangkap kontras di antara keduanya.

12.5.2 Loading sign ambiguity

Jika vv adalah eigenvector, v-v juga eigenvector dengan eigenvalue sama. Karena itu software dapat memberikan PC1 dengan tanda berlawanan tanpa mengubah geometri. Untuk indeks, pilih orientasi agar makna substantif konsisten dan dokumentasikan pembalikan tanda.

12.5.3 Correlation PCA vs covariance PCA

Jika variabel berbeda unit, covariance PCA dapat didominasi variabel variance besar. Correlation PCA ekuivalen PCA pada ZZ standardized. Namun standardisasi menganggap satu SD setiap variabel comparable; jika measurement reliability berbeda, pertimbangkan hal tersebut dalam interpretasi.

12.5.4 Reconstruction intuition

Dengan KK komponen, prediksi data standardized: ẑi=k=1Kscoreikvk. \hat z_i=\sum_{k=1}^{K}score_{ik}v_k. Residual reconstruction ziẑiz_i-\hat z_i menunjukkan informasi yang tidak ditangkap komponen. Wilayah dengan reconstruction error tinggi bisa merupakan pola unik/outlier yang justru penting secara kebijakan.

12.5.5 R output reading

xp <- panel |> filter(tahun==2025) |>
  select(kemiskinan_persen, tpt_persen, internet_persen, ipm, indeks_inovasi)
pca <- prcomp(xp, center=TRUE, scale.=TRUE)
summary(pca)
#> Importance of components:
#>                           PC1    PC2    PC3    PC4     PC5
#> Standard deviation     1.7221 0.8432 0.7656 0.6708 0.53601
#> Proportion of Variance 0.5931 0.1422 0.1172 0.0900 0.05746
#> Cumulative Proportion  0.5931 0.7353 0.8525 0.9425 1.00000
round(pca$rotation[,1:3],3)
#>                      PC1    PC2    PC3
#> kemiskinan_persen -0.443 -0.003 -0.696
#> tpt_persen         0.367  0.893 -0.190
#> internet_persen    0.501 -0.108  0.215
#> ipm                0.439 -0.217 -0.645
#> indeks_inovasi     0.475 -0.379 -0.133

Baca sdev^2 sebagai eigenvalue (untuk covariance matrix dari data transformed sesuai prcomp), rotation sebagai loading/eigenvectors, dan x sebagai score.

12.5.6 PCA vs index theory

Jika PC1 memberi loading besar pada internet dan IPM karena variance/correlation dominan, tetapi stakeholder menilai akses kesehatan normatif sangat penting, PC1 tidak otomatis menggantikan indeks teori. Laporkan dua pendekatan dan sensitivitas. (Jolliffe dan Cadima 2016; OECD dan Joint Research Centre, European Commission 2008)

12.6 Contoh dengan Data Simulasi

reg <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  filter(tahun == 2025)
X <- reg |> select(ipm, internet_persen, indeks_pendidikan, akses_kesehatan, pdrb_perkapita_juta, umkm_per_1000)
pca <- prcomp(X, center = TRUE, scale. = TRUE)
summary(pca)
#> Importance of components:
#>                           PC1    PC2     PC3     PC4     PC5     PC6
#> Standard deviation     2.0253 0.8835 0.72790 0.58744 0.39925 0.28818
#> Proportion of Variance 0.6837 0.1301 0.08831 0.05751 0.02657 0.01384
#> Cumulative Proportion  0.6837 0.8138 0.90208 0.95959 0.98616 1.00000
round(pca$rotation[, 1:3], 3) |> knitr::kable(caption = "Loading tiga komponen utama")
Table 12.1: Loading tiga komponen utama
PC1 PC2 PC3
ipm 0.400 0.240 0.544
internet_persen 0.417 -0.503 0.002
indeks_pendidikan 0.402 0.401 0.345
akses_kesehatan 0.347 0.597 -0.633
pdrb_perkapita_juta 0.454 -0.267 0.087
umkm_per_1000 0.422 -0.318 -0.420

12.7 Contoh dengan Data Nyata

INDO-DAPOER menyediakan banyak indikator yang secara substantif saling terkait. Sebelum PCA, pilih satu periode dan pastikan kelengkapan data memadai. Jangan mencampur level provinsi dan kabupaten atau indikator dengan tahun berbeda tanpa justifikasi.

Kartu dataset real.

  • Nama: indikator multivariat pembangunan INDO-DAPOER untuk PCA.
  • Sumber dan URL: World Bank Data Catalog, https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.
  • Tahun: satu tahun analisis ≤2018 dengan overlap indikator memadai.
  • Unit observasi: kabupaten/kota.
  • Variabel/definisi: sekumpulan indikator kuantitatif pembangunan (mis. poverty, literacy, HDI components, fiscal/infrastructure indicators); transformasi/standardisasi dicatat eksplisit.
  • Alasan digunakan: menunjukkan bagaimana korelasi antarindikator dapat diringkas menjadi beberapa komponen tanpa menyebutnya otomatis sebagai indeks kebijakan.
  • Keterbatasan: PCA sensitif terhadap skala/outlier dan hanya menangkap variasi linear; komponen tinggi varian belum tentu paling relevan bagi kebijakan. (World Bank 2026)

12.8 Analisis Menggunakan R

library(factoextra)
fviz_pca_biplot(pca, repel = TRUE, title = "PCA indikator regional - simulasi")

12.9 Paket Output PCA Lengkap

eigen12 <- pca$sdev^2
pve12 <- eigen12/sum(eigen12)
eigen_tbl12 <- tibble::tibble(
  PC=paste0("PC",seq_along(eigen12)), eigenvalue=eigen12,
  PVE=pve12, cumulative_PVE=cumsum(pve12)
)
knitr::kable(eigen_tbl12, digits=3, caption="Eigenvalue, proportion variance explained, dan kumulatif")
Table 12.2: Eigenvalue, proportion variance explained, dan kumulatif
PC eigenvalue PVE cumulative_PVE
PC1 4.102 0.684 0.684
PC2 0.781 0.130 0.814
PC3 0.530 0.088 0.902
PC4 0.345 0.058 0.960
PC5 0.159 0.027 0.986
PC6 0.083 0.014 1.000
ggplot2::ggplot(eigen_tbl12, ggplot2::aes(seq_along(eigenvalue), PVE)) +
  ggplot2::geom_col() + ggplot2::geom_line(ggplot2::aes(y=cumulative_PVE), linewidth=1) +
  ggplot2::geom_point(ggplot2::aes(y=cumulative_PVE), size=2.5) +
  ggplot2::scale_x_continuous(breaks=seq_along(eigen12), labels=eigen_tbl12$PC) +
  ggplot2::labs(title="Scree dan cumulative explained variance", x="Principal component", y="Proporsi variance")

load12 <- as.data.frame(pca$rotation[,1:min(4,ncol(pca$rotation)),drop=FALSE]) |>
  tibble::rownames_to_column("indikator")
knitr::kable(load12, digits=3, caption="Loading komponen utama")
Table 12.3: Loading komponen utama
indikator PC1 PC2 PC3 PC4
ipm 0.400 0.240 0.544 -0.623
internet_persen 0.417 -0.503 0.002 0.394
indeks_pendidikan 0.402 0.401 0.345 0.595
akses_kesehatan 0.347 0.597 -0.633 -0.004
pdrb_perkapita_juta 0.454 -0.267 0.087 -0.042
umkm_per_1000 0.422 -0.318 -0.420 -0.318
load_long12 <- load12 |> tidyr::pivot_longer(-indikator, names_to="PC", values_to="loading")
ggplot2::ggplot(load_long12, ggplot2::aes(indikator, loading, fill=loading>0)) +
  ggplot2::geom_col(show.legend=FALSE) + ggplot2::facet_wrap(~PC) +
  ggplot2::coord_flip() + ggplot2::labs(title="Loading profile setiap principal component", x=NULL)

score12 <- tibble::as_tibble(pca$x[,1:2,drop=FALSE]) |> dplyr::mutate(wilayah=reg$wilayah) |>
  dplyr::select(wilayah, dplyr::everything()) |> dplyr::arrange(dplyr::desc(PC1))
knitr::kable(score12, digits=3, caption="Score PC1 dan PC2 setiap wilayah")
Table 12.4: Score PC1 dan PC2 setiap wilayah
wilayah PC1 PC2
Wilayah_02 4.146 2.029
Wilayah_10 3.727 0.336
Wilayah_11 3.071 0.842
Wilayah_14 2.711 -0.433
Wilayah_12 2.306 -0.714
Wilayah_20 1.926 -0.475
Wilayah_22 1.851 -0.243
Wilayah_07 0.362 0.607
Wilayah_13 0.087 0.052
Wilayah_03 0.059 -0.019
Wilayah_24 -0.174 -1.209
Wilayah_16 -0.196 -1.101
Wilayah_09 -0.214 -0.485
Wilayah_26 -0.225 0.081
Wilayah_18 -0.245 -1.078
Wilayah_27 -0.268 -1.448
Wilayah_06 -0.550 0.202
Wilayah_05 -0.601 -1.098
Wilayah_04 -0.679 -1.347
Wilayah_17 -0.948 0.353
Wilayah_25 -1.483 1.228
Wilayah_23 -1.508 1.097
Wilayah_19 -1.673 0.919
Wilayah_01 -2.113 0.296
Wilayah_08 -2.237 0.790
Wilayah_15 -2.646 0.267
Wilayah_21 -4.486 0.551

12.10 Interpretasi dalam Konteks Regional

Jika PC1 memberi loading positif tinggi pada IPM, internet, pendidikan, kesehatan, dan PDRB, skor PC1 tinggi dapat dibaca sebagai kombinasi kapabilitas pembangunan. Namun PCA memaksimalkan variance, bukan relevansi kebijakan; indikator penting dengan variasi kecil dapat terabaikan.

12.11 Latihan

  1. Mengapa PCA biasanya membutuhkan standardisasi?
  2. Apa arti eigenvalue besar?
  3. Mengapa PC1 bukan otomatis “indeks pembangunan terbaik”?
  4. Analisis: tentukan jumlah PC untuk menjelaskan minimal 80% variance.
  5. Analisis: gunakan PC1-PC2 sebagai input clustering dan bandingkan hasil.
  6. Mini-case: pimpinan meminta satu indeks komposit. Jelaskan kapan PCA layak dan kapan pendekatan berbobot kebijakan lebih tepat.

12.11.1 Tugas Terstruktur Pertemuan 12

Lakukan PCA pada minimal lima indikator regional. Laporkan eigenvalues, PVE, loading, score, dan biplot. Bandingkan ranking berbasis PC1 dengan indeks berbobot teori. Jelaskan minimal dua perbedaan dan implikasinya.

12.11.2 Kuis Formatif Pertemuan 12

Fokus: covariance vs correlation PCA; eigenvalue/eigenvector; score/loading; PVE; reconstruction; tanda PC; keterbatasan PCA untuk indeks kebijakan.

12.12 Hubungan dengan Capstone Project

PCA dapat dipakai bila proyek memiliki banyak indikator berkorelasi atau untuk membangun visual 2D sebelum clustering. Tim harus tetap menyertakan tabel loading dan interpretasi.

12.13 Kesimpulan

PCA mereduksi kompleksitas statistik, bukan kompleksitas kebijakan. Komponen harus dibaca melalui loadings, variance explained, dan konteks indikator.

12.14 Pendalaman Magister — PCA dan konstruksi indeks

12.14.1 Audit metodologis

  1. Pca covariance dipakai pada unit tak sebanding.
  2. Pc1 disebut indeks terbaik otomatis.
  3. Loading sign disalahartikan.
  4. Pve tinggi dianggap policy relevance.
  5. Outlier mendominasi covariance.
  6. Pca dihitung sebelum split pada predictive workflow.

12.14.2 Pertanyaan viva / diskusi kelas

  1. Apa eigenvalue dan eigenvector secara substantif?
  2. Mengapa scaling penting?
  3. Apa beda score dan loading?
  4. Mengapa tanda PC dapat dibalik?
  5. Bagaimana memilih K komponen?
  6. Mengapa PCA dan indeks normatif harus dibandingkan?

13 Analisis Data Spasial Areal dan Visualisasi Geospasial

13.1 Pendahuluan

Analisis regional pada tingkat kabupaten/kota secara alami merupakan data areal: setiap observasi mewakili suatu polygon administratif, bukan satu titik koordinat. Karena itu pembelajaran spasial pada bab ini menggunakan batas kabupaten/kota Jawa Barat dari berkas polygon yang disediakan bersama e-book dan menggabungkannya dengan persentase penduduk miskin tahun 2024. Dataset kemiskinan kabupaten/kota Jawa Barat dipublikasikan oleh Badan Pusat Statistik dan didiseminasikan melalui Open Data Jawa Barat; seri persentase tersedia untuk 2010–2025, sedangkan publikasi resmi BPS Jawa Barat juga mendokumentasikan kemiskinan kabupaten/kota 2019–2024. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026c; Badan Pusat Statistik Provinsi Jawa Barat 2025)

Bab ini membahas tiga lapis analisis: (1) pemetaan choropleth, (2) pembentukan struktur ketetanggaan areal, dan (3) autocorrelation global serta lokal. Peta sendiri hanya menunjukkan lokasi nilai; statistik spasial diperlukan untuk menilai apakah wilayah dengan nilai serupa cenderung berdekatan. (Moran 1950; Anselin 1995; Bivand, Pebesma, dan Gómez-Rubio 2013; Pebesma dan Bivand 2023)

13.2 Tujuan Pembelajaran

Setelah pertemuan ini mahasiswa mampu:

  1. membedakan data point, line, dan areal/polygon;
  2. membaca dan memeriksa geometri polygon dengan sf;
  3. menggabungkan indikator kemiskinan dengan polygon berdasarkan kode wilayah;
  4. menyusun matriks bobot spasial dari hubungan antar-polygon dan kedekatan batas wilayah;
  5. menghitung spatial lag dan Moran’s II;
  6. melakukan permutation test untuk autocorrelation global;
  7. menghitung Local Moran dan memetakan pola High–High, Low–Low, High–Low, dan Low–High;
  8. melakukan sensitivity analysis terhadap definisi neighborhood areal; dan
  9. menjelaskan MAUP serta ecological fallacy dalam rekomendasi regional.

13.3 Konsep Data Areal

Misalkan Jawa Barat dibagi menjadi nn wilayah administratif. Untuk setiap polygon AiA_i diamati outcome yiy_i, misalnya persentase penduduk miskin. Dua wilayah disebut bertetangga bila polygon mereka memenuhi aturan tertentu.

Secara klasik, Queen contiguity menyatakan dua polygon bertetangga bila berbagi sisi atau titik sudut, sedangkan Rook contiguity mensyaratkan sisi bersama. Namun shapefile administratif dapat memiliki overlap, enclave, atau ketidaksempurnaan topologi. Karena itu pada contoh ini bobot utama dibangun dari hubungan intersection antar-polygon:

wij={1,AiAj,0,lainnya, w_{ij}=\begin{cases} 1, & A_i\cap A_j\neq\varnothing,\\ 0, & \text{lainnya}, \end{cases}

untuk iji\neq j. Sebagai sensitivity analysis, digunakan bobot kedua berbasis jarak minimum antar-polygon sampai 10 km. Ini tetap merupakan analisis areal karena jarak dihitung dari geometry polygon, bukan mengganti wilayah menjadi data point. Matriks bobot 𝐖=[wij]\mathbf W=[w_{ij}] kemudian di-row-standardize:

wij*=wijjwij, w_{ij}^{*}=\frac{w_{ij}}{\sum_j w_{ij}},

sehingga spatial lag untuk wilayah ii adalah rata-rata tertimbang nilai tetangganya:

(Wy)i=jwij*yj. (Wy)_i=\sum_j w_{ij}^{*}y_j.

13.4 Moran’s I Global

Definisikan deviasi dari rata-rata zi=yiyz_i=y_i-\bar y. Moran’s II adalah

I=nS0ijwijzizjizi2, I=\frac{n}{S_0} \frac{\sum_i\sum_j w_{ij}z_i z_j} {\sum_i z_i^2},

dengan

S0=ijwij. S_0=\sum_i\sum_j w_{ij}.

Secara umum, I>0I>0 menunjukkan nilai serupa cenderung berdekatan, I<0I<0 menunjukkan pola tetangga yang kontras, dan nilai dekat ekspektasi acak menunjukkan tidak ada autocorrelation yang kuat. Interpretasi tidak boleh hanya berdasarkan tanda; gunakan randomization/permutation inference. (Moran 1950)

Jika I(1),,I(B)I^{(1)},\ldots,I^{(B)} adalah Moran’s II dari BB permutasi label wilayah, pseudo p-value dapat dihitung dari proporsi statistik permutasi yang sama atau lebih ekstrem daripada nilai observasi, dengan koreksi Monte Carlo.

13.5 Local Moran dan LISA

Local Moran untuk wilayah ii dapat ditulis

Ii=zim2jwijzj, I_i=\frac{z_i}{m_2}\sum_j w_{ij}z_j,

dengan

m2=1nizi2. m_2=\frac{1}{n}\sum_i z_i^2.

Gabungan tanda ziz_i dan spatial lag menghasilkan empat pola:

  • High–High (HH): nilai tinggi dikelilingi nilai tinggi;
  • Low–Low (LL): nilai rendah dikelilingi nilai rendah;
  • High–Low (HL): nilai tinggi di antara tetangga rendah;
  • Low–High (LH): nilai rendah di antara tetangga tinggi.

LISA bersifat lokal dan melibatkan banyak pengujian. Peta LISA harus dibaca sebagai screening pola lokal, bukan bukti kausal. (Anselin 1995)

13.6 Dataset dan Provenance

Geometry. Folder data/spatial_jabar/ berasal dari ZIP batas administratif yang diberikan untuk mata kuliah. Berkas utama adalah JABAR.shp, JABAR.shx, dan JABAR.dbf. Shapefile tidak menyertakan .prj, sehingga CRS tidak tersimpan secara eksplisit. Koordinat berada pada rentang longitude–latitude Jawa Barat; dalam latihan ini CRS ditetapkan sebagai EPSG:4326 setelah pemeriksaan. Pada riset nyata, CRS wajib diverifikasi pada sumber geodata sebelum penetapan manual.

Outcome. File data/kemiskinan_jabar_2024.csv berisi persentase penduduk miskin 27 kabupaten/kota Jawa Barat tahun 2024 dan disiapkan sebagai teaching extract dari seri BPS/Open Data Jawa Barat. Portal resminya mendokumentasikan variabel kabupaten/kota, persentase penduduk miskin, satuan persen, dan tahun; publikasi BPS Jawa Barat 2019–2024 menjadi rujukan substantif tambahan untuk konteks indikator kemiskinan. (Badan Pusat Statistik dan Pemerintah Provinsi Jawa Barat 2026c; Badan Pusat Statistik Provinsi Jawa Barat 2025)

Catatan join. Geometry lama pada kode 18 masih dapat membawa label historis yang tidak konsisten. Karena itu join dilakukan dengan KABKOTNO, lalu nama tampilan diambil dari tabel kemiskinan. Ini menunjukkan mengapa kode wilayah lebih aman daripada fuzzy matching nama.

13.7 Import Polygon dan Audit Geometry

jabar13 <- sf::st_read("data/spatial_jabar/JABAR.shp", quiet = TRUE) |>
  sf::st_make_valid() |>
  dplyr::mutate(KABKOTNO = stringr::str_pad(as.character(KABKOTNO), 2, pad = "0"))

if (is.na(sf::st_crs(jabar13))) {
  sf::st_crs(jabar13) <- 4326
}

geom_audit13 <- tibble::tibble(
  n_polygon = nrow(jabar13),
  crs_epsg = sf::st_crs(jabar13)$epsg,
  geometry_valid = sum(sf::st_is_valid(jabar13)),
  geometry_invalid = sum(!sf::st_is_valid(jabar13)),
  type_polygon = sum(as.character(sf::st_geometry_type(jabar13)) == "POLYGON"),
  type_multipolygon = sum(as.character(sf::st_geometry_type(jabar13)) == "MULTIPOLYGON")
)
knitr::kable(geom_audit13, caption = "Audit awal geometri Jawa Barat")
Table 13.1: Audit awal geometri Jawa Barat
n_polygon crs_epsg geometry_valid geometry_invalid type_polygon type_multipolygon
27 4326 27 0 23 4
poverty13 <- readr::read_csv("data/kemiskinan_jabar_2024.csv", show_col_types = FALSE) |>
  dplyr::mutate(KABKOTNO = stringr::str_pad(as.character(KABKOTNO), 2, pad = "0"))

jabar13 <- jabar13 |>
  dplyr::select(KABKOTNO, geometry) |>
  dplyr::left_join(poverty13, by = "KABKOTNO")

join_audit13 <- tibble::tibble(
  polygon = nrow(jabar13),
  outcome_non_missing = sum(!is.na(jabar13$kemiskinan_persen_2024)),
  outcome_missing = sum(is.na(jabar13$kemiskinan_persen_2024)),
  duplicate_code = sum(duplicated(jabar13$KABKOTNO))
)
knitr::kable(join_audit13, caption = "Audit spatial join geometry dan data kemiskinan")
Table 13.2: Audit spatial join geometry dan data kemiskinan
polygon outcome_non_missing outcome_missing duplicate_code
27 27 0 0

Analisis dilanjutkan hanya jika seluruh 27 polygon memiliki outcome dan tidak ada duplikasi kode.

13.8 Statistik Deskriptif Kemiskinan Areal

desc13 <- jabar13 |>
  sf::st_drop_geometry() |>
  dplyr::summarise(
    n = dplyr::n(),
    mean = mean(kemiskinan_persen_2024),
    median = median(kemiskinan_persen_2024),
    sd = sd(kemiskinan_persen_2024),
    q1 = quantile(kemiskinan_persen_2024, .25),
    q3 = quantile(kemiskinan_persen_2024, .75),
    min = min(kemiskinan_persen_2024),
    max = max(kemiskinan_persen_2024),
    cv = sd / mean
  )
knitr::kable(desc13, digits = 2, caption = "Statistik deskriptif persentase penduduk miskin, 2024")
Table 13.3: Statistik deskriptif persentase penduduk miskin, 2024
n mean median sd q1 q3 min max cv
27 8.01 8.41 2.65 6.36 10.19 2.34 11.93 0.33
rank13 <- jabar13 |>
  sf::st_drop_geometry() |>
  dplyr::arrange(dplyr::desc(kemiskinan_persen_2024)) |>
  dplyr::mutate(rank = dplyr::row_number()) |>
  dplyr::select(rank, nama_kabupaten_kota, kemiskinan_persen_2024)
knitr::kable(rank13, digits = 2, caption = "Ranking deskriptif kemiskinan kabupaten/kota Jawa Barat, 2024")
Table 13.4: Ranking deskriptif kemiskinan kabupaten/kota Jawa Barat, 2024
rank nama_kabupaten_kota kemiskinan_persen_2024
1 KABUPATEN INDRAMAYU 11.93
2 KABUPATEN KUNINGAN 11.88
3 KOTA TASIKMALAYA 11.10
4 KABUPATEN CIREBON 11.00
5 KABUPATEN MAJALENGKA 10.82
6 KABUPATEN BANDUNG BARAT 10.49
7 KABUPATEN TASIKMALAYA 10.23
8 KABUPATEN CIANJUR 10.14
9 KABUPATEN GARUT 9.68
10 KABUPATEN SUBANG 9.49
11 KABUPATEN SUMEDANG 9.10
12 KOTA CIREBON 9.02
13 KABUPATEN PANGANDARAN 8.75
14 KABUPATEN PURWAKARTA 8.41
15 KABUPATEN KARAWANG 7.86
16 KABUPATEN CIAMIS 7.39
17 KOTA SUKABUMI 7.20
18 KABUPATEN BOGOR 7.05
19 KABUPATEN SUKABUMI 6.87
20 KOTA BOGOR 6.53
21 KABUPATEN BANDUNG 6.19
22 KOTA BANJAR 5.85
23 KABUPATEN BEKASI 4.80
24 KOTA CIMAHI 4.39
25 KOTA BEKASI 4.01
26 KOTA BANDUNG 3.87
27 KOTA DEPOK 2.34

Ranking hanya deskriptif. Ia belum mempertimbangkan ukuran populasi, kedalaman kemiskinan, kerentanan, atau hubungan spasial.

13.9 Distribusi dan Choropleth

ggplot2::ggplot(sf::st_drop_geometry(jabar13), ggplot2::aes(kemiskinan_persen_2024)) +
  ggplot2::geom_histogram(bins = 8, boundary = 0) +
  ggplot2::geom_vline(xintercept = mean(jabar13$kemiskinan_persen_2024), linetype = 2) +
  ggplot2::labs(title = "Distribusi persentase penduduk miskin antarkabupaten/kota", x = "Penduduk miskin (%)", y = "Jumlah wilayah")

ggplot2::ggplot(jabar13) +
  ggplot2::geom_sf(ggplot2::aes(fill = kemiskinan_persen_2024), colour = "white", linewidth = .25) +
  ggplot2::scale_fill_viridis_c(option = "C", direction = -1) +
  ggplot2::labs(title = "Persentase Penduduk Miskin Kabupaten/Kota Jawa Barat, 2024", fill = "Kemiskinan (%)", caption = "Sumber indikator: BPS/Open Data Jawa Barat; batas wilayah: berkas polygon mata kuliah") +
  ggplot2::theme_void() +
  ggplot2::theme(plot.title = ggplot2::element_text(face = "bold"), plot.caption = ggplot2::element_text(hjust = 0))

Choropleth menampilkan rate, bukan jumlah absolut. Ini penting karena polygon luas atau berpenduduk besar tidak otomatis memiliki tingkat kemiskinan tinggi.

13.10 Struktur Ketetanggaan Antar-Polygon

# Bobot utama: polygon saling beririsan/bersinggungan (intersection adjacency).
rel_inter13 <- sf::st_intersects(jabar13)
n13 <- nrow(jabar13)
W_inter13 <- matrix(0, n13, n13)
for (i in seq_len(n13)) {
  jj <- setdiff(rel_inter13[[i]], i)
  if (length(jj) > 0) W_inter13[i, jj] <- 1
}

# Bobot alternatif: jarak minimum antar-polygon <= 10 km.
jabar13_m <- sf::st_transform(jabar13, 32748)
D13 <- units::drop_units(sf::st_distance(jabar13_m))
diag(D13) <- Inf
W_10km13 <- 1L * (D13 <= 10000)
diag(W_10km13) <- 0L

neighbor_tbl13 <- tibble::tibble(
  nama_kabupaten_kota = jabar13$nama_kabupaten_kota,
  intersection_neighbors = rowSums(W_inter13),
  neighbors_within_10km = rowSums(W_10km13)
)
knitr::kable(neighbor_tbl13, caption = "Jumlah tetangga areal: intersection dan proximity 10 km")
Table 13.5: Jumlah tetangga areal: intersection dan proximity 10 km
nama_kabupaten_kota intersection_neighbors neighbors_within_10km
KABUPATEN BOGOR 8 8
KABUPATEN SUKABUMI 3 4
KABUPATEN CIANJUR 6 8
KABUPATEN BANDUNG 7 7
KABUPATEN GARUT 4 6
KABUPATEN TASIKMALAYA 6 7
KABUPATEN CIAMIS 6 8
KABUPATEN KUNINGAN 3 4
KABUPATEN CIREBON 4 4
KABUPATEN MAJALENGKA 6 7
KABUPATEN SUMEDANG 6 9
KABUPATEN INDRAMAYU 4 4
KABUPATEN SUBANG 6 8
KABUPATEN PURWAKARTA 5 8
KABUPATEN KARAWANG 4 5
KABUPATEN BEKASI 3 5
KABUPATEN BANDUNG BARAT 6 7
KABUPATEN PANGANDARAN 2 3
KOTA BOGOR 1 3
KOTA SUKABUMI 1 2
KOTA BANDUNG 3 6
KOTA CIREBON 1 2
KOTA BEKASI 3 3
KOTA DEPOK 2 4
KOTA CIMAHI 3 5
KOTA TASIKMALAYA 2 2
KOTA BANJAR 1 3
ggplot2::ggplot(neighbor_tbl13, ggplot2::aes(reorder(nama_kabupaten_kota, intersection_neighbors), intersection_neighbors)) +
  ggplot2::geom_col() +
  ggplot2::coord_flip() +
  ggplot2::labs(title = "Jumlah tetangga berdasarkan intersection polygon", x = NULL, y = "Jumlah tetangga")

Perbedaan degree menunjukkan bahwa setiap wilayah memiliki jumlah tetangga berbeda. Row-standardization mencegah wilayah dengan banyak tetangga secara otomatis memiliki spatial lag yang lebih besar hanya karena jumlah koneksi.

13.11 Moran’s I Global dan Permutation Test

lw_inter13 <- spdep::mat2listw(W_inter13, style = "W", zero.policy = TRUE)
y13 <- jabar13$kemiskinan_persen_2024

moran_test13 <- spdep::moran.test(y13, lw_inter13, zero.policy = TRUE, randomisation = TRUE)
set.seed(260813)
moran_mc13 <- spdep::moran.mc(y13, lw_inter13, nsim = 999, zero.policy = TRUE)

moran_out13 <- tibble::tibble(
  statistic = "Moran's I — polygon intersection",
  I_observed = unname(moran_test13$estimate[[1]]),
  expectation = unname(moran_test13$estimate[[2]]),
  variance = unname(moran_test13$estimate[[3]]),
  p_asymptotic = moran_test13$p.value,
  p_permutation = moran_mc13$p.value
)
knitr::kable(moran_out13, digits = 4, caption = "Autocorrelation global kemiskinan Jawa Barat")
Table 13.6: Autocorrelation global kemiskinan Jawa Barat
statistic I_observed expectation variance p_asymptotic p_permutation
Moran’s I — polygon intersection 0.4776 -0.0385 0.0199 0.0001 0.001

P-value permutation lebih sesuai untuk pembelajaran karena secara eksplisit membandingkan pola observasi dengan distribusi acak hasil pengacakan label wilayah.

13.12 Moran Scatterplot

z13 <- as.numeric(scale(y13))
lag_z13 <- spdep::lag.listw(lw_inter13, z13, zero.policy = TRUE)
scatter13 <- tibble::tibble(
  wilayah = jabar13$nama_kabupaten_kota,
  z = z13,
  spatial_lag_z = lag_z13
)

ggplot2::ggplot(scatter13, ggplot2::aes(z, spatial_lag_z)) +
  ggplot2::geom_hline(yintercept = 0, linetype = 2) +
  ggplot2::geom_vline(xintercept = 0, linetype = 2) +
  ggplot2::geom_smooth(method = "lm", se = FALSE) +
  ggplot2::geom_point(size = 2.6) +
  ggplot2::labs(title = "Moran scatterplot kemiskinan 2024", x = "Kemiskinan terstandardisasi (z)", y = "Spatial lag z")

Kuadran kanan-atas dan kiri-bawah merepresentasikan kemiripan lokal (high–high dan low–low), sedangkan dua kuadran lainnya menandai kontras lokal.

13.13 Local Moran dan Peta LISA

local13 <- spdep::localmoran(y13, lw_inter13, zero.policy = TRUE)

jabar13$Ii <- local13[, "Ii"]
jabar13$Z_Ii <- local13[, "Z.Ii"]
pcol13 <- grep("^Pr", colnames(local13), value = TRUE)[1]
jabar13$p_local <- local13[, pcol13]
jabar13$z <- z13
jabar13$lag_z <- lag_z13
jabar13$quadrant <- dplyr::case_when(
  jabar13$z >= 0 & jabar13$lag_z >= 0 ~ "High–High",
  jabar13$z < 0 & jabar13$lag_z < 0 ~ "Low–Low",
  jabar13$z >= 0 & jabar13$lag_z < 0 ~ "High–Low",
  TRUE ~ "Low–High"
)
jabar13$lisa_class <- ifelse(jabar13$p_local <= .05, jabar13$quadrant, "Tidak signifikan")

local_tbl13 <- jabar13 |>
  sf::st_drop_geometry() |>
  dplyr::select(nama_kabupaten_kota, kemiskinan_persen_2024, Ii, Z_Ii, p_local, lisa_class) |>
  dplyr::arrange(p_local)
knitr::kable(local_tbl13, digits = 4, caption = "Local Moran dan klasifikasi LISA")
Table 13.7: Local Moran dan klasifikasi LISA
nama_kabupaten_kota kemiskinan_persen_2024 Ii Z_Ii p_local lisa_class
KABUPATEN CIREBON 11.00 1.2809 2.4893 0.0128 High–High
KABUPATEN MAJALENGKA 10.82 0.9306 2.4846 0.0130 High–High
KOTA BEKASI 4.01 1.9470 2.4593 0.0139 Low–Low
KABUPATEN BOGOR 7.05 0.2348 2.1219 0.0338 Low–Low
KABUPATEN INDRAMAYU 11.93 1.2103 1.8862 0.0593 Tidak signifikan
KABUPATEN SUMEDANG 9.10 0.2746 1.8163 0.0693 Tidak signifikan
KABUPATEN CIAMIS 7.39 -0.1624 -1.7941 0.0728 Tidak signifikan
KOTA DEPOK 2.34 2.0870 1.6298 0.1031 Tidak signifikan
KABUPATEN TASIKMALAYA 10.23 0.4785 1.6194 0.1054 Tidak signifikan
KABUPATEN KUNINGAN 11.88 0.9855 1.3336 0.1823 Tidak signifikan
KABUPATEN BEKASI 4.80 0.8127 1.2871 0.1981 Tidak signifikan
KOTA CIREBON 9.02 0.4444 1.1451 0.2522 Tidak signifikan
KABUPATEN SUBANG 9.49 0.2146 1.0810 0.2797 Tidak signifikan
KABUPATEN PURWAKARTA 8.41 0.0581 0.9278 0.3535 Tidak signifikan
KOTA CIMAHI 4.39 0.6248 0.9242 0.3554 Tidak signifikan
KABUPATEN BANDUNG BARAT 10.49 -0.3418 -0.8816 0.3780 Tidak signifikan
KOTA BANDUNG 3.87 0.6081 0.8258 0.4089 Tidak signifikan
KABUPATEN GARUT 9.68 0.2220 0.7827 0.4338 Tidak signifikan
KOTA TASIKMALAYA 11.10 0.3634 0.5123 0.6084 Tidak signifikan
KABUPATEN KARAWANG 7.86 0.0132 0.4692 0.6389 Tidak signifikan
KABUPATEN PANGANDARAN 8.75 0.0866 0.4497 0.6530 Tidak signifikan
KOTA SUKABUMI 7.20 0.1380 0.4448 0.6565 Tidak signifikan
KOTA BOGOR 6.53 0.2119 0.3881 0.6979 Tidak signifikan
KOTA BANJAR 5.85 0.2001 0.2708 0.7865 Tidak signifikan
KABUPATEN CIANJUR 10.14 0.0316 0.1910 0.8485 Tidak signifikan
KABUPATEN BANDUNG 6.19 -0.0409 -0.0938 0.9253 Tidak signifikan
KABUPATEN SUKABUMI 6.87 -0.0196 -0.0490 0.9610 Tidak signifikan
ggplot2::ggplot(jabar13) +
  ggplot2::geom_sf(ggplot2::aes(fill = lisa_class), colour = "white", linewidth = .25) +
  ggplot2::labs(title = "Peta Local Moran (LISA) kemiskinan Jawa Barat, 2024", fill = "LISA class", caption = "p lokal ≤ 0,05 ditampilkan sebagai pola lokal; interpretasi bersifat screening") +
  ggplot2::theme_void() +
  ggplot2::theme(plot.title = ggplot2::element_text(face = "bold"), plot.caption = ggplot2::element_text(hjust = 0))

13.14 Sensitivity Analysis: Intersection versus Proximity 10 km

lw_10km13 <- spdep::mat2listw(W_10km13, style = "W", zero.policy = TRUE)
set.seed(260813)
mc_inter13 <- spdep::moran.mc(y13, lw_inter13, nsim = 999, zero.policy = TRUE)
set.seed(260813)
mc_10km13 <- spdep::moran.mc(y13, lw_10km13, nsim = 999, zero.policy = TRUE)

sens13 <- tibble::tibble(
  neighborhood = c("Polygon intersection", "Polygon distance <= 10 km"),
  Moran_I = c(unname(mc_inter13$statistic), unname(mc_10km13$statistic)),
  p_permutation = c(mc_inter13$p.value, mc_10km13$p.value),
  mean_neighbors = c(mean(rowSums(W_inter13)), mean(rowSums(W_10km13)))
)
knitr::kable(sens13, digits = 4, caption = "Sensitivity Moran's I terhadap definisi neighborhood areal")
Table 13.8: Sensitivity Moran’s I terhadap definisi neighborhood areal
neighborhood Moran_I p_permutation mean_neighbors
Polygon intersection 0.4776 0.001 3.9259
Polygon distance <= 10 km 0.4060 0.001 5.2593

Jika tanda, magnitude, atau kesimpulan inferensial berubah drastis antara intersection adjacency dan proximity 10 km, hasil harus dilaporkan sebagai sensitif terhadap definisi konektivitas. Neighborhood seharusnya mewakili mekanisme regional yang masuk akal; adjacency administratif belum tentu cocok untuk mobilitas komuter, perdagangan, DAS, atau jaringan transportasi.

13.15 Peta Interaktif Polygon

pal13 <- leaflet::colorNumeric("YlOrRd", domain = jabar13$kemiskinan_persen_2024)
leaflet::leaflet(jabar13) |>
  leaflet::addProviderTiles("CartoDB.Positron") |>
  leaflet::addPolygons(
    fillColor = ~pal13(kemiskinan_persen_2024),
    fillOpacity = .75,
    weight = .8,
    color = "white",
    popup = ~paste0(
      "<b>", nama_kabupaten_kota, "</b><br>",
      "Kemiskinan 2024: ", round(kemiskinan_persen_2024, 2), "%<br>",
      "LISA: ", lisa_class
    )
  ) |>
  leaflet::addLegend(pal = pal13, values = ~kemiskinan_persen_2024, title = "Kemiskinan (%)")

13.16 Interpretasi dalam Konteks Regional

Analisis areal mengubah pertanyaan dari “kabupaten mana paling tinggi?” menjadi “apakah kabupaten dengan kemiskinan tinggi berada dalam lingkungan regional yang juga memiliki nilai tinggi?”. Jika terdapat pola High–High, intervensi lintas batas dapat dipertimbangkan karena akses pekerjaan, transportasi, pasar, dan layanan publik tidak berhenti di garis administrasi. Sebaliknya, High–Low dapat menunjukkan wilayah yang berbeda tajam dari tetangganya dan layak ditelaah sebagai kasus khusus.

Namun spatial autocorrelation tidak menjelaskan penyebab. Pola dapat muncul karena struktur ekonomi yang mirip, topografi, aksesibilitas, urbanisasi, kebijakan historis, atau proses pengukuran. Untuk membuat klaim mekanisme diperlukan variabel tambahan dan model yang sesuai.

13.17 MAUP dan Ecological Fallacy

Modifiable Areal Unit Problem (MAUP) berarti hasil statistik dapat berubah bila batas atau tingkat agregasi wilayah diubah. Kabupaten/kota adalah satu pilihan agregasi administratif, bukan satu-satunya representasi proses sosial-ekonomi.

Ecological fallacy terjadi jika hubungan pada tingkat kabupaten langsung diterapkan kepada individu. Misalnya, kabupaten dengan kemiskinan tinggi tidak berarti setiap rumah tangga di kabupaten itu miskin, dan asosiasi antara internet dan kemiskinan antarkabupaten tidak sama dengan hubungan pada rumah tangga. (Pebesma dan Bivand 2023; Lovelace, Nowosad, dan Muenchow 2025)

13.18 Latihan

  1. Jelaskan perbedaan contiguity klasik, intersection adjacency, dan proximity antar-polygon.
  2. Mengapa polygon lebih tepat daripada titik centroid untuk outcome kabupaten/kota?
  3. Apa arti Moran’s II positif tetapi permutation p-value besar?
  4. Bandingkan choropleth menggunakan quantile breaks dan continuous scale. Apakah persepsi disparitas berubah?
  5. Identifikasi wilayah dengan silhouette—bukan, pada bab ini LISA—High–High dan Low–Low. Apa data tambahan yang perlu diperiksa sebelum rekomendasi dibuat?
  6. Jelaskan satu contoh MAUP dan satu contoh ecological fallacy dalam analisis kemiskinan regional.

13.18.1 Tugas Terstruktur Pertemuan 13

Gunakan polygon Jawa Barat dan outcome regional dari BPS/Open Data Jabar. Tampilkan audit geometry, audit join, statistik deskriptif, ranking, choropleth, degree neighborhood, Moran’s I + permutation test, Moran scatterplot, Local Moran/LISA map, dan sensitivity intersection vs proximity polygon. Akhiri dengan memo 300–400 kata yang memisahkan temuan deskriptif, temuan spasial, hipotesis mekanisme, dan rekomendasi data lanjutan.

13.18.2 Kuis Formatif Pertemuan 13

  1. Tuliskan rumus Moran’s II dan jelaskan S0S_0.
  2. Apa tujuan row-standardization pada WW?
  3. Apa beda High–High dengan High–Low?
  4. Mengapa local p-values memerlukan kehati-hatian karena multiple testing?
  5. Mengapa autocorrelation spasial tidak sama dengan causal spillover?

13.19 Hubungan dengan Capstone Project

Jika capstone menggunakan unit wilayah, tim harus memutuskan apakah geografi hanya untuk visualisasi atau merupakan bagian dari mekanisme analitik. Bila struktur spasial relevan, minimal lakukan audit neighborhood dan satu sensitivity analysis. Peta tidak boleh menjadi dekorasi; ia harus menjawab pertanyaan substantif.

13.20 Kesimpulan

Regional data science membutuhkan areal thinking. Untuk indikator kabupaten/kota, polygon, neighborhood, spatial lag, global Moran, dan Local Moran memberi kerangka yang lebih tepat daripada sekadar plot titik. Analisis tetap harus menjaga batas inferensi: pola spasial adalah evidence tentang struktur, bukan otomatis evidence tentang sebab.

13.21 Pendalaman Magister — Areal Spatial Reasoning

13.21.1 Audit metodologis

  1. Apakah geometry dan outcome berada pada unit administratif yang sama?
  2. Apakah CRS dan vintage boundary telah diverifikasi?
  3. Apakah join menggunakan kode wilayah dan seluruh unmatched record diaudit?
  4. Apakah definisi WW memiliki justifikasi substantif?
  5. Apakah inference global menggunakan randomization/permutation check?
  6. Apakah Local Moran dibaca sebagai screening dan bukan causal cluster?
  7. Apakah MAUP serta ecological fallacy dinyatakan secara eksplisit?

13.21.2 Pertanyaan Viva

  1. Mengapa data kabupaten/kota disebut areal data?
  2. Apa yang berubah ketika definisi neighborhood diubah dari intersection menjadi proximity 10 km?
  3. Bagaimana membaca Moran scatterplot?
  4. Apa perbedaan global Moran dan Local Moran?
  5. Kapan spatial autocorrelation seharusnya memengaruhi desain model prediktif?

14 Model Comparison, Uncertainty, Fairness, dan Evaluasi Kebijakan

14.1 Pendahuluan

Model terbaik bukan selalu model dengan metric agregat paling kecil. Keputusan regional membutuhkan evaluasi robustness, uncertainty, subgroup performance, fairness, dan konsekuensi operasional. Model card adalah salah satu cara mendokumentasikan intended use, metric, keterbatasan, dan kelompok kinerja. (Mitchell dkk. 2019)

14.2 Tujuan Pembelajaran

Mahasiswa mampu membandingkan model pada metric yang relevan, menganalisis residual/subgroup, melakukan sensitivity analysis sederhana, dan menyusun model card.

14.3 Definisi dan Konsep

Robustness adalah kestabilan kesimpulan terhadap perubahan data/model yang wajar. Fairness di konteks regional berarti memeriksa apakah error sistematis lebih besar pada kelompok wilayah tertentu. Hal ini bukan sekadar masalah teknis; definisi fairness terkait tujuan program.

14.4 Formulasi Matematis

Perbedaan error antargrup:

ΔMAE=MAEAMAEB. \Delta_{MAE}=MAE_A-MAE_B.

Coverage interval prediksi:

Coverage=1ni=1nI(LiyiUi), Coverage=\frac{1}{n}\sum_{i=1}^{n} I(L_i\le y_i\le U_i),

dengan [Li,Ui][L_i,U_i] interval prediksi. Coverage nominal 95% idealnya mendekati 0,95 pada data yang relevan.

14.4.1 Perbandingan model sebagai estimasi ketidakpastian

Jika mbkm_{bk} adalah nilai metrik model kk pada resample b=1,,Bb=1,\dots,B, rata-rata dan standard error resampling: mk=1Bb=1Bmbk,SE(mk)=smkB. \bar m_k=\frac{1}{B}\sum_{b=1}^{B}m_{bk},\qquad SE(\bar m_k)=\frac{s_{m_k}}{\sqrt B}. Selisih kecil dibanding variability resampling tidak layak diperlakukan sebagai bukti bahwa satu model “pasti terbaik”. Pertimbangkan kesederhanaan, interpretability, latency, fairness, dan data requirements. (Kuhn dan Silge 2022)

14.4.2 Bootstrap untuk uncertainty

Ambil BB bootstrap samples dan hitung statistic θ̂*(b)\hat\theta^{*(b)}. Bootstrap standard error: SÊboot(θ̂)=1B1b=1B(θ̂*(b)θ*)2. \widehat{SE}_{boot}(\hat\theta)=\sqrt{\frac{1}{B-1}\sum_{b=1}^{B}(\hat\theta^{*(b)}-\bar\theta^{*})^2}. Bootstrap dapat diterapkan pada koefisien, ranking, atau metrik model, dengan resampling scheme yang menghormati struktur panel/spasial jika diperlukan.

14.4.3 Ranking stability

Jika ri(a)r_i^{(a)} dan ri(b)r_i^{(b)} adalah ranking wilayah di dua skenario bobot/model, Spearman rank correlation: ρs=16idi2n(n21),di=ri(a)ri(b). \rho_s=1-\frac{6\sum_i d_i^2}{n(n^2-1)},\qquad d_i=r_i^{(a)}-r_i^{(b)}. Jika daftar “10 wilayah prioritas” berubah drastis karena sedikit perubahan bobot, rekomendasi harus dilaporkan sebagai tidak stabil.

14.4.4 Fairness metrics

Untuk protected/context group AA:

Demographic parity difference DP=P(Ŷ=1A=a)P(Ŷ=1A=b). DP=P(\hat Y=1\mid A=a)-P(\hat Y=1\mid A=b).

Equal opportunity difference EO=P(Ŷ=1Y=1,A=a)P(Ŷ=1Y=1,A=b). EO=P(\hat Y=1\mid Y=1,A=a)-P(\hat Y=1\mid Y=1,A=b).

Tidak ada satu fairness metric yang selalu tepat; kriteria dapat saling bertentangan dan konteks hukum/etik menentukan apa yang relevan. Dalam regional policy, group dapat berupa urban/rural, pulau/kawasan, atau kategori kapasitas fiskal—tetapi penggunaan kategori harus punya dasar substantif dan tidak menstigmatisasi. (Hardt, Price, dan Srebro 2016)

14.4.5 Calibration dan decision curve sederhana

Jika benefit intervensi dan cost berbeda, net benefit pada threshold tt dapat ditulis secara sederhana: NB(t)=TP(t)nFP(t)nt1t. NB(t)=\frac{TP(t)}{n}-\frac{FP(t)}{n}\frac{t}{1-t}. Rumus berasal dari decision-analytic framing tertentu dan tidak otomatis berlaku untuk semua kebijakan; gunakan sebagai contoh bahwa threshold harus dihubungkan dengan trade-off keputusan.

14.4.6 Dari prediction ke policy evaluation: Difference-in-Differences

Jika ada treated group D=1D=1 dan control D=0D=0, sebelum (t=0t=0) dan sesudah (t=1t=1), estimand DID: τ̂DID=(Y1,postY1,pre)(Y0,postY0,pre). \widehat\tau_{DID}=(\bar Y_{1,post}-\bar Y_{1,pre})-(\bar Y_{0,post}-\bar Y_{0,pre}). Regresi: Yit=α+βDi+γPostt+τ(Di×Postt)+εit. Y_{it}=\alpha+\beta D_i+\gamma Post_t+\tau(D_i\times Post_t)+\varepsilon_{it}. Interpretasi kausal membutuhkan asumsi parallel trends dan desain yang kredibel. DID dimasukkan untuk menunjukkan perbedaan antara “memprediksi outcome” dan “mengevaluasi apakah kebijakan menyebabkan perubahan”. (Callaway dan Sant’Anna 2021; Hernán dan Robins 2020)

14.5 Intuisi Metode

Model yang rata-rata bagus bisa buruk untuk daerah berpenduduk kecil atau data terbatas. Jika model digunakan untuk alokasi bantuan, error tidak merata dapat memperkuat ketimpangan.

14.5.1 Worked Example — model difference relative to uncertainty

Model A RMSE fold: 2.1,2.2,2.0,2.4,2.3 → mean 2.20. Model B: 2.05,2.18,1.98,2.36,2.28 → mean 2.17. Selisih 0.03 sangat kecil dibanding variasi antar-fold. Menyebut B “jauh lebih baik” tidak didukung. Pertimbangkan paired resample differences dan simplicity.

14.5.2 Bootstrap ranking

Untuk setiap bootstrap bb, hitung score/ranking wilayah. Untuk wilayah ii, laporkan median rank dan interval percentile: CIrank,i=[Q0.025(ri*),Q0.975(ri*)]. CI_{rank,i}=[Q_{0.025}(r_i^*),Q_{0.975}(r_i^*)]. Jika wilayah ranking 8 memiliki interval 3–19, penetapan cut-off “top 10” harus hati-hati.

14.5.3 Fairness numeric

Group urban: TPR=0.90; rural: TPR=0.65. Equal opportunity difference urban–rural=0.25. Ini memberi sinyal model lebih sering melewatkan prioritas rural. Penyebab dapat berasal dari data quality, feature availability, label process, atau heterogeneity; fairness diagnostic bukan diagnosis penyebab.

14.5.4 DID numeric

Treated outcome: pre 60, post 75 → +15. Control: pre 58, post 65 → +7. τ̂DID=157=8. \widehat\tau_{DID}=15-7=8. Interpretasi kausal memerlukan parallel trends dan tidak adanya perubahan berbeda lain yang confound treatment timing. Uji/plot pre-trends penting, dan modern DID perlu memperhatikan staggered adoption. (Callaway dan Sant’Anna 2021)

14.5.5 Robustness matrix

Analytic choice Base Alternative Result stable?
weights index 0.5/0.3/0.2 equal weights yes/no
split temporal grouped region yes/no
model RF ridge/logit yes/no
W spatial queen kNN yes/no
missing complete case imputation/sensitivity yes/no

Capstone harus menyimpulkan bukan hanya “hasil”, tetapi set of results that survive reasonable alternatives.

14.5.6 Uncertainty hierarchy

Bedakan: 1. sampling uncertainty; 2. measurement error; 3. model uncertainty; 4. hyperparameter uncertainty; 5. scenario/weight uncertainty; 6. structural uncertainty tentang mekanisme regional.

CI koefisien hanya menangkap sebagian dari daftar tersebut. Kebijakan berbasis data harus menghindari false precision.

14.6 Contoh dengan Data Simulasi

panel <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE)
train <- panel |> filter(tahun <= 2023)
test <- panel |> filter(tahun >= 2024)
fit <- lm(kemiskinan_persen ~ pdrb_perkapita_juta + tpt_persen + internet_persen + ipm, data = train)
ev <- test |> mutate(pred = predict(fit, newdata = test), abs_err = abs(kemiskinan_persen-pred))

ev |>
  group_by(urban) |>
  summarise(n=n(), MAE=mean(abs_err), RMSE=sqrt(mean((kemiskinan_persen-pred)^2))) |>
  knitr::kable(digits=3, caption="Kinerja model menurut tipe wilayah - simulasi")
Table 14.1: Kinerja model menurut tipe wilayah - simulasi
urban n MAE RMSE
0 22 1.343 1.611
1 32 0.927 1.259

14.6.1 Visualisasi Output: Error menurut Tipe Wilayah

ev |>
  dplyr::group_by(urban) |>
  dplyr::summarise(MAE = mean(abs_err), .groups = "drop") |>
  dplyr::mutate(tipe = ifelse(urban == 1, "Urban", "Non-urban")) |>
  ggplot2::ggplot(ggplot2::aes(tipe, MAE, fill = tipe)) +
  ggplot2::geom_col(show.legend = FALSE) +
  ggplot2::scale_fill_manual(values = c("Urban" = "#145B8C", "Non-urban" = "#C99A17")) +
  ggplot2::labs(title = "MAE menurut tipe wilayah — simulasi", x = NULL, y = "MAE")

14.7 Contoh dengan Data Nyata

Pada INDO-DAPOER atau Open Data Jabar, subgroup dapat dibentuk dari status kota/kabupaten, quantile populasi, zona geografis, atau kategori berbasis teori. Hindari menciptakan subgroup kecil yang membuat metric sangat tidak stabil.

Kartu dataset real.

  • Nama: INDO-DAPOER atau Open Data Jawa Barat untuk audit subgroup dan robustness.
  • Sumber dan URL: INDO-DAPOER https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research; Open Data Jabar https://opendata.jabarprov.go.id/.
  • Tahun: sesuai analytic sample; semua subgroup harus berasal dari periode dan definisi yang kompatibel.
  • Unit observasi: wilayah–tahun atau wilayah pada satu tahun.
  • Variabel/definisi: outcome/prediction, residual/error, status kabupaten/kota atau subgroup berbasis ukuran/populasi/geografi; subgroup harus didefinisikan sebelum melihat hasil jika digunakan untuk evaluasi formal.
  • Alasan digunakan: memperlihatkan bahwa average performance dapat menyembunyikan error tinggi pada jenis wilayah tertentu.
  • Keterbatasan: subgroup kecil menghasilkan metric tidak stabil; fairness statistik tidak identik dengan keadilan kebijakan dan perlu interpretasi institusional. (World Bank 2026; Pemerintah Provinsi Jawa Barat 2026b)

14.8 Analisis Menggunakan R

# Sensitivitas ranking prioritas terhadap bobot indikator.
latest <- panel |> filter(tahun == 2025)
rank_a <- latest |>
  mutate(score = .6*as.numeric(scale(kemiskinan_persen)) + .4*as.numeric(scale(tpt_persen))) |>
  arrange(desc(score)) |>
  mutate(rank_a = row_number())
rank_b <- latest |>
  mutate(score = .4*as.numeric(scale(kemiskinan_persen)) + .3*as.numeric(scale(tpt_persen)) - .3*as.numeric(scale(ipm))) |>
  arrange(desc(score)) |>
  mutate(rank_b = row_number())
left_join(rank_a |> select(wilayah, rank_a), rank_b |> select(wilayah, rank_b), by="wilayah") |>
  mutate(delta_rank = rank_b-rank_a) |>
  arrange(desc(abs(delta_rank))) |>
  head(10) |>
  knitr::kable()
wilayah rank_a rank_b delta_rank
Wilayah_21 15 3 -12
Wilayah_14 11 22 11
Wilayah_27 17 9 -8
Wilayah_26 5 11 6
Wilayah_25 13 19 6
Wilayah_24 8 13 5
Wilayah_07 1 5 4
Wilayah_01 19 15 -4
Wilayah_10 21 25 4
Wilayah_08 24 20 -4

14.9 Paket Output Evaluasi Model Lengkap

d14 <- readr::read_csv("data/simulasi_panel_regional.csv", show_col_types=FALSE) |>
  dplyr::filter(tahun==2025)
set.seed(260814)
s14 <- rsample::initial_split(d14, prop=.8)
tr14 <- rsample::training(s14); te14 <- rsample::testing(s14)

lm14 <- stats::lm(kemiskinan_persen ~ pdrb_perkapita_juta+tpt_persen+ipm+internet_persen+umkm_per_1000, data=tr14)
rf14 <- ranger::ranger(kemiskinan_persen ~ pdrb_perkapita_juta+tpt_persen+ipm+internet_persen+umkm_per_1000, data=tr14, num.trees=500, seed=260814)

pred14 <- dplyr::bind_rows(
  tibble::tibble(actual=te14$kemiskinan_persen, pred=predict(lm14,newdata=te14), model="Linear"),
  tibble::tibble(actual=te14$kemiskinan_persen, pred=predict(rf14,data=te14)$predictions, model="Random forest")
) |> dplyr::mutate(error=pred-actual)

metric14 <- pred14 |> dplyr::group_by(model) |>
  dplyr::summarise(RMSE=sqrt(mean(error^2)), MAE=mean(abs(error)), Bias=mean(error), P90_AbsError=quantile(abs(error),.90), .groups="drop")
knitr::kable(metric14, digits=3, caption="Perbandingan metric utama dan tail error")
Table 14.2: Perbandingan metric utama dan tail error
model RMSE MAE Bias P90_AbsError
Linear 1.171 1.032 -0.993 1.626
Random forest 0.954 0.821 -0.800 1.349
ggplot2::ggplot(pred14, ggplot2::aes(error, fill=model)) +
  ggplot2::geom_density(alpha=.35) + ggplot2::geom_vline(xintercept=0,linetype=2) +
  ggplot2::labs(title="Distribusi error holdout", x="Prediction error", fill="Model")

worst14 <- pred14 |> dplyr::group_by(model) |> dplyr::slice_max(abs(error), n=5, with_ties=FALSE) |> dplyr::ungroup()
knitr::kable(worst14, digits=3, caption="Lima error absolut terbesar per model")
Table 14.3: Lima error absolut terbesar per model
actual pred model error
11.637 9.856 Linear -1.781
10.966 9.495 Linear -1.471
10.098 8.929 Linear -1.169
11.810 10.715 Linear -1.095
9.444 8.887 Linear -0.557
11.637 9.994 Random forest -1.643
10.966 9.911 Random forest -1.055
9.444 8.495 Random forest -0.949
11.810 11.166 Random forest -0.644
10.098 9.528 Random forest -0.570

14.10 Interpretasi dalam Konteks Regional

Jika prioritas berubah drastis hanya karena bobot sedikit berubah, sistem ranking rapuh. Kebijakan sebaiknya menampilkan tier atau range, bukan ranking presisi 1-27 yang memberi kesan kepastian palsu.

14.11 Latihan

  1. Apa beda robustness dan accuracy?
  2. Mengapa subgroup evaluation penting untuk kebijakan regional?
  3. Apa isi minimum model card?
  4. Analisis: hitung MAE per kuartil kemiskinan.
  5. Analisis: lakukan sensitivity ranking dengan tiga skema bobot.
  6. Mini-case: model sedikit lebih akurat tetapi error meningkat besar di wilayah tertinggal. Putuskan apakah model dipakai dan jelaskan governance-nya.

14.11.1 Tugas Terstruktur Pertemuan 14

Lakukan robustness audit capstone: minimal dua skenario bobot/fitur, satu alternatif resampling/model, satu fairness slice, dan satu uncertainty summary. Buat tabel “temuan yang stabil” vs “temuan yang sensitif”.

14.11.2 Kuis 4 — Minggu 11–14 (2,5%)

Kisi-kisi: k-means objective; silhouette; PCA; Moran’s I; spatial weights; bootstrap SE; rank stability; fairness metric; calibration; prediction vs policy evaluation; DID intuition.

14.12 Hubungan dengan Capstone Project

Milestone evaluasi: tim menyertakan tabel comparison, subgroup check, sensitivity analysis, dan model card 1 halaman.

14.13 Kesimpulan

Evaluasi model adalah evaluasi risiko keputusan. Metric agregat harus dilengkapi robustness, subgroup performance, uncertainty, dan keterbatasan penggunaan.

14.14 Pendalaman Magister — Robustness, fairness, dan policy evaluation

14.14.1 Audit metodologis

  1. Model winner ditentukan dari selisih trivial.
  2. Ranking uncertainty tidak dilaporkan.
  3. Fairness metric dipilih tanpa konteks.
  4. Subgroup kecil dinilai terlalu pasti.
  5. Did dipakai tanpa parallel trends.
  6. Prediction disamakan dengan evaluation.

14.14.2 Pertanyaan viva / diskusi kelas

  1. Apa practical significance selisih metric?
  2. Bagaimana bootstrap membantu ranking?
  3. Apa konflik fairness criteria?
  4. Mengapa stability penting sebelum top-k policy?
  5. Apa estimand DID?
  6. Bagaimana membedakan model uncertainty dan policy uncertainty?

15 Data Science for Regional Policy, Dashboard, dan Generative AI yang Bertanggung Jawab

15.1 Pendahuluan

Tahap akhir analisis adalah mengubah bukti menjadi opsi kebijakan. Rekomendasi yang baik menunjukkan evidence chain: masalah → data → hasil → ketidakpastian → opsi → konsekuensi. Generative AI dapat mempercepat coding dan dokumentasi, tetapi juga dapat menghasilkan kode salah, referensi fiktif, atau interpretasi terlalu percaya diri. (Miao dan Holmes 2023; Tabassi 2023)

15.2 Tujuan Pembelajaran

Mahasiswa mampu menyusun policy insight, membedakan temuan dan rekomendasi, membuat dashboard ringkas, menggunakan GenAI secara transparan, dan mendokumentasikan verifikasi.

15.3 Definisi dan Konsep

Evidence-based policy bukan berarti keputusan dibuat oleh model. Bukti adalah input bersama nilai publik, hukum, anggaran, political feasibility, local knowledge, dan equity. AI berperan sebagai assistant, bukan otoritas epistemik.

Penggunaan GenAI yang diperbolehkan: menjelaskan dokumentasi package, menghasilkan skeleton kode, debugging, membuat alternatif visual, merapikan dokumentasi, dan brainstorming interpretasi awal. Kewajiban mahasiswa: memeriksa kode, memvalidasi output, membaca sumber asli, menguji asumsi, menghapus data sensitif, dan mendeklarasikan penggunaan AI.

15.4 Formulasi Matematis

Untuk keputusan berbasis expected loss, secara konseptual pilih tindakan aa yang meminimalkan

a*=argminaE[L(a,θ)D], a^*=\arg\min_a E[L(a,\theta)\mid D],

di mana L(a,θ)L(a,\theta) adalah loss dari tindakan aa ketika keadaan sebenarnya θ\theta, dan DD adalah bukti/data. Formula ini menekankan bahwa keputusan bergantung pada loss/konsekuensi, bukan hanya prediksi.

15.4.1 Dari model output ke keputusan multi-kriteria

Jika kebijakan mempertimbangkan pp kriteria, score sederhana: Si=j=1pwjzij,jwj=1. S_i=\sum_{j=1}^{p}w_j z_{ij},\qquad \sum_jw_j=1. Tetapi jika model menghasilkan risk probability p̂i\hat p_i, score kebijakan dapat menggabungkan risiko dan feasibility: Qi=wrp̂i+wfFi+weEi, Q_i=w_r\hat p_i+w_fF_i+w_eE_i, dengan FiF_i feasibility dan EiE_i equity score. Persamaan ini bukan resep universal; tujuannya memperlihatkan bahwa transisi model→policy memerlukan pilihan eksplisit yang dapat diaudit.

15.4.2 Expected utility dan constrained prioritization

Jika intervensi ai{0,1}a_i\in\{0,1\}, benefit ekspektasian bib_i, biaya cic_i, anggaran BB: maxaiiaibis.t.iaiciB. \max_{a_i}\sum_i a_i b_i \quad \text{s.t.}\quad \sum_i a_i c_i\le B. Ini adalah bentuk knapsack/optimization sederhana. Model prediksi dapat membantu memperkirakan bib_i atau risiko, tetapi alokasi akhir tetap constrained decision problem.

15.4.3 Dashboard metrics dan denominator discipline

Jika dashboard menampilkan KPI, setiap KPI harus memiliki definisi matematis. Misalnya coverage: Coverage=beneficiaries reachedtarget population×100%. Coverage=\frac{\text{beneficiaries reached}}{\text{target population}}\times100\%.

Change vs target: Gapt=xtTt. Gap_t=x_t-T_t.

Percent target achievement (untuk target positif): Achievementt=xtTt×100%. Achievement_t=\frac{x_t}{T_t}\times100\%. Hindari persentase bila denominator nol/tidak stabil. Dashboard harus menampilkan sumber, periode, update time, dan status data.

15.4.4 Protokol validasi output Generative AI

Setiap keluaran AI yang memengaruhi analisis melewati empat lapis verifikasi:

V=Vsource×Vcode×Vresult×Vinterpretation, V=V_{source}\times V_{code}\times V_{result}\times V_{interpretation}, di mana setiap V{0,1}V_\cdot\in\{0,1\} pada checklist minimum. Jika salah satu nol, artefak belum layak dipakai. Ini bukan probabilistic score, tetapi process-control device.

  • Vsource=1V_{source}=1: sumber/URL/metadata dicek langsung.
  • Vcode=1V_{code}=1: kode dijalankan dan unit-tested secara minimal.
  • Vresult=1V_{result}=1: hasil dibandingkan dengan sanity check/baseline.
  • Vinterpretation=1V_{interpretation}=1: klaim substantif diperiksa terhadap definisi data dan teori.

UNESCO menekankan pendekatan human-centred dan validasi etis-pedagogis untuk GenAI; NIST AI RMF mendorong governance, mapping, measurement, dan management risiko AI. (Miao dan Holmes 2023; Tabassi 2023; Autio dkk. 2024)

15.4.5 AI-use declaration minimum

Untuk setiap project, simpan tabel:

Elemen Isi minimum
Tool/model nama layanan/model bila diketahui
Tanggal kapan digunakan
Tujuan dokumentasi, debugging, ide visualisasi, dsb.
Prompt category ringkasan, bukan data sensitif mentah
Output used bagian apa yang benar-benar digunakan
Verification bagaimana kode/sumber/hasil diverifikasi
Human revision perubahan substansial yang dilakukan mahasiswa

Data personal, data rahasia, atau data dengan pembatasan lisensi tidak boleh ditempelkan ke layanan AI publik tanpa dasar dan izin yang sesuai.

15.4.6 Reproducibility sebagai kontrak ilmiah

Analisis yang reproducible dapat dipandang sebagai fungsi Output=F(Data,Code,Parameters,Environment). Output=F(Data,Code,Parameters,Environment). Jika salah satu komponen tidak tersedia atau berubah tanpa dokumentasi, output tidak dapat diaudit. Catat sessionInfo(), seed, package versions, sumber data, dan semua parameter preprocessing/model.

15.5 Intuisi Metode

Model dapat memberi probabilitas desa rentan 0,72. Kebijakan tetap harus menjawab: kapasitas verifikasi berapa, biaya salah sasaran berapa, data apa yang sensitif, siapa yang dapat mengajukan koreksi, dan kapan model ditinjau ulang.

15.5.1 Worked Example — constrained allocation

Empat wilayah memiliki expected benefit (50,40,35,30)(50,40,35,30) dan cost (30,20,20,10)(30,20,20,10) juta; budget 50. Memilih dua benefit terbesar A+B membutuhkan 50 dan benefit 90. Kombinasi A+D cost 40 benefit 80; B+C cost 40 benefit 75; B+C+D cost 50 benefit 105. Maka ranking benefit individual tidak cukup; constraint menghasilkan portfolio berbeda.

Ini memperjelas transisi dari risk prediction ke decision optimization. Model dapat menghasilkan risk/benefit estimate, tetapi resource allocation membutuhkan fungsi objective dan constraints.

15.5.2 Policy recommendation ladder

Gunakan lima tingkat klaim:

  1. Observed: “TPT lebih tinggi di kelompok X pada data ini.”
  2. Associated: “TPT berasosiasi dengan Y setelah conditioning model.”
  3. Predicted: “Model memprediksi risiko tinggi pada wilayah Z.”
  4. Causal: “Intervensi A menyebabkan perubahan B”—butuh design causal.
  5. Recommended: “Lakukan A”—butuh evidence + feasibility + value judgment.

Jangan melompat dari tingkat 1–3 langsung ke 5 tanpa penjelasan tambahan.

15.5.3 Dashboard minimum viable architecture

Dashboard kebijakan sebaiknya memiliki empat layer: overview → comparison → drill-down → methodology. Overview menampilkan 3–5 KPI; comparison memungkinkan lintas wilayah/waktu; drill-down menampilkan profile; methodology menjelaskan source, formula, update, dan limitation.

15.5.4 Data freshness

Jika data terakhir tahun tdt_d dan dashboard dibuka tahun tct_c, lag: Lag=tctd. Lag=t_c-t_d. KPI dengan lag besar harus diberi badge “historical”/“latest available”, bukan ditampilkan seolah real-time. INDO-DAPOER berhenti 2018 sehingga cocok untuk latihan historis dan bukan kondisi terkini. (World Bank 2026)

15.5.5 AI verification example

AI menyarankan scale() sebelum split. Mahasiswa harus mengoreksi karena leakage. AI mengutip dataset “BPS Innovation Index 2025” yang tidak ditemukan: source verification gagal. AI menulis interpretasi “internet menurunkan kemiskinan”: interpretation verification gagal karena model hanya asosiasional. Contoh ini menunjukkan kode yang syntactically plausible tetap dapat salah secara ilmiah.

15.5.6 R log untuk AI use

ai_log <- tibble::tribble(
 ~tanggal, ~tool, ~tujuan, ~output_used, ~verification,
 "2026-09-15", "Generative AI", "debug join", "saran anti_join", "dicek pada toy data dan dokumentasi dplyr",
 "2026-10-01", "Generative AI", "draft caption", "struktur caption", "angka dan klaim diverifikasi dari output sendiri"
)
knitr::kable(ai_log, caption="Contoh AI-use log")
Table 15.1: Contoh AI-use log
tanggal tool tujuan output_used verification
2026-09-15 Generative AI debug join saran anti_join dicek pada toy data dan dokumentasi dplyr
2026-10-01 Generative AI draft caption struktur caption angka dan klaim diverifikasi dari output sendiri

15.5.7 Policy memo quality test

Setiap recommendation harus bisa ditelusuri ke evidence. Gunakan format: Temuan → interpretasi → opsi → rekomendasi → indikator monitoring → caveat. Jika satu rekomendasi tidak memiliki evidence chain, hapus atau ubah menjadi hipotesis untuk penelitian berikutnya.

15.6 Contoh dengan Data Simulasi

latest <- read_csv("data/simulasi_panel_regional.csv", show_col_types = FALSE) |>
  filter(tahun == 2025) |>
  mutate(
    prioritas = case_when(
      kemiskinan_persen >= quantile(kemiskinan_persen,.75) & internet_persen < median(internet_persen) ~ "Inklusi digital + perlindungan sosial",
      tpt_persen >= quantile(tpt_persen,.75) & pdrb_perkapita_juta > median(pdrb_perkapita_juta) ~ "Matching tenaga kerja-industri",
      TRUE ~ "Monitoring / intervensi sektoral"
    )
  )
latest |> count(prioritas) |> knitr::kable(caption="Contoh penerjemahan pola menjadi opsi intervensi - simulasi")
Table 15.2: Contoh penerjemahan pola menjadi opsi intervensi - simulasi
prioritas n
Inklusi digital + perlindungan sosial 7
Matching tenaga kerja-industri 5
Monitoring / intervensi sektoral 15

15.6.1 Visualisasi Output: Portofolio Strategi Regional

latest |>
  dplyr::count(prioritas) |>
  ggplot2::ggplot(ggplot2::aes(reorder(prioritas, n), n)) +
  ggplot2::geom_col(fill = "#145B8C") +
  ggplot2::coord_flip() +
  ggplot2::labs(title = "Distribusi opsi intervensi — simulasi", x = NULL, y = "Jumlah wilayah")

15.7 Contoh dengan Data Nyata

Untuk dashboard Jawa Barat, sumber data dapat berasal dari Open Data Jabar/BPS; dashboard harus menampilkan tahun data, sumber, status angka, dan definisi indikator pada tooltip/metadata. Jangan mencampur indikator 2025 dan 2022 dalam satu “snapshot 2025” tanpa label.

Kartu dataset real.

  • Nama: Open Data Jawa Barat—contoh TPT, kemiskinan, populasi, dan UMKM untuk policy dashboard.
  • Sumber dan URL: portal Open Data Jawa Barat https://opendata.jabarprov.go.id/; halaman dataset spesifik dicatat pada data/katalog_data_real.csv.
  • Tahun: berbeda antarindikator (mis. TPT 2007–2024; kemiskinan 2002–2025; populasi 2010–2025; UMKM 2016–2023).
  • Unit observasi: kabupaten/kota–tahun.
  • Variabel/definisi: kode/nama wilayah, nilai indikator, satuan, tahun; setiap tooltip/dashboard wajib menampilkan definisi dan tahun sumber.
  • Alasan digunakan: data terbaru relatif mudah diakses dan relevan untuk stakeholder regional Jawa Barat.
  • Keterbatasan: vintage tidak seragam dan status angka dapat berbeda (observasi/proyeksi); dashboard tidak boleh menyamarkan perbedaan tersebut sebagai satu snapshot yang seragam. (Pemerintah Provinsi Jawa Barat 2026b)

15.8 Analisis Menggunakan R

map_policy <- latest
leaflet::leaflet(map_policy) |>
  leaflet::addProviderTiles("CartoDB.Positron") |>
  leaflet::addCircleMarkers(~longitude, ~latitude, radius = 6,
    popup = ~paste0("<b>", wilayah, "</b><br>", prioritas))

15.8.1 Protokol penggunaan Generative AI

Gunakan tabel log berikut untuk project:

Elemen Contoh isi
Tool/model Nama layanan/model yang digunakan
Tanggal YYYY-MM-DD
Tujuan Debugging pivot_longer() / ide visualisasi / dokumentasi
Ringkasan prompt Bukan data rahasia; cukup ringkas tujuan
Output yang dipakai Fungsi/kode/paragraf apa yang diadaptasi
Verifikasi Dibandingkan dokumentasi resmi, unit test, cek hasil manual
Modifikasi manusia Perubahan yang dilakukan mahasiswa

Tidak diperbolehkan: membuat sumber/referensi fiktif, mengunggah data individual rahasia tanpa izin, menyalin interpretasi AI tanpa pemeriksaan, atau menyembunyikan penggunaan AI ketika berkontribusi substantif pada produk akhir.

15.9 Interpretasi dalam Konteks Regional

Policy recommendation perlu memiliki tingkat kepastian yang sebanding dengan bukti. Gunakan bahasa “data menunjukkan asosiasi/pola”, “model memprediksi”, atau “hasil mendukung prioritas eksplorasi”, bukan klaim sebab-akibat yang tidak didukung desain.

15.10 Latihan

  1. Apa beda evidence-based dan model-based policy?
  2. Mengapa AI output harus diverifikasi ke dokumentasi resmi?
  3. Apa yang harus dilaporkan dalam AI-use declaration?
  4. Analisis: ubah tiga temuan statistik menjadi rekomendasi SMART yang masih menyebut keterbatasan.
  5. Analisis: buat prototype dashboard dengan 3 KPI dan 2 filter.
  6. Mini-case: AI menyarankan bahwa korelasi -0,7 membuktikan dampak program. Tulis koreksi metodologis dan cara mengecek klaim tersebut.

15.10.1 Tugas Terstruktur Pertemuan 15

Buat policy translation memo maksimum 2 halaman: tiga temuan, dua opsi kebijakan, satu rekomendasi, stakeholder, implementation risk, data limitation, dan indikator monitoring. Lampirkan screenshot/dashboard beta. Isi AI-use log bila AI digunakan.

15.10.2 Kuis Formatif Pertemuan 15

  1. Mengapa ranking model tidak otomatis menjadi ranking kebijakan?
  2. Apa fungsi constraint anggaran dalam prioritization?
  3. Apa empat lapis validasi output AI?
  4. Informasi apa yang wajib muncul pada KPI dashboard?
  5. Sebutkan data yang tidak layak ditempelkan ke layanan AI publik.

15.11 Hubungan dengan Capstone Project

Minggu 15 adalah policy and communication gate: kelompok menyerahkan dashboard beta, policy memo 2 halaman, AI-use log, dan mendapatkan peer review.

15.12 Kesimpulan

Nilai sains data muncul ketika bukti diterjemahkan menjadi keputusan secara transparan. AI dapat mempercepat kerja, tetapi tanggung jawab ilmiah tetap berada pada analis manusia.

15.13 Pendalaman Magister — Policy translation dan responsible AI

15.13.1 Audit metodologis

  1. Dashboard tanpa definisi kpi.
  2. Data historical ditampilkan sebagai current.
  3. Ai source tidak diverifikasi.
  4. Kode ai berjalan tapi salah konsep.
  5. Recommendation melampaui evidence.
  6. Data sensitif dikirim ke layanan publik.

15.13.2 Pertanyaan viva / diskusi kelas

  1. Apa perbedaan model score dan policy score?
  2. Bagaimana budget constraint mengubah ranking?
  3. Apa empat lapis AI verification?
  4. Apa yang harus ada pada AI-use declaration?
  5. Bagaimana data freshness ditampilkan?
  6. Apa evidence chain untuk satu recommendation?

16 Final Project Presentation, UAS, dan Reproducibility Audit

16.1 Pendahuluan

Pertemuan akhir menguji dua hal berbeda: produk tim melalui presentasi capstone dan penguasaan individu melalui UAS/defense. Pemisahan ini mencegah keberhasilan kelompok menutupi ketidaksiapan individu.

16.2 Tujuan Pembelajaran

Mahasiswa mampu mempertahankan keputusan analitik, menjawab kritik, menunjukkan reproducibility, membedakan evidence dari asumsi, dan menyusun rekomendasi regional yang proporsional.

16.3 Definisi dan Konsep

Reproducibility audit memeriksa apakah data, kode, seed, dependency, dan output dapat ditelusuri. Replicability lebih luas dan berkaitan dengan apakah temuan serupa diperoleh dengan data/prosedur baru. Untuk mata kuliah ini, fokus minimum adalah reproducibility.

16.4 Formulasi Matematis

Tidak ada formula baru. Mahasiswa harus mampu menjelaskan kembali metric/model yang digunakan pada project, termasuk unit outcome dan arti koefisien/probabilitas/cluster/metric.

16.4.1 Prinsip penilaian final: product quality × individual mastery

Project adalah kerja kelompok, tetapi UAS mengukur penguasaan individu. Secara konseptual skor final presentation/defense dapat dipisahkan: SUAS=0.60Sanalyticsynthesis+0.40Soraldefense. S_{UAS}=0.60S_{analytic\ synthesis}+0.40S_{oral\ defense}. Bobot ini berada di dalam komponen UAS 20%, bukan menambah bobot semester.

16.4.2 Reproducibility audit score

Gunakan checklist dengan komponen cj{0,1}c_j\in\{0,1\} dan bobot wjw_j: R=100j=1mwjcj,jwj=1. R=100\sum_{j=1}^{m}w_jc_j,\qquad \sum_jw_j=1. Komponen minimum: data provenance, raw/processed separation, executable script, fixed seed, environment information, model object/parameter, generated tables/figures, AI declaration, dan README.

16.4.3 UAS analytical synthesis

Mahasiswa menerima satu mini-case atau cuplikan hasil analisis yang belum sempurna dan harus:

  1. mengidentifikasi problem framing;
  2. memilih/menilai metode;
  3. membaca output/metric;
  4. menemukan potensi leakage/bias;
  5. menginterpretasikan secara regional;
  6. mengusulkan satu perbaikan model dan satu perbaikan kebijakan.

Kisi-kisi UAS:

Area Proporsi skor UAS Fokus
Integrasi workflow 15% problem→data→model→decision
ML/classification 20% tree/ensemble/logit/threshold/metrics
Unsupervised & spatial 20% cluster/PCA/Moran/peta
Validation & uncertainty 20% resampling, calibration, sensitivity, fairness
Policy & AI governance 15% evidence-based recommendation, AI declaration
Oral defense 10% menjelaskan keputusan analitik secara individual

16.4.4 Pertanyaan oral defense contoh

  • “Mengapa Anda menggunakan kabupaten-tahun sebagai unit observasi?”
  • “Apa yang terjadi pada hasil jika data tahun pandemi dikeluarkan?”
  • “Mengapa threshold klasifikasi Anda 0,35 dan bukan 0,5?”
  • “Apa baseline yang Anda kalahkan dan seberapa besar perbaikannya?”
  • “Apakah feature importance dapat ditafsirkan sebagai pengaruh kausal? Mengapa?”
  • “Bagaimana hasil berubah jika matriks tetangga memakai k-nearest neighbors?”
  • “Bagian mana dari analisis yang dibantu Generative AI dan bagaimana diverifikasi?”

16.4.5 Standar final project package

Folder minimum:

capstone/
  README.md
  data_raw/            # bila lisensi mengizinkan
  data_processed/
  R/
    01_import.R
    02_clean.R
    03_eda.R
    04_model.R
    05_validate.R
    06_visualize.R
  report/
    final_report.Rmd
  dashboard/
  output/
  metadata/
    data_dictionary.csv
    provenance.csv
    ai_use_log.csv
  sessionInfo.txt

Final package dianggap berhasil jika dosen dapat mengikuti README dan meregenerasi tabel/grafik utama tanpa menebak langkah tersembunyi.

16.5 Intuisi Metode

Jika sebuah angka pada slide tidak dapat ditelusuri ke kode atau tabel sumber, angka tersebut belum siap menjadi bukti kebijakan. Audit trail adalah perlindungan terhadap kesalahan analitik dan ketergantungan berlebihan pada AI.

16.5.1 Contoh perhitungan nilai akhir

Mahasiswa memperoleh Project=84, Partisipasi=90, Kuis=80, Tugas=88, UTS=76, UAS=82. Nilai numerik: NA=0.30(84)+0.10(90)+0.10(80)+0.10(88)+0.20(76)+0.20(82). NA=0.30(84)+0.10(90)+0.10(80)+0.10(88)+0.20(76)+0.20(82). NA=25.2+9+8+8.8+15.2+16.4=82.6. NA=25.2+9+8+8.8+15.2+16.4=82.6. Konversi ke huruf mengikuti ketentuan akademik program/universitas yang berlaku; e-book tidak menetapkan boundary huruf bila belum diberikan secara resmi.

16.5.2 Oral defense diagnostic

Oral defense bertujuan membedakan team product dan individual understanding. Dosen dapat memilih satu grafik, satu formula, satu code chunk, dan satu recommendation secara acak. Mahasiswa harus menjelaskan: - apa input dan output; - mengapa metode dipilih; - apa asumsi; - apa alternative; - apa keterbatasan; - bagaimana hasil memengaruhi keputusan.

16.5.3 Reproducibility audit practical test

Dosen/peer reviewer menjalankan project dari clean session. Failure modes umum:

  1. absolute path lokal;
  2. package tidak disebut;
  3. data processed diedit manual;
  4. seed tidak ditetapkan;
  5. object dibuat interaktif tetapi tidak ada pada script;
  6. dashboard membaca file di folder pribadi;
  7. source URL hilang;
  8. AI-generated function tidak terdokumentasi.

16.5.4 Final policy-defense question matrix

Pertanyaan Bukti yang diharapkan
“Apa masalahnya?” decision question dan stakeholder
“Mengapa data ini?” metadata, representativeness, period
“Mengapa model ini?” baseline comparison + validation
“Seberapa pasti?” CV/bootstrap/sensitivity/calibration
“Apakah adil?” subgroup analysis bila relevan
“Apakah spasial?” map + W sensitivity jika dipakai
“Apa tindakan?” recommendation traceable to findings
“Apa peran AI?” AI-use log + verification

16.5.5 Final report architecture

  1. Executive summary (1 halaman)
  2. Problem and decision context
  3. Data and provenance
  4. Methods dengan formula/asumsi
  5. EDA and regional evidence
  6. Models and validation
  7. Robustness/uncertainty/fairness
  8. Spatial/segmentation evidence bila relevan
  9. Policy options and recommendation
  10. Limitations
  11. Reproducibility and AI declaration
  12. References + appendices

16.5.6 Kriteria “master-level”

Pekerjaan magister tidak ditentukan oleh jumlah algoritma. Standar yang diharapkan adalah argumentasi: mahasiswa mampu menjelaskan mengapa satu pilihan analitik lebih defensible daripada alternatif, mengukur uncertainty, mengenali asumsi yang rapuh, serta menahan diri dari klaim yang tidak didukung. Project dengan model sederhana tetapi argumentasi, validasi, dan policy translation kuat dapat lebih unggul daripada model kompleks yang tidak dipahami.

16.6 Contoh dengan Data Simulasi

# Contoh artefak audit sederhana.
files_needed <- c(
  "Sains_Data_Inovasi_Regional.Rmd",
  "references.bib",
  "data/simulasi_panel_regional.csv",
  "R/00_setup.R"
)
tibble(file = files_needed, tersedia = file.exists(files_needed)) |>
  knitr::kable(caption = "Contoh reproducibility checklist")
Table 16.1: Contoh reproducibility checklist
file tersedia
Sains_Data_Inovasi_Regional.Rmd TRUE
references.bib TRUE
data/simulasi_panel_regional.csv TRUE
R/00_setup.R TRUE

16.6.1 Visualisasi Output: Reproducibility Status

audit_plot <- tibble::tibble(file = files_needed, tersedia = file.exists(files_needed))
ggplot2::ggplot(audit_plot, ggplot2::aes(reorder(file, tersedia), as.integer(tersedia), fill = tersedia)) +
  ggplot2::geom_col(show.legend = FALSE) +
  ggplot2::coord_flip() +
  ggplot2::scale_y_continuous(breaks = c(0,1), labels = c("Tidak", "Ya")) +
  ggplot2::scale_fill_manual(values = c("TRUE" = "#145B8C", "FALSE" = "#C99A17")) +
  ggplot2::labs(title = "Status artefak reproducibility", x = NULL, y = "Tersedia")

16.7 Contoh dengan Data Nyata

Untuk data open data, tim menyimpan URL sumber dan metadata, bukan mengklaim kepemilikan data. Bila lisensi membatasi redistribusi, repository menyimpan script download dan checksum/versi, bukan file mentah.

Kartu dataset real untuk final project.

  • Nama: ditentukan tim dari BPS/Open Data Jawa Barat/data.go.id/World Bank/WHO/UNData; contoh minimum yang dapat direplikasi adalah TPT kabupaten/kota Jawa Barat.
  • Sumber dan URL contoh: Open Data Jawa Barat/BPS, https://opendata.jabarprov.go.id/id/dataset/tingkat-pengangguran-terbuka-berdasarkan-kabupatenkota-di-jawa-barat.
  • Tahun contoh: 2007–2024.
  • Unit observasi contoh: kabupaten/kota–tahun.
  • Variabel/definisi contoh: identitas wilayah, TPT (%), satuan, tahun. Untuk dataset tim, semua variabel harus ditulis dalam data dictionary beserta unit/denominator.
  • Alasan digunakan: audit final menilai kemampuan mendokumentasikan dan mereplikasi data nyata, bukan sekadar menampilkan output yang sudah jadi.
  • Keterbatasan: keterbatasan mengikuti dataset pilihan; tim wajib menyertakan lisensi, tanggal akses, checksum/versi bila relevan, dan instruksi download bila raw data tidak boleh didistribusikan. (Pemerintah Provinsi Jawa Barat 2026b)

16.8 Analisis Menggunakan R

sessionInfo()
#> R version 4.5.1 (2025-06-13)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sonoma 14.5
#> 
#> Matrix products: default
#> BLAS:   /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib 
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
#> 
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#> 
#> time zone: Asia/Jakarta
#> tzcode source: internal
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#>  [1] httr2_1.2.3        jsonlite_2.0.0     leaflet_2.2.2      tmap_4.1          
#>  [5] spdep_1.3-13       spData_2.3.4       sf_1.0-21          factoextra_1.0.7  
#>  [9] cluster_2.1.8.1    ranger_0.17.0      yardstick_1.3.2    workflowsets_1.1.1
#> [13] workflows_1.3.0    tune_2.0.1         tailor_0.1.0       rsample_1.3.1     
#> [17] recipes_1.3.1      parsnip_1.4.1      modeldata_1.5.1    infer_1.1.0       
#> [21] dials_1.4.2        scales_1.4.0       tidymodels_1.4.1   broom_1.0.12      
#> [25] knitr_1.50         skimr_2.2.2        janitor_2.2.1      lubridate_1.9.5   
#> [29] forcats_1.0.1      stringr_1.6.0      dplyr_1.2.1        purrr_1.2.0       
#> [33] readr_2.2.0        tidyr_1.3.1        tibble_3.3.1       ggplot2_4.0.1     
#> [37] tidyverse_2.0.0   
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.5.1           leaflegend_1.2.1        hardhat_1.4.2          
#>   [4] XML_3.99-0.18           rpart_4.1.24            sparsevctrs_0.3.4      
#>   [7] lifecycle_1.0.5         rstatix_0.7.2           globals_0.18.0         
#>  [10] lattice_0.22-7          vroom_1.7.1             MASS_7.3-65            
#>  [13] crosstalk_1.2.1         backports_1.5.0         magrittr_2.0.4         
#>  [16] sass_0.4.10             rmarkdown_2.30          jquerylib_0.1.4        
#>  [19] yaml_2.3.10             otel_0.2.0              sp_2.2-0               
#>  [22] DBI_1.2.3               RColorBrewer_1.1-3      multcomp_1.4-28        
#>  [25] abind_1.4-8             spatialreg_1.3-6        nnet_7.3-20            
#>  [28] TH.data_1.1-3           rappdirs_0.3.3          sandwich_3.1-1         
#>  [31] ipred_0.9-15            lava_1.8.1              ggrepel_0.9.6          
#>  [34] listenv_0.10.0          terra_1.8-54            units_0.8-7            
#>  [37] parallelly_1.45.0       codetools_0.2-20        tidyselect_1.2.1       
#>  [40] raster_3.6-32           farver_2.1.2            base64enc_0.1-3        
#>  [43] cols4all_0.9            e1071_1.7-16            Formula_1.2-5          
#>  [46] survival_3.8-3          tools_4.5.1             Rcpp_1.1.0             
#>  [49] glue_1.8.0              prodlim_2025.04.28      xfun_0.54              
#>  [52] leaflet.providers_2.0.0 mgcv_1.9-3              withr_3.0.2            
#>  [55] fastmap_1.2.0           boot_1.3-31             digest_0.6.38          
#>  [58] timechange_0.4.0        R6_2.6.1                microbenchmark_1.5.0   
#>  [61] colorspace_2.1-2        wk_0.9.4                spacesXYZ_1.6-0        
#>  [64] LearnBayes_2.15.1       dichromat_2.0-0.1       utf8_1.2.6             
#>  [67] generics_0.1.4          data.table_1.18.2.1     class_7.3-23           
#>  [70] htmlwidgets_1.6.4       tmaptools_3.2           pkgconfig_2.0.3        
#>  [73] gtable_0.3.6            timeDate_4051.111       GPfit_1.0-9            
#>  [76] S7_0.2.1                furrr_0.3.1             htmltools_0.5.8.1      
#>  [79] carData_3.0-5           bookdown_0.43           png_0.1-8              
#>  [82] gower_1.0.2             snakecase_0.11.1        rstudioapi_0.17.1      
#>  [85] tzdb_0.5.0              coda_0.19-4.1           nlme_3.1-168           
#>  [88] repr_1.1.7              proxy_0.4-27            cachem_1.1.0           
#>  [91] zoo_1.8-15              KernSmooth_2.23-26      parallel_4.5.1         
#>  [94] s2_1.1.9                leafsync_0.1.0          pillar_1.11.1          
#>  [97] grid_4.5.1              logger_0.4.0            vctrs_0.7.3            
#> [100] ggpubr_0.6.1            car_3.1-3               lhs_1.2.0              
#> [103] evaluate_1.0.5          mvtnorm_1.3-3           cli_3.6.5              
#> [106] compiler_4.5.1          rlang_1.3.0             crayon_1.5.3           
#> [109] maptiles_0.10.0         future.apply_1.20.0     ggsignif_0.6.4         
#> [112] labeling_0.4.3          classInt_0.4-11         stringi_1.8.7          
#> [115] modelenv_0.2.0          viridisLite_0.4.2       deldir_2.0-4           
#> [118] stars_0.6-8             Matrix_1.7-3            hms_1.1.4              
#> [121] bit64_4.6.0-1           leafem_0.2.4            future_1.58.0          
#> [124] igraph_2.1.4            bslib_0.11.0            lwgeom_0.2-14          
#> [127] bit_4.6.0               DiceDesign_1.10

Checklist akhir repository:

  1. README menjelaskan pertanyaan, data, cara menjalankan project.
  2. data/raw tidak berisi data sensitif.
  3. script cleaning terpisah dari analisis atau jelas urutannya.
  4. seed dicatat pada proses acak.
  5. output utama dapat dibuat ulang.
  6. model metric dihitung pada holdout/resampling yang benar.
  7. AI-use declaration tersedia.
  8. keterbatasan dan risiko misuse ditulis.

16.9 Interpretasi dalam Konteks Regional

Presentasi final harus berakhir dengan opsi tindakan dan batas bukti, bukan dengan “akurasi model 87%”. Contoh penutup yang lebih substantif: “Model membantu menyaring 20% wilayah dengan risiko tertinggi, tetapi error lebih besar pada wilayah berdata jarang; karena itu rekomendasi kami adalah menggunakan model sebagai tahap screening yang diikuti verifikasi lapangan, bukan keputusan otomatis.”

16.10 Latihan

  1. Bedakan reproducibility dan replicability.
  2. Apa yang harus dilakukan jika hasil slide tidak cocok dengan output script terbaru?
  3. Mengapa repository perlu mencatat versi package?
  4. Analisis: minta rekan menjalankan ulang satu analisis tanpa instruksi verbal; catat titik yang gagal.
  5. Analisis: buat model card final satu halaman.
  6. Mini-case: setelah presentasi, stakeholder meminta ranking individu warga. Jelaskan apakah model level kabupaten dapat digunakan dan mengapa.

16.10.1 UAS — Individual Analytical Synthesis & Defense (20%)

UAS terdiri dari analytical synthesis individual dan oral defense. Mahasiswa tidak dinilai dari hafalan syntax R, tetapi dari kemampuan menjelaskan keputusan analitik, membaca output, menemukan risiko validitas, dan menghubungkan hasil dengan keputusan regional.

16.10.2 Checklist Final Project Presentation

  • masalah dan stakeholder jelas dalam ≤90 detik;
  • sumber data dan periode disebutkan;
  • satu diagram workflow;
  • EDA menunjukkan disparitas yang relevan;
  • baseline dan model utama dibandingkan;
  • metrik dipilih sesuai target;
  • uncertainty/sensitivity ditampilkan;
  • rekomendasi tidak melampaui bukti;
  • dashboard hanya menampilkan indikator yang terdefinisi;
  • repository/package dapat direproduksi;
  • penggunaan AI dideklarasikan.

16.11 Hubungan dengan Capstone Project

Milestone akhir: repository reproducible, dashboard/visual, policy memo, presentasi, dan defense. UAS individual menguji kemampuan menjelaskan metode serta mengkritik keterbatasan proyek.

16.12 Kesimpulan

Capstone yang baik dapat diaudit, direproduksi, dan dipertahankan secara substantif. Tujuan akhir bukan memamerkan algoritma, tetapi meningkatkan kualitas keputusan regional dengan bukti yang transparan.

Pendalaman Akhir: Synthesis, Reproducibility, dan Defense

Audit metodologis

  1. Team product menutupi pemahaman individu.
  2. File hanya berjalan di laptop pembuat.
  3. Ai use tidak dideklarasikan.
  4. Hasil utama tidak dapat diregenerasi.
  5. Limitation disembunyikan.
  6. Presentasi terlalu teknis tanpa decision implication.

Pertanyaan Viva / Diskusi Kelas

  1. Bagaimana membuktikan project reproducible?
  2. Apa keputusan analitik paling sulit?
  3. Bagaimana hasil berubah pada skenario alternatif?
  4. Apa satu klaim yang harus diturunkan karena bukti terbatas?
  5. Bagaimana kontribusi AI diverifikasi?
  6. Apa tindakan stakeholder besok pagi setelah membaca laporan?

Daftar Rumus Inti

Bagian ini berfungsi sebagai indeks cepat. Penjelasan, asumsi, dan contoh terdapat pada bab terkait.

Topik Rumus inti
Weighted index Si=jwjzijS_i=\sum_jw_jz_{ij}
Rate r=(a/b)kr=(a/b)k
Growth gt=(xtxt1)/xt1g_t=(x_t-x_{t-1})/x_{t-1}
Z-score z=(xx)/sz=(x-\bar x)/s
Mean/variance x=n1xi\bar x=n^{-1}\sum x_i, s2=(n1)1(xix)2s^2=(n-1)^{-1}\sum(x_i-\bar x)^2
Correlation r=Cov(X,Y)/(sXsY)r=Cov(X,Y)/(s_Xs_Y)
Gini G=2ix(i)/(nxi)(n+1)/nG=2\sum i x_{(i)}/(n\sum x_i)-(n+1)/n
OLS β̂=(XX)1Xy\hat\beta=(X'X)^{-1}X'y
R2R^2 1SSE/SST1-SSE/SST
VIF 1/(1Rj2)1/(1-R_j^2)
RMSE n1(yŷ)2\sqrt{n^{-1}\sum(y-\hat y)^2}
MAE n1|yŷ|n^{-1}\sum|y-\hat y|
Ridge SSE+λβj2SSE+\lambda\sum\beta_j^2
Lasso SSE+λ|βj|SSE+\lambda\sum|\beta_j|
Gini impurity 1kpk21-\sum_kp_k^2
RF regression B1bf̂b(x)B^{-1}\sum_b\hat f_b(x)
Logistic p=eη/(1+eη)p=e^\eta/(1+e^\eta)
Sensitivity TP/(TP+FN)TP/(TP+FN)
Precision TP/(TP+FP)TP/(TP+FP)
F1 2PR/(P+R)2PR/(P+R)
K-means kiCkxiμk2\sum_k\sum_{i\in C_k}\|x_i-\mu_k\|^2
Silhouette (ba)/max(a,b)(b-a)/\max(a,b)
PCA eigen Svk=λkvkSv_k=\lambda_kv_k
PVE λk/jλj\lambda_k/\sum_j\lambda_j
Moran’s I nS0ijwijzizjizi2\frac{n}{S_0}\frac{\sum_{ij}w_{ij}z_iz_j}{\sum_i z_i^2}
Bootstrap SE (B1)1b(θb*θ*)2\sqrt{(B-1)^{-1}\sum_b(\theta_b^*-\bar\theta^*)^2}
DID (YT,postYT,pre)(YC,postYC,pre)(\bar Y_{T,post}-\bar Y_{T,pre})-(\bar Y_{C,post}-\bar Y_{C,pre})

Glosarium Sains Data Regional

Istilah Definisi operasional dalam mata kuliah
Analytical question pertanyaan yang dapat dijawab dengan data/metode dan diturunkan dari masalah keputusan
Outcome variabel target yang dijelaskan, diprediksi, atau dievaluasi
Feature/predictor informasi yang digunakan untuk menjelaskan/memprediksi outcome
Unit observasi entitas satu baris data, misalnya kabupaten–tahun
Unit analisis unit yang menjadi dasar inferensi/interpretasi; sering sama tetapi tidak selalu dengan unit observasi
Denominator populasi dasar suatu rate/proportion
Provenance jejak asal data, versi, transformasi, lisensi, dan tanggal akses
Metadata informasi tentang definisi, satuan, periode, metode produksi, dan struktur data
Tidy data struktur satu variabel per kolom, satu observasi per baris, satu jenis unit per tabel
Missingness keadaan nilai tidak teramati; mekanismenya dapat memengaruhi bias
Outlier observasi ekstrem; dapat berupa error atau fenomena substantif valid
Feature engineering konstruksi fitur baru dari data mentah untuk merepresentasikan konsep yang lebih relevan
Leakage informasi yang tidak seharusnya tersedia saat prediksi masuk ke training/preprocessing
EDA exploratory data analysis: iterasi pertanyaan–visualisasi–pola–pertanyaan baru
Association hubungan statistik, tidak otomatis kausal
Prediction estimasi outcome pada observasi/waktu baru
Causal effect perubahan outcome akibat intervensi/perlakuan di bawah definisi estimand dan asumsi identifikasi
Baseline model model/rule sederhana sebagai pembanding wajib
Loss function fungsi yang mengukur biaya kesalahan prediksi
Empirical risk rata-rata loss pada sample training
Generalization kemampuan perform pada data baru dari target deployment
Cross-validation resampling untuk estimasi perform/tuning menggunakan training data
RMSE akar mean squared error; menekankan error besar
MAE mean absolute error; error absolut rata-rata
Calibration kesesuaian predicted probability dengan observed frequency
Discrimination kemampuan model membedakan/ranking kelas positif vs negatif
Threshold batas probabilitas/score untuk mengubah prediksi menjadi tindakan/kelas
Random forest ensemble randomized decision trees dengan agregasi prediksi
Boosting ensemble sequential yang menambah weak learners untuk mengurangi loss
Regularization penalti kompleksitas untuk mengontrol variance/overfitting
Clustering pengelompokan unsupervised berdasarkan similarity yang didefinisikan
Centroid pusat rata-rata cluster dalam K-means
Silhouette ukuran compactness dan separation per observasi
PCA rotasi linear yang mencari arah variance maksimum
Loading coefficient/eigenvector yang membentuk principal component
Score PCA koordinat observasi pada principal component
PVE proportion of variance explained oleh komponen
CRS coordinate reference system untuk menginterpretasi koordinat spasial
Spatial weights WW definisi matematis siapa bertetangga/berinteraksi dengan siapa
Spatial lag weighted combination nilai pada tetangga
Moran’s I ukuran global spatial autocorrelation
LISA local indicators of spatial association
MAUP perubahan hasil akibat skala/zoning unit areal
Ecological fallacy kesalahan menerapkan hubungan agregat kepada individu
Bootstrap resampling dengan replacement untuk mengestimasi sampling variability
Robustness kestabilan kesimpulan terhadap reasonable analytic alternatives
Sensitivity analysis evaluasi bagaimana hasil berubah saat asumsi/parameter diubah
Fairness evaluasi distribusi perform/keputusan di kelompok relevan; definisinya kontekstual
DID difference-in-differences untuk evaluasi perubahan treated vs control dengan asumsi tertentu
Policy brief dokumen ringkas yang menghubungkan bukti, opsi, rekomendasi, dan caveat
Dashboard antarmuka monitoring/exploration; bukan pengganti analisis metodologis
Reproducibility kemampuan pihak lain meregenerasi hasil dari data, kode, parameter, dan environment
AI-use declaration catatan transparan tentang tujuan, bagian yang dibantu AI, dan metode verifikasi
Model card dokumentasi intended use, data, metrics, limitations, dan risiko model
Datasheet dokumentasi asal, komposisi, collection, preprocessing, penggunaan, limitations dataset

Derivasi Ringkas Rumus-Rumus Kunci

16.13 Derivasi OLS Normal Equations

Mulai dari objective S(β)=(yXβ)(yXβ). S(\beta)=(y-X\beta)'(y-X\beta). Ekspansi: S=yy2βXy+βXXβ. S=y'y-2\beta'X'y+\beta'X'X\beta. Turunkan terhadap β\beta: Sβ=2Xy+2XXβ. \frac{\partial S}{\partial\beta}=-2X'y+2X'X\beta. Set sama dengan nol: XXβ̂=Xy. X'X\hat\beta=X'y. Jika XXX'X invertibel: β̂=(XX)1Xy. \boxed{\hat\beta=(X'X)^{-1}X'y}. Ini menunjukkan OLS berasal langsung dari minimisasi SSE, bukan formula yang muncul tanpa alasan.

16.14 Mengapa mean meminimalkan squared error

Untuk konstanta cc, minimalkan Q(c)=i(yic)2. Q(c)=\sum_i(y_i-c)^2. Turunan: Q(c)=2i(yic)=2(iyinc). Q'(c)=-2\sum_i(y_i-c)=-2\left(\sum_i y_i-nc\right). Set nol memberi c=yc=\bar y. Inilah alasan leaf prediction regression tree adalah mean pada node bila loss squared error.

16.15 Mengapa median meminimalkan absolute error

Untuk Q(c)=i|yic|, Q(c)=\sum_i|y_i-c|, fungsi tidak differentiable di data points, tetapi subgradient berubah tanda ketika jumlah observasi di bawah dan di atas cc seimbang. Solusi berada pada median. Ini menjelaskan hubungan natural MAE dengan median-type prediction.

16.17 PCA sebagai constrained maximization

Variance projection XcvX_cv adalah Var(Xcv)=vSv. Var(X_cv)=v'Sv. Cari vv dengan vv=1v'v=1. Lagrangian: (v,λ)=vSvλ(vv1). \mathcal L(v,\lambda)=v'Sv-\lambda(v'v-1). Turunan terhadap vv: 2Sv2λv=0Sv=λv. 2Sv-2\lambda v=0\Rightarrow Sv=\lambda v. Jadi arah principal component adalah eigenvector covariance/correlation matrix.

16.18 Bias–variance decomposition ringkas

Misalkan Y=f(x)+εY=f(x)+\varepsilon, E(ε)=0E(\varepsilon)=0, Var(ε)=σ2Var(\varepsilon)=\sigma^2. Untuk estimator f̂\hat f: E[(Yf̂)2]=E[(f+εf̂)2]. E[(Y-\hat f)^2]=E[(f+\varepsilon-\hat f)^2]. Cross-term dengan ε\varepsilon hilang karena mean nol dan independensi yang diasumsikan. Tambah-kurang Ef̂E\hat f menghasilkan σ2+[Ef̂f]2+E[(f̂Ef̂)2]. \sigma^2+[E\hat f-f]^2+E[(\hat f-E\hat f)^2]. Tiga komponen adalah irreducible noise, squared bias, dan variance.

16.19 K-means centroid update

Untuk satu cluster CC, minimalkan Q(μ)=iCxiμ2. Q(\mu)=\sum_{i\in C}\|x_i-\mu\|^2. Turunan vector: Qμ=2iC(xiμ)=0, \frac{\partial Q}{\partial\mu}=-2\sum_{i\in C}(x_i-\mu)=0, sehingga μ=|C|1iCxi. \boxed{\mu=|C|^{-1}\sum_{i\in C}x_i}. Karena itu update centroid adalah mean anggota cluster.

16.20 Standard error mean

Jika XiX_i independen dengan variance σ2\sigma^2: Var(X)=Var(n1iXi)=n2iVar(Xi)=σ2n. Var(\bar X)=Var\left(n^{-1}\sum_iX_i\right)=n^{-2}\sum_iVar(X_i)=\frac{\sigma^2}{n}. Maka SE(X)=σ/nSE(\bar X)=\sigma/\sqrt n, diestimasi dengan s/ns/\sqrt n.

16.21 Hubungan odds dan probability

Odds o=p/(1p)o=p/(1-p). Sebaliknya p=o1+o. p=\frac{o}{1+o}. Jika odds dikalikan OR, probability baru adalah p=ORp/(1p)1+ORp/(1p). p' = \frac{OR\cdot p/(1-p)}{1+OR\cdot p/(1-p)}. Rumus ini menunjukkan perubahan probability bergantung pada baseline pp.

16.22 Moran’s I sebagai cross-product tetangga

Pembilang ijwijzizj \sum_i\sum_jw_{ij}z_iz_j besar positif jika neighbors memiliki deviasi dengan tanda sama; negatif jika tanda berlawanan. Penyebut izi2\sum_i z_i^2 menormalisasi overall variance dan n/S0n/S_0 menyesuaikan total bobot. Karena nilai ekspektasi null bergantung struktur W dan n, inference sebaiknya menggunakan teori/permutation yang tepat, bukan membandingkan sekadar dengan nol.

Checklist Akhir untuk Mahasiswa

Sebelum menyerahkan tugas/project, pastikan:

Daftar Pustaka dan Sumber Data

Daftar pustaka berikut dihasilkan dari references.bib. URL sumber data dipertahankan agar mahasiswa dapat memeriksa metadata, tahun cakupan, versi, dan tanggal akses. Untuk dataset yang terus diperbarui, status data harus diverifikasi kembali pada saat project dikerjakan.

Anselin, Luc. 1995. “Local Indicators of Spatial Association—LISA.” Geographical Analysis 27 (2): 93–115. https://doi.org/10.1111/j.1538-4632.1995.tb00338.x.
Autio, Chloe, Reva Schwartz, Jesse Dunietz, Shomik Jain, Martin Stanley, Elham Tabassi, Patrick Hall, dan Kamie Roberts. 2024. “Artificial Intelligence Risk Management Framework: Generative Artificial Intelligence Profile.” NIST AI 600-1. National Institute of Standards; Technology. https://doi.org/10.6028/NIST.AI.600-1.
Badan Pusat Statistik. 2026. “Badan Pusat Statistik Republik Indonesia.” https://www.bps.go.id/.
Badan Pusat Statistik Provinsi Jawa Barat. 2025. Kemiskinan Kabupaten/Kota di Provinsi Jawa Barat 2019–2024. 32000.25002. Badan Pusat Statistik Provinsi Jawa Barat. https://jabar.bps.go.id/id/publication/2025/02/28/fe91e8d4537a17cb53916883/kemiskinan-kabupaten-kota-di-provinsi-jawa-barat-2019-2024.html.
Badan Pusat Statistik, dan Pemerintah Provinsi Jawa Barat. 2026a. “Jumlah Penduduk Miskin Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/id/dataset/jumlah-penduduk-miskin-berdasarkan-kabupatenkota-di-jawa-barat.
———. 2026b. “Laju Pertumbuhan Produk Domestik Regional Bruto Atas Dasar Harga Konstan Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/id/dataset/laju-pertumbuhan-produk-domestik-regional-bruto-atas-dasar-harga-konstan-berdasarkan-kabupatenkota-di-jawa-barat.
———. 2026c. “Persentase Penduduk Miskin Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/en/dataset/persentase-penduduk-miskin-berdasarkan-kabupatenkota-di-jawa-barat.
———. 2026d. “Tingkat Pengangguran Terbuka Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/id/dataset/tingkat-pengangguran-terbuka-berdasarkan-kabupatenkota-di-jawa-barat.
Bivand, Roger S., Edzer Pebesma, dan Virgilio Gómez-Rubio. 2013. Applied Spatial Data Analysis with R. 2 ed. New York: Springer. https://doi.org/10.1007/978-1-4614-7618-4.
Breiman, Leo. 2001. “Random Forests.” Machine Learning 45: 5–32. https://doi.org/10.1023/A:1010933404324.
Callaway, Brantly, dan Pedro H. C. Sant’Anna. 2021. “Difference-in-Differences with Multiple Time Periods.” Journal of Econometrics 225 (2): 200–230. https://doi.org/10.1016/j.jeconom.2020.12.001.
Chen, Tianqi, dan Carlos Guestrin. 2016. “XGBoost: A Scalable Tree Boosting System.” Dalam Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 785–94. ACM. https://doi.org/10.1145/2939672.2939785.
Dinas Koperasi dan Usaha Kecil Provinsi Jawa Barat. 2026. “Proyeksi Jumlah Usaha Mikro Kecil Menengah (UMKM) Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/id/dataset/proyeksi-jumlah-usaha-mikro-kecil-menengah-umkm-berdasarkan-kabupatenkota-di-jawa-barat.
Fawcett, Tom. 2006. “An Introduction to ROC Analysis.” Pattern Recognition Letters 27 (8): 861–74. https://doi.org/10.1016/j.patrec.2005.10.010.
Friedman, Jerome H. 2001. “Greedy Function Approximation: A Gradient Boosting Machine.” The Annals of Statistics 29 (5): 1189–1232. https://doi.org/10.1214/aos/1013203451.
Gebru, Timnit, Jamie Morgenstern, Briana Vecchione, Jennifer Wortman Vaughan, Hanna Wallach, Hal Daumé III, dan Kate Crawford. 2021. “Datasheets for Datasets.” Communications of the ACM 64 (12): 86–92. https://doi.org/10.1145/3458723.
Hardt, Moritz, Eric Price, dan Nathan Srebro. 2016. “Equality of Opportunity in Supervised Learning.” Advances in Neural Information Processing Systems 29. https://proceedings.neurips.cc/paper/2016/hash/9d2682367c3935defcb1f9e247a97c0d-Abstract.html.
Harrell, Frank E. Jr. 2015. Regression Modeling Strategies: With Applications to Linear Models, Logistic and Ordinal Regression, and Survival Analysis. 2 ed. Cham: Springer. https://doi.org/10.1007/978-3-319-19425-7.
Hastie, Trevor, Robert Tibshirani, dan Jerome Friedman. 2009. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. 2 ed. New York: Springer. https://doi.org/10.1007/978-0-387-84858-7.
Hernán, Miguel A., dan James M. Robins. 2020. Causal Inference: What If. Boca Raton, FL: Chapman; Hall/CRC. https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/.
Hoerl, Arthur E., dan Robert W. Kennard. 1970. “Ridge Regression: Biased Estimation for Nonorthogonal Problems.” Technometrics 12 (1): 55–67. https://doi.org/10.1080/00401706.1970.10488634.
James, Gareth, Daniela Witten, Trevor Hastie, dan Robert Tibshirani. 2021. An Introduction to Statistical Learning: with Applications in R. 2 ed. New York: Springer. https://doi.org/10.1007/978-1-0716-1418-1.
Jolliffe, Ian T., dan Jorge Cadima. 2016. “Principal Component Analysis: A Review and Recent Developments.” Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences 374 (2065): 20150202. https://doi.org/10.1098/rsta.2015.0202.
Kaufman, Leonard, dan Peter J. Rousseeuw. 1990. Finding Groups in Data: An Introduction to Cluster Analysis. New York: Wiley. https://doi.org/10.1002/9780470316801.
Kementerian Kesehatan Republik Indonesia, dan Pemerintah Provinsi Jawa Barat. 2026. “Prevalensi Balita Stunting Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/id/dataset/prevalensi-balita-stunting-berdasarkan-kabupatenkota-di-jawa-barat.
Kuhn, Max, dan Julia Silge. 2022. Tidy Modeling with R: A Framework for Modeling in the Tidyverse. Sebastopol, CA: O’Reilly Media. https://www.tmwr.org/.
Little, Roderick J. A., dan Donald B. Rubin. 2019. Statistical Analysis with Missing Data. 3 ed. Hoboken, NJ: Wiley. https://doi.org/10.1002/9781119482260.
Lovelace, Robin, Jakub Nowosad, dan Jannes Muenchow. 2025. Geocomputation with R. 2 ed. Boca Raton, FL: Chapman; Hall/CRC. https://r.geocompx.org/.
Miao, Fengchun, dan Wayne Holmes. 2023. Guidance for Generative AI in Education and Research. Paris: UNESCO. https://unesdoc.unesco.org/ark:/48223/pf0000386693.
Mitchell, Margaret, Simone Wu, Andrew Zaldivar, Parker Barnes, Lucy Vasserman, Ben Hutchinson, Elena Spitzer, Inioluwa Deborah Raji, dan Timnit Gebru. 2019. “Model Cards for Model Reporting.” Dalam Proceedings of the Conference on Fairness, Accountability, and Transparency, 220–29. ACM. https://doi.org/10.1145/3287560.3287596.
Moran, P. A. P. 1950. “Notes on Continuous Stochastic Phenomena.” Biometrika 37 (1/2): 17–23. https://doi.org/10.2307/2332142.
OECD, dan Joint Research Centre, European Commission. 2008. Handbook on Constructing Composite Indicators: Methodology and User Guide. Paris: OECD Publishing. https://doi.org/10.1787/9789264043466-en.
Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.
Pebesma, Edzer, dan Roger Bivand. 2023. Spatial Data Science: With Applications in R. Boca Raton, FL: Chapman; Hall/CRC. https://r-spatial.org/book/.
Pemerintah Provinsi Jawa Barat. 2026a. “Luas Areal Tanam Padi Sawah Berdasarkan Kabupaten/Kota di Jawa Barat.” https://opendata.jabarprov.go.id/id/dataset/luas-areal-tanam-padi-sawah-berdasarkan-kabupatenkota-di-jawa-barat.
———. 2026b. “Open Data Jawa Barat.” https://opendata.jabarprov.go.id/.
Provost, Foster, dan Tom Fawcett. 2013. Data Science for Business: What You Need to Know about Data Mining and Data-Analytic Thinking. Sebastopol, CA: O’Reilly Media.
Rousseeuw, Peter J. 1987. “Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis.” Journal of Computational and Applied Mathematics 20: 53–65. https://doi.org/10.1016/0377-0427(87)90125-7.
Sekolah Pascasarjana Universitas Padjadjaran. 2026. “Profil Magister Inovasi Regional.” https://pasca.unpad.ac.id/profil-magister-inovasi-regional/.
Tabassi, Elham. 2023. “Artificial Intelligence Risk Management Framework (AI RMF 1.0).” NIST AI 100-1. National Institute of Standards; Technology. https://doi.org/10.6028/NIST.AI.100-1.
Tibshirani, Robert. 1996. “Regression Shrinkage and Selection via the Lasso.” Journal of the Royal Statistical Society: Series B (Methodological) 58 (1): 267–88. https://doi.org/10.1111/j.2517-6161.1996.tb02080.x.
Tufte, Edward R. 2001. The Visual Display of Quantitative Information. 2 ed. Cheshire, CT: Graphics Press.
Tukey, John W. 1977. Exploratory Data Analysis. Reading, MA: Addison-Wesley.
Wickham, Hadley. 2014. “Tidy Data.” Journal of Statistical Software 59 (10): 1–23. https://doi.org/10.18637/jss.v059.i10.
Wickham, Hadley, Mine Çetinkaya-Rundel, dan Garrett Grolemund. 2023. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. 2 ed. Sebastopol, CA: O’Reilly Media. https://r4ds.hadley.nz/.
Wilkinson, Leland. 2005. The Grammar of Graphics. 2 ed. New York: Springer. https://doi.org/10.1007/0-387-28695-0.
World Bank. 2026. “Indonesia Database for Policy and Economic Research (INDO-DAPOER).” https://datacatalog.worldbank.org/search/dataset/0041056/indonesia-database-for-policy-and-economic-research.