Bab 1. Pendahuluan

1.1 Latar belakang

Tuberkulosis (TBC) merupakan penyakit infeksi kronis paru-paru dan menular yang disebabkan oleh Mycobacterium tuberculosis. TBC dapat menyebar melalui pernafasan dengan menghirup percikan dahak (droplet) individu yang terinfeksi bakteri penyebab TBC. Ketika masuk ke dalam tubuh manusia, TBC akan menyerang berbagai organ tubuh, terutama paru-paru [1]. Penularannya yang mudah membuat kasus TBC cenderung tinggi bahkan hingga angka kematiannya.

Hingga saat ini, TBC merupakan tantangan utama kesehatan global karena merupakan salah satu penyakit dengan jumlah kasus terbanyak di dunia yaitu lebih dari 1 juta kasus dan 125 ribu kematian setiap tahun atau sekitar 14 kematian terjadi setiap jam akibat TBC. Menurut laporan global kasus TBC tahun 2024, Indonesia menempati posisi kedua tertinggi jumlah kasus tertinggi setelah India. Kasus TBC di Indonesia mencapai 885 ribu, dengan pembagian 496 ribu kasus pada laki-laki, 359 ribu kasus pada perempuan, dan 135 ribu pada anak-anak. Angka kasus tersebut baru 80% dari total estimasi target temuan kasus TBC nasional yang sebanyak 1,09 juta kasus [2]. Hal tersebut menunjukkan urgensi dan pentingnya masalah ini perlu diselesaikan.

Tingginya kasus TBC serta dampak yang diberikannya, menyebabkan perhatian khusus secara global, salah satunya melalui target poin ketiga pada Tujuan Pembangunan Berkelanjutan atau Sustainable Development Goals (SDGs) poin ke-3 yaitu memastikan hidup sehat dan meningkatkan kesejahteraan untuk semua orang. Salah satu isu dalam poin tersebut adalah menanggulangi epidemi TBC pada tahun 2030 [3].

Menurut Badan Pusat Statistik (BPS) 2024, provinsi Jawa Barat menjadi provinsi dengan jumlah kasus TBC tertinggi di Indonesia, yaitu mencapai 234.710 kasus pada tahun 2024. Kemudian disusul Jawa Timur dengan 116.752 kasus dan Jawa Tengah dengan 107.685 kasus [4][5].

TBC merupakan penyakit yang sangat dipengaruhi oleh kondisi spasial dan lingkungan, karena penyebarannya tidak terjadi secara acak tetapi membentuk pola antarwilayah. Kasus tinggi di suatu daerah dapat berdampak pada peningkatan kasus di daerah sekitar akibat mobilitas penduduk dan kondisi lingkungan yang mirip. Salah satu 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 [6].

Pengaruh kondisi spasial terhadap penyebaran TBC juga dapat dilihat dari tingginya mobilitas masyarakat di area Jakarta, Bogor, Depok, Tangerang, dan Bekasi (Jabodetabek). Kawasan ini ditandai oleh pergerakan komuter harian yang tinggi. Menurut BPS 2023, hasil Survei Komuter Jabodetabek 2023 menunjukkan bahwa terdapat sekitar 14,9 % penduduk komuter dari 29,6 juta penduduk Jabodetabek berumur 5 tahun ke atas. Kabupaten/Kota dengan persentase komuter tertinggi dibandingkan jumlah penduduk adalah Kota Depok (24,5%), diikuti Kota Bekasi (19,2%), dan Tangerang Selatan (18,5%). Sebagian besar komuter sebesar 81,9% memiliki kegiatan utama bekerja sedangkan 18,15% berkegiatan utama sekolah/kuliah/kursus. Sedangkan menurut jenis kelamin, 67,3% komuter berjenis kelamin laki-laki berbanding 32,7% perempuan atau kurang lebih proporsi jenis kelamin laki-laki dan perempuan adalah 2:1 [7].

Selain aspek spasial, faktor lain yang turut berperan penting dalam kasus TBC adalah jenis kelamin dan lingkungan yaitu kepadatan penduduk. Laki-laki cenderung lebih rentan terhadap TBC dibanding perempuan secara biologis karena berdasarkan hormon seks, hormon testosteron yang dominan pada laki-laki cenderung menekan sistem kekebalan tubuh, sehingga respons imun terhadap bakteri TBC lebih lemah. Hormon testosteron menurunkan aktivitas sel T, markofag, dan produksi sitokin yang penting untuk melawan bakteri TBC. Sebaliknya hormon estrogen yang lebih dominan pada perempuan justru memperkuat sistem imun. Hormon estrogen meningkatkan pembentukan makraofag, antibodi, dan respon sel T-helper tipe 1 yang membantu tubuh melawan infeksi TBC [8][9].

Dengan demikian, diperlukan penelitian epidemiologis yang menganalisis kasus TBC di provinsi Jawa Barat beserta faktor risikonya yaitu jenis kelamin. Melalui pendekatan ini, penelitian diharapkan dapat memberikan gambaran mengenai pola penyebaran TBC di Jawa Barat serta menjadi dasar kebijakan kesehatan publik yang efektif dan berbasis lokasi.

1.2 Rumusan masalah

  • Bagaimana pola penyebaran kasus Tuberkulosis (TBC) di Provinsi Jawa Barat?

  • Apakah terdapat pengaruh faktor jenis kelamin terhadap jumlah kasus TBC di Provinsi Jawa Barat?

  • Apakah terdapat keterkaitan spasial (autokorelasi spasial) antara wilayah dengan kasus TBC tinggi dan wilayah sekitarnya di Provinsi Jawa Barat?

1.3 Tujuan

  • Menganalisis pola penyebaran kasus Tuberkulosis (TBC) di Provinsi Jawa Barat.

  • Menganalisis pengaruh faktor jenis kelamin terhadap jumlah kasus TBC di Provinsi Jawa Barat.

  • Mengidentifikasi adanya autokorelasi spasial antarwilayah dalam penyebaran kasus TBC di Provinsi Jawa Barat.

Bab 2. Tinjauan Pustaka

2.1 Agen, Host, Environment

Model agent–host–environment atau segitiga epidemiologi merupakan konsep fundamental dalam epidemiologi penyakit menular. Model ini menjelaskan bahwa timbulnya penyakit merupakan hasil interaksi dinamis antara tiga komponen utama: agent (penyebab penyakit), host (pejamu dan kerentanannya), dan environment (lingkungan yang memfasilitasi penularan). Pendekatan ini tidak hanya bersifat tradisional, tetapi terus relevan untuk menjelaskan dinamika penyakit, di mana lingkungan dipahami sebagai faktor eksternal kunci yang memediasi pertemuan antara agen infeksius dan pejamu yang rentan (Rajendran & Krishnan, 2023) [10].

Dalam konteks tuberkulosis (TBC), agent adalah bakteri Mycobacterium tuberculosis, sedangkan host adalah manusia dengan berbagai faktor risiko seperti status imun, komorbiditas, dan status gizi. Environment menjadi determinan kunci yang mencakup faktor fisik dan sosial. Berbagai studi meta-analisis dan tinjauan sistematis terbaru secara konsisten mengonfirmasi bahwa faktor lingkungan fisik seperti kepadatan hunian (high occupancy density) yang tinggi, ventilasi udara yang buruk, dan kelembaban yang tidak terkontrol secara langsung dan signifikan meningkatkan risiko transmisi TBC di dalam rumah tangga dan komunitas (Hariyani et al., 2024) [11].

2.2 Ukuran Frekuensi

Prevalensi merupakan salah satu ukuran frekuensi utama dalam epidemiologi yang menggambarkan proporsi individu dalam suatu populasi yang menderita penyakit tertentu pada waktu tertentu. Ukuran ini mencerminkan beban penyakit dalam populasi dan menjadi indikator penting untuk perencanaan serta evaluasi program kesehatan masyarakat. Dalam konteks penelitian tuberkulosis (TBC), prevalensi digunakan untuk mengetahui seberapa besar proporsi penduduk yang menderita TBC pada wilayah dan periode tertentu.

\(Prevalensi(\%) = \frac{Jumlah\ Kasus\ TBC}{Jumlah\ Penduduk} \times 100\)

Terdapat dua jenis prevalensi yang umum digunakan, yaitu prevalensi titik (point prevalence) dan prevalensi periode (period prevalence).

Prevalensi titik menggambarkan proporsi individu yang menderita penyakit pada satu titik waktu tertentu.

Prevalensi periode menunjukkan proporsi individu yang menderita penyakit dalam suatu periode waktu, misalnya satu tahun pengamatan

2.3 Ukuran Asosiasi

Ukuran asosiasi digunakan dalam epidemiologi untuk menilai kekuatan hubungan antara faktor risiko (paparan) dan kejadian penyakit. Pada desain potong lintang (cross-sectional), ukuran asosiasi yang umum digunakan meliputi Prevalence Ratio (PR), Prevalence Odds Ratio (POR), dan Prevalence Difference (PD).

Prevalence Ratio (PR) menggambarkan perbandingan prevalensi penyakit antara kelompok terpapar dan kelompok tidak terpapar. Nilai PR lebih dari satu menunjukkan bahwa kelompok terpapar memiliki prevalensi penyakit yang lebih tinggi. Sementara itu, Prevalence Odds Ratio (POR) mengukur rasio odds prevalensi penyakit antara dua kelompok.

\(POR = \frac{\frac{P_{laki - laki}}{1 - P_{laki - laki}}}{\frac{P_{perempuan}}{1 - P_{perempuan}}}\)

Dimana PLaki − laki dan pPerempuan merupakan prevalensi dalam bentuk proporsi, bukan persentase. Walaupun POR sering digunakan dalam analisis regresi logistik, pada penyakit dengan prevalensi tinggi, POR cenderung melebihkan kekuatan asosiasi dibanding PR (Tamhane et al., 2016) [12]. Rumus PR:

\(PR = \frac{P_{Laki - laki}}{P_{perempuan}}\)

Dimana PLaki − laki​ adalah prevalensi TBC pada laki-laki, dan pPerempuan​ adalah prevalensi TBC pada perempuan.

Sedangkan Prevalence Difference (PD) merupakan ukuran absolut yang menggambarkan selisih prevalensi antara kelompok terpapar dan tidak terpapar, sehingga dapat menggambarkan beban tambahan penyakit secara langsung dalam populasi.

PD = Plaki − laki − Pperempuan

Dalam analisis data potong lintang, regresi log-binomial atau modified Poisson regression dengan robust standard error direkomendasikan untuk memperoleh estimasi PR yang lebih akurat dibanding regresi logistik yang menghasilkan OR (Gnardellis et al., 2022) [13]. Dengan demikian, ketiga ukuran ini saling melengkapi dalam memberikan gambaran tentang hubungan antara faktor risiko dan prevalensi penyakit pada populasi.

2.4 Desain studi

Dalam analisis yang dilakukan ini, digunkan desain studi cross-sectional yang merupakan salah satu desain penelitian observasional yang paling sering digunakan dalam epidemiologi karena mampu menggambarkan status kesehatan populasi dan hubungannya dengan faktor risiko pada satu titik waktu. Penelitian ini berfokus pada tahun 2020-2024 dengan ukuran epidemiologi diukur untuk setiap tahunnya sebagai pembanding. Desain ini efektif untuk mengukur prevalensi penyakit serta menilai asosiasi antara paparan dan outcome secara cepat dan efisien (Wang & Cheng, 2020) [14].

Namun, desain ini memiliki keterbatasan dalam menentukan hubungan sebab-akibat karena pengukuran paparan dan penyakit dilakukan secara bersamaan, sehingga urutan waktu tidak dapat dipastikan. Selain itu, desain ini rentan terhadap selection bias apabila sampel tidak representatif, serta information bias jika terdapat kesalahan dalam pencatatan atau diagnosis penyakit. Oleh karena itu, pelaporan hasil penelitian cross-sectional perlu mengikuti pedoman STROBE (Strengthening the Reporting of Observational Studies in Epidemiology) agar hasil penelitian lebih transparan, sistematis, dan dapat dievaluasi dengan baik [15].

Bab 3. Metodologi

3.1 Sumber Data

Data yang digunakan merupakan data sekunder yang bersumber dari Open Data Jabar. Penelitian ini mencakup data kasus TBC dan jumlah penduduk berdasarkan jenis kelamin dari 27 kabupaten/kota yang ada di Provinsi Jawa Barat pada tahun 2020 - 2024 [16][17].

3.2 Variabel

Variabel-variabel yang digunakan dapat dilihat sebagai berikut :

Variabel Keterangan
Y Jumlah Kasus TBC
X Jenis Kelamin
N Jumlah Penduduk

3.3 Metode Analisis

Penelitian ini menggunakan desain cross-sectional dengan analisis epidemiologi dan spasial dalam menggambarkan penyebaran dan hubungan faktor risiko kasus TBC di Provinsi Jawa Barat tahun 2020-2024. Analisis dilakukan melalui tiga tahap utama, yaitu eksplorasi data dan statistika deskriptif untuk menampilkan penyebaran kasus berdasarkan jenis kelamin dan wilayah, penghitungan ukuran frekuensi (prevalensi) untuk menggambarkan besarnya beban penyakit TBC, serta analisis ukuran asosiasi menggunakan Prevalence Ratio (PR), Prevalence Odds Ratio (POR), dan Prevalence Difference (PD) untuk menilai perbedaan risiko TBC antara laki-laki dan perempuan. Dari ukuran frekuensi dan asosiasi yang didapat, dilakukan perbandingan untuk tiap tahunnya untuk melihat apakah ada perubahan atau kecenderungan mutlak pada ukuran epidemiologi dari tahun ketahun. Selanjutnya dilakukan analisis spasial menggunakan Moran’s I dan LISA untuk mendeteksi adanya pola ketergantungan spasial serta klaster wilayah dengan kasus TBC tinggi.

3.4 Alur Kerja

Proses analisis dilakukan dengan langkah - langkah sebagai berikut.

  1. Pengumpulan Data

  2. Pengolahan dan Eksplorasi Data

  3. Analisis Deskriptif dan Ukuran Frekuensi

  4. Analisis Ukuran Asosiasi

  5. Analisis Spasial dengan Moran’s I dan LISA

  6. Visualisasi dan Interpretasi

Bab 4. Hasil dan Pembahasan

4.1 Eksplorasi Data dan Analisis Deskriptif

4.1.1 Peta Sebaran Kasus TBC

Gambar 1. Peta Sebaran Total Kasus TBC di Jawa Barat 2020-2024

Berdasarkan visualisasi peta sebaran tersebut yang diambil dari Dashboard di main menu, kasus TBC cenderung lebih tinggi di wilayah bagian barat Jawa Barat sejak tahun 2020 sampai 2024 secara konsisten, terutama Kabupaten Bogor yang tercatat sebagai wilayah dengan jumlah total kasus tertinggi (lebih dari 25.000 kasus). Sementara itu, Kabupaten Pangandaran menunjukkan jumlah total kasus paling rendah (kurang dari 5.000 kasus). Warna hijau yang semakin tebal/gelap pada peta menggambarkan intensitas kasus yang semakin tinggi tinggi.

4.1.2 Distribusi Kasus TBC Berdasarkan Gender

Distribusi rata-rata kasus TBC menurut gender tahun 2020-2024 dapat dilihat pada tabel berikut.

Laki-Laki (Tertinggi) Laki-Laki (Terendah) Perempuan (Tertinggi) Perempuan (Terendah)
2020 Bogor (9.010) Pangandaran (195) Bogor (7.322) Pangandaran (138)
2021 Bogor (6.211) Banjar (185) Bogor (4.954) Banjar (147)
2022 Bogor (6.510) Banjar (168) Bogor (5.376) Banjar (100)
2023 Bogor (11.881) Pangandaran (422) Bogor (10.043) Banjar (321)
2024 Bogor (13.846) Pangandaran (502) Bogor (11.618) Pangandaran (359)

Berdasarkan tabel tersebut, terlihat bahwa Kabupaten Bogor secara konsisten menempati posisi dengan jumlah kasus TBC tertinggi baik pada laki-laki maupun perempuan di seluruh tahun observasi. Pada tahun 2024, Kabupaten Bogor mencatat 13.846 kasus TBC pada laki-laki dan 11.618 kasus pada perempuan, menjadikannya wilayah dengan beban TBC tertinggi di Jawa Barat.

Sementara itu, Kabupaten Pangandaran dan Kota Banjar secara bergantian menjadi wilayah dengan jumlah kasus TBC terendah. Pada tahun 2024, Kabupaten Pangandaran melaporkan 502 kasus pada laki-laki dan 359 kasus pada perempuan, menunjukkan peningkatan dibandingkan tahun-tahun sebelumnya tetapi tetap menjadi daerah dengan jumlah kasus paling sedikit di provinsi ini.

Secara umum, pola perbedaan jumlah kasus antara laki-laki dan perempuan bersifat konsisten di seluruh tahun, dengan proporsi laki-laki yang terinfeksi selalu lebih tinggi. Peningkatan kasus pada tahun 2023–2024 yang cukup signifikan, terutama di wilayah dengan kepadatan penduduk tinggi seperti Bogor, menunjukkan adanya kemungkinan peningkatan deteksi kasus melalui kegiatan surveilans aktif atau intensifikasi program skrining TBC. Hal ini juga dapat berkaitan dengan pemulihan pasca pandemi Covid-19, di mana kegiatan penemuan kasus (case finding) kembali berjalan lebih optimal.

4.1.3 Distribusi Populasi Berdasarkan Gender

Hasil visualisasi menunjukkan bahwa proporsi populasi laki-laki dan perempuan relatif seimbang, yaitu sekitar 50,7% laki-laki dan 49,3% perempuan di tahun 2024. Hal ini berarti terdapat dugaan bahwa perbedaan jumlah kasus TBC tidak disebabkan oleh perbedaan jumlah populasi, melainkan karena perbedaan risiko dan paparan di antara gender.

4.2 Ukuran Frekuensi

4.2.1 Prevalensi per Kabupaten/Kota

Ukuran frekuensi dalam epidemiologi menggambarkan seberapa besar proporsi populasi yang mengalami suatu penyakit pada waktu tertentu. Dalam penelitian ini, ukuran frekuensi yang digunakan adalah prevalensi kasus Tuberkulosis (TBC) berdasarkan jenis kelamin (laki-laki dan perempuan) pada tahun 2024 di setiap kabupaten/kota di Provinsi Jawa Barat. Peta sebaran kasus TBC berdasarkan prevalensi tahun 2024 dapat dilihat pada gambar berikut.

Prevalensi dihitung dengan membandingkan jumlah kasus TBC terhadap jumlah penduduk pada kelompok jenis kelamin yang sama, kemudian dikalikan 100 untuk mendapatkan hasil dalam satuan persen. Tabel berikut menampilkan prevalensi kasus TBC di setiap kabupaten/kota pada tahun 2024 berdasarkan jenis kelamin:

Kabupaten Tahun Prevalensi Laki-Laki (%) Prevalensi Perempuan (%)
KABUPATEN BANDUNG 2024 0.336 0.307
KABUPATEN BANDUNG BARAT 2024 0.215 0.205
KABUPATEN BEKASI 2024 0.37 0.29
KABUPATEN BOGOR 2024 0.466 0.41
KABUPATEN CIAMIS 2024 0.262 0.184
KABUPATEN CIANJUR 2024 0.298 0.28
KABUPATEN CIREBON 2024 0.351 0.265
KABUPATEN GARUT 2024 0.295 0.285
KABUPATEN INDRAMAYU 2024 0.248 0.167
KABUPATEN KARAWANG 2024 0.46 0.355
KABUPATEN KUNINGAN 2024 0.278 0.214
KABUPATEN MAJALENGKA 2024 0.322 0.255
KABUPATEN PANGANDARAN 2024 0.224 0.161
KABUPATEN PURWAKARTA 2024 0.518 0.44
KABUPATEN SUBANG 2024 0.384 0.299
KABUPATEN SUKABUMI 2024 0.341 0.302
KABUPATEN SUMEDANG 2024 0.246 0.198
KABUPATEN TASIKMALAYA 2024 0.191 0.14
KOTA BANDUNG 2024 0.659 0.646
KOTA BANJAR 2024 0.626 0.405
KOTA BEKASI 2024 0.556 0.449
KOTA BOGOR 2024 0.828 0.78
KOTA CIMAHI 2024 0.666 0.704
KOTA CIREBON 2024 1.135 0.956
KOTA DEPOK 2024 0.385 0.336
KOTA SUKABUMI 2024 0.839 0.747
KOTA TASIKMALAYA 2024 0.556 0.485

Dari tabel tersebut dapat diamati bahwa prevalensi TBC pada laki-laki umumnya lebih tinggi dibandingkan perempuan di hampir seluruh kabupaten/kota.

4.2.2 Perbandingan Prevalensi dari Tahun Sebelumnya

Untuk melihat perkembangan situasi TBC di Jawa Barat dari waktu ke waktu, dilakukan analisis perbandingan prevalensi tahunan selama periode 2020–2024. Perbandingan ini penting untuk mengetahui tren perubahan proporsi kasus TBC antar tahun serta perbedaan berdasarkan jenis kelamin.

tahun prevalensi male (%) prevalensi female (%) prevalensi total (%)
2020 0.256 0.218 0.237
2021 0.193 0.162 0.178
2022 0.2 0.173 0.187
2023 0.356 0.305 0.33
2024 0.398 0.343 0.371

Berdasarkan tabel di atas, prevalensi TBC di Jawa Barat menunjukkan peningkatan dari tahun ke tahun setelah 2022. Tahun 2020–2021 memperlihatkan penurunan yang mungkin dipengaruhi oleh berkurangnya pelaporan dan akses layanan kesehatan akibat pandemi Covid-19, namun sejak 2022 hingga 2024 terjadi peningkatan kembali, mencerminkan kembali seriusnya kasus TBC.

Selain itu, prevalensi pada laki-laki tetap lebih tinggi dibandingkan perempuan di setiap tahun pengamatan, yang menegaskan adanya perbedaan risiko antara laki-laki dan perempuan terhadap penyakit TBC di wilayah ini.

Laki-Laki (Tertinggi) Laki-Laki (Terendah) Perempuan (Tertinggi) Perempuan (Terendah)
2020 Kota Sukabumi (0.58%) Pangandaran (0.09%) Kota Bandung (0.48%) Pangandaran (0.06%)
2021 Kota Cirebon (0.42%) Bandung Barat (0.09%) Kota Bandung (0.35%) Indramayu (0.07%)
2022 Kota Cirebon (0.62%) Bandung Barat (0.1%) Kota Cirebon (0.48%) Indramayu (0.07%)
2023 Kota Cirebon (0.89%) Bandung Barat (0.17%) Cimahi (0.76%) Tasikmalaya (0.13%)
2024 Kota Cirebon (1.14%) Tasikmalaya (0.19%) Kota Cirebon (0.96%) Tasikmalaya (0.14%)

Berdasarkan di atas, dapat diketahui bahwa prevalensi TBC tertinggi pada laki-laki secara konsisten terjadi di wilayah perkotaan padat penduduk seperti Kota Cirebon dan Kota Sukabumi, sementara prevalensi terendah cenderung ditemukan di wilayah dengan kepadatan penduduk rendah seperti Kabupaten Tasikmalaya, Pangandaran, dan Bandung Barat.

Pada tahun 2024, Kota Cirebon mencatat prevalensi TBC tertinggi pada laki-laki sebesar 1,14% dan pada perempuan sebesar 0,96%, menjadikannya wilayah dengan beban relatif tertinggi di Jawa Barat. Hal ini mengindikasikan bahwa meskipun jumlah kasus absolut mungkin tidak sebesar daerah lain, proporsi penderita terhadap jumlah penduduk di Cirebon tergolong tinggi, menunjukkan kemungkinan adanya transmisi lokal yang intens atau efektivitas deteksi kasus yang tinggi.

Sebaliknya, Kabupaten Tasikmalaya dan Pangandaran secara konsisten menunjukkan prevalensi terendah pada kedua gender, dengan nilai di bawah 0,2%. Hal ini dapat mencerminkan dua kemungkinan. Pertama, beban penyakit yang memang lebih rendah atau kedua, kegiatan penemuan kasus (case finding) yang masih terbatas di wilayah tersebut.

Pola yang muncul menunjukkan bahwa wilayah perkotaan dengan kepadatan penduduk tinggi dan mobilitas sosial-ekonomi besar cenderung memiliki prevalensi TBC yang lebih tinggi. Kondisi ini sejalan dengan literatur epidemiologi yang menyebutkan bahwa kepadatan permukiman, paparan lingkungan tertutup, serta faktor sosial ekonomi berperan penting dalam peningkatan risiko penularan TBC

4.3 Ukuran Asosiasi

4.3.1 Prevalence Ratio (PR)

Ukuran Prevalence Ratio (PR) digunakan untuk membandingkan prevalensi suatu penyakit antara dua kelompok gender, yakni antara laki-laki dan perempuan.

Tahun PR
2020 1.227
2021 1.231
2022 1.223
2023 1.205
2024 1.213

Nilai PR berkisar antara 1,205 hingga 1,231, menunjukkan bahwa prevalensi TBC pada laki-laki secara konsisten sekitar 20–23% lebih tinggi dibandingkan perempuan. Pada tahun 2024, nilai PR mencapai 1,213, yang berarti prevalensi TBC pada laki-laki masih lebih tinggi sekitar 21% dibandingkan perempuan. Jika dibandingkan antar-tahun, PR menunjukkan tren relatif stabil tanpa penurunan berarti, mengindikasikan bahwa risiko penyakit TBC berbasis jenis kelamin masih berlangsung secara konsisten selama periode 2020–2024.

4.3.2 Prevalence Odds Ratio (POR)

Prevalence Odds Ratio (POR) mengukur perbandingan peluang seseorang menderita TBC antara dua kelompok (gender).

Tahun POR
2020 1.227
2021 1.232
2022 1.223
2023 1.206
2024 1.214

Nilai POR berkisar antara 1,206 hingga 1,232 dari tahun 2020 sampai dengan 2024. Pada tahun 2024, nilai POR sebesar 1,214 menunjukkan bahwa peluang laki-laki untuk menderita TBC sekitar 1,2 kali lebih besar dibandingkan perempuan. Bila dibandingkan dengan tahun-tahun sebelumnya, tidak terjadi penurunan berarti pada nilai POR, yang menandakan bahwa kesenjangan peluang tersebut bersifat persisten.

POR Tertinggi POR Terendan
2020 Banjar (1.52%) Cianjur (0.98%)
2021 Pangandaran (1.49%) Cimahi (0.93%)
2022 Banjar (1.66%) Cimahi (0.91%)
2023 Indramayu (1.52%) Bandung Barat (0.96%)
2024 Banjar (1.55%) Cimahi (0.95%)

Berdasarkan hasil perhitungan, nilai POR di seluruh kabupaten/kota berada di kisaran 0,9 hingga 1,7, yang menunjukkan bahwa peluang laki-laki untuk menderita TBC umumnya lebih tinggi dibandingkan perempuan, meskipun tingkat perbedaannya bervariasi antarwilayah.

Pada tahun 2024, misalnya, Kota Banjar menunjukkan nilai POR tertinggi sebesar 1.55, yang berarti peluang laki-laki untuk menderita TBC sekitar 1,5 kali lebih besar dibandingkan perempuan di wilayah tersebut. Sebaliknya, Kota Cimahi mencatat nilai POR terendah di angka 0.95, yang menandakan tidak adanya perbedaan peluang signifikan antara kedua gender bahkan menunjukkan kecenderungan sedikit lebih tinggi pada perempuan.

Secara temporal, Banjar secara konsisten menjadi wilayah dengan nilai POR tertinggi pada sebagian besar tahun pengamatan (2020, 2022, dan 2024). Hal ini mengindikasikan adanya disparitas risiko yang relatif stabil antara laki-laki dan perempuan di daerah tersebut, yang dapat berkaitan dengan faktor sosial-ekonomi, pola pekerjaan, atau perbedaan akses layanan kesehatan.

Sebaliknya, Cimahi dan Bandung Barat cenderung menunjukkan nilai POR mendekati 1, menandakan bahwa risiko TBC antara laki-laki dan perempuan relatif setara di wilayah tersebut. Hal ini mungkin mencerminkan cakupan layanan kesehatan yang lebih merata, atau pola perilaku yang serupa antara kedua gender dalam hal paparan faktor risiko TBC.

Jika ditinjau dari tren tahunan, terlihat bahwa POR relatif stabil di kisaran 1,2 pada tingkat provinsi, dengan sedikit peningkatan pada tahun 2022 dan 2024. Pola ini menguatkan temuan pada ukuran PR dan PD, yaitu bahwa laki-laki secara konsisten memiliki peluang lebih besar untuk terinfeksi TBC dibandingkan perempuan, meskipun perbedaan peluang tidak terlalu ekstrem.

Konsistensi nilai POR dan PR yang saling mendekati memperlihatkan bahwa proporsi penderita TBC terhadap populasi total masih rendah, sehingga perbedaan antara ukuran berbasis proporsi (PR) dan odds (POR) tidak signifikan, ini merupakan fenomena yang umum dijumpai pada penyakit dengan prevalensi rendah seperti TBC.

4.3.3 Prevalence Difference (PD)

Ukuran Prevalence Difference (PD) menggambarkan selisih absolut prevalensi antara dua kelompok.

Tahun PD (%)
2020 0.046
2021 0.032
2022 0.033
2023 0.055
2024 0.066

Selama periode 2020–2024, nilai PD berada pada rentang 0,032% hingga 0,066%, dengan tahun 2024 mencapai nilai tertinggi yakni sebesar 0,066%. Hal ini berarti selisih prevalensi antara laki-laki dan perempuan semakin melebar pada tahun terakhir observasi. Walaupun perbedaan tersebut tergolong kecil, konsistensinya menunjukkan bahwa beban penyakit TBC pada laki-laki signifikan selalu lebih tinggi dan belum menunjukkan tren penyempitan kesenjangan dari tahun ke tahun.

Tahun PD Tertinggi PD Terendah
2020 Banjar (0.17%) Kota Bandung (0.00%)
2021 Kota Cirebon (0.12) Bandung Barat (0.00%)
2022 Kota Cirebon (0.15%) Bandung (0.00%)
2023 Banjar (0.16%) Bandung Barat (0.01%)
2024 Banjar (0.22%) Garut (0.01%)

Wilayah Kota Banjar kembali menempati posisi dengan nilai PD tertinggi pada beberapa tahun, termasuk tahun 2020, 2023, dan 2024, yang menunjukkan bahwa selisih prevalensi TBC antara laki-laki dan perempuan di daerah tersebut paling lebar, yakni mencapai 0,22% pada tahun 2024. Artinya, pada tahun tersebut, prevalensi TBC pada laki-laki di Kota Banjar lebih tinggi sekitar 0,22 poin persentase dibandingkan perempuan, suatu perbedaan yang meskipun tampak kecil, namun cukup bermakna secara epidemiologis.

Sebaliknya, beberapa daerah seperti Kota Bandung, Bandung Barat, dan Garut mencatat nilai PD yang mendekati nol, yang berarti tidak terdapat perbedaan prevalensi yang berarti antara laki-laki dan perempuan. Hal ini dapat menunjukkan bahwa risiko TBC di wilayah-wilayah tersebut relatif seimbang antar gender, kemungkinan disebabkan oleh distribusi sosial-ekonomi dan pola kehidupan yang serupa, atau program pengendalian TBC yang menjangkau kedua kelompok secara setara.

Hasil perhitungan PD ini mengonfirmasi temuan dari PR dan POR, yaitu bahwa laki-laki secara konsisten memiliki prevalensi TBC lebih tinggi dibandingkan perempuan di sebagian besar wilayah Jawa Barat. Namun, karena nilai PD relatif kecil (kurang dari 0,3%), dapat disimpulkan bahwa perbedaan gender dalam beban TBC di tingkat populasi tidak terlalu ekstrem, meskipun arah asosiasinya tetap sama di seluruh periode 2020–2024.

4.4. Pembahasan

4.4.1 Hasil Autokorelasi Spasial

Uji Statistik p-value
Moran’s I 0.002 (I = 0.35)

Berdasarkan hasil Moran’s I yang menggunakan matriks bobot spasial dengan queen continquity, nilai p-value <0.05 (Tolak H0) dan nilai I = 0.35 yang berarti terdapat autokorelasi spasial positif yang signifikan. Hal tersebut menunjukkan bahwa daerah dengan kasus tinggi dikelilingi oleh daerah dengan kassu tinggi juga, dan sebaliknya untuk daerah dengan kasus rendah dikelilingi oleh daerah dengan kasus rendah juga.

4.4.1 Hasil Local Moran’s I (LISA)

Untuk local Moran’s I (LISA), menghasilkan nilai berbeda pada setiap daerah. Terdapat beberapa daerah yang signifikan dan terbagi menjadi 2 bagian. Pertama, daerah High-High cluster seperti Bekasi, Depok, dan Bogor. Kedua, daerah Low-Low cluster seperti Purwakarta, Majalengka, dan Ciamis. Terakhir daerah yang diasumsikan sebagai outlier karena tidak sesuai teori dalam analisis spasial yaitu Low-High seperti Bandung Barat dan High-Low seperti Subang, Garut, dan Cirebon. Hasil visualisasi dapat dilihat pada gambar berikut.

4.5 Simulasi Cross-Section

Sebagai bagian dari analisis epidemiologi, dilakukan simulasi desain studi cross-sectional untuk menggambarkan hubungan antara jenis kelamin dan kejadian TBC pada populasi di Provinsi Jawa Barat. Studi ini bersifat simulatif, dengan data yang disusun secara hipotetik untuk mempermudah pemahaman konsep ukuran asosiasi dan potensi bias dalam desain epidemiologis.

Jenis Kelamin TBC (+) TBC (−) Total
Laki-laki 40 460 500
Perempuan 20 480 500
Total 60 940 1000

Variabel Utama

  • Variabel independen (paparan): Jenis kelamin (laki-laki/perempuan)

  • Variabel dependen (outcome): Status TBC (positif atau negatif berdasarkan hasil pemeriksaan laboratorium atau konfirmasi klinis).

Dalam simulasi ini, jenis kelamin diasumsikan sebagai faktor risiko yang dapat memengaruhi kemungkinan seseorang terdiagnosis TBC.

Populasi dan Unit Analisis
Populasi target adalah seluruh masyarakat dewasa di Provinsi Jawa Barat, yang berpotensi terpapar infeksi TBC. Unit analisis adalah individu, di mana setiap individu dicatat berdasarkan status TBC dan jenis kelaminnya.

Metode Sampling
Metode pengambilan sampel yang digunakan adalah multistage cluster sampling, dengan langkah-langkah sebagai berikut:

  1. Pemilihan acak beberapa kabupaten/kota di Jawa Barat sebagai klaster utama.

  2. Dari setiap kabupaten/kota terpilih, dipilih secara acak beberapa kecamatan dan kemudian kelurahan/desa.

  3. Di setiap kelurahan, dilakukan pemilihan rumah tangga secara acak sistematis.

  4. Dari setiap rumah tangga, satu individu dewasa (≥15 tahun) dipilih secara acak sebagai responden.

Metode ini memungkinkan pemerataan representasi populasi dan mengurangi risiko bias geografis.

Potensi Bias dan Confounding

  1. Selection Bias
    Dapat terjadi jika individu yang berpartisipasi tidak mewakili populasi umum, misalnya hanya yang datang ke fasilitas kesehatan, bukan populasi komunitas.

  2. Information Bias
    Kemungkinan kesalahan diagnosis (false positive atau false negative) atau kesalahan pelaporan status TBC.

  3. Confounding Factors
    Faktor lain seperti kebiasaan merokok, paparan polusi udara, infeksi HIV, status gizi, atau kepadatan hunian dapat memengaruhi hubungan antara jenis kelamin dan kejadian TBC.

Oleh karena itu, dalam penelitian riil, variabel-variabel tersebut sebaiknya dikontrol menggunakan analisis multivariat (misalnya regresi logistik).

Bab 5. Kesimpulan dan Saran

5.1 Kesimpulan

Penelitian ini bertujuan untuk menganalisis pola penyebaran kasus Tuberkulosis (TBC) di Provinsi Jawa Barat, menilai pengaruh faktor jenis kelamin terhadap jumlah kasus, serta mengidentifikasi adanya autokorelasi spasial antar wilayah selama periode 2020–2024. Berdasarkan hasil analisis, diketahui bahwa pola penyebaran TBC menunjukkan kecenderungan yang konsisten di wilayah bagian barat Jawa Barat, terutama di Kabupaten Bogor, Kota Depok, dan Kota Bekasi yang menjadi pusat konsentrasi kasus tertinggi. Hasil uji autokorelasi spasial dengan Moran’s I sebesar 0,35 (p-value = 0,002) menunjukkan adanya autokorelasi spasial positif yang signifikan. Artinya, wilayah dengan jumlah kasus tinggi cenderung berdekatan dengan wilayah lain yang juga memiliki kasus tinggi (high-high cluster), sedangkan daerah dengan kasus rendah berdekatan dengan wilayah berkasus rendah (low-low cluster), seperti Garut dan Tasikmalaya. Temuan ini menegaskan bahwa distribusi kasus TBC di Jawa Barat tidak bersifat acak, melainkan membentuk pola spasial yang nyata.

Dari sisi perbedaan berdasarkan jenis kelamin, hasil analisis prevalensi menunjukkan bahwa laki-laki secara konsisten memiliki prevalensi dan peluang menderita TBC lebih tinggi dibandingkan perempuan di seluruh tahun pengamatan. Nilai Prevalence Ratio (PR) berkisar antara 1,205 hingga 1,231, sementara Prevalence Odds Ratio (POR) antara 1,206 hingga 1,232, yang menandakan bahwa laki-laki memiliki risiko sekitar 1,2 kali lebih tinggi untuk menderita TBC dibandingkan perempuan. Selain itu, Prevalence Difference (PD) yang berkisar antara 0,03% hingga 0,07% menunjukkan selisih absolut prevalensi yang kecil namun konsisten, menegaskan adanya disparitas risiko berdasarkan gender. Jika dilihat secara temporal, prevalensi TBC sempat menurun pada tahun 2020–2021, kemungkinan akibat pembatasan mobilitas dan menurunnya pelaporan selama pandemi COVID-19, namun kembali meningkat signifikan sejak 2022 hingga 2024. Pada tahun terakhir observasi, prevalensi mencapai 0,398% pada laki-laki dan 0,343% pada perempuan, menunjukkan peningkatan beban penyakit di seluruh populasi.

Secara keseluruhan, hasil penelitian ini menunjukkan bahwa faktor jenis kelamin memiliki pengaruh terhadap kejadian TBC di Jawa Barat, di mana laki-laki menjadi kelompok dengan beban penyakit yang lebih tinggi. Namun, pola spasial yang terbentuk juga mengindikasikan bahwa faktor lingkungan, sosial ekonomi, kepadatan penduduk, dan mobilitas urban turut berperan penting dalam menentukan distribusi penyakit. Dengan demikian, pengendalian TBC di Jawa Barat perlu mempertimbangkan pendekatan berbasis wilayah dan berbasis gender secara bersamaan untuk mencapai efektivitas yang optimal.

5.2 Saran

Berdasarkan hasil penelitian, disarankan agar Dinas Kesehatan Provinsi Jawa Barat memperkuat program deteksi dini di wilayah dengan beban tinggi seperti Bogor, Bekasi, dan Cirebon, serta meningkatkan koordinasi antar wilayah yang termasuk dalam klaster spasial kasus tinggi. Program pengendalian TBC juga perlu mempertimbangkan perbedaan gender dengan memberikan perhatian lebih kepada kelompok laki-laki sebagai kelompok dengan risiko tertinggi melalui edukasi, promosi kesehatan, dan peningkatan akses terhadap pemeriksaan TBC. Selain itu, pengembangan sistem pemantauan spasial berbasis data perlu terus ditingkatkan agar mampu memberikan gambaran sebaran kasus secara real-time dan mendukung pengambilan keputusan berbasis bukti. Penelitian lanjutan juga direkomendasikan untuk memasukkan faktor-faktor risiko lain seperti perilaku merokok, status gizi, kepadatan hunian, dan akses layanan kesehatan guna memperoleh pemahaman yang lebih komprehensif mengenai determinan TBC di Jawa Barat.

Daftar Pustaka

[1] Prameswari Ambarsih. (2023). Urgensi Penanggulangan TBC di Indonesia. Diakses dari https://rc-gerid.unair.ac.id/urgensi-penanggulangan-tbc-di-indonesia/

[2] Kementerian Kesehatan Republik Indonesia. (2025). Gerakan Indonesia untuk Mengakhiri TB. Diakses dari https://kemkes.go.id/id/indonesias-movement-to-end-tb

[3] Stop TB Indonesia. (2022). Peluncuran Rencana Global untuk Mengakhiri TBC 2023-2030. Diakses dari https://www.stoptbindonesia.org/single-post/peluncuran-rencana-global-untuk-mengakhiri-tbc-2023-2030

[4] Muhamad Nabilah. (2025). Jawa Barat Jadi Provinsi dengan Kasus TBC Terbanyak 2024. Diakses dari https://databoks.katadata.co.id/demografi/statistik/6790af5d95790/jawa-barat-jadi-provinsi-dengan-kasus-tbc-terbanyak-2024

[5] Tim detikHealth. (2025). Jawa Barat Penyumbang Kasus TBC Tertinggi di Indonesia. Diakses dari https://www.detik.com/jabar/berita/d-7742880/jawa-barat-penyumbang-kasus-tbc-tertinggi-di-indonesia

[6] 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.

[7] Badan Pusat Statistik. (2024). Statistik Komuter Jabodetabek: Hasil Survei Komuter Jabodetabek 2023 (Vol. 3). Direktorat Statistik Kependudukan dan Ketenagakerjaan, Badan Pusat Statistik. https://www.bps.go.id

[8] Gupta, S., Winglee, K., Ahn, J., & Bishai, W. R. (2022). Genetic and hormonal mechanisms underlying sex-specific immune responses in tuberculosis. Trends in Immunology, 43(9), 737–749. https://doi.org/10.1016/j.it.2022.06.004

[9] Chidambaram, V., Tun, N. L., Majella, M. G., Castillo, J. R., Ayeh, S. K., Kumar, A., Neupane, P., Sivakumar, R. K., Win, E. P., Abbey, E. J., Wang, S., Zimmerman, A., Blanck, J., Gupte, A., Wang, J.-Y., & Karakousis, P. C. (2021). Male sex is associated with worse microbiological and clinical outcomes following tuberculosis treatment: A retrospective cohort study, a systematic review of the literature, and meta-analysis. Clinical Infectious Diseases, 73(9), 1580–1588. https://doi.org/10.1093/cid/ciab527

[10] Rajendran, K., & Krishnan, T. (2023). Eco-epidemiology triad to explain infectious diseases. Indian Journal of Medical Research, 158(3), 195–201. https://doi.org/10.4103/ijmr.ijmr_1170_23

[11] Hariyani, H., Sudarman, S., & Purnamasari, I. (2024). The Role of Environmental Factors in The Incidence of Tuberculosis and Stunting in Children: A Systematic Review. Indonesian Journal of Global Health Research, 6(1), 163-174. https://doi.org/10.37287/ijghr.v6i1.2335

[12] Tamhane, A. R., Westfall, A. O., Burkholder, G. A., & Cutter, G. R. (2016). Prevalence odds ratio versus prevalence ratio: choice comes with consequences. Statistics in Medicine, 35(30), 5730–5735. https://doi.org/10.1002/sim.7059

[13] Gnardellis, C., Notara, V., Papadakaki, M., Gialamas, V., & Chliaoutakis, J. (2022). Overestimation of Relative Risk and Prevalence Ratio: Misuse of Logistic Modeling. Diagnostics (Basel, Switzerland), 12(11), 2851. https://doi.org/10.3390/diagnostics12112851

[14] Wang, X., & Cheng, Z. (2020). Cross-Sectional Studies: Strengths, Weaknesses, and Recommendations. Chest, 158(1S), S65–S71. https://doi.org/10.1016/j.chest.2020.03.012

[15] von Elm, E., Altman, D. G., Egger, M., Pocock, S. J., Gøtzsche, P. C., & Vandenbroucke, J. P. (2007). The Strengthening the Reporting of Observational Studies in Epidemiology (STROBE) statement: guidelines for reporting observational studies. Annals of Internal Medicine, 147(8), 573–577. https://doi.org/10.7326/0003-4819-147-8-200710160-00010

[16] Pemerintah Provinsi Jawa Barat. (2025). Jumlah Kasus Tuberkulosis Berdasarkan Jenis Kelamin di Jawa Barat. Open Data Jabar. Diakses pada 29 Oktober 2025, dari https://opendata.jabarprov.go.id/id/dataset/jumlah-kasus-tuberkulosis-berdasarkan-jenis-kelamin-di-jawa-barat

[17] Pemerintah Provinsi Jawa Barat. (2025). Jumlah Penduduk Berdasarkan Kelompok Umur dan Kabupaten/Kota di Jawa Barat. Open Data Jabar. Diakses pada 29 Oktober 2025, dari https://opendata.jabarprov.go.id/id/dataset/jumlah-penduduk-berdasarkan-kelompok-umur-dan-kabupatenkota-di-jawa-barat

Lampiran

Link Dashboard: https://epidem-tbc-jawa-barat-dashboard.streamlit.app/

Syntax Python

import streamlit as st

import pandas as pd

import geopandas as gpd

import matplotlib.pyplot as plt

import plotly.express as px

# from utils.sidebar import sidebar

import json

from PIL import Image

import matplotlib.colors as mcolors

from utils.LISA import lisa_map, lisa_map_cluster

st.set_page_config(layout=‘wide’)

@st.cache_data

def load_data():

data = pd.read_csv(‘data/df_final.csv’)

data[‘kabupaten/kota’] = data[‘kabupaten/kota’].apply(lambda x: ‘DEPOK’ if x == ‘KOTA DEPOK’ else ‘CIMAHI’ if x == ‘KOTA CIMAHI’ else ‘BANJAR’ if x == ‘KOTA BANJAR’ else x)

data.set_index(‘kabupaten/kota’, inplace=True)

return data

# with c1:

with st.sidebar:

t = st.selectbox(‘Pilih Tahun’, options=[2024, 2023, 2022, 2021, 2020])

st.divider()

st.title(f”Analisis Epidemiologi Kasus TBC di Jawa Barat Tahun {t}“)

@st.cache_data

def load_map_data(df):

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

df.index = df.index.str.lower()

try:

df[‘jumlah kasus’] = df[‘kasus_laki-laki’] + df[‘kasus_perempuan’]

df[‘jumlah populasi’] = df[‘populasi_laki-laki’] + df[‘populasi_perempuan’]

except:

pass

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

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

gdf[‘NAME_2’] = gdf[‘NAME_2’].str.lower()

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

return merged

def map(map_data, cmap):

col_awal = st.selectbox(’‘, options=[’JUMLAH KASUS’, ’JUMLAH POPULASI’], label_visibility=’collapsed’, key=‘selectbox_main’)

col_awal = col_awal.lower()

# st.write(‘Peta Sebaran Kasus TBC di Jawa Barat’)

map_data = load_map_data(sub_df)

map_data.plot(

ax=ax,

cmap=cmap,

legend=True,

column=col_awal,

edgecolor=‘black’,

legend_kwds={‘shrink’: 0.5}

)

ax.axis(‘off’)

st.pyplot(fig)

def format_number(x):

return f’{x:,.0f}’

def bar_chart(df, expand=True):

if expand:

with st.expander(‘Show Bar Chart’):

tipe = st.selectbox(‘Pilih Kasus / Populasi’, options=[‘KASUS’, ‘POPULASI’])

tipe = tipe.lower()

st.bar_chart(df[[f’{tipe}_laki-laki’, f’{tipe}_perempuan’]], stack=False)

else:

with st.container(border=True):

tipe = st.selectbox(‘Pilih Kasus / Populasi’, options=[‘KASUS’, ‘POPULASI’])

tipe = tipe.lower()

st.bar_chart(df[[f’{tipe}_laki-laki’, f’{tipe}_perempuan’]], stack=False)

ahe = Image.open(‘data/ahe.jpeg’)

df = load_data()

sub_df = df[df[‘tahun’] == t]

a_df = sub_df.copy()

a_df[‘prevalensi_laki-laki’] = (a_df[‘kasus_laki-laki’] / a_df[‘populasi_laki-laki’]) * 100

a_df[‘prevalensi_perempuan’] = (a_df[‘kasus_perempuan’] / a_df[‘populasi_perempuan’]) * 100

a_df[‘prev_laki-laki_prop’] = a_df[‘kasus_laki-laki’] / a_df[‘populasi_laki-laki’]

a_df[‘prev_perempuan_prop’] = a_df[‘kasus_perempuan’] / a_df[‘populasi_perempuan’]

a_df[‘PR’] = a_df[‘prev_laki-laki_prop’] / a_df[‘prev_perempuan_prop’]

odds_male = a_df[‘prev_laki-laki_prop’] / (1 - a_df[‘prev_laki-laki_prop’])

odds_female = a_df[‘prev_perempuan_prop’] / (1 - a_df[‘prev_perempuan_prop’])

# odds_male = a_df[‘prevalensi_laki-laki’] / (1 - a_df[‘prevalensi_laki-laki’])

# odds_female = a_df[‘prevalensi_perempuan’] / (1- a_df[‘prevalensi_perempuan’])

a_df[‘POR’] = odds_male / odds_female

a_df[‘PD_%’] = abs((a_df[‘prev_laki-laki_prop’] - a_df[‘prev_perempuan_prop’]) * 100)

a_df = a_df[[‘prevalensi_laki-laki’, ‘prevalensi_perempuan’, ‘PR’, ‘POR’, ‘PD_%’]]

merged = load_map_data(sub_df)

# cmap = mcolors.LinearSegmentedColormap.from_list(“custom_blue”, [])

cmap = mcolors.LinearSegmentedColormap.from_list(“custom_green”, [])

list_tabs = [‘📋 Main’, ‘🔍 Kabupaten/Kota’, ‘📊 Chart’, ‘📈 Ukuran Epidemiologi’]

with st.container(horizontal=True, horizontal_alignment=‘center’):

tab1, tab4, tab2, tab3 = st.tabs(list_tabs)

with tab1:

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

# with st.container(border=True):

st.markdown(f”<h1 style=‘text-align:center;’>Rata-rata Kasus TBC Jawa Barat</h1>“, unsafe_allow_html=True)

c11, c12 = st.columns([1, 1])

with c11:

with st.container(border=True):

st.markdown(f”<h4 style=‘text-align:center;’>Laki-laki</h4>“, unsafe_allow_html=True)

st.markdown(f”<h4 style=‘text-align:center;’>{format_number(sub_df[‘kasus_laki-laki’].mean())}</h4>“, unsafe_allow_html=True)

# st.divider()

c111, c112 = st.columns([1, 1])

with c111:

st.markdown(f”<h4 style=‘text-align:center;’>Tertinggi</h4>“, unsafe_allow_html=True)

st.markdown(f”<h5 style=‘text-align:center;’>{sub_df[sub_df[‘kasus_laki-laki’] == sub_df[‘kasus_laki-laki’].max()].index.values[0]} ({format_number(sub_df[sub_df[‘kasus_laki-laki’] == sub_df[‘kasus_laki-laki’].max()][‘kasus_laki-laki’].values[0])})</h5>“, unsafe_allow_html=True)

with c112:

st.markdown(f”<h4 style=‘text-align:center;’>Terendah</h4>“, unsafe_allow_html=True)

st.markdown(f”<h5 style=‘text-align:center;’>{sub_df[sub_df[‘kasus_laki-laki’] == sub_df[‘kasus_laki-laki’].min()].index.values[0]} ({format_number(sub_df[sub_df[‘kasus_laki-laki’] == sub_df[‘kasus_laki-laki’].min()][‘kasus_laki-laki’].values[0])})</h5>“, unsafe_allow_html=True)

with c12:

with st.container(border=True):

st.markdown(f”<h4 style=‘text-align:center;’>Perempuan</h4>“, unsafe_allow_html=True)

st.markdown(f”<h4 style=‘text-align:center;’>{format_number(sub_df[‘kasus_perempuan’].mean())}</h4>“, unsafe_allow_html=True)

# st.divider()

c121, c122 = st.columns([1, 1])

with c121:

st.markdown(f”<h4 style=‘text-align:center;’>Tertinggi</h4>“, unsafe_allow_html=True)

st.markdown(f”<h5 style=‘text-align:center;’>{sub_df[sub_df[‘kasus_perempuan’] == sub_df[‘kasus_perempuan’].max()].index.values[0]} ({format_number(sub_df[sub_df[‘kasus_perempuan’] == sub_df[‘kasus_perempuan’].max()][‘kasus_perempuan’].values[0])})</h5>“, unsafe_allow_html=True)

with c122:

st.markdown(f”<h4 style=‘text-align:center;’>Terendah</h4>“, unsafe_allow_html=True)

st.markdown(f”<h5 style=‘text-align:center;’>{sub_df[sub_df[‘kasus_perempuan’] == sub_df[‘kasus_perempuan’].min()].index.values[0]} ({format_number(sub_df[sub_df[‘kasus_perempuan’] == sub_df[‘kasus_perempuan’].min()][‘kasus_perempuan’].values[0])})</h5>“, unsafe_allow_html=True)

merged_data = load_map_data(sub_df)

merged_data = merged_data.set_index(“NAME_2”)

# geojson_data = merged_data.__geo_interface__

geojson_data = json.loads(merged_data.to_json())

with st.container(border=True):

st.markdown(f”<h2 style=‘text-align:center;’>Sebaran Kasus TBC Jawa Barat (L & P)</h2>“, unsafe_allow_html=True)

# ===== Choropleth =====

fig = px.choropleth(

merged_data,

geojson=geojson_data,

locations=merged_data.index,

color=‘jumlah kasus’,

hover_name=merged_data.index,

hover_data={

‘Kasus Laki-laki’: merged_data[‘kasus_laki-laki’],

‘Kasus Perempuan’: merged_data[‘kasus_perempuan’],

# merged_data.index: False

},

# color_continuous_scale=[‘#FFEB3B’, ‘#FFC107’, ‘#FF9800’, ‘#FF5722’, ‘#F44336’],

color_continuous_scale=[‘#E6EE9C’, ‘#DCE775’, ‘#AED581’, ‘#81C784’, ‘#4CAF50’]

# labels={prevalence_var: ‘Prevalence (per 100k)’}

)

# fig.update_geos(center={“lat”: -2.5, “lon”: 118})

fig.update_geos(fitbounds=“locations”, visible=False)

fig.update_layout(height=600, margin={“r”:0,“t”:0,“l”:0,“b”:0})

st.plotly_chart(fig, use_container_width=True, config={‘scrollZoom’:False})

# st.info(“💡 Tip: Interactive map with zoom/pan. Hover to see details. Yellow = Low risk, Orange-Red = High risk.”)

# with st.container(border=True):

with st.expander(‘Statistik Deskriptif’):

st.dataframe(sub_df.drop(columns=‘tahun’).describe())

st.write(‘Jumlah’)

st.dataframe(sub_df.drop(columns=‘tahun’).sum().to_frame().T.style.format(‘{:,.0f}’))

# st.dataframe(

# sub_df.drop(columns=‘tahun’).sum().to_frame().T,

# column_config={

# col: st.column_config.NumberColumn(format=“%,.0f”)

# for col in sub_df.columns if col != “tahun”

# }

# )

l1, l2 = st.columns([1, 1])

with l1:

with st.expander(‘LISA’):

lisa_map()

with l2:

with st.expander(‘Cluster’):

lisa_map_cluster()

with tab4:

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

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

# with st.container(border=True):

with st.container(border=True, height=‘stretch’):

kab = st.selectbox(’‘, options=sub_df.index.tolist(), label_visibility=“collapsed”, placeholder=’Pilih Kabupaten/Kota’, index=0)

c1, c2 = st.columns([1.1, 0.9])

if kab is not None:

kab_kecil = kab.lower().replace(” “,”“)

with c1:

sub_df2 = sub_df[sub_df.index == kab]

st.markdown(f’## {kab}’)

st.divider()

c11, c12 = st.columns([1, 1])

with c11:

# with st.container(border=True):

st.markdown(‘#### Kasus Laki-laki’)

st.write(format_number(sub_df2[‘kasus_laki-laki’].values[0]))

# with st.container(border=True):

st.markdown(‘#### Kasus Perempuan’)

st.write(format_number(sub_df2[‘kasus_perempuan’].values[0]))

with c12:

st.markdown(‘#### Populasi Laki-laki’)

st.write(format_number(sub_df2[‘populasi_laki-laki’].values[0]))

st.markdown(‘#### Populasi Perempuan’)

st.write(format_number(sub_df2[‘populasi_perempuan’].values[0]))

with c2:

with st.container(border=True, vertical_alignment=‘center’):

col = st.selectbox(““, options=[‘JUMLAH KASUS’, ‘JUMLAH POPULASI’], label_visibility=‘collapsed’)

col = col.lower()

map_data = load_map_data(sub_df)

a, b = map_data[col].min(), map_data[col].max()

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

map_data = map_data[map_data[‘NAME_2’] == kab_kecil]

map_data.plot(

ax=ax2,

cmap=cmap,

legend=True,

column=col,

edgecolor=‘black’,

legend_kwds={‘shrink’: 0.5},

vmin=a,

vmax=b

)

ax2.axis(‘off’)

st.pyplot(fig2)

# with st.container(border=True):

with st.expander(‘Lihat Keseluruhan’):

col1, col2 = st.columns([1.1, 0.9])

with col1:

with st.container(border=True, height=‘stretch’):

st.write(‘DataFrame’)

try:

st.dataframe(sub_df)

except:

st.dataframe(df)

with col2:

with st.container(border=True, height=‘stretch’, vertical_alignment=‘center’):

map_data = load_map_data(sub_df)

map(map_data, cmap)

with tab2:

# with st.container(border=True):

# tipe = st.selectbox(‘Pilih Kasus / Populasi’, options=[‘KASUS’, ‘POPULASI’])

# tipe = tipe.lower()

for tipe in [‘kasus’, ‘populasi’]:

with st.container(border=True):

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

with c1:

with st.container(border=True, height=‘stretch’):

st.markdown(f”<h2 style=‘text-align:center;’>Bar Chart {tipe.upper()}</h2>“, unsafe_allow_html=True)

st.bar_chart(df[[f’{tipe}_laki-laki’, f’{tipe}_perempuan’]], stack=False)

with c2:

with st.container(border=True):

st.markdown(f”<h2 style=‘text-align:center;’>Proporsi {tipe.upper()} Laki-laki dan Perempuan</h2>“, unsafe_allow_html=True)

val_1 = df[f’{tipe}_laki-laki’].sum()

val_2 = df[f’{tipe}_perempuan’].sum()

piedf = pd.DataFrame({‘Jenis Kelamin’: [‘Laki-laki’, ‘Perempuan’], ‘Total’: [val_1, val_2]})

pie = px.pie(

piedf, values=‘Total’, names=‘Jenis Kelamin’,

color=‘Jenis Kelamin’,

hole=0.4

)

pie.update_layout(height=400)

st.plotly_chart(pie)

with st.container(border=True):

st.markdown(f”<h2 style=‘text-align:center;’>Histogram Jumlah {tipe.upper()} (L + P)</h2>“, unsafe_allow_html=True)

hist = px.histogram(map_data, x=f’jumlah {tipe}’, nbins=20)

st.plotly_chart(hist)

with tab3:

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

p_max_laki = a_df[a_df[‘prevalensi_laki-laki’] == a_df[‘prevalensi_laki-laki’].max()]

p_min_laki = a_df[a_df[‘prevalensi_laki-laki’] == a_df[‘prevalensi_laki-laki’].min()]

p_max_perempuan = a_df[a_df[‘prevalensi_perempuan’] == a_df[‘prevalensi_perempuan’].max()]

p_min_perempuan = a_df[a_df[‘prevalensi_perempuan’] == a_df[‘prevalensi_perempuan’].min()]

with c1:

with st.container(border=True):

st.markdown(‘#### Prevalensi Laki-Laki’)

with st.container(border=False, horizontal=False):

st.write(f’Tertinggi: {p_max_laki.index.values[0]} ({p_max_laki[‘prevalensi_laki-laki’].values[0]:.2f} %)’)

st.write(f’Terendah: {p_min_laki.index.values[0]} ({p_min_laki[‘prevalensi_laki-laki’].values[0]:.2f} %)’)

with c2:

with st.container(border=True):

st.markdown(‘#### Prevalensi Perempuan’)

with st.container(border=False, horizontal=False):

st.write(f’Tertinggi: {p_max_perempuan.index.values[0]} ({p_max_perempuan[‘prevalensi_perempuan’].values[0]:.2f} %)’)

st.write(f’Terendah: {p_min_perempuan.index.values[0]} ({p_min_perempuan[‘prevalensi_perempuan’].values[0]:.2f} %)’)

with c3:

with st.container(border=True):

st.markdown(‘#### Prevalensi Odds Ratio’)

or_max = a_df[a_df[‘POR’] == a_df[‘POR’].max()]

or_min = a_df[a_df[‘POR’] == a_df[‘POR’].min()]

with st.container(border=False, horizontal=False):

st.write(f’Tertinggi: {or_max.index.values[0]} ({or_max[‘POR’].values[0]:.2f} %)’)

st.write(f’Terendah: {or_min.index.values[0]} ({or_min[‘POR’].values[0]:.2f} %)’)

with c4:

with st.container(border=True):

st.markdown(‘#### Prevalensi Difference’)

pd_max = a_df[a_df[‘PD_%’] == a_df[‘PD_%’].max()]

pd_min = a_df[a_df[‘PD_%’] == a_df[‘PD_%’].min()]

with st.container(border=False, horizontal=False):

st.write(f’Tertinggi: {pd_max.index.values[0]} ({pd_max[‘PD_%’].values[0]:.2f} %)’)

st.write(f’Terendah: {pd_min.index.values[0]} ({pd_min[‘PD_%’].values[0]:.2f} %)’)

a_df[‘prevalensi_total’] = a_df[‘prevalensi_laki-laki’] + a_df[‘prevalensi_perempuan’]

merged_data = load_map_data(a_df)

merged_data = merged_data.set_index(“NAME_2”)

# geojson_data = merged_data.__geo_interface__

geojson_data = json.loads(merged_data.to_json())

with st.container(border=True):

st.markdown(f”<h2 style=‘text-align:center;’>Prevalensi (L & P)</h2>“, unsafe_allow_html=True)

# ===== Choropleth =====

fig = px.choropleth(

merged_data,

geojson=geojson_data,

locations=merged_data.index,

color=‘prevalensi_total’,

hover_name=merged_data.index,

hover_data={

‘Prev Laki-laki’: merged_data[‘prevalensi_laki-laki’],

‘Prev Perempuan’: merged_data[‘prevalensi_perempuan’],

# merged_data.index: False

},

# color_continuous_scale=[‘#FFEB3B’, ‘#FFC107’, ‘#FF9800’, ‘#FF5722’, ‘#F44336’],

color_continuous_scale=[‘#E6EE9C’, ‘#DCE775’, ‘#AED581’, ‘#81C784’, ‘#4CAF50’]

# labels={prevalence_var: ‘Prevalence (per 100k)’}

)

# fig.update_geos(center={“lat”: -2.5, “lon”: 118})

fig.update_geos(fitbounds=“locations”, visible=False)

fig.update_layout(height=600, margin={“r”:0,“t”:0,“l”:0,“b”:0})

st.plotly_chart(fig, use_container_width=True, config={‘scrollZoom’:False})

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

with c1:

with st.expander(‘Dataframe Hasil Analisis’):

a_df

with c2:

with st.expander(‘Agent-Host-Environment’):

st.image(ahe, use_container_width=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’]

gdf[‘NAME_2’] = gdf[‘NAME_2’].apply(lambda x: x.lower())

df = pd.read_csv(‘data/df_final.csv’, index_col=0)

df[‘jumlah kasus’] = df[‘kasus_laki-laki’] + df[‘kasus_perempuan’]

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

df.index = df.index.str.lower()

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

y = merged[“jumlah kasus”].values

w = Queen.from_dataframe(merged)

w.transform = ‘r’

moran_loc = Moran_Local(y, w)

merged[“LISA”] = moran_loc.Is

merged[“LISA_clus”] = moran_loc.q

a, b = 0, 1

merged[‘LISA’] = a + ( (merged[‘LISA’] - merged[‘LISA’].min()) * (b - a) / (merged[‘LISA’].max() - merged[‘LISA’].min()))

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

merged.plot(

column=“LISA”,

cmap=“RdBu”,

legend=True,

vmin=a,

vmax=b,

ax=ax

)

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

ax.axis(“off”)

st.pyplot(fig)

def lisa_map_cluster():

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

import numpy as np

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

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

gdf[‘NAME_2’] = gdf[‘NAME_2’].apply(lambda x: x.lower())

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

df = pd.read_csv(‘data/df_final.csv’, index_col=0)

df[‘jumlah kasus’] = df[‘kasus_laki-laki’] + df[‘kasus_perempuan’]

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

df.index = df.index.str.lower()

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

y = merged[“jumlah kasus”].values

w = Queen.from_dataframe(merged)

w.transform = ‘r’

moran_loc = Moran_Local(y, w)

merged[“LISA”] = moran_loc.Is

merged[“LISA_clus”] = moran_loc.q

a, b = 0, 1

merged[‘LISA’] = a + ((merged[‘LISA’] - merged[‘LISA’].min()) * (b - a) / (merged[‘LISA’].max() - merged[‘LISA’].min()))

# st.header(“LISA Cluster Visibility”)

cb1, cb2, cb3, cb4 = st.columns(4)

show_hh = cb1.checkbox(‘HH’, value=True)

show_hl = cb2.checkbox(‘HL’, value=True)

show_lh = cb3.checkbox(‘LH’, value=True)

show_ll = cb4.checkbox(‘LL’, value=True)

colors = {

1: “red”,

2: “lightblue”,

3: “blue”,

4: “orange”

}

active_clusters = {

1: show_hh,

2: show_lh,

3: show_ll,

4: show_hl

}

merged[“color”] = merged[“LISA_clus”].apply(

lambda c: colors[c] if active_clusters[c] else “white”

)

fig, ax = plt.subplots(1, 1, figsize=(10, 6))

merged.plot(color=merged[“color”], ax=ax, edgecolor=“black”, linewidth=0.5)

handles = []

ax.legend(handles=handles, loc=‘upper right’)

ax.set_title(“LISA Cluster Map — Jawa Barat”, fontsize=14)

ax.axis(“off”)

st.pyplot(fig)

if name == ‘main’:

lisa_map()