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

Abstrak

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

2.1 Pengertian Epidemiologi

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

2.2 Konsep Agent–Host–Environment dalam Epidemiologi TBC

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.

1. Agent (Agen Penyebab)

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.

2. Host (Inang)

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.

3. Environment (Lingkungan)

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

2.3 Ukuran Asosiasi dalam Epidemiologi

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:

a. Risk Ratio (RR)

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:

  • A = jumlah kasus pada kelompok terpapar
  • B = jumlah tidak sakit pada kelompok terpapar
  • C = jumlah kasus pada kelompok tidak terpapar
  • D = jumlah tidak sakit pada kelompok tidak terpapar Interpretasi: jika RR>1, paparan meningkatkan risiko penyakit; jika RR<1, paparan bersifat protektif; dan jika RR=1, tidak ada asosiasi antara paparan dan penyakit.

b. Odds Ratio (OR)

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.

c. Prevalence Ratio (PR)

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

1. Jenis dan Sumber Data

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.

2. Variabel Penelitian

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:

3. Ukuran Epidemiologi

3.1 Populasi Berisiko

Populasi berisiko dihitung berdasarkan jumlah penduduk sebagai berikut:

\[ Populasi_i = X1_i \times 1000 \]

3.2 Crude Rate (Incidence Rate)

Crude Rate atau angka insidensi dihitung untuk menyesuaikan perbedaan ukuran populasi antarwilayah:

\[ IR_{100k,i} = \frac{Kasus\ TBC_i}{Populasi_i} \times 100000 \]


4. Disease Mapping: SMR dan Confidence Interval Poisson

4.1 Expected Cases

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\)

4.2 Standardized Morbidity Ratio (SMR)

SMR dihitung sebagai berikut:

\[ SMR_i = \frac{O_i}{E_i} \]

4.3 Confidence Interval SMR (Poisson)

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.


5. Model Epidemiologi Count Data

5.1 Model Poisson

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 \]

5.2 Model Negative Binomial

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.


6. Uji Autokorelasi Spasial

6.1 Moran’s I (Global)

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} \]

6.2 LISA (Local Indicators of Spatial Association)

LISA digunakan untuk mengidentifikasi klaster spasial lokal (High-High, Low-Low, High-Low, Low-High).


10. Perangkat Lunak

Seluruh analisis dilakukan menggunakan RStudio


Alur Penelitian

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

4.1 Peta Deskriptif Persebaran Kasus Tuberkulosis di Jawa Timur Tahun 2024

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.

4.2 Ukuran Epidemilogi

# 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
)
Tabel Ukuran Epidemiologi TBC Kabupaten/Kota Jawa Timur Tahun 2024
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.

4.3 Disease Mapping: SMR dan Confidence Interval Poisson

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
)
Tabel Disease Mapping: Crude Rate dan SMR (dengan CI Poisson)
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.

4.4 Model Epidemiologi Count Data

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.

4.5 Uji Autokorelasi Spasial

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.