Analisis Kasus Tuberkulosis di Kabupaten/Kota
Provinsi Jawa Timur
Tahun 2024
Ditujukan Guna Memenuhi UAS Mata Kuliah Epidemiologi
Disusun oleh:
Khalisha Syahla Putri Marindra
(140610230008)
Dosen Pengampu:
I Gede Nyoman Mindra Jaya,
Ph.D
PROGRAM STUDI S-1 STATISTIKA
FAKULTAS MATEMATIKA DAN ILMU
PENGETAHUAN ALAM
UNIVERSITAS PADJADJARAN
JATINANGOR
2025
Tuberkulosis (TBC) merupakan salah satu penyakit menular yang masih menjadi permasalahan kesehatan masyarakat di Indonesia, termasuk di Provinsi Jawa Timur. Jumlah kasus TBC yang tinggi serta distribusinya yang tidak merata antarwilayah menunjukkan perlunya pendekatan analisis yang tidak hanya bersifat deskriptif, tetapi juga mempertimbangkan aspek spasial dan epidemiologis. Penelitian ini bertujuan untuk menganalisis pola distribusi kasus TBC di tingkat kabupaten/kota Provinsi Jawa Timur tahun 2024 serta mengkaji faktor-faktor demografis dan lingkungan yang berhubungan dengan variasi jumlah kasus antarwilayah.
Data yang digunakan merupakan data sekunder kasus TBC dan karakteristik wilayah kabupaten/kota di Jawa Timur tahun 2024. Metode analisis yang digunakan meliputi perhitungan ukuran epidemiologi, analisis autokorelasi spasial menggunakan Moran’s I dan LISA, serta analisis disease mapping melalui Crude Rate dan Standardized Morbidity Ratio (SMR). Selain itu, dilakukan pemodelan epidemiologi menggunakan regresi Poisson dengan offset populasi dan regresi Negative Binomial untuk mengatasi overdispersi.
Hasil analisis menunjukkan bahwa distribusi kasus TBC di Jawa Timur memiliki autokorelasi spasial yang signifikan, yang mengindikasikan adanya keterkaitan antarwilayah. Analisis LISA mengidentifikasi klaster wilayah dengan risiko tinggi dan rendah kejadian TBC. Pada analisis epidemiologi, model Negative Binomial dipilih sebagai model yang paling sesuai karena mampu menangani overdispersi pada data kasus TBC. Hasil disease mapping menunjukkan adanya perbedaan risiko relatif kejadian TBC antarwilayah.
Secara keseluruhan, penelitian ini menunjukkan bahwa pendekatan epidemiologi yang dikombinasikan dengan analisis spasial mampu memberikan gambaran mengenai pola penyebaran TBC. Temuan ini diharapkan dapat menjadi dasar dalam perencanaan strategi pengendalian dan pencegahan Tuberkulosis yang lebih efektif dan berbasis wilayah di Provinsi Jawa Timur
Kata kunci: Tuberkulosis, Epidemiologi, Jawa Timur
BAB I
LATAR BELAKANG
Shutterstock Tuberkulosis (TBC) merupakan salah satu penyakit menular yang hingga saat ini masih menjadi permasalahan kesehatan masyarakat di Indonesia. Penyakit ini disebabkan oleh bakteri Mycobacterium tuberculosis yang umumnya menyerang paru-paru dan ditularkan melalui percikan droplet dahak dari penderita saat batuk, bersin, atau berbicara [1]. Berdasarkan laporan Kementerian Kesehatan Republik Indonesia, Indonesia masih termasuk dalam lima besar negara dengan beban Tuberkulosis tertinggi di dunia, dengan estimasi lebih dari satu juta kasus baru setiap tahunnya [2]. Kondisi ini menunjukkan bahwa TBC masih menjadi tantangan besar dalam sistem kesehatan nasional dan memerlukan perhatian khusus dari pemerintah.
Provinsi Jawa Timur merupakan salah satu provinsi dengan jumlah kasus Tuberkulosis yang cukup besar di Indonesia. Berdasarkan laporan Dinas Kesehatan Provinsi Jawa Timur, hingga tahun 2024 tercatat lebih dari 70 ribu kasus TBC yang dilaporkan di Jawa Timur [3]. Di tingkat kabupaten/kota, distribusi kasus menunjukkan variasi yang cukup signifikan, dengan daerah berpenduduk padat seperti Kota Surabaya melaporkan lebih dari 12 ribu kasus TBC sepanjang tahun 2024 [4]. Tingginya jumlah kasus tersebut mencerminkan beban penyakit yang masih berat serta menunjukkan bahwa penularan TBC di Jawa Timur masih berlangsung aktif di masyarakat.
Distribusi kasus Tuberkulosis di Jawa Timur tidak bersifat homogen, melainkan menunjukkan perbedaan antarwilayah kabupaten/kota yang dipengaruhi oleh karakteristik demografis dan lingkungan setempat [5]. Wilayah dengan tingkat kepadatan penduduk tinggi dan kondisi sosial ekonomi yang rendah cenderung memiliki jumlah kasus yang lebih besar dibandingkan wilayah dengan kondisi lingkungan dan akses kesehatan yang lebih baik [6]. Oleh karena itu, analisis epidemiologis yang mencakup deskripsi distribusi kasus secara spasial menjadi penting untuk memahami pola penyebaran penyakit serta mengidentifikasi wilayah dengan risiko tinggi penularan TBC [7].
Berdasarkan kondisi tersebut, penelitian ini berfokus pada analisis epidemiologi kasus Tuberkulosis di tingkat kabupaten/kota di Provinsi Jawa Timur tahun 2024. Penelitian ini bertujuan untuk menggambarkan distribusi kasus TBC secara geografis serta menganalisis faktor-faktor demografis dan lingkungan yang berpotensi memengaruhi variasi jumlah kasus antarwilayah. Hasil analisis diharapkan dapat memberikan gambaran epidemiologis yang komprehensif dan menjadi dasar dalam perencanaan strategi pencegahan serta pengendalian Tuberkulosis di Provinsi Jawa Timur.
BAB II
TINJAUAN PUSTAKA
Epidemiologi merupakan ilmu yang mempelajari distribusi serta determinan masalah kesehatan dalam populasi, serta penerapannya untuk pengendalian penyakit [8]. Tujuan utama epidemiologi adalah mengidentifikasi faktor-faktor penyebab dan pola penyebaran penyakit agar dapat dilakukan intervensi kesehatan masyarakat yang tepat. Dalam konteks Tuberkulosis (TBC), epidemiologi berperan penting dalam memahami pola penyebaran penyakit, faktor risiko yang berkontribusi terhadap kejadian TBC, serta efektivitas program pengendalian yang diterapkan [9]. Pendekatan kuantitatif digunakan untuk menilai hubungan antara faktor sosial, ekonomi, dan lingkungan terhadap kejadian TBC di suatu wilayah [10].
Konsep dasar dalam epidemiologi penyakit menular dikenal sebagai segitiga epidemiologi (epidemiologic triad), yang terdiri dari tiga komponen utama: agent (agen penyebab), host (inang), dan environment (lingkungan) [10]. Interaksi ketiganya menentukan terjadinya dan penyebaran suatu penyakit.
Agen penyebab TBC adalah Mycobacterium tuberculosis, yaitu bakteri berbentuk batang yang bersifat tahan asam (acid-fast bacillus) dan menular melalui udara (airborne transmission) ketika penderita batuk, bersin, atau berbicara [11]. Agen ini mampu bertahan di udara selama beberapa jam, sehingga meningkatkan peluang penularan di ruang tertutup.
Inang dalam kasus TBC adalah manusia. Kerentanan seseorang terhadap infeksi dipengaruhi oleh berbagai faktor seperti usia, status imun, status gizi, serta kondisi sosial ekonomi [12]. Individu dengan sistem imun yang lemah (misalnya penderita HIV/AIDS), gizi buruk, atau tinggal di lingkungan miskin memiliki risiko lebih tinggi mengalami infeksi TBC aktif.
Lingkungan memiliki peranan besar dalam penyebaran TBC. Kepadatan penduduk, kondisi ventilasi yang buruk, tingkat kelembapan tinggi, serta kualitas udara yang rendah dapat meningkatkan peluang transmisi Mycobacterium tuberculosis [13]. Wilayah dengan tingkat kemiskinan tinggi dan akses terbatas terhadap fasilitas kesehatan juga cenderung memiliki angka kasus TBC lebih besar.
Pemahaman terhadap interaksi antara agent, host, dan environment menjadi dasar dalam merancang strategi pencegahan, seperti peningkatan kualitas hunian, penyuluhan gizi, dan deteksi dini TBC di populasi berisiko [12].
Untuk menilai kekuatan hubungan antara faktor risiko (paparan) dan kejadian penyakit, epidemiologi menggunakan ukuran asosiasi (measure of association). Ukuran ini menggambarkan seberapa besar risiko suatu penyakit meningkat atau menurun pada individu yang terpapar dibandingkan yang tidak terpapar [14]. Beberapa ukuran asosiasi yang umum digunakan meliputi:
Digunakan dalam studi kohort, RR mengukur rasio risiko penyakit pada kelompok terpapar dibandingkan kelompok tidak terpapar. \[ RR = \frac{\frac{A}{A + B}}{\frac{C}{C + D}} \] dengan:
Digunakan dalam studi kasus–kontrol, OR membandingkan peluang paparan pada kelompok kasus dan kontrol. \[ OR = \frac{A \times D}{B \times C} \] Interpretasi: nilai OR > 1 menunjukkan bahwa paparan meningkatkan peluang terjadinya penyakit, sedangkan OR < 1 menunjukkan efek protektif.
Umumnya digunakan dalam studi potong lintang (cross-sectional) untuk membandingkan prevalensi penyakit antar kelompok. \[ PR = \frac{\frac{A}{A + B}}{\frac{C}{C + D}} \] Umumnya digunakan dalam studi potong lintang (cross-sectional) untuk membandingkan prevalensi penyakit antar kelompok. Nilai PR menunjukkan seberapa besar kemungkinan individu terpapar memiliki penyakit dibandingkan individu yang tidak terpapar pada waktu tertentu [14]. Ukuran asosiasi seperti RR, OR, dan PR membantu peneliti memahami hubungan antara faktor risiko seperti kepadatan penduduk, kemiskinan, atau akses terhadap fasilitas kesehatan dengan kejadian TBC di suatu wilayah [9].
BAB III
METODOLOGI PENELITIAN
Tuberkulosis (TBC) adalah penyakit menular yang disebabkan oleh bakteri Mycobacterium tuberculosis yang umumnya menyerang paru-paru.Penelitian ini menggunakan data sekunder yang bersifat cross-section pada tahun 2024. Data dianalisis pada tingkat kabupaten/kota di Provinsi Jawa Timur.. Data diperoleh dari publikasi resmi Badan Pusat Statistik (BPS). Unit analisis dalam penelitian ini adalah 38 kabupaten/kota di Provinsi Jawa Timur, di mana setiap unit direpresentasikan sebagai satu entitas spasial dengan batas wilayah administratif yang jelas.
Selain variabel dependen berupa jumlah kasus TBC tahun 2024 (Y), penelitian ini juga melibatkan enam variabel independen, yaitu:
X1: Kepadatan Penduduk,
X2: Jumlah Penduduk Miskin,
X3: Konsumsi Rokok Tanpa Filter,
Pemilihan Provinsi Jawa Timur sebagai wilayah penelitian didasarkan pada tingginya variasi jumlah kasus TBC antarwilayah, sehingga memungkinkan untuk mengidentifikasi adanya pola ketergantungan spasial yang signifikan antar kabupaten/kota. Penelitian ini menggunakan pendekatan spatial econometrics untuk mengidentifikasi adanya efek spasial pada persebaran TBC. Tahapan analisis meliputi:
Populasi berisiko dihitung berdasarkan jumlah penduduk sebagai berikut:
\[ Populasi_i = X1_i \times 1000 \]
Crude Rate atau angka insidensi dihitung untuk menyesuaikan perbedaan ukuran populasi antarwilayah:
\[ IR_{100k,i} = \frac{Kasus\ TBC_i}{Populasi_i} \times 100000 \]
Jumlah kasus harapan (expected cases) dihitung menggunakan angka insidensi referensi:
\[ r = \frac{\sum O_i}{\sum P_i} \]
\[ E_i = P_i \times r \]
dengan: - \(O_i\) = jumlah kasus observasi - \(P_i\) = populasi wilayah ke-\(i\)
SMR dihitung sebagai berikut:
\[ SMR_i = \frac{O_i}{E_i} \]
Interval kepercayaan SMR dihitung menggunakan distribusi Poisson:
\[ CI_{lower} = \frac{1}{2E_i} \chi^2_{\alpha/2, 2O_i} \]
\[ CI_{upper} = \frac{1}{2E_i} \chi^2_{1-\alpha/2, 2(O_i+1)} \]
Wilayah dikategorikan signifikan apabila interval kepercayaan tidak memotong nilai 1.
Model Poisson digunakan untuk memodelkan jumlah kasus TBC dengan offset populasi:
\[ Y_i \sim Poisson(\mu_i) \]
\[ \log(\mu_i) = \log(P_i) + \beta_0 + \beta_1 X2_i + \beta_2 X3_i + \beta_3 X4_i \]
Model Negative Binomial digunakan apabila terjadi overdispersion pada model Poisson:
\[ Var(Y_i) = \mu_i + \alpha \mu_i^2 \]
Pemilihan model terbaik dilakukan berdasarkan nilai AIC dan indikator overdispersion.
Uji Moran’s I digunakan untuk mendeteksi autokorelasi spasial global:
\[ I = \frac{n}{\sum_i \sum_j w_{ij}} \frac{\sum_i \sum_j w_{ij}(x_i - \bar{x})(x_j - \bar{x})} {\sum_i (x_i - \bar{x})^2} \]
LISA digunakan untuk mengidentifikasi klaster spasial lokal (High-High, Low-Low, High-Low, Low-High).
Seluruh analisis dilakukan menggunakan RStudio
Alur kerja penelitian ini meliputi: (1) pengumpulan data sekunder dari Open Data Jabar; (2) pembersihan dan pengolahan data; (3) perhitungan ukuran epidemiologi seperti prevalensi, RR, OR, dan AR; (4) Perhitungan SMR dan Crude rate; dan membentuk Model Epidemiologi ; (5) penyajian hasil dalam bentuk tabel, grafik, dan peta tematik untuk menampilkan pola sebaran kasus TBC di Provinsi Jawa Timur. Seluruh proses dilakukan menggunakan perangkat lunak R untuk mendukung analisis kuantitatif dan visualisasi spasial secara akurat.
BAB IV
library(sf)
library(readxl)
library(dplyr)
library(ggplot2)
clean_name <- function(x) tolower(gsub("\\s+|kabupaten|kota|,", "", x))
to_num_safe <- function(v) {
if (is.numeric(v)) return(v)
v <- as.character(v)
v <- gsub("\\.", "", v) # buang ribuan titik
v <- gsub(",", ".", v) # desimal koma -> titik
suppressWarnings(as.numeric(v))
}
path_zip <- "GADM PETA JATIM.zip" # contoh: "data/GADM PETA JATIM.zip"
path_excel <- "Kasus Penyakit Menurut Kabupaten.xlsx" # contoh: "data/Kasus....xlsx"
tahun_pilih <- 2024
tmpdir <- file.path(tempdir(), paste0("shp_", as.integer(Sys.time())))
dir.create(tmpdir, showWarnings = FALSE, recursive = TRUE)
utils::unzip(path_zip, exdir = tmpdir)
shp_files <- list.files(tmpdir, pattern = "\\.shp$", full.names = TRUE, recursive = TRUE, ignore.case = TRUE)
stopifnot(length(shp_files) > 0)
shp <- sf::st_read(shp_files[1], quiet = TRUE) |> sf::st_make_valid()
prov_col <- names(shp)[grepl("NAME_1|prov", names(shp), ignore.case = TRUE)]
if (length(prov_col) > 0) {
shp <- shp |> dplyr::filter(grepl("Jawa Timur", .data[[prov_col[1]]], ignore.case = TRUE))
}
if (is.na(sf::st_crs(shp))) sf::st_crs(shp) <- 4326
stopifnot(nrow(shp) > 0)
stopifnot("NAME_2" %in% names(shp))
df <- readxl::read_excel("C:/Users/khalisha marindra/Downloads/Kasus Penyakit Menurut Kabupaten_Kota dan Jenis Penyakit di Provinsi Jawa Timur, 2024.xlsx")
names(df) <- trimws(gsub("\\s+", "_", names(df)))
x_idx <- grep("^X", names(df))
if (length(x_idx) > 0) {
for (nm in names(df)[x_idx]) df[[nm]] <- to_num_safe(df[[nm]])
}
if ("Kasus_TBC" %in% names(df)) df$Kasus_TBC <- to_num_safe(df$Kasus_TBC)
stopifnot("Tahun" %in% names(df))
df <- df |> dplyr::filter(Tahun == tahun_pilih)
stopifnot(nrow(df) > 0)
shp$.key <- clean_name(shp$NAME_2)
if ("Kabupaten_Kota" %in% names(df)) {
df$.key <- clean_name(df$Kabupaten_Kota)
} else if ("Kabupaten" %in% names(df)) {
df$.key <- clean_name(df$Kabupaten)
} else if ("Kota" %in% names(df)) {
df$.key <- clean_name(df$Kota)
} else {
stop("Kolom nama wilayah tidak ditemukan di Excel (Kabupaten_Kota/Kabupaten/Kota).")
}
joined <- dplyr::left_join(shp, df, by = ".key") |> sf::st_as_sf()
stopifnot(nrow(joined) > 0)
stopifnot("Kasus_TBC" %in% names(joined))
centroids <- sf::st_point_on_surface(joined)
ggplot(joined) +
geom_sf(aes(fill = Kasus_TBC), color = "grey60", linewidth = 0.2) +
geom_sf_text(data = centroids, aes(label = NAME_2), size = 2.8, color = "black") +
scale_fill_viridis_c(option = "C", direction = -1, na.value = "grey95") +
theme_minimal() +
labs(
title = paste0("Peta Kasus TBC Jawa Timur (", tahun_pilih, ")"),
fill = "Kasus TBC"
)
Peta kasus Tuberkulosis (TBC) di Provinsi Jawa Timur tahun 2024
menunjukkan bahwa jumlah kasus TBC tidak terdistribusi secara merata
antar kabupaten/kota. Wilayah dengan jumlah kasus tertinggi cenderung
terkonsentrasi di kawasan perkotaan, terutama Kota Surabaya, yang
ditandai dengan warna paling gelap pada peta. Selain Surabaya, beberapa
kabupaten dengan jumlah kasus relatif tinggi juga terlihat di wilayah
Jember, Sidoarjo, dan Malang, yang merupakan daerah dengan jumlah
penduduk besar dan aktivitas sosial ekonomi yang tinggi.
Sebaliknya, wilayah di bagian barat dan selatan Jawa Timur, seperti Pacitan, Trenggalek, dan beberapa kabupaten di wilayah Mataraman, menunjukkan jumlah kasus TBC yang relatif lebih rendah. Perbedaan ini mengindikasikan bahwa kepadatan penduduk, tingkat urbanisasi, serta intensitas interaksi sosial berperan penting dalam variasi jumlah kasus TBC antarwilayah.
Namun demikian, peta ini masih merepresentasikan jumlah kasus, sehingga wilayah dengan populasi besar cenderung memiliki jumlah kasus yang lebih tinggi.
# Baca shapefile
shp <- sf::st_read("C:/Users/khalisha marindra/Downloads/GADM PETA JATIM/GADM_JATIM_KABKOTA.shp", quiet = TRUE)
# Baca data TBC
df <- readxl::read_excel("C:/Users/khalisha marindra/Downloads/Kasus Penyakit Menurut Kabupaten_Kota dan Jenis Penyakit di Provinsi Jawa Timur, 2024.xlsx")
# Bersihkan nama wilayah
clean_name <- function(x) {
tolower(gsub("\\s+|kabupaten|kota|,", "", x))
}
shp$.key <- clean_name(shp$NAME_2)
df$.key <- clean_name(df$Kabupaten_Kota)
# Join → INI data_clean
data_clean <- dplyr::left_join(shp, df, by = ".key")
# =========================
# Standarisasi Nama Kolom
# =========================
data_clean <- data_clean %>%
dplyr::rename(
Kasus_TBC = dplyr::any_of(c(
"Kasus_TBC",
"Kasus TBC",
"Jumlah_Kasus",
"Kasus_TB",
"TBC"
))
)
sf_epi <- data_clean %>%
dplyr::mutate(
Kasus_TBC = as.numeric(Kasus_TBC),
X1 = as.numeric(X1),
Populasi = X1 * 1000,
Prevalensi = ifelse(
!is.na(Populasi) & Populasi > 0,
Kasus_TBC / Populasi,
NA_real_
),
IR_100k = ifelse(
!is.na(Populasi) & Populasi > 0,
(Kasus_TBC / Populasi) * 100000,
NA_real_
)
)
tab_epi <- sf_epi %>%
sf::st_drop_geometry() %>%
dplyr::select(
NAME_2, Tahun, Kasus_TBC, X1, Populasi, Prevalensi, IR_100k
) %>%
dplyr::rename(
KabKota = NAME_2,
Penduduk_Ribu = X1
)
knitr::kable(
tab_epi,
caption = "Tabel Ukuran Epidemiologi TBC Kabupaten/Kota Jawa Timur Tahun 2024",
digits = 3
)
| KabKota | Tahun | Kasus_TBC | Penduduk_Ribu | Populasi | Prevalensi | IR_100k |
|---|---|---|---|---|---|---|
| Bangkalan | 2024 | 1770 | 1102.5 | 1102500 | 0.002 | 160.544 |
| Banyuwangi | 2024 | 2715 | 1754.4 | 1754400 | 0.002 | 154.754 |
| Batu | 2024 | 341 | 222.7 | 222700 | 0.002 | 153.121 |
| Blitar | 2024 | 1101 | 1263.7 | 1263700 | 0.001 | 87.125 |
| Bojonegoro | 2024 | 2250 | 1325.3 | 1325300 | 0.002 | 169.773 |
| Bondowoso | 2024 | 1521 | 792.3 | 792300 | 0.002 | 191.973 |
| Gresik | 2024 | 3440 | 1364.0 | 1364000 | 0.003 | 252.199 |
| Jember | 2024 | 4771 | 2603.8 | 2603800 | 0.002 | 183.232 |
| Jombang | 2024 | 2263 | 1362.7 | 1362700 | 0.002 | 166.067 |
| Kediri | 2024 | 2349 | 1689.9 | 1689900 | 0.001 | 139.002 |
| Kota Blitar | 2024 | 322 | 154.9 | 154900 | 0.002 | 207.876 |
| Kota Kediri | 2024 | 1391 | 298.2 | 298200 | 0.005 | 466.465 |
| Kota Madiun | 2024 | 918 | 201.8 | 201800 | 0.005 | 454.906 |
| Kota Malang | 2024 | 2626 | 872.7 | 872700 | 0.003 | 300.905 |
| Kota Mojokerto | 2024 | 757 | 137.4 | 137400 | 0.006 | 550.946 |
| Kota Pasuruan | 2024 | 698 | 219.4 | 219400 | 0.003 | 318.140 |
| Kota Probolinggo | 2024 | 607 | 249.5 | 249500 | 0.002 | 243.287 |
| Lamongan | 2024 | 3225 | 1378.2 | 1378200 | 0.002 | 234.001 |
| Lumajang | 2024 | 2154 | 1145.9 | 1145900 | 0.002 | 187.975 |
| Madiun | 2024 | 972 | 757.8 | 757800 | 0.001 | 128.266 |
| Magetan | 2024 | 935 | 685.5 | 685500 | 0.001 | 136.397 |
| Malang | 2024 | 3177 | 2736.0 | 2736000 | 0.001 | 116.118 |
| Mojokerto | 2024 | 2012 | 1154.3 | 1154300 | 0.002 | 174.305 |
| Nganjuk | 2024 | 1464 | 1131.8 | 1131800 | 0.001 | 129.351 |
| Ngawi | 2024 | 1348 | 884.1 | 884100 | 0.002 | 152.471 |
| Pacitan | 2024 | 439 | 588.6 | 588600 | 0.001 | 74.584 |
| Pamekasan | 2024 | 1124 | 884.7 | 884700 | 0.001 | 127.049 |
| Pasuruan | 2024 | 3296 | 1657.2 | 1657200 | 0.002 | 198.890 |
| Ponorogo | 2024 | 1306 | 962.9 | 962900 | 0.001 | 135.632 |
| Probolinggo | 2024 | 2184 | 1185.2 | 1185200 | 0.002 | 184.273 |
| Sampang | 2024 | 1496 | 1016.3 | 1016300 | 0.001 | 147.201 |
| Sidoarjo | 2024 | 5409 | 2171.5 | 2171500 | 0.002 | 249.090 |
| Situbondo | 2024 | 1373 | 700.7 | 700700 | 0.002 | 195.947 |
| Sumenep | 2024 | 2274 | 1153.2 | 1153200 | 0.002 | 197.190 |
| Surabaya | 2024 | 9182 | 2922.0 | 2922000 | 0.003 | 314.237 |
| Trenggalek | 2024 | 504 | 744.5 | 744500 | 0.001 | 67.696 |
| Tuban | 2024 | 2178 | 1225.2 | 1225200 | 0.002 | 177.767 |
| Tulungagung | 2024 | 1485 | 1113.9 | 1113900 | 0.001 | 133.315 |
Berdasarkan perhitungan ukuran epidemiologi, diperoleh nilai prevalensi dan Crude Rate (Incidence Rate per 100.000 penduduk) kasus Tuberkulosis yang bervariasi antar kabupaten/kota di Provinsi Jawa Timur dengan Mojokerto mempunyai nilai terbesar. Prevalensi menggambarkan proporsi penduduk yang menderita TBC terhadap total populasi di suatu wilayah, sedangkan Crude Rate menunjukkan tingkat kejadian TBC dengan mempertimbangkan besarnya populasi penduduk.
Hasil tabel menunjukkan bahwa wilayah dengan jumlah penduduk relatif kecil dapat memiliki nilai prevalensi dan IR yang tinggi, meskipun total jumlah kasus tidak sebesar wilayah dengan populasi besar. Dari beberapa kabupaten/kota yang memiliki IR per 100.000 penduduk melebihi 400, yang mengindikasikan tingkat risiko penularan TBC yang tinggi di wilayah tersebut.
Peta Crude Rate (IR per 100.000 penduduk) memperlihatkan bahwa pola risiko TBC tidak selalu sejalan dengan peta total jumlah kasus. Beberapa wilayah di bagian selatan dan barat Jawa Timur menunjukkan warna yang lebih gelap, menandakan tingkat kejadian TBC yang lebih tinggi secara relatif terhadap jumlah penduduknya. Sebaliknya, wilayah dengan jumlah kasus besar seperti kawasan perkotaan tidak selalu memiliki IR tertinggi karena besarnya populasi penduduk.
Hal ini menunjukkan pentingnya penggunaan ukuran epidemiologi berbasis populasi seperti prevalensi dan Crude Rate, karena mampu memberikan gambaran risiko penyakit yang lebih akurat dibandingkan hanya melihat jumlah kasus.
data_epi <- data_clean %>%
mutate(
Kasus_TBC = as.numeric(Kasus_TBC),
X1 = as.numeric(X1),
Populasi = X1 * 1000,
IR_100k = ifelse(!is.na(Populasi) & Populasi > 0,
(Kasus_TBC / Populasi) * 100000, NA_real_)
)
# Observed (O) dan Populasi (P)
O <- data_epi$Kasus_TBC
P <- data_epi$Populasi
# Rate referensi (overall crude rate)
r_ref <- sum(O, na.rm = TRUE) / sum(P, na.rm = TRUE)
# Expected count (E) jika risikonya sama dengan rata-rata provinsi
E <- P * r_ref
# SMR = O/E
data_smr <- data_epi %>%
mutate(
E_exp = E,
SMR = ifelse(!is.na(E_exp) & E_exp > 0, Kasus_TBC / E_exp, NA_real_)
)
alpha_smr <- 0.05
Oobs <- data_smr$Kasus_TBC
Eexp <- data_smr$E_exp
SMR_L <- ifelse(
Oobs == 0, 0,
0.5 * qchisq(alpha_smr/2, df = 2 * Oobs) / Eexp
)
SMR_U <- 0.5 * qchisq(1 - alpha_smr/2, df = 2 * (Oobs + 1)) / Eexp
data_smr <- data_smr %>%
mutate(
SMR_L = SMR_L,
SMR_U = SMR_U,
SMR_signif = ifelse(!is.na(SMR_L) & !is.na(SMR_U) & (SMR_L > 1 | SMR_U < 1), TRUE, FALSE),
SMR_cat = case_when(
SMR_signif & SMR > 1 ~ "SMR > 1 (Signif)",
SMR_signif & SMR < 1 ~ "SMR < 1 (Signif)",
TRUE ~ "Not signif"
) %>% factor(levels = c("SMR > 1 (Signif)", "SMR < 1 (Signif)", "Not signif"))
)
p_smr <- ggplot(data_smr) +
geom_sf(aes(fill = SMR), color = "grey60") +
scale_fill_viridis_c(na.value = "grey95") +
theme_minimal() +
labs(
title = "Disease Mapping: SMR (O/E)",
fill = "SMR"
)
p_smr
p_smr_sig <- ggplot(data_smr) +
geom_sf(aes(fill = SMR_cat), color = "grey60") +
scale_fill_manual(values = c("red", "blue", "grey80"), na.value = "grey95") +
theme_minimal() +
labs(
title = "Signifikansi SMR (CI Poisson vs 1)",
fill = "Kategori"
)
p_smr_sig
smr_table <- data_smr %>%
sf::st_drop_geometry() %>%
dplyr::select(
dplyr::any_of(c(
"NAME_2", "Kasus_TBC", "Populasi", "IR_100k",
"E_exp", "SMR", "SMR_L", "SMR_U", "SMR_cat"
))
) %>%
dplyr::rename(
KabKota = NAME_2,
Kasus = Kasus_TBC,
CI_Lower = SMR_L,
CI_Upper = SMR_U,
Kategori = SMR_cat
)
knitr::kable(
smr_table,
caption = "Tabel Disease Mapping: Crude Rate dan SMR (dengan CI Poisson)",
digits = 3
)
| KabKota | Kasus | Populasi | IR_100k | E_exp | SMR | CI_Lower | CI_Upper | Kategori |
|---|---|---|---|---|---|---|---|---|
| Bangkalan | 1770 | 1102500 | 160.544 | 2040.147 | 0.868 | 0.828 | 0.909 | SMR < 1 (Signif) |
| Banyuwangi | 2715 | 1754400 | 154.754 | 3246.471 | 0.836 | 0.805 | 0.868 | SMR < 1 (Signif) |
| Batu | 341 | 222700 | 153.121 | 412.100 | 0.827 | 0.742 | 0.920 | SMR < 1 (Signif) |
| Blitar | 1101 | 1263700 | 87.125 | 2338.444 | 0.471 | 0.443 | 0.499 | SMR < 1 (Signif) |
| Bojonegoro | 2250 | 1325300 | 169.773 | 2452.433 | 0.917 | 0.880 | 0.956 | SMR < 1 (Signif) |
| Bondowoso | 1521 | 792300 | 191.973 | 1466.130 | 1.037 | 0.986 | 1.091 | Not signif |
| Gresik | 3440 | 1364000 | 252.199 | 2524.046 | 1.363 | 1.318 | 1.409 | SMR > 1 (Signif) |
| Jember | 4771 | 2603800 | 183.232 | 4818.263 | 0.990 | 0.962 | 1.019 | Not signif |
| Jombang | 2263 | 1362700 | 166.067 | 2521.640 | 0.897 | 0.861 | 0.935 | SMR < 1 (Signif) |
| Kediri | 2349 | 1689900 | 139.002 | 3127.115 | 0.751 | 0.721 | 0.782 | SMR < 1 (Signif) |
| Kota Blitar | 322 | 154900 | 207.876 | 286.638 | 1.123 | 1.004 | 1.253 | SMR > 1 (Signif) |
| Kota Kediri | 1391 | 298200 | 466.465 | 551.811 | 2.521 | 2.390 | 2.657 | SMR > 1 (Signif) |
| Kota Madiun | 918 | 201800 | 454.906 | 373.426 | 2.458 | 2.302 | 2.623 | SMR > 1 (Signif) |
| Kota Malang | 2626 | 872700 | 300.905 | 1614.908 | 1.626 | 1.564 | 1.690 | SMR > 1 (Signif) |
| Kota Mojokerto | 757 | 137400 | 550.946 | 254.255 | 2.977 | 2.769 | 3.197 | SMR > 1 (Signif) |
| Kota Pasuruan | 698 | 219400 | 318.140 | 405.994 | 1.719 | 1.594 | 1.852 | SMR > 1 (Signif) |
| Kota Probolinggo | 607 | 249500 | 243.287 | 461.693 | 1.315 | 1.212 | 1.424 | SMR > 1 (Signif) |
| Lamongan | 3225 | 1378200 | 234.001 | 2550.323 | 1.265 | 1.221 | 1.309 | SMR > 1 (Signif) |
| Lumajang | 2154 | 1145900 | 187.975 | 2120.458 | 1.016 | 0.973 | 1.060 | Not signif |
| Madiun | 972 | 757800 | 128.266 | 1402.289 | 0.693 | 0.650 | 0.738 | SMR < 1 (Signif) |
| Magetan | 935 | 685500 | 136.397 | 1268.500 | 0.737 | 0.691 | 0.786 | SMR < 1 (Signif) |
| Malang | 3177 | 2736000 | 116.118 | 5062.896 | 0.628 | 0.606 | 0.650 | SMR < 1 (Signif) |
| Mojokerto | 2012 | 1154300 | 174.305 | 2136.002 | 0.942 | 0.901 | 0.984 | SMR < 1 (Signif) |
| Nganjuk | 1464 | 1131800 | 129.351 | 2094.366 | 0.699 | 0.664 | 0.736 | SMR < 1 (Signif) |
| Ngawi | 1348 | 884100 | 152.471 | 1636.004 | 0.824 | 0.781 | 0.869 | SMR < 1 (Signif) |
| Pacitan | 439 | 588600 | 74.584 | 1089.189 | 0.403 | 0.366 | 0.443 | SMR < 1 (Signif) |
| Pamekasan | 1124 | 884700 | 127.049 | 1637.114 | 0.687 | 0.647 | 0.728 | SMR < 1 (Signif) |
| Pasuruan | 3296 | 1657200 | 198.890 | 3066.605 | 1.075 | 1.038 | 1.112 | SMR > 1 (Signif) |
| Ponorogo | 1306 | 962900 | 135.632 | 1781.821 | 0.733 | 0.694 | 0.774 | SMR < 1 (Signif) |
| Probolinggo | 2184 | 1185200 | 184.273 | 2193.181 | 0.996 | 0.954 | 1.038 | Not signif |
| Sampang | 1496 | 1016300 | 147.201 | 1880.636 | 0.795 | 0.756 | 0.837 | SMR < 1 (Signif) |
| Sidoarjo | 5409 | 2171500 | 249.090 | 4018.304 | 1.346 | 1.310 | 1.382 | SMR > 1 (Signif) |
| Situbondo | 1373 | 700700 | 195.947 | 1296.627 | 1.059 | 1.004 | 1.116 | SMR > 1 (Signif) |
| Sumenep | 2274 | 1153200 | 197.190 | 2133.966 | 1.066 | 1.022 | 1.110 | SMR > 1 (Signif) |
| Surabaya | 9182 | 2922000 | 314.237 | 5407.084 | 1.698 | 1.664 | 1.733 | SMR > 1 (Signif) |
| Trenggalek | 504 | 744500 | 67.696 | 1377.678 | 0.366 | 0.335 | 0.399 | SMR < 1 (Signif) |
| Tuban | 2178 | 1225200 | 177.767 | 2267.200 | 0.961 | 0.921 | 1.002 | Not signif |
| Tulungagung | 1485 | 1113900 | 133.315 | 2061.243 | 0.720 | 0.684 | 0.758 | SMR < 1 (Signif) |
head(smr_table, 10)
Hasil pemetaan SMR menunjukkan adanya perbedaan tingkat risiko TBC antarwilayah setelah distandarisasi terhadap tingkat kejadian rata-rata Provinsi Jawa Timur. Wilayah dengan SMR > 1 menunjukkan bahwa jumlah kasus TBC yang diamati lebih tinggi dibandingkan jumlah kasus yang diharapkan berdasarkan risiko rata-rata provinsi, sehingga wilayah tersebut dapat dikategorikan sebagai wilayah berisiko tinggi. Sebaliknya, wilayah dengan SMR < 1 menunjukkan risiko TBC yang lebih rendah dibandingkan rata-rata provinsi. Berdasarkan interval kepercayaan Poisson, beberapa wilayah dengan SMR > 1 yang signifikan adalah hotspot epidemiologis, karena kelebihan kasus yang terjadi tidak disebabkan oleh variasi acak. Wilayah dengan SMR tidak signifikan menunjukkan bahwa perbedaan jumlah kasus masih berada dalam batas variasi statistik yang wajar. Secara keseluruhan, hasil Disease Mapping menggunakan SMR menunjukkan bahwa beban dan risiko TBC di Jawa Timur tidak terdistribusi secara merata. Penggunaan SMR memberikan informasi yang lebih akurat untuk perbandingan antarwilayah dibandingkan Crude Rate, khususnya pada wilayah dengan populasi kecil.
library(MASS)
library(broom)
df_model <- data_clean %>%
st_drop_geometry() %>%
mutate(
Kasus_TBC = as.numeric(Kasus_TBC),,
X1 = as.numeric(X1),
X2 = as.numeric(X2),
X3 = as.numeric(X3),
X4 = as.numeric(X4)
)
model_pois <- glm(
Kasus_TBC ~ X1 + X2 + X3 + X4 + offset(log(X1)),
family = poisson(link = "log"),
data = df_model
)
dispersion_ratio <- sum(residuals(model_pois, type = "pearson")^2) /
model_pois$df.residual
model_nb <- glm.nb(
Kasus_TBC ~ X1 + X2 + X3 + X4 + offset(log(X1)),
data = df_model
)
tab_pois <- tidy(model_pois, exponentiate = TRUE, conf.int = TRUE) %>%
mutate(Model = "Poisson")
tab_nb <- tidy(model_nb, exponentiate = TRUE, conf.int = TRUE) %>%
mutate(Model = "Negative Binomial")
hasil_model_epi <- bind_rows(tab_pois, tab_nb) %>%
dplyr::select(Model, term, estimate, conf.low, conf.high, p.value)
DT::datatable(
hasil_model_epi,
rownames = FALSE,
options = list(pageLength = 10, scrollX = TRUE),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: left;',
'Model Epidemiologi Poisson dan Negative Binomial (RR)'
)
)
list(
AIC_Poisson = AIC(model_pois),
AIC_NegBin = AIC(model_nb),
Dispersion_Ratio_Poisson = dispersion_ratio
)
## $AIC_Poisson
## [1] 4065.835
##
## $AIC_NegBin
## [1] 578.5302
##
## $Dispersion_Ratio_Poisson
## [1] 114.8632
Model epidemiologi yang digunakan dalam penelitian ini adalah regresi Poisson dan regresi Negative Binomial, sehingga model merepresentasikan laju kejadian (rate) kasus Tuberkulosis pada tingkat kabupaten/kota di Provinsi Jawa Timur.
Hasil evaluasi menunjukkan bahwa model Poisson mengalami overdispersi, yang ditunjukkan oleh nilai dispersion ratio yang lebih besar dari satu. Kondisi ini menandakan variasi jumlah kasus TBC lebih besar daripada yang diasumsikan oleh distribusi Poisson, sehingga model Poisson kurang optimal untuk menggambarkan data kasus TBC di Jawa Timur. Sebaliknya, model Negative Binomial mampu menangani overdispersi melalui parameter dispersi tambahan, sehingga menghasilkan estimasi yang lebih stabil.
Berdasarkan tabel koefisien yang telah dieksponensialkan, beberapa variabel penjelas menunjukkan Risk Ratio (RR) lebih besar dari satu, yang mengindikasikan bahwa peningkatan nilai variabel tersebut berkaitan dengan peningkatan risiko kejadian TBC. Sebaliknya, variabel dengan RR kurang dari satu berperan sebagai faktor protektif yang berkaitan dengan penurunan risiko TBC.
Perbandingan nilai AIC antara model Poisson dan Negative Binomial menunjukkan bahwa model Negative Binomial memiliki AIC yang lebih kecil, sehingga dipilih sebagai model epidemiologi yang lebih sesuai untuk menganalisis faktor-faktor yang memengaruhi variasi jumlah kasus TBC antar kabupaten/kota di Jawa Timur.
library(sf)
library(dplyr)
library(spdep)
library(ggplot2)
shp_path <- "data_shp/JATIM_KABKOTA.shp" # atau hasil unzip shapefile
excel_path <- "data_excel/Kasus_TBC.xlsx" # file excel
# Baca shapefile & excel
shp <- sf::st_read("C:/Users/khalisha marindra/Downloads/GADM PETA JATIM/GADM_JATIM_KABKOTA.shp", quiet = TRUE) %>%
sf::st_make_valid()
df <- readxl::read_excel("C:/Users/khalisha marindra/Downloads/Kasus Penyakit Menurut Kabupaten_Kota dan Jenis Penyakit di Provinsi Jawa Timur, 2024.xlsx")
names(df) <- trimws(gsub("\\s+", "_", names(df)))
clean_name <- function(x) tolower(gsub("\\s+|kabupaten|kota|,", "", x))
tahun_pakai <- 2024
df <- df %>% dplyr::filter(Tahun == tahun_pakai)
# Buat key join
shp$.key <- clean_name(shp$NAME_2)
if ("Kabupaten_Kota" %in% names(df)) {
df$.key <- clean_name(df$Kabupaten_Kota)
} else if ("Kabupaten" %in% names(df)) {
df$.key <- clean_name(df$Kabupaten)
} else if ("Kota" %in% names(df)) {
df$.key <- clean_name(df$Kota)
} else {
stop("Kolom nama wilayah tidak ditemukan di excel (Kabupaten_Kota/Kabupaten/Kota).")
}
# Join
sf_join <- dplyr::left_join(shp, df, by = ".key") %>% sf::st_as_sf()
stopifnot("Kasus_TBC" %in% names(sf_join))
ok <- !is.na(sf_join$Kasus_TBC)
sf_m <- sf_join[ok, ]
# Neighbors & listw
nb_full <- spdep::poly2nb(sf_join, queen = TRUE)
nb_sub <- subset(nb_full, ok)
lw_sub <- spdep::nb2listw(nb_sub, style = "W", zero.policy = TRUE)
# Variabel analisis
y <- sf_m$Kasus_TBC
moran_res <- spdep::moran.test(y, lw_sub, zero.policy = TRUE)
moran_I <- unname(moran_res$estimate[["Moran I statistic"]])
moran_EI <- unname(moran_res$estimate[["Expectation"]])
moran_p <- moran_res$p.value
cat("GLOBAL Moran's I\n")
## GLOBAL Moran's I
cat("Moran I :", round(moran_I, 4), "\n")
## Moran I : 0.3738
cat("E(I) :", round(moran_EI, 4), "\n")
## E(I) : -0.027
cat("p-value :", signif(moran_p, 4), "\n\n")
## p-value : 0.0002389
# =========================
# 4) LISA (Local Moran)
# =========================
alpha_lisa <- 0.05 # ubah kalau mau
local <- spdep::localmoran(y, lw_sub, zero.policy = TRUE)
# Z-score & spatial lag (untuk klasifikasi HH/LL/HL/LH)
z <- as.numeric(scale(y))
lag_z <- spdep::lag.listw(lw_sub, z, zero.policy = TRUE)
sig <- local[, 5] < alpha_lisa
cluster <- rep("Not Sig", length(z))
cluster[z > 0 & lag_z > 0 & sig] <- "High-High"
cluster[z < 0 & lag_z < 0 & sig] <- "Low-Low"
cluster[z > 0 & lag_z < 0 & sig] <- "High-Low"
cluster[z < 0 & lag_z > 0 & sig] <- "Low-High"
sf_m$LISA <- factor(cluster, levels = c("High-High","Low-Low","High-Low","Low-High","Not Sig"))
# =========================
# 5) PETA LISA
# =========================
ggplot(sf_m) +
geom_sf(aes(fill = LISA), color = "grey60", linewidth = 0.2) +
theme_minimal() +
labs(
title = paste0(
"Peta LISA Kasus TBC (", tahun_pakai, ") | Global Moran's I = ",
round(moran_I, 3), " (p = ", signif(moran_p, 3), ")"
),
fill = "LISA Cluster"
)
Hasil analisis autokorelasi spasial menggunakan Global Moran’s I
menunjukkan nilai Moran’s I sebesar 0,3738 dengan p-value = 0,000239.
Nilai Moran’s I yang positif mengindikasikan adanya autokorelasi spasial
positif yang kuat pada distribusi kasus Tuberkulosis antar
kabupaten/kota di Provinsi Jawa Timur. Hal ini menunjukkan bahwa wilayah
dengan jumlah kasus TBC tinggi cenderung berdekatan dengan wilayah lain
yang juga memiliki jumlah kasus tinggi, sehingga distribusi kasus tidak
bersifat acak secara geografis.
Berdasarkan hasil Local Indicators of Spatial Association (LISA), teridentifikasi klaster High–High yang signifikan di wilayah Kota Surabaya dan kabupaten/kota sekitarnya. Klaster High–High menunjukkan bahwa wilayah dengan jumlah kasus TBC tinggi dikelilingi oleh wilayah dengan jumlah kasus tinggi pula, sehingga dapat dikategorikan sebagai hotspot penularan TBC di Jawa Timur. Keberadaan klaster ini mengindikasikan adanya proses penularan yang dipengaruhi oleh kedekatan geografis, kepadatan penduduk, serta interaksi sosial antarwilayah.
Sebagian besar wilayah lainnya berada dalam kategori Not Significant, yang menunjukkan tidak adanya autokorelasi spasial lokal yang signifikan pada wilayah tersebut. Kondisi ini mengindikasikan bahwa variasi jumlah kasus TBC di wilayah-wilayah tersebut relatif tidak dipengaruhi oleh wilayah tetangganya secara langsung.
Secara keseluruhan, hasil Moran’s I dan LISA menunjukkan bahwa penyebaran kasus TBC di Jawa Timur memiliki pola spasial yang terklaster, khususnya di kawasan perkotaan dan sekitarnya.
BAB V
KESIMPULAN DAN SARAN
Berdasarkan hasil analisis epidemiologi dan kasus Tuberkulosis (TBC) di tingkat kabupaten/kota Provinsi Jawa Timur tahun 2024, dapat disimpulkan bahwa distribusi kasus TBC tidak tersebar secara merata antarwilayah. Wilayah dengan kepadatan penduduk tinggi dan karakteristik sosial ekonomi tertentu cenderung memiliki jumlah kasus yang lebih besar dibandingkan wilayah lainnya, sehingga menunjukkan adanya variasi risiko kejadian TBC secara geografis.
Hasil analisis autokorelasi spasial menggunakan Moran’s I menunjukkan adanya ketergantungan spasial yang signifikan, yang mengindikasikan bahwa jumlah kasus TBC di suatu wilayah dipengaruhi oleh kondisi wilayah di sekitarnya. Temuan ini diperkuat oleh hasil analisis LISA yang mengidentifikasi adanya klaster wilayah dengan risiko tinggi (high–high) dan risiko rendah (low–low), sehingga menegaskan pentingnya pendekatan berbasis wilayah dalam pengendalian penyakit.
Analisis epidemiologi menggunakan regresi Poisson dengan offset populasi mengindikasikan adanya overdispersi, sehingga model Negative Binomial dipilih sebagai model yang lebih sesuai. Hasil model ini menunjukkan bahwa faktor demografis dan sosial ekonomi berperan penting dalam meningkatkan atau menurunkan risiko kejadian TBC di Jawa Timur. Selain itu, pendekatan disease mapping melalui Crude Rate dan Standardized Morbidity Ratio (SMR) mampu menggambarkan perbedaan risiko relatif antarwilayah dengan lebih stabil dibandingkan angka kasus mentah.
Secara keseluruhan, analisis epidemiologi memberikan gambaran mengenai pola penyebaran TBC di Provinsi Jawa Timur serta faktor-faktor yang memengaruhinya. Pendekatan ini sangat bermanfaat sebagai dasar dalam perencanaan kebijakan kesehatan masyarakat yang lebih efektif dan berbasis wilayah.
DAFTAR PUSTAKA
[1]World Health Organization. Global Tuberculosis Report 2023. Geneva: World Health Organization; 2023. [2]Kementerian Kesehatan Republik Indonesia. Laporan Program Penanggulangan Tuberkulosis Tahun 2023. Jakarta: Direktorat Jenderal Pencegahan dan Pengendalian Penyakit; 2024. [3]Dinas Kesehatan Provinsi Jawa Timur. Profil Kesehatan Provinsi Jawa Timur Tahun 2023 (Data Update Semester I 2024). Surabaya: Dinkes Jatim; 2024. [4]Kementerian Kesehatan Republik Indonesia. Dashboard Tuberkulosis Indonesia: Situasi TBC di Provinsi Jawa Timur. Jakarta: Kemenkes RI; 2024 [diakses 21 Desember 2025]. Tersedia dari: [tautan mencurigakan telah dihapus] [5]Gelman A, Hill J. Data Analysis Using Regression and Multilevel/Hierarchical Models. New York: Cambridge University Press; 2007. [6]Marais BJ, Hesseling AC, Gie RP, Schaaf HS, Beyers N. The burden of childhood tuberculosis and the importance of contact tracing. South African Medical Journal. 2006;96(10):1064-5. [7]Pfeiffer DU, Robinson TP, Stevenson M, et al. Spatial Analysis in Epidemiology. Oxford: Oxford University Press; 2008. Gordis L. Epidemiology. 5th ed. Philadelphia: Elsevier Saunders; 2014. [8]Buntuan V. Gambaran Epidemiologi Tuberkulosis. Jurnal Biomedik (JBM). 2014;6(3). [9]Bonita R, Beaglehole R, Kjellström T. Basic Epidemiology. 2nd ed. Geneva: World Health Organization; 2006. [10]World Health Organization. Global Tuberculosis Report 2023. Geneva: WHO; 2023. [11]Kumar V, Abbas AK, Aster JC. Robbins Basic Pathology. 10th ed. Philadelphia: Elsevier; 2017. [12]Nnoaham KE, Clarke A. Low serum vitamin D levels and tuberculosis: a systematic review and meta-analysis. International Journal of Epidemiology. 2008;37(1):113-119. [13]Rothman KJ, Greenland S, Lash TL. Modern Epidemiology. 3rd ed. [14]Philadelphia: Lippincott Williams & Wilkins; 2008.