Nama: Peter Taniwan
NPM: 140610230079
Jurusan: Statistika
Mata Kuliah: Spatial Statistics
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:
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).
Berdasarkan latar belakang yang telah diuraikan, maka permasalahan dalam penelitian ini dapat diidentifikasi sebagai berikut:
Tujuan dari penelitian ini adalah sebagai berikut:
Batasan dalam penelitian ini adalah sebagai berikut:
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].
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].
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:
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 |
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.
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:
Eksplorasi Data Spasial
Mengidentifikasi karakteristik statistik dan pola awal persebaran kasus
TBC melalui analisis deskriptif dan visualisasi peta.
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).
Pemodelan Spasial Ekonometrik
Membandingkan model OLS, SAR, dan SEM untuk mengetahui bentuk
ketergantungan spasial yang dominan.
Pemilihan Model Terbaik
Memilih model dengan mempertimbangkan hasil uji Lagrange Multiplier (LM)
dan nilai Akaike Information Criterion (AIC).
Visualisasi dan Interpretasi Hasil
Menyajikan hasil estimasi dan pola klaster spasial untuk memberikan
interpretasi substantif terhadap faktor-faktor yang memengaruhi kasus
TBC.
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.
Analisis Deskriptif dan Visualisasi Awal
Membuat peta tematik untuk menggambarkan distribusi kasus TBC antar
kabupaten/kota dan mengidentifikasi pola awal persebaran.
Uji Autokorelasi Spasial
Menguji adanya pola ketergantungan spasial global menggunakan statistik
Moran’s I dan pola lokal menggunakan LISA (Local Indicators of Spatial
Association).
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).
Pemilihan Model Terbaik
Menentukan model yang paling sesuai untuk menjelaskan variasi spasial
kasus TBC antarwilayah.
Visualisasi dan Interpretasi Hasil
Menampilkan peta hasil estimasi dan memberikan interpretasi substantif
terhadap hubungan antarvariabel serta pola spasial yang
ditemukan.
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.
| 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")
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.
| 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:
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.
| 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.
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:
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.
[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.
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()