Bab 1. Pendahuluan

1.1 Latar Belakang

Tuberkulosis (TBC) merupakan penyakit menular yang disebabkan oleh Mycobacterium tuberculosis dan hingga kini masih menjadi tantangan utama kesehatan global [1]. Menurut laporan WHO tahun 2023, jumlah kasus TBC secara global mencapai 10,8 juta jiwa, dan Indonesia menempati posisi kedua tertinggi dengan sekitar 10% dari total kasus dunia [2].

Provinsi Jawa Barat menjadi wilayah dengan jumlah kasus TBC tertinggi di Indonesia, yaitu mencapai 224.798 kasus pada tahun 2024 menurut data Badan Pusat Statistik [1]. Kondisi ini menunjukkan bahwa penularan TBC belum sepenuhnya terkendali dan dapat menghambat pencapaian Tujuan Pembangunan Berkelanjutan (SDGs) poin ke-3, yaitu kehidupan sehat dan kesejahteraan bagi semua [2].

TBC merupakan penyakit yang sangat dipengaruhi oleh kondisi spasial dan lingkungan karena penyebarannya tidak terjadi secara acak, melainkan membentuk pola antarwilayah. Kasus tinggi di suatu daerah dapat berdampak pada peningkatan kasus di daerah sekitar akibat mobilitas penduduk dan kesamaan kondisi lingkungan [4]. Penelitian sebelumnya menunjukkan adanya autokorelasi spasial positif pada kasus TBC di Jawa Tengah, di mana peningkatan kasus di satu kabupaten/kota meningkatkan risiko di wilayah tetangganya [5]. Hal ini menjadi dasar penggunaan model Spatial Autoregressive (SAR), yang mengasumsikan bahwa nilai variabel dependen (\(y\)) di suatu wilayah dipengaruhi oleh \(y\) di wilayah sekitarnya (endogenitas spasial) [4][5].

Pengaruh kondisi spasial terhadap penyebaran TBC dapat dilihat dari tingginya mobilitas masyarakat di area Jakarta, Bogor, Depok, Tangerang, dan Bekasi (Jabodetabek). Kawasan ini ditandai oleh pergerakan komuter harian yang masif. Sebagai contoh, sebagian besar komuter ke Jakarta didominasi oleh penduduk dari Depok dan Bekasi yang bertujuan untuk bekerja (83%) [6]. Lebih lanjut, data regional memperkirakan bahwa 13% penduduk Jabodetabek melakukan aktivitas harian di luar wilayah tempat tinggalnya [7]. Arus pergerakan manusia yang intensif ini menciptakan kondisi ideal bagi penyakit menular seperti TBC untuk menyebar melintasi batas-batas administratif, seiring pergerakan dinamis individu pembawa infeksi antar wilayah dan interaksi mereka di ruang publik yang padat.

Selain aspek spasial, faktor lingkungan dan pelayanan kesehatan juga memiliki peran penting dalam penyebaran TBC. Oleh karena itu, penelitian ini menggunakan empat variabel independen utama, yaitu:

  1. Jumlah Puskesmas – mencerminkan akses masyarakat terhadap pelayanan kesehatan dasar. Semakin banyak fasilitas kesehatan, semakin cepat proses deteksi dan pengobatan TBC dilakukan, sehingga menekan penyebaran penyakit [1][8].
  2. Persentase Rumah Tangga dengan Sumber Air Minum Layak – kualitas air yang buruk dapat meningkatkan risiko infeksi sekunder dan menurunkan imunitas tubuh terhadap TBC [1].
  3. Persentase Rumah Tangga dengan Sanitasi Layak – sanitasi yang tidak memadai dapat memicu penyakit infeksi saluran pernapasan dan memperbesar risiko TBC [1]. Air minum aman dan sanitasi layak juga berhubungan langsung dengan kualitas hidup dan kesehatan penduduk [2].
  4. Indeks Kualitas Udara (IKA) – polusi udara, terutama partikulat halus (PM2.5), dapat merusak sistem pernapasan dan meningkatkan kerentanan terhadap infeksi Mycobacterium tuberculosis [1][9].

Dengan demikian, analisis spasial ekonometrik menjadi penting untuk memahami pola penyebaran TBC di Jawa Barat secara menyeluruh. Model SAR digunakan untuk menangkap efek dependensi spasial antarwilayah, sedangkan Spatial Error Model (SEM) digunakan untuk mengatasi korelasi pada komponen error antarwilayah [10]. Model terbaik akan dipilih berdasarkan kriteria informasi seperti Akaike Information Criterion (AIC).

Melalui pendekatan ini, penelitian diharapkan dapat memberikan gambaran ilmiah mengenai pola penyebaran TBC di Jawa Barat serta menjadi dasar kebijakan kesehatan publik yang efektif dan berbasis lokasi (place-based policy).

1.2 Identifikasi Masalah

Berdasarkan latar belakang yang telah diuraikan, maka permasalahan dalam penelitian ini dapat diidentifikasi sebagai berikut:

  1. Kasus TBC di Jawa Barat berjumlah 224.798 dan diduga membentuk pola spasial, bukan acak, sehingga diperlukan uji autokorelasi spasial global (Moran’s I dan Geary’s C) serta lokal (LISA) untuk membuktikan adanya ketergantungan spasial antarwilayah.
  2. Perlu dianalisis pengaruh jumlah puskesmas, persentase rumah tangga dengan air minum layak, sanitasi layak, dan indeks kualitas udara terhadap jumlah kasus TBC dengan mempertimbangkan efek dependensi spasial.
  3. Diperlukan model spasial ekonometrik terbaik (SAR atau SEM) yang mampu menjelaskan variasi jumlah kasus TBC antarwilayah di Provinsi Jawa Barat secara lebih akurat dan berbasis lokasi.

1.3 Tujuan Penelitian

Tujuan dari penelitian ini adalah sebagai berikut:

  1. Mendeskripsikan pola dan distribusi spasial kasus TBC di tingkat kabupaten/kota Provinsi Jawa Barat tahun 2024.
  2. Menguji adanya autokorelasi spasial global dan lokal pada kasus TBC menggunakan statistik Moran’s I, Geary’s C, dan LISA.
  3. Menganalisis pengaruh faktor lingkungan dan kesehatan (jumlah puskesmas, air minum layak, sanitasi layak, dan indeks kualitas udara) terhadap jumlah kasus TBC dengan mempertimbangkan efek spasial.
  4. Menentukan model spasial ekonometrik terbaik (SAR atau SEM) yang paling sesuai untuk menjelaskan variasi jumlah kasus TBC antarwilayah di Provinsi Jawa Barat.

1.4 Batasan Penelitian

Batasan dalam penelitian ini adalah sebagai berikut:

  1. Penelitian difokuskan pada kasus TBC paru di tingkat kabupaten/kota di Provinsi Jawa Barat tahun 2024.
  2. Variabel independen yang digunakan terbatas pada empat faktor, yaitu jumlah puskesmas, persentase rumah tangga dengan air minum layak, persentase rumah tangga dengan sanitasi layak, dan indeks kualitas udara.
  3. Analisis spasial dilakukan pada level agregat wilayah (kabupaten/kota), sehingga tidak mencakup variasi individu atau rumah tangga.
  4. Model yang digunakan adalah Spatial Autoregressive Model (SAR) dan Spatial Error Model (SEM) dengan matriks bobot spasial tipe queen contiguity untuk merepresentasikan kedekatan antarwilayah.

Bab 2. Tinjauan Pustaka

2.1 Spatial Dependence

Dependensi spasial merupakan kondisi di mana nilai suatu variabel pada suatu wilayah dipengaruhi oleh nilai variabel yang sama di wilayah sekitarnya, sehingga observasi antarwilayah tidak bersifat independen [4]. Dependensi ini muncul akibat kedekatan geografis, interaksi sosial, atau kesamaan karakteristik lingkungan yang menyebabkan fenomena di satu lokasi dapat menyebar ke lokasi lain di sekitarnya [5].

Dalam konteks epidemiologi, seperti pada penyebaran tuberkulosis (TBC), wilayah dengan jumlah kasus tinggi sering kali diikuti oleh wilayah tetangga dengan kasus tinggi juga karena mobilitas penduduk dan kondisi lingkungan yang mirip [1][5].

2.2 Autokorelasi Spasial

Autokorelasi spasial menggambarkan tingkat hubungan antara nilai suatu variabel di satu lokasi dengan lokasi lain yang berdekatan secara geografis [4]. Autokorelasi spasial positif terjadi ketika wilayah yang berdekatan memiliki nilai yang mirip (sama-sama tinggi atau rendah), sedangkan autokorelasi negatif terjadi ketika wilayah berdekatan memiliki nilai yang berlawanan [5].

Secara umum, autokorelasi spasial dapat diukur menggunakan pendekatan global dan lokal. Ukuran global yang paling umum adalah Moran’s I dan Geary’s C, di mana Moran’s I berfungsi mirip dengan koefisien korelasi Pearson namun mempertimbangkan aspek spasial, sedangkan Geary’s C lebih sensitif terhadap variasi lokal antarwilayah.

Untuk analisis lokal, digunakan Local Moran’s I (LISA) yang dapat mengidentifikasi klaster seperti high-high, low-low, high-low, dan low-high, serta Getis-Ord G yang mendeteksi hot spots (wilayah bernilai tinggi dikelilingi wilayah bernilai tinggi) dan cold spots (wilayah bernilai rendah dikelilingi wilayah bernilai rendah) [4][5].

2.3 Model Spatial Econometrics

Model spasial ekonometrik digunakan untuk mengatasi pelanggaran asumsi independensi akibat adanya dependensi antarwilayah [4]. Dua bentuk utamanya adalah Spatial Autoregressive Model (SAR), yang memasukkan pengaruh nilai variabel dependen dari wilayah tetangga (spatial lag), dan Spatial Error Model (SEM), yang menggunakan dependensi spasial pada komponen error [5][8].

Model SAR menekankan adanya hubungan spasial antarwilayah, sedangkan SEM menangkap korelasi spasial yang tidak teramati. Kedua model ini umumnya diestimasi menggunakan metode Maximum Likelihood [10].

Persamaan umum model SAR ditulis sebagai berikut:

\[ \hat{y} = \hat{\rho} W y + X \hat{\beta} + \hat{\varepsilon}, \quad \hat{\varepsilon} \sim N(0, \hat{\sigma}^2 I) \]

Dengan:

  • \(\hat{y}\) = variabel respons
  • \(\hat{\rho}\) = koefisien autoregresif spasial (spatial lag coefficient) yang mengukur seberapa besar pengaruh rata-rata kasus di wilayah tetangga terhadap suatu wilayah
  • \(W\) = matriks bobot spasial yang menggambarkan hubungan ketetanggaan antar wilayah
  • \(X\) = matriks variabel prediktor
  • \(\hat{\beta}\) = vektor koefisien regresi untuk masing-masing variabel dalam \(X\)
  • \(\hat{\varepsilon}\) = vektor error yang berdistribusi normal dengan rataan nol dan varians \(\hat{\sigma}^2\)

Bab 3. Metodologi Penelitian

3.1 Data

Data yang digunakan merupakan data sekunder yang bersumber dari Badan Pusat Statistika (BPS) Provinsi Jawa Barat, Open Data Jabar, dan Laporan Kinerja Direktorat Pengendalian Pencemaran Udara tahun 2024 [11][12][13][14].

Penelitian ini mencakup data dari 27 kabupaten/kota yang ada di Provinsi Jawa Barat. Variabel-variabel yang digunakan dalam penelitian dapat dilihat pada tabel berikut:

Variabel Keterangan
Y Jumlah Kasus TBC
X1 Jumlah Puskesmas
X2 Persentase Rumah Tangga yang Memiliki Sumber Air Minum Layak
X3 Persentase Rumah Tangga yang Memiliki Sanitasi Layak
X4 Indeks Kualitas Udara

3.2 Unit Spasial

Unit spasial dalam penelitian ini adalah kabupaten/kota di Provinsi Jawa Barat. Setiap kabupaten/kota dianggap sebagai satuan wilayah yang merepresentasikan satu observasi dalam analisis spasial. Unit spasial ini dipilih karena data kasus TBC, jumlah fasilitas kesehatan, dan indikator lingkungan tersedia pada level daerah tersebut.

3.3 Metode Analisis

Penelitian ini menggunakan pendekatan analisis spasial ekonometrik untuk mengidentifikasi pola penyebaran dan hubungan antarwilayah kasus TBC di Provinsi Jawa Barat tahun 2024. Tahapan analisis dilakukan sebagai berikut:

  1. Eksplorasi Data Spasial
    Mengidentifikasi karakteristik statistik dan pola awal persebaran kasus TBC melalui analisis deskriptif dan visualisasi peta.

  2. Uji Autokorelasi Spasial
    Mengukur adanya ketergantungan spasial menggunakan statistik Moran’s I dan analisis LISA untuk mendeteksi klaster wilayah dengan nilai tinggi (high-high) dan rendah (low-low).

  3. Pemodelan Spasial Ekonometrik
    Membandingkan model OLS, SAR, dan SEM untuk mengetahui bentuk ketergantungan spasial yang dominan.

  4. Pemilihan Model Terbaik
    Memilih model dengan mempertimbangkan hasil uji Lagrange Multiplier (LM) dan nilai Akaike Information Criterion (AIC).

  5. Visualisasi dan Interpretasi Hasil
    Menyajikan hasil estimasi dan pola klaster spasial untuk memberikan interpretasi substantif terhadap faktor-faktor yang memengaruhi kasus TBC.

3.4 Alur Kerja Penelitian

Pengumpulan Data
Memperoleh data sekunder dari Badan Pusat Statistik (BPS) Jawa Barat, Open Data Jabar, dan Laporan Direktorat Pengendalian Pencemaran Lingkungan, yang mencakup data jumlah kasus TBC, jumlah puskesmas, persentase rumah tangga dengan air minum layak, sanitasi layak, serta indeks kualitas udara.

  1. Analisis Deskriptif dan Visualisasi Awal
    Membuat peta tematik untuk menggambarkan distribusi kasus TBC antar kabupaten/kota dan mengidentifikasi pola awal persebaran.

  2. Uji Autokorelasi Spasial
    Menguji adanya pola ketergantungan spasial global menggunakan statistik Moran’s I dan pola lokal menggunakan LISA (Local Indicators of Spatial Association).

  3. Pemodelan Spasial Ekonometrik
    Membangun dan membandingkan model Spatial Autoregressive Model (SAR) dan Spatial Error Model (SEM) berdasarkan hasil uji Lagrange Multiplier (LM) serta nilai Akaike Information Criterion (AIC).

  4. Pemilihan Model Terbaik
    Menentukan model yang paling sesuai untuk menjelaskan variasi spasial kasus TBC antarwilayah.

  5. Visualisasi dan Interpretasi Hasil
    Menampilkan peta hasil estimasi dan memberikan interpretasi substantif terhadap hubungan antarvariabel serta pola spasial yang ditemukan.

Bab4. Hasil dan Pembahasan

4.1 Peta Deskriptif

knitr::include_graphics("C:/Users/Admin/Downloads/KULIAH/Semester 5/Spasial/Project/Peta Kasus TBC di Jawa Barat.png")

Berdasarkan gambar, kabupaten/kota yang memiliki kasus TBC tinggi (merah gelap) cenderung berdekatan dengan daerah dengan kasus yang tinggi juga. Daerah dengan kasus yang rendah (merah terang) cenderung berdekatan dengan daerah yang kasusnya rendah juga. Hal ini menunjukkan terdapat kemungkinan dependensi spasial antar daerah. 

4.2 Hasil Uji Autokorelasi

Uji Statistik p-value Nilai Indeks
Moran’s I 0.002 I = 0.35

Berdasarkan hasil Moran’s I yang menggunakan matriks bobot spasial dengan queen contiguity, diperoleh nilai p-value < 0.05 (Tolak H₀) dan I = 0.35, yang berarti terdapat autokorelasi spasial positif yang signifikan. Hal ini menunjukkan bahwa daerah dengan kasus TBC tinggi cenderung dikelilingi oleh daerah dengan kasus tinggi juga, dan sebaliknya, daerah dengan kasus rendah dikelilingi oleh daerah dengan kasus rendah.

Untuk Local Moran’s I (LISA), nilai yang dihasilkan berbeda pada setiap daerah. Beberapa daerah menunjukkan nilai yang signifikan dan terbagi menjadi dua kelompok utama yaitu High-high cluster: Bekasi, Depok, dan Bogor dan Low-low cluster: Garut dan Tasikmalaya.Hasil visualisasi peta klaster dapat dilihat pada gambar berikut.

knitr::include_graphics("C:/Users/Admin/Downloads/KULIAH/Semester 5/Spasial/Project/Peta LISA Kasus TBC di Jawa Barat.png")

4.3 Estimasi Model

Hasil Estimasi Model OLS

knitr::include_graphics("C:/Users/Admin/Downloads/KULIAH/Semester 5/Spasial/Project/OLS.png")

Berdasarkan hasil estimasi Ordinary Least Squares (OLS), hanya variabel X1 (jumlah puskesmas) dan X3 (sanitasi layak) yang signifikan. Koefisien X1 bernilai positif, yang berarti semakin banyak jumlah puskesmas, maka semakin tinggi kasus TBC dengan asumsi variabel lain konstan. Hal tersebut tidak sesuai dengan landasan teori yang seharusnya menunjukkan hubungan berlawanan. Penyebabnya dapat disebabkan oleh adanya variabel prediktor lain yang belum dimasukkan ke dalam model, namun berhubungan dengan X1 dan memengaruhi variabel dependen Y, seperti kepadatan penduduk.

Sementara itu, koefisien X3 bernilai negatif, sehingga semakin tinggi persentase masyarakat yang memiliki akses terhadap sanitasi layak, maka semakin rendah kasus TBC dengan asumsi variabel lain konstan. Hal ini sesuai dengan landasan teori yang menyatakan bahwa sanitasi yang baik dapat menurunkan risiko penyebaran penyakit menular seperti TBC.

knitr::include_graphics("C:/Users/Admin/Downloads/KULIAH/Semester 5/Spasial/Project/SAR.png")

Berdasarkan hasil estimasi Spatial Autoregressive Model (SAR), variabel yang signifikan hanya X1 (jumlah puskesmas) dan X3 (sanitasi layak), sama seperti pada model OLS. Tanda koefisiennya juga sama, hanya berbeda pada besaran nilai koefisien. Dengan demikian, interpretasi model SAR sejalan dengan model OLS, dan perbedaan tanda koefisien pada X1 terhadap landasan teori kemungkinan disebabkan oleh variabel prediktor lain yang tidak dimasukkan ke dalam model.

Dampak Langsung, Tidak Langsung, dan Total dari SAR

Variabel Direct Indirect Total
Jumlah Puskesmas (X1) 254.18423 99.68413 353.86836
Persentase Rumah Tangga yang Memiliki Sumber Air Minum Layak (X2) 171.72826 67.34715 239.07541
Persentase Rumah Tangga yang Memiliki Sanitasi Layak (X3) -69.84007 -27.38938 -97.22945
Indeks Kualitas Udara (X4) -94.76753 -37.16525 -131.93278

Pada model SAR, dampak dari variabel bebas (X) dapat dikategorikan menjadi tiga jenis, yaitu:

  • Direct impact: dampak yang terjadi secara lokal pada suatu daerah sebagai akibat perubahan variabel prediktornya.
  • Indirect impact: efek spillover, yaitu dampak yang muncul karena pengaruh variabel prediktor dari daerah tetangga.
  • Total impact: merupakan gabungan dari direct dan indirect impact.

Hasil di atas menunjukkan bahwa variabel sanitasi layak (X3) memiliki pengaruh negatif baik secara langsung maupun tidak langsung terhadap jumlah kasus TBC, sedangkan jumlah puskesmas (X1) memiliki pengaruh positif.

knitr::include_graphics("C:/Users/Admin/Downloads/KULIAH/Semester 5/Spasial/Project/SEM.png")

Berdasarkan hasil estimasi Spatial Error Model (SEM), variabel yang signifikan hanya X1 (jumlah puskesmas) dan X3 (sanitasi layak), sama seperti pada model OLS dan SAR. Tanda koefisiennya juga sama dengan kedua model tersebut dan hanya berbeda pada besarannya. Dengan demikian, interpretasi hasil model SEM serupa dengan OLS dan SAR.

Perbedaan tanda koefisien pada X1 (jumlah puskesmas) terhadap landasan teori kemungkinan disebabkan oleh adanya variabel prediktor lain yang tidak dimasukkan ke dalam model, namun berhubungan dengan X1 dan turut memengaruhi kasus TBC.

4.4 Perbandingan Model

Model LM-Test Value p-value AIC
SAR LMlag 18.325 0.00001 475.64
SEM LMerror 9.3529 0.002 478.58
SAR (Robust) LMlag 10.679 0.001 475.64
SEM (Robust) LMerror 1.7062 0.19 478.58

Berdasarkan hasil uji Lagrange Multiplier (LM), nilai p-value pada model SAR dan SEM sama-sama signifikan (p-value < 0.05) pada uji LM biasa, sehingga dilanjutkan dengan uji LM robust. Hasil menunjukkan bahwa SAR signifikan (p-value < 0.05), sedangkan SEM tidak signifikan (p-value > 0.05).

Selain itu, berdasarkan nilai Akaike Information Criterion (AIC), model SAR memiliki nilai AIC yang lebih kecil dibandingkan dengan SEM. Hal ini menunjukkan bahwa model SAR lebih cocok untuk data dan lebih sederhana sesuai dengan prinsip parsimoni.

Dengan demikian, model SAR dipilih sebagai model spasial ekonometrik terbaik.

4.5 Interpretasi Hasil

Model SAR yang terbentuk dari penelitian ini adalah sebagai berikut:

\[ \hat{y} = \hat{\rho} W y + X \hat{\beta} + \hat{\varepsilon}, \quad \hat{\varepsilon} \sim N(0, \hat{\sigma}^2 I) \]

Dengan:

  • Ŷ = Nilai prediksi angka kasus TBC pada kabupaten/kota di Jawa Barat
  • \(\hat{\rho}\) (rho topi) = Estimasi dependensi spasial pada jumlah kasus TBC antar kabupaten/kota
  • W = Matriks bobot spasial
  • X = [1, X₁, X₂, X₃, X₄], dengan:
    • X₁ = Jumlah puskesmas
    • X₂ = Persentase rumah tangga yang memiliki sumber air minum layak
    • X₃ = Persentase rumah tangga yang memiliki sanitasi layak
    • X₄ = Indeks kualitas udara
  • \(\hat{\beta}\) (beta topi) = Estimasi koefisien pada setiap variabel X
  • \(\hat{\varepsilon}\) (epsilon topi) = Residual model atau error hasil estimasi
  • \(\hat{\sigma}^2\) = Estimasi varians error

Bab 5. Kesimpulan dan Saran

Kasus Tuberkulosis (TBC) di Provinsi Jawa Barat menunjukkan dependensi spasial positif. Hal tersebut mendukung hipotesis bahwa kasus tuberkulosis memiliki dependensi spasial dan diperlukan pemodelan spasial ekonometrik. Model spasial ekonometrik terbaik yang dipilih adalah SAR (Spatial Autoregressive) berdasarkan uji LM dan AIC. Hasil estimasi model SAR menunjukkan bahwa kasus TBC dipengaruhi oleh kasus TBC di area tetangganya. Sedangkan variabel prediktor yang berpengaruh signifikan adalah jumlah puskesmas (X1) dengan koefisien bernilai positif dan persentase masyarakat yang memiliki akses terhadap sanitasi layak (X3) dengan koefisien bernilai negatif.

Saran untuk penelitian selanjutnya adalah memasukkan variabel prediktor lain yang signifikan seperti kepadatan penduduk sehingga tidak memengaruhi pengaruh dari variabel prediktor yang sudah ada seperti X1 dan menggunakan metode yang melibatkan aspek waktu juga, tidak hanya ruang apabila didasari dengan landasan teori yang kuat.

Bab 6. Daftar Pustaka

[1] H. Zeanova et al., “Analisis Faktor Penyebab Penyakit TBC di Jawa Barat Menggunakan Regresi Binomial Negatif,” ResearchGate, 2024. [Online]. Available: https://www.researchgate.net/publication/387640440_ANALISIS_FAKTOR_PENYEBAB_PENYAKIT_TBC_DI_JAWA_BARAT_MENGGUNAKAN_REGRESI_BINOMIAL_NEGATIF

[2] Kementerian Kesehatan Republik Indonesia, Profil Kesehatan Indonesia 2024, Jakarta: Kemenkes RI, 2024.

[3] M. Sobari, I. G. N. M. Jaya, and B. N. Ruchjana, “Spatial Analysis of Dengue Disease in Jakarta Province,” CAUCHY – Jurnal Matematika Murni dan Aplikasi, vol. 7, no. 4, pp. 535–547, 2023.

[4] L. Anselin, “Spatial Econometrics,” in A Companion to Theoretical Econometrics, B. H. Baltagi, Ed., Oxford: Blackwell Publishing, 2001, pp. 310–330.

[5] H. I. Zebua and I. G. N. M. Jaya, “Spatial Autoregressive Model of Tuberculosis Cases in Central Java Province 2019,” CAUCHY – Jurnal Matematika Murni dan Aplikasi, vol. 7, no. 2, pp. 240–248, 2022.

[6] Hidayati, Inayah. “Daily Commute of Circular Migrant in Greater Jakarta: a Review.” Jo-DEST: Journal of Demography, Ethnography and Social Transformation, … (lengkapi detail jurnal)

[7] Setyawan, Dhani; Wardhana, Irwanda Wisnu; Khairunnisah, Khairunnisah. “Determinants of Labor Market in Jakarta Metropolitan Area: a Survival Analysis of Commuters.” Communications – Scientific Letters of the University of Zilina, Vol.22, No.2 (2020).

[8] H. Yasin, A. R. Hakim, and B. Warsito, Regresi Spasial (Aplikasi dengan R), Pekalongan: WADE Group, 2020.

[9] W. Wang et al., “Reclaiming independence in spatial-clustering datasets: A series of data-driven spatial weights matrices,” Statistics in Medicine, vol. 41, no. 15, pp. 2939–2956, 2022.

[10] A. A. Grasa, Econometric Model Selection: A New Approach, Dordrecht: Springer, 2018.

[11] Badan Pusat Statistik Provinsi Jawa Barat, Persentase Rumah Tangga yang Memiliki Akses Terhadap Sumber Air Minum Layak (Persen), 2024, Statistik Table, diakses 2025. [Online]. Tersedia: https://jabar.bps.go.id/id/statistics-table/2/NzI5IzI=/persentase-rumah-tangga-yang-memiliki-akses-terhadap-sumber-air-minum-layak-.html

[12] Pemerintah Provinsi Jawa Barat, “Persentase Keluarga dengan Akses Sanitasi Layak (Jamban Sehat) Berdasarkan Kabupaten/Kota di Jawa Barat,” Open Data Jabar, diakses 2025. [Online]. Tersedia: https://opendata.jabarprov.go.id/id/dataset/persentase-keluarga-dengan-akses-sanitasi-layak-jamban-sehat-berdasarkan-kabupatenkota-di-jawa-barat

[13] Pemerintah Provinsi Jawa Barat, “Jumlah Puskesmas Berdasarkan Kabupaten/Kota di Jawa Barat,” Open Data Jabar, diakses 2025. [Online]. Tersedia:https://opendata.jabarprov.go.id/en/dataset/jumlah-puskesmas-berdasarkan-kabupatenkota-di-jawa-barat

[14] Kementerian Lingkungan Hidup dan Kehutanan Republik Indonesia, Laporan Kinerja Direktorat Pengendalian Pencemaran Udara Tahun 2024, Jakarta: Direktorat Pengendalian Pencemaran Udara, Direktorat Jenderal Pengendalian Pencemaran dan Kerusakan Lingkungan, 2024.

Lampiran

Script Python

import streamlit as st

import pandas as pd

st.set_page_config(

    page_title=“Welcome”,

    page_icon=“📊”,

    layout=‘wide’

)

st.write(“# Dashboard Kasus TBC di Jawa Barat Tahun 2024”)

st.sidebar.success(“Silahkan pilih section.”)

st.markdown(“Dashboard ini dibuat dengan tujuan memberikan wawasan terkait TBC dan faktor-faktor pengaruhnya.”)

st.markdown(‘Dengan faktor-faktor sebagai berikut:’)

st.markdown(‘Y = Jumlah Kasus  \n X1 = Jumlah Puskesmas  \n X2 = Persentase Rumah Tangga yang Memiliki Sumber Air Minum Layak  \n’

‘X3 = Persentase Rumah Tangga yang Memiliki Sanitasi Layak  \n X4 = Indeks Kualitas Udara’)

@st.cache_data

def get_data():

    return pd.read_csv(‘data/data_jumlah_tbc.csv’, index_col=0, sep=‘;’)

df = get_data()

df = df.sort_index()

cols = [“Y”, “X1”, “X2”, “X3”, “X4”]

for col in cols:

    df[col] = (

        df[col].astype(str)

        .str.replace(“,”, “.”)   # fix comma decimals

        .str.replace(“%”, ““)    # remove percent signs

    )

    df[col] = pd.to_numeric(df[col], errors=“coerce”)

with st.container(border=True):

    st.subheader(‘Bar Chart’)

    st.bar_chart(df[‘Y’])

    st.subheader(‘DataFrame’)

    st.dataframe(df)

    st.subheader(‘Statistik Deskriptif’)

    st.write(df.describe())

import geopandas as gpd

import numpy as np

from libpysal.weights import Queen

from spreg import ML_Lag, ML_Error

import streamlit as st

import pandas as pd

import statsmodels.formula.api as smf

from spreg import OLS

@st.cache_data

def load_data():

    gdf = gpd.read_file(“data/gadm41_IDN_2.json”)

    gdf = gdf[gdf[‘NAME_1’] == ‘JawaBarat’]

    df = pd.read_csv(‘data/data_jumlah_tbc.csv’, sep=‘;’, index_col=0)

    df.index = df.index.str.replace(’ ‘,’’, regex=False)

    merged = gdf.merge(df, left_on=‘NAME_2’, right_index=True)

    return merged

data_spatial = load_data()

cols = [“Y”, “X1”, “X2”, “X3”, “X4”]

for col in cols:

    data_spatial[col] = (

        data_spatial[col].astype(str)

        .str.replace(“,”, “.”)

        .str.replace(“%”, ““)

    )

    data_spatial[col] = pd.to_numeric(data_spatial[col], errors=“coerce”)

y = data_spatial[“Y”].values.reshape((-1, 1))

X = data_spatial[[“X1”, “X2”, “X3”, “X4”]].values

w = Queen.from_dataframe(data_spatial)

w.transform = “r”

# SAR Model

sar_model = ML_Lag(y, X, w=w, method=“full”)

# OLS Model

formula = ‘Y ~ X1 + X2 + X3 + X4’

ols_model = smf.ols(formula, data=data_spatial).fit()

# SEM Model

sem_model = ML_Error(y, X, w=w, name_y=‘Y’, name_x=[‘X1’, ‘X2’, ‘X3’, ‘X4’])

# with st.container(border=True):

st.subheader(‘Model dengan AIC terbaik adalah SAR’)

c1, c2 = st.columns([1, 1])

c3, c4 = st.columns([1, 1])

with c1:

    with st.container(border=True):

        st.header(“Spatial Auto Regression (SAR)”)

        st.markdown(“##### Model Fit and Diagnostics”)

        col1, col2, col3 = st.columns(3)

        # col1.metric(“Pseudo R-squared”, f”{sar_model.pr2:.4f}“)

        col1.metric(“AIC”, f”{sar_model.aic:.2f}“)

        col2.metric(“Log-Likelihood”, f”{sar_model.logll:.2f}“)

        col3.metric(“Observations”, sar_model.n)

        st.markdown(“##### Model Coefficients (β)”)

        coeffs = {

            ‘Variable’: sar_model.name_x[:-1],

            ‘Coefficient’: sar_model.betas.flatten()[:-1], # Exclude rho from betas

            ‘Std. Error’: sar_model.std_err.flatten()[:-1],

            ‘Z_Statistic’ : [z[1] for z in sar_model.z_stat[:-1]],

            ‘Probability’: np.array([p for z, p in sar_model.z_stat][:-1]),

        }

        coeffs_df = pd.DataFrame(coeffs).round(4)

        st.dataframe(coeffs_df, use_container_width=True, hide_index=True)

with c3:

    with st.container(border=True):

        st.header(‘Ordinary Least Square (OLS)’)

        st.markdown(“##### Model Fit and Diagnostics”)

        col1, col2, col3 = st.columns(3)

        col1.metric(“AIC”, f”{ols_model.aic:.2f}“)

        col2.metric(“Log-Likelihood”, f”{ols_model.llf:.2f}“)

        col3.metric(“Observations”, ols_model.nobs)

        st.markdown(“##### Model Coefficients (β)”)

        coeffs = {

            ‘Variabel’: ols_model.params.index.tolist(),

            ‘Coefficient’: ols_model.params.values,

            ‘Std. Error’: ols_model.bse.values,

            ‘Z_Statistic’: ols_model.tvalues.values,

            ‘Probability’: ols_model.pvalues.values

        }

        coeffs_df = pd.DataFrame(coeffs).round(4)

        st.dataframe(coeffs_df, use_container_width=True, hide_index=True)

with c2:

    with st.container(border=True):

        st.header(“Spatial Error Model (SEM)”)

        st.markdown(“##### Model Fit and Diagnostics”)

        col1, col2, col3 = st.columns(3)

        col1.metric(“AIC”, f”{sem_model.aic:.2f}“)

        col2.metric(“Log-Likelihood”, f”{sem_model.logll:.2f}“)

        col3.metric(“Observations”, sem_model.n)

        st.markdown(“##### Model Coefficients (β)”)

        coeffs = {

            ‘Variable’: sar_model.name_x[:-1],

            ‘Coefficient’: sem_model.betas.flatten()[:-1], # Exclude rho from betas

            ‘Std. Error’: sem_model.std_err.flatten()[:-1],

            ‘Z_Statistic’ : [z[1] for z in sem_model.z_stat[:-1]],

            ‘Probability’: np.array([p for z, p in sem_model.z_stat][:-1]),

        }

        coeffs_df = pd.DataFrame(coeffs).round(4)

        st.dataframe(coeffs_df, use_container_width=True, hide_index=True)

import streamlit as st

import geopandas as gpd

import matplotlib.pyplot as plt

import pandas as pd

from utils.LISA import lisa_map

from utils.Map import create_indo_map

st.title(“Peta Kasus TBC”)

@st.cache_data

def load_data():

    df =pd.read_excel(‘data/Data_prediksi.xlsx’, index_col=0)

    df.index = df.index.str.replace(’ ‘,’’, regex=False)

    gdf = gpd.read_file(‘data/gadm41_IDN_2.json’)

    gdf = gdf[gdf[‘NAME_1’] == ‘JawaBarat’]

    merged = gdf.merge(df, left_on=‘NAME_2’, right_index=True)

    return merged

merged = load_data()

provinsi = st.multiselect(

    “Pilih Kabupaten / Kota”,

    options=merged.NAME_2.tolist(),

    # default=[‘Bandung’]

)

fig, ax = plt.subplots(figsize=(20, 4))

cola, colb = st.columns([1, 1])

with cola:

    with st.container(border=True):

        if provinsi:

            merged.plot(ax=ax, color=‘lightgray’, edgecolor=‘black’)

            merged_selected = merged[merged[‘NAME_2’].isin(provinsi)]

            merged_selected.plot(

                    ax=ax,

                    cmap=‘YlOrRd’,

                    legend=True,

                    column=‘Y’,

                    edgecolor=‘black’,

                    vmin=0,

                    vmax=30000

                )

        else:

                merged.plot(

                    ax=ax,

                    cmap=‘YlOrRd’,

                    legend=True,

                    column=‘Y’,

                    edgecolor=‘black’,

                    vmin=0,

                    vmax=30000

                )

        ax.set_title(‘Peta Kasus TBC di Jawa Barat’, fontsize=14)

        ax.axis(‘off’)

        # plt.tight_layout()

        st.pyplot(fig)

with colb:

        with st.container(border=True):

            lisa_map()

            st.write(“““<div style=”text-align: justify;“>Local Moran’s I atau LISA berfungsi untuk mendeteksi lokasi-lokasi spesifik yang memiliki pola spasial yang signifikan. 

                Melihat peta yang dihasilkan, dapat dilihat bahwa wilayah barat yang ada di Jawa Barat (Bekasi, Depok, Bogor) dapat dikategorikan sebagai High-High cluster atau hotspot yang mana terdapat kasus TBC yang tinggi. 

                Wilayah selatan dan timur Jawa Barat (Garut dan Tasikmalaya) cenderung membentuk Low-Low Cluster atau coldspot</div>“““, unsafe_allow_html=True)

import streamlit as st

import geopandas as gpd

import matplotlib.pyplot as plt

import pandas as pd

@st.cache_data

def load_data():

    df = pd.read_excel(‘data/Data_prediksi.xlsx’, index_col=0)

    df.index = df.index.str.replace(’ ‘,’’, regex=False)

    gdf = gpd.read_file(‘data/gadm41_IDN_2.json’)

    gdf = gdf[gdf[‘NAME_1’] == ‘JawaBarat’]

    merged = gdf.merge(df, left_on=‘NAME_2’, right_index=True)

    return merged

st.title(“Peta Prediksi dan Residual Kasus TBC”)

merged = load_data()

provinsi = st.multiselect(

    “Pilih Kabupaten / Kota”,

    options=merged.NAME_2.tolist(),

)

col, col2 = st.columns([1, 1])

cola, colb = st.columns([1, 1])

with col:

    with st.container(border=True):

        fig1, ax1 = plt.subplots(figsize=(10, 4))

        merged.plot(ax=ax1, color=‘lightgray’, edgecolor=‘black’)

        if provinsi:

            merged_selected = merged[merged[‘NAME_2’].isin(provinsi)]

            merged_selected.plot(

                ax=ax1,

                column=‘Y’,

                cmap=‘YlOrRd’,

                legend=True,

                edgecolor=‘black’,

                vmin=-5000,

                vmax=30000

            )

        else:

            merged.plot(

                ax=ax1,

                column=‘Y’,

                cmap=‘YlOrRd’,

                legend=True,

                edgecolor=‘black’,

                vmin=-5000,

                vmax=30000

            )

        ax1.set_title(‘Peta Kasus TBC Aktual di Jawa Barat’, fontsize=14)

        ax1.axis(‘off’)

        st.pyplot(fig1)

with col2:

    with st.container(border=True):

        d = merged.copy()

        d = d[[‘NAME_2’, ‘Y’, ‘Y_prediksi’, ‘Residual’]]

        if provinsi:

            d = d[d[‘NAME_2’].isin(provinsi)]

        d.rename(columns={‘NAME_2’: ‘Kabupaten/Kota’}, inplace=True)

        d.set_index(‘Kabupaten/Kota’, inplace=True)

        d = d.sort_index()

        st.dataframe(d)

with cola:

    with st.container(border=True):

        fig2, ax2 = plt.subplots(figsize=(10, 4))

        merged.plot(ax=ax2, color=‘lightgray’, edgecolor=‘black’)

        if provinsi:

            merged_selected = merged[merged[‘NAME_2’].isin(provinsi)]

            merged_selected.plot(

                ax=ax2,

                column=‘Y_prediksi’,

                cmap=‘YlOrRd’,

                legend=True,

                edgecolor=‘black’,

                vmin=-5000,

                vmax=30000

            )

        else:

            merged.plot(

                ax=ax2,

                column=‘Y_prediksi’,

                cmap=‘YlOrRd’,

                legend=True,

                edgecolor=‘black’,

                vmin=-5000,

                vmax=30000

            )

        ax2.set_title(‘Peta Prediksi Kasus TBC di Jawa Barat’, fontsize=14)

        ax2.axis(‘off’)

        st.pyplot(fig2)

with colb:

    with st.container(border=True):

        fig3, ax3 = plt.subplots(figsize=(10, 4))

        merged.plot(ax=ax3, color=‘lightgray’, edgecolor=‘black’)

        if provinsi:

            merged_selected = merged[merged[‘NAME_2’].isin(provinsi)]

            merged_selected.plot(

                ax=ax3,

                column=‘Residual’,

                cmap=‘YlOrRd’,

                legend=True,

                edgecolor=‘black’,

                vmin=-5000,

                vmax=30000

            )

        else:

            merged.plot(

                ax=ax3,

                column=‘Residual’,

                cmap=‘YlOrRd’,

                legend=True,

                edgecolor=‘black’,

                vmin=-5000,

                vmax=30000

            )

        ax3.set_title(‘Peta Residual Kasus TBC di Jawa Barat’, fontsize=14)

        ax3.axis(‘off’)

        st.pyplot(fig3)

# with st.container(border=True):

#     lisa_map()

#     st.write(“““<div style=”text-align: justify;“>Local Moran’s I atau LISA berfungsi untuk mendeteksi lokasi-lokasi spesifik yang memiliki pola spasial yang signifikan. 

#                 Melihat peta yang dihasilkan, dapat dilihat bahwa wilayah barat yang ada di Jawa Barat (Bekasi, Depok, Bogor) dapat dikategorikan sebagai High-High cluster atau hotspot yang mana terdapat kasus TBC yang tinggi. 

#                 Wilayah selatan dan timur Jawa Barat (Garut dan Tasikmalaya) cenderung membentuk Low-Low Cluster atau coldspot</div>“““, unsafe_allow_html=True)

def lisa_map():

    import streamlit as st

    import geopandas as gpd

    import matplotlib.pyplot as plt

    import pandas as pd

    from libpysal.weights import Queen

    from esda import Moran_Local

    gdf = gpd.read_file(“data/gadm41_IDN_2.json”)

    gdf = gdf[gdf[‘NAME_1’] == ‘JawaBarat’]

    df = pd.read_csv(‘data/data_jumlah_tbc.csv’, sep=‘;’, index_col=0)

    df.index = df.index.str.replace(’ ‘,’’, regex=False)

    merged = gdf.merge(df, left_on=‘NAME_2’, right_index=True)

    y = merged[“Y”].values

    w = Queen.from_dataframe(merged)

    w.transform = ‘r’

    moran_loc = Moran_Local(y, w)

    merged[“LISA”] = moran_loc.Is

    fig, ax = plt.subplots(1, 1, figsize=(20, 4))

    merged.plot(

        column=“LISA”,

        cmap=“RdYlBu”,

        legend=True,

        vmin=-1, 

        vmax=1,

        ax=ax

        )

    merged.boundary.plot(ax=ax, color=“black”, linewidth=0.5)

    ax.set_title(“Peta LISA Kasus TBC di Jawa Barat”, fontsize=14)

    ax.axis(“off”)

    st.pyplot(fig)

    # c, _ = st.columns([1, 1])

    # with c:

        # with st.container(border=True):

        #     merged.plot(

        #         column=“LISA”,

        #         cmap=“RdYlBu”,

        #         legend=True,

        #         vmin=-1, 

        #         vmax=1,

        #         ax=ax

        #     )

        #     merged.boundary.plot(ax=ax, color=“black”, linewidth=0.5)

        #     ax.set_title(“Peta LISA Kasus TBC di Jawa Barat”, fontsize=14)

        #     ax.axis(“off”)

        #     st.pyplot(fig)

if _name_ == ‘_main_’:

    lisa_map()