Judul
Analisis Epidemiologi Kasus Pneumonia Pada Balita di Jawa Timur Tahun
2022
Nama
Stephani Julieta
Program Studi
S-1 Statistika
NPM
140610230050
Mata Kuliah
Epidemiologi
Dosen Pembimbing Mata Kuliah
I Gede Nyoman Mindra Jaya, P.hd
Abstrak
Pneumonia merupakan salah satu penyebab utama morbiditas pada balita dan masih menjadi permasalahan kesehatan masyarakat di Indonesia, termasuk di Provinsi Jawa Timur. Penelitian ini bertujuan untuk menganalisis secara epidemiologis kejadian pneumonia pada balita di Provinsi Jawa Timur tahun 2022 berdasarkan distribusi wilayah serta faktor-faktor yang berhubungan. Penelitian ini menggunakan desain observasional dengan pendekatan potong lintang dan memanfaatkan data sekunder tingkat kabupaten/kota. Analisis yang dilakukan meliputi analisis deskriptif, pemetaan spasial, penghitungan ukuran frekuensi dan ukuran asosiasi, serta pemodelan regresi Negative Binomial.
Hasil analisis menunjukkan bahwa insidensi pneumonia balita di Jawa Timur tidak tersebar secara merata antar wilayah, dengan beberapa kabupaten/kota memiliki insidensi yang relatif lebih tinggi. Peta persebaran spasial mengindikasikan adanya variasi geografis kejadian pneumonia balita. Faktor kepadatan penduduk, cakupan imunisasi, dan prevalensi gizi kurang menunjukkan hubungan dengan kejadian pneumonia balita. Hasil pemodelan menunjukkan bahwa kepadatan penduduk dan prevalensi gizi kurang berasosiasi dengan peningkatan laju kejadian pneumonia balita, sedangkan cakupan imunisasi berperan sebagai faktor protektif. Temuan ini menegaskan pentingnya pendekatan epidemiologi berbasis wilayah dalam perencanaan intervensi pencegahan dan pengendalian pneumonia balita.
Pneumonia merupakan salah satu penyakit infeksi saluran pernapasan akut yang menjadi penyebab utama morbiditas dan mortalitas pada balita di berbagai negara, khususnya di negara berkembang. World Health Organization (WHO) menyatakan bahwa pneumonia masih menjadi penyebab utama kematian balita di dunia, dengan kontribusi signifikan di wilayah Asia Tenggara. Kondisi ini menunjukkan bahwa pneumonia bukan hanya masalah klinis, tetapi juga persoalan kesehatan masyarakat yang memerlukan pendekatan epidemiologis berbasis data.
Di Indonesia, pneumonia pada balita masih menjadi tantangan kesehatan masyarakat yang serius. Kementerian Kesehatan Republik Indonesia secara konsisten melaporkan bahwa pneumonia termasuk dalam sepuluh besar penyakit terbanyak pada balita, dengan variasi distribusi kasus yang cukup besar antar wilayah. Faktor lingkungan, karakteristik host (usia, status gizi, status imunisasi), serta kepadatan penduduk berperan penting dalam proses terjadinya dan penyebaran penyakit ini sesuai dengan kerangka agent–host–environment.
Provinsi Jawa Timur merupakan salah satu provinsi dengan jumlah penduduk terbesar di Indonesia, termasuk populasi balita yang tinggi dan karakteristik wilayah yang beragam, mulai dari daerah perkotaan dengan kepadatan penduduk tinggi hingga daerah pedesaan. Berdasarkan data tahun 2022 yang digunakan dalam penelitian ini, terlihat adanya variasi jumlah kasus pneumonia balita antar kabupaten/kota di Jawa Timur, yang berpotensi dipengaruhi oleh perbedaan jumlah penduduk balita, kepadatan penduduk, cakupan imunisasi, serta prevalensi balita dengan status gizi kurang.
Analisis epidemiologi diperlukan untuk menggambarkan distribusi pneumonia balita secara kuantitatif dan spasial, serta untuk memahami hubungan antara faktor risiko yang tersedia dalam data dengan kejadian pneumonia. Pendekatan ini sejalan dengan tujuan epidemiologi modern, yaitu tidak hanya mendeskripsikan besarnya masalah kesehatan, tetapi juga memberikan dasar ilmiah bagi perencanaan intervensi dan kebijakan kesehatan masyarakat.
Oleh karena itu, penelitian ini dilakukan untuk menganalisis secara epidemiologis kasus pneumonia pada balita di Provinsi Jawa Timur tahun 2022 menggunakan data sekunder, dengan menekankan pada pengukuran frekuensi penyakit dan keterkaitannya dengan faktor-faktor demografis dan kesehatan yang relevan.
Berdasarkan latar belakang tersebut, rumusan masalah dalam penelitian ini adalah sebagai berikut:
Bagaimana distribusi kasus pneumonia pada balita di kabupaten/kota Provinsi Jawa Timur tahun 2022?
Bagaimana gambaran ukuran frekuensi pneumonia balita berdasarkan data jumlah kasus dan jumlah penduduk balita?
Bagaimana hubungan antara karakteristik wilayah dan faktor host, seperti kepadatan penduduk, cakupan imunisasi, serta prevalensi gizi kurang pada balita, dengan kejadian pneumonia?
Faktor apa yang berpotensi berkontribusi terhadap variasi kejadian pneumonia balita antar wilayah di Jawa Timur berdasarkan analisis epidemiologi?
Pneumonia merupakan infeksi akut pada jaringan paru-paru yang umumnya disebabkan oleh agen infeksius seperti bakteri, virus, atau jamur. Pada kelompok balita, pneumonia menjadi penyakit yang sangat berisiko karena sistem imun yang belum berkembang sempurna serta tingginya paparan faktor lingkungan yang tidak sehat. Menurut World Health Organization, pneumonia didefinisikan sebagai peradangan paru yang ditandai dengan gejala batuk, sesak napas, dan napas cepat, yang pada balita dapat berkembang menjadi kondisi berat apabila tidak ditangani secara tepat.
Di Indonesia, pneumonia balita masih menjadi salah satu prioritas pengendalian penyakit menular. Data Kementerian Kesehatan Republik Indonesia menunjukkan bahwa beban pneumonia balita bervariasi antar wilayah, mencerminkan perbedaan kondisi lingkungan, sosial ekonomi, serta akses terhadap layanan kesehatan. Oleh karena itu, pneumonia balita menjadi objek kajian penting dalam epidemiologi deskriptif dan analitik.
Pendekatan agent–host–environment merupakan kerangka dasar dalam epidemiologi untuk menjelaskan proses terjadinya penyakit menular.
Agent penyebab pneumonia pada balita umumnya berupa mikroorganisme patogen, seperti Streptococcus pneumoniae, Haemophilus influenzae, serta berbagai virus pernapasan. Agen ini dapat menular melalui droplet dan kontak dekat, terutama di lingkungan dengan kepadatan penduduk tinggi.
Faktor host berperan besar dalam menentukan kerentanan balita terhadap pneumonia. Usia balita, status gizi, status imunisasi, serta kondisi kesehatan secara umum memengaruhi kemampuan tubuh dalam melawan infeksi. Balita dengan status gizi kurang dan cakupan imunisasi yang rendah diketahui memiliki risiko lebih tinggi untuk mengalami pneumonia.
Lingkungan fisik dan sosial turut memengaruhi terjadinya pneumonia. Kepadatan penduduk, kualitas udara, sanitasi, dan kondisi tempat tinggal merupakan faktor lingkungan yang dapat meningkatkan paparan agen infeksius. Dalam konteks wilayah seperti Provinsi Jawa Timur, perbedaan karakteristik perkotaan dan perdesaan dapat menyebabkan variasi risiko pneumonia antar kabupaten/kota.
Pendekatan agent–host–environment membantu peneliti memahami pneumonia balita secara komprehensif dan menjadi dasar dalam analisis epidemiologi berbasis wilayah.
Ukuran epidemiologi digunakan untuk menggambarkan besarnya masalah kesehatan dan membandingkan kejadian penyakit antar populasi atau wilayah.
Ukuran frekuensi yang umum digunakan dalam analisis pneumonia balita meliputi insidensi dan prevalensi. Insidensi menggambarkan jumlah kasus baru pneumonia pada periode tertentu dibandingkan dengan populasi berisiko, sedangkan prevalensi menunjukkan proporsi balita yang menderita pneumonia pada suatu waktu tertentu.
Dalam analisis berbasis data agregat kabupaten/kota, ukuran frekuensi dapat dinyatakan dalam bentuk rasio atau angka kejadian per jumlah penduduk balita. Ukuran ini penting untuk menggambarkan variasi kejadian pneumonia antar wilayah dan mengidentifikasi daerah dengan beban penyakit yang lebih tinggi.
Interpretasi ukuran frekuensi tidak hanya menekankan pada besarnya angka, tetapi juga pada konteks populasi dan karakteristik wilayah. Perbedaan angka kejadian pneumonia dapat mencerminkan variasi faktor risiko, sistem pelaporan, maupun akses layanan kesehatan.
Penelitian ini menggunakan pendekatan studi observasional dengan desain cross-sectional. Desain ini menilai kejadian pneumonia balita dan faktor-faktor terkait pada satu periode waktu, yaitu tahun 2022.
Desain cross-sectional sesuai digunakan untuk:
Meskipun desain ini tidak dapat menunjukkan hubungan sebab-akibat secara langsung, studi potong lintang tetap memberikan gambaran epidemiologis yang kuat untuk identifikasi pola risiko dan perencanaan intervensi kesehatan masyarakat.
Berdasarkan tinjauan pustaka, kerangka konseptual penelitian ini menempatkan kejadian pneumonia balita sebagai variabel utama yang dipengaruhi oleh faktor host (jumlah balita, status gizi, cakupan imunisasi) dan faktor lingkungan (kepadatan penduduk). Hubungan antar variabel dianalisis secara epidemiologis untuk memahami variasi kejadian pneumonia di tingkat kabupaten/kota Provinsi Jawa Timur.
Penelitian ini merupakan penelitian observasional analitik dengan desain potong lintang (cross-sectional). Desain ini digunakan untuk menganalisis kejadian pneumonia pada balita dan faktor-faktor yang terkait pada satu periode waktu, yaitu tahun 2022.
Pendekatan potong lintang dipilih karena penelitian menggunakan data sekunder agregat pada tingkat kabupaten/kota di Provinsi Jawa Timur, sehingga memungkinkan analisis distribusi penyakit dan hubungan antar variabel tanpa melakukan follow-up individu.
Wilayah penelitian mencakup seluruh kabupaten/kota di Provinsi Jawa Timur. Unit analisis dalam penelitian ini adalah wilayah administratif kabupaten/kota, bukan individu balita.
Setiap unit analisis memiliki informasi jumlah kasus pneumonia balita dan karakteristik demografis serta kesehatan wilayah terkait.
Penelitian ini menggunakan data sekunder yang bersumber dari:
Data kasus pneumonia balita Provinsi Jawa Timur tahun 2022
Data jumlah penduduk balita
Data kepadatan penduduk
Data cakupan imunisasi
Data prevalensi balita dengan status gizi kurang
Seluruh data bersifat agregat tahunan dan dianalisis pada tingkat kabupaten/kota.
| No | Variabel | Jenis Variabel | Definisi Operasional | Skala Data |
|---|---|---|---|---|
| 1 | Kasus pneumonia balita | Dependen | Jumlah kasus pneumonia pada balita di setiap kabupaten/kota di Jawa Timur tahun 2022 | Rasio |
| 2 | Jumlah penduduk balita | Independen | Jumlah penduduk usia balita pada masing-masing kabupaten/kota | Rasio |
| 3 | Kepadatan penduduk | Independen | Jumlah penduduk per satuan luas wilayah kabupaten/kota | Rasio |
| 4 | Cakupan imunisasi balita | Independen | Persentase balita yang telah mendapatkan imunisasi dasar lengkap | Rasio |
| 5 | Prevalensi gizi kurang | Independen | Persentase balita dengan status gizi kurang pada tiap kabupaten/kota | Rasio |
Seluruh variabel dianalisis pada tingkat agregat wilayah kabupaten/kota dan bersumber dari data sekunder tahunan.
Angka insidensi digunakan untuk menggambarkan jumlah kasus pneumonia balita relatif terhadap populasi balita berisiko pada suatu wilayah.
Rumus insidensi dinyatakan sebagai: \[ \text{Insidensi} = \frac{C}{N} \times k \] dengan:
𝐶 = jumlah kasus pneumonia balita
𝑁 = jumlah penduduk balita
𝑘= konstanta pengali (misalnya 1.000 balita)
Prevalensi digunakan untuk menggambarkan proporsi balita yang menderita pneumonia dalam periode pengamatan.
Rumus prevalensi dinyatakan sebagai:
\[ \text{Prevalensi} = \frac{C}{N} \times k \] Pada data agregat tahunan, perhitungan prevalensi dilakukan dengan asumsi bahwa jumlah kasus mencerminkan total kejadian selama periode tersebut.
| Ukuran | Kapan digunakan | Definisi | Rumus (LaTeX) | Keterangan simbol |
|---|---|---|---|---|
| Risk Ratio (RR) | Data dapat dinyatakan sebagai risiko/proporsi kejadian pada kelompok terpapar vs tidak terpapar (umum di cohort; bisa dipakai di data agregat jika dihitung “risiko pneumonia per balita” per kelompok wilayah) | Perbandingan risiko kejadian pada kelompok terpapar dibanding tidak terpapar | \[RR=\frac{R_e}{R_u}=\frac{\frac{a}{a+b}}{\frac{c}{c+d}}\] | \(a\)=kasus pada terpapar, \(b\)=non-kasus pada terpapar, \(c\)=kasus pada tidak terpapar, \(d\)=non-kasus pada tidak terpapar. \(R_e\)=risiko terpapar, \(R_u\)=risiko tidak terpapar |
| Odds Ratio (OR) | Sangat umum untuk case-control; juga bisa untuk tabel 2×2 di data agregat | Perbandingan odds kejadian pada terpapar vs tidak terpapar | \[OR=\frac{a/b}{c/d}=\frac{ad}{bc}\] | Simbol \(a,b,c,d\) sama seperti di atas |
| Risk Difference (RD) (Attributable Risk) | Ketika ingin melihat selisih risiko absolut antara terpapar dan tidak terpapar | Selisih risiko kejadian | \[RD=R_e-R_u=\frac{a}{a+b}-\frac{c}{c+d}\] | \(R_e\)=risiko terpapar, \(R_u\)=risiko tidak terpapar |
| Attributable Fraction among Exposed (AF_e) | Ketika ingin proporsi kejadian pada terpapar yang “dikaitkan” dengan paparan (asumsi kausal) | Proporsi kejadian pada terpapar yang dapat diatribusikan pada paparan | \[AF_e=\frac{R_e-R_u}{R_e}=\frac{RR-1}{RR}\] | Perlu \(RR\) atau risiko |
| Prevalence Ratio (PR) (opsional untuk cross-sectional) | Jika keluaran diperlakukan sebagai “prevalensi/proporsi” pada satu waktu/periode | Rasio prevalensi pada terpapar vs tidak terpapar | \[PR=\frac{P_e}{P_u}=\frac{\frac{a}{a+b}}{\frac{c}{c+d}}\] | Secara bentuk sama dengan RR, tetapi interpretasi pada studi potong lintang adalah rasio prevalensi |
Analisis deskriptif dilakukan untuk:
Untuk menilai hubungan antara faktor lingkungan dan host dengan kejadian pneumonia balita, dilakukan analisis hubungan menggunakan pendekatan statistik.
Jika variabel dependen berupa jumlah kasus atau angka insidensi, maka digunakan model regresi dengan bentuk umum:
\[ Y_i = \beta_0 + \beta_1 X_{1i} + \beta_2 X_{2i} + \cdots + \beta_p X_{pi} + \varepsilon_i \]
dengan:
Yi = kejadian pneumonia pada wilayah ke- = variabel independen = intercept = koefisien regresi = galat acak
Koefisien regresi diinterpretasikan sebagai perubahan rata-rata kejadian pneumonia balita akibat perubahan satu satuan variabel independen dengan asumsi variabel lain konstan.
Tahapan analisis data dalam penelitian ini meliputi:
Pembersihan dan pemeriksaan data
Perhitungan ukuran epidemiologi
Analisis deskriptif dan visualisasi
Pemodelan statistik
Interpretasi hasil secara epidemiologis
# Install packages
packages <- c("tidyverse","readxl","janitor","broom","MASS","knitr")
to_install <- packages[!packages %in% rownames(installed.packages())]
if(length(to_install) > 0) install.packages(to_install)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tibble' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
library(janitor)
## Warning: package 'janitor' was built under R version 4.3.3
##
## Attaching package: 'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(broom)
library(MASS)
##
## Attaching package: 'MASS'
##
## The following object is masked from 'package:dplyr':
##
## select
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(tmap)
library(dplyr)
# ---- 1) Load data ----
# GANTI path jika lokasi file berbeda
path_xlsx <- "C:/Users/ASUS/Downloads/pneumonia jatim data.xlsx"
raw <- readxl::read_excel(path_xlsx) |>
janitor::clean_names()
# Cek kolom
names(raw)
## [1] "kabupaten_kota" "jumlah_kasus_pneumonia_balita"
## [3] "jumlah_penduduk_balita" "kepadatan_penduduk"
## [5] "cakupan_imunisasi" "prevalensi_balita_gizi_kurang"
glimpse(raw)
## Rows: 38
## Columns: 6
## $ kabupaten_kota <chr> "Pacitan", "Ponorogo", "Trenggalek", "Tu…
## $ jumlah_kasus_pneumonia_balita <dbl> 113, 2343, 1710, 2848, 2536, 1294, 6110,…
## $ jumlah_penduduk_balita <dbl> 34250, 54931, 45061, 76327, 84676, 12209…
## $ kepadatan_penduduk <dbl> 417.96, 684.11, 601.23, 985.63, 706.62, …
## $ cakupan_imunisasi <dbl> 71.96, 70.82, 74.80, 81.09, 77.55, 63.94…
## $ prevalensi_balita_gizi_kurang <dbl> 4.6, 7.1, 3.8, 5.3, 5.6, 7.0, 5.2, 4.8, …
# Rename agar enak dipakai (opsional tapi membantu)
df <- raw |>
transmute(
kab_kota = kabupaten_kota,
balita_n = jumlah_penduduk_balita,
kasus_pn = jumlah_kasus_pneumonia_balita,
kepadatan = kepadatan_penduduk,
imunisasi = cakupan_imunisasi,
gizi_kurang = prevalensi_balita_gizi_kurang
) |>
mutate(
kab_kota = as.character(kab_kota),
across(c(balita_n, kasus_pn, kepadatan, imunisasi, gizi_kurang), as.numeric)
)
# Validasi data dasar
stopifnot(all(df$balita_n >= 0, na.rm = TRUE))
stopifnot(all(df$kasus_pn >= 0, na.rm = TRUE))
stopifnot(all(df$kasus_pn <= df$balita_n, na.rm = TRUE)) # kasus <= populasi berisiko
# ---- 2) Ukuran frekuensi (incidence/proportion) ----
# Karena data agregat 1 tahun (2022), ukuran yang paling tepat dipakai adalah:
# - Proporsi kasus tahunan (kasus / populasi balita) dan bisa ditampilkan per 1.000 balita.
df <- df |>
mutate(
prop_kasus = kasus_pn / balita_n,
insidensi_per_1000 = prop_kasus * 1000,
insidensi_per_10000 = prop_kasus * 10000
)
# Ringkasan deskriptif
desc_tbl <- df |>
summarise(
n_wilayah = n(),
total_balita = sum(balita_n, na.rm = TRUE),
total_kasus = sum(kasus_pn, na.rm = TRUE),
mean_ins_1000 = mean(insidensi_per_1000, na.rm = TRUE),
median_ins_1000 = median(insidensi_per_1000, na.rm = TRUE),
min_ins_1000 = min(insidensi_per_1000, na.rm = TRUE),
max_ins_1000 = max(insidensi_per_1000, na.rm = TRUE)
)
desc_tbl
## # A tibble: 1 × 7
## n_wilayah total_balita total_kasus mean_ins_1000 median_ins_1000 min_ins_1000
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 38 2870423 92118 33.2 31.8 3.30
## # ℹ 1 more variable: max_ins_1000 <dbl>
# Top/bottom wilayah
top10 <- df |>
arrange(desc(insidensi_per_1000)) |>
slice_head(n = 10) |>
dplyr::select(kab_kota, balita_n, kasus_pn, insidensi_per_1000)
bottom10 <- df |>
arrange(insidensi_per_1000) |>
slice_head(n = 10) |>
dplyr::select(kab_kota, balita_n, kasus_pn, insidensi_per_1000)
top10
## # A tibble: 10 × 4
## kab_kota balita_n kasus_pn insidensi_per_1000
## <chr> <dbl> <dbl> <dbl>
## 1 Kota Blitar 10844 1088 100.
## 2 Kota Madiun 12271 756 61.6
## 3 Sidoarjo 174938 10276 58.7
## 4 Surabaya 213590 11692 54.7
## 5 Bondowoso 51028 2701 52.9
## 6 Bojonegoro 84009 4317 51.4
## 7 Gresik 103322 4775 46.2
## 8 Magetan 40454 1772 43.8
## 9 Bangkalan 77634 3330 42.9
## 10 Jombang 97394 4171 42.8
bottom10
## # A tibble: 10 × 4
## kab_kota balita_n kasus_pn insidensi_per_1000
## <chr> <dbl> <dbl> <dbl>
## 1 Pacitan 34250 113 3.30
## 2 Sampang 76368 324 4.24
## 3 Kediri 122097 1294 10.6
## 4 Lumajang 72165 977 13.5
## 5 Nganjuk 77104 1124 14.6
## 6 Mojokerto 84155 1304 15.5
## 7 Jember 180645 3134 17.3
## 8 Sumenep 70152 1358 19.4
## 9 Banyuwangi 114080 2249 19.7
## 10 Tuban 80443 1707 21.2
Wilayah dengan insidensi pneumonia balita tertinggi menunjukkan proporsi kasus yang besar dibandingkan jumlah penduduk balita. Hal ini menandakan bahwa balita yang tinggal di wilayah-wilayah tersebut memiliki risiko pneumonia yang relatif lebih tinggi. Kondisi ini dapat dipengaruhi oleh faktor lingkungan seperti kepadatan penduduk, serta faktor host seperti status gizi dan cakupan imunisasi.
# Distribusi insidensi (Histogram berwarna)
ggplot(df, aes(x = insidensi_per_1000)) +
geom_histogram(
bins = 15,
fill = "steelblue",
color = "black",
alpha = 0.8
) +
labs(
title = "Distribusi Insidensi Pneumonia Balita (per 1.000) - Jawa Timur 2022",
x = "Insidensi per 1.000 Balita",
y = "Jumlah kabupaten/kota"
) +
theme_minimal()
Histogram menunjukkan bahwa sebagian besar kabupaten/kota berada pada
kisaran insidensi tertentu, sementara hanya sedikit wilayah yang
memiliki insidensi sangat tinggi. Pola ini mengindikasikan adanya
wilayah dengan kejadian pneumonia balita yang bersifat ekstrem dan
berpotensi menjadi prioritas intervensi kesehatan masyarakat.
# Bar plot top 15 wilayah (berwarna dengan gradasi)
df |>
arrange(desc(insidensi_per_1000)) |>
slice_head(n = 15) |>
mutate(kab_kota = fct_reorder(kab_kota,
insidensi_per_1000)) |>
ggplot(aes(
x = kab_kota,
y = insidensi_per_1000,
fill = insidensi_per_1000
)) +
geom_col() +
coord_flip() +
scale_fill_gradient(
low = "lightblue",
high = "darkred",
name = "Insidensi\n(per 1.000)"
) +
labs(
title = "15 Kabupaten/Kota dengan Insidensi Pneumonia Balita Tertinggi",
x = NULL,
y = "Insidensi per 1.000 balita"
) +
theme_minimal() +
theme(legend.position = "right")
Grafik menunjukkan lima belas kabupaten/kota di Provinsi Jawa Timur dengan insidensi pneumonia balita tertinggi pada tahun 2022, yang dinyatakan dalam jumlah kasus per 1.000 balita. Terlihat adanya perbedaan insidensi yang cukup mencolok antar wilayah, yang menandakan bahwa risiko pneumonia balita tidak tersebar secara merata.
Kota Blitar menempati posisi tertinggi dengan insidensi yang jauh lebih besar dibandingkan wilayah lain. Jarak yang cukup lebar antara Kota Blitar dan wilayah peringkat kedua menunjukkan bahwa beban pneumonia balita di Kota Blitar bersifat relatif ekstrem dan berpotensi menjadi wilayah prioritas utama dalam upaya pengendalian penyakit. Kondisi ini dapat dipengaruhi oleh kombinasi faktor lingkungan, kepadatan penduduk, serta karakteristik balita di wilayah tersebut.
Wilayah lain seperti Kota Madiun, Sidoarjo, dan Kota Surabaya juga menunjukkan insidensi yang relatif tinggi. Meskipun tidak setinggi Kota Blitar, tingginya insidensi di wilayah-wilayah ini mengindikasikan bahwa daerah dengan karakteristik perkotaan dan aktivitas penduduk yang tinggi berpotensi memiliki risiko penularan pneumonia yang lebih besar pada balita.
Pada kelompok wilayah dengan insidensi menengah hingga lebih rendah dalam daftar ini, seperti Bangkalan, Jombang, Ponorogo, Situbondo, hingga Tulungagung, insidensi pneumonia balita tetap tergolong tinggi dibandingkan wilayah lain di Jawa Timur yang tidak masuk dalam 15 besar. Hal ini menunjukkan bahwa meskipun relatif lebih rendah, wilayah-wilayah tersebut masih memiliki beban pneumonia balita yang perlu mendapatkan perhatian.
Gradasi warna dari biru muda hingga merah tua memperkuat interpretasi visual bahwa semakin gelap warna batang, semakin tinggi tingkat insidensi pneumonia balita. Pendekatan visual ini memudahkan identifikasi wilayah dengan risiko tertinggi secara cepat dan intuitif.
Secara epidemiologis, grafik ini menegaskan bahwa kejadian pneumonia balita bersifat heterogen antar wilayah, sehingga intervensi kesehatan masyarakat perlu difokuskan pada kabupaten/kota dengan insidensi tertinggi. Temuan ini juga menjadi dasar untuk analisis lebih lanjut mengenai faktor-faktor risiko yang berkontribusi terhadap tingginya insidensi pneumonia balita di wilayah-wilayah tersebut.
# Set mode tmap
tmap_mode("plot")
# Baca shapefile Jawa Timur (sesuaikan path jika perlu)
jatim_shp <- st_read("C:/Users/ASUS/Downloads/jatim_shp")
## Reading layer `Kabupaten-Kota (Provinsi Jawa Timur)' from data source
## `C:\Users\ASUS\Downloads\jatim_shp' using driver `ESRI Shapefile'
## Simple feature collection with 38 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 110.8987 ymin: -8.78036 xmax: 116.2702 ymax: -5.048857
## Geodetic CRS: WGS 84
# rapikan teks supaya nama match (anti beda spasi/huruf besar)
df_map <- df %>%
mutate(kab_kota_key = str_squish(str_to_upper(kab_kota)))
jatim_shp2 <- jatim_shp %>%
mutate(kab_kota_key = str_squish(str_to_upper(NAME_2)))
# join
jatim_map <- dplyr::left_join(jatim_shp2, df_map, by = "kab_kota_key")
# cek cepat: berapa yang berhasil join?
sum(!is.na(jatim_map$insidensi_per_1000))
## [1] 38
sum(is.na(jatim_map$insidensi_per_1000))
## [1] 0
# Cek nama kolom wilayah di shapefile
names(jatim_shp)
## [1] "ID_0" "COUNTRY" "NAME_1" "NL_NAME_1" "ID_2" "NAME_2"
## [7] "VARNAME_2" "NL_NAME_2" "TYPE_2" "ENGTYPE_2" "CC_2" "HASC_2"
## [13] "geometry"
# Pastikan kolom nama kab/kota di shapefile sama dengan df$kab_kota
# Misalnya kolom shapefile bernama "KAB_KOTA" atau "NAMOBJ"
# GANTI di bawah jika nama kolom berbeda
# Plot peta insidensi pneumonia balita
tm_shape(jatim_map) +
tm_polygons(
col = "insidensi_per_1000",
title = "Insidensi Pneumonia\n(per 1.000 balita)",
palette = "Reds",
style = "quantile",
border.col = "black",
lwd = 0.2
) +
tm_layout(
title = "Peta Persebaran Pneumonia Balita di Provinsi Jawa Timur Tahun 2022",
title.size = 1,
legend.outside = TRUE,
frame = FALSE
)
Peta menunjukkan bahwa insidensi pneumonia balita di Provinsi Jawa Timur tahun 2022 tidak tersebar secara merata antar kabupaten/kota. Terlihat adanya variasi spasial yang jelas, yang ditunjukkan oleh perbedaan intensitas warna pada masing-masing wilayah. Kabupaten/kota dengan warna merah lebih gelap merepresentasikan wilayah dengan insidensi pneumonia balita yang lebih tinggi, sedangkan wilayah dengan warna lebih terang menunjukkan insidensi yang lebih rendah.
Beberapa wilayah tampak terkonsentrasi pada kelas insidensi tinggi, yang mengindikasikan adanya daerah-daerah dengan beban pneumonia balita yang relatif lebih berat dibandingkan wilayah lainnya. Pola ini menunjukkan bahwa risiko pneumonia balita bersifat heterogen secara geografis, bukan acak, dan kemungkinan dipengaruhi oleh perbedaan karakteristik lingkungan, kepadatan penduduk, serta faktor kesehatan balita di masing-masing wilayah.
Pengelompokan warna berdasarkan klasifikasi kuantil menunjukkan bahwa setiap kelas memuat jumlah wilayah yang relatif seimbang. Pendekatan ini memudahkan perbandingan tingkat risiko antar kabupaten/kota dan membantu mengidentifikasi wilayah prioritas secara visual. Wilayah dengan insidensi tinggi berpotensi menjadi target utama dalam perencanaan intervensi kesehatan masyarakat, seperti peningkatan cakupan imunisasi dan pemantauan status gizi balita.
Keberadaan beberapa wilayah dengan kategori missing mengindikasikan bahwa terdapat kabupaten/kota yang tidak memiliki data atau data yang tidak berhasil terhubung dalam proses penggabungan data spasial. Hal ini penting untuk dicatat sebagai keterbatasan analisis dan menunjukkan perlunya peningkatan kualitas dan konsistensi data pada tingkat wilayah.
Secara epidemiologis, peta ini menegaskan bahwa analisis spasial memberikan informasi tambahan yang tidak dapat diperoleh hanya dari tabel atau grafik, karena mampu menunjukkan pola geografis kejadian pneumonia balita. Informasi ini sangat penting untuk mendukung pengambilan keputusan berbasis wilayah dalam upaya pencegahan dan pengendalian pneumonia balita di Provinsi Jawa Timur.
# Scatter untuk eksplorasi faktor risiko (host/env)
# Kepadatan vs insidensi
ggplot(df, aes(x = kepadatan, y = insidensi_per_1000)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE) +
labs(title = "Kepadatan penduduk vs Insidensi pneumonia balita", x = "Kepadatan", y = "Insidensi per 1.000")
## `geom_smooth()` using formula = 'y ~ x'
Terlihat kecenderungan bahwa wilayah dengan kepadatan penduduk lebih tinggi memiliki insidensi pneumonia balita yang lebih tinggi. Secara epidemiologis, kepadatan penduduk dapat meningkatkan peluang kontak antar individu sehingga mempermudah penularan agen infeksi penyebab pneumonia.
# Imunisasi vs insidensi
ggplot(df, aes(x = imunisasi, y = insidensi_per_1000)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE) +
labs(title = "Cakupan imunisasi vs Insidensi pneumonia balita", x = "Cakupan imunisasi (%)", y = "Insidensi per 1.000")
## `geom_smooth()` using formula = 'y ~ x'
Hubungan negatif antara cakupan imunisasi dan insidensi pneumonia balita menunjukkan bahwa wilayah dengan cakupan imunisasi yang lebih baik cenderung memiliki kejadian pneumonia yang lebih rendah. Hal ini sejalan dengan peran imunisasi sebagai faktor protektif terhadap infeksi saluran pernapasan.
ggplot(df, aes(x = gizi_kurang, y = insidensi_per_1000)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE) +
labs(title = "Prevalensi gizi kurang vs Insidensi pneumonia balita", x = "Gizi kurang (%)", y = "Insidensi per 1.000")
## `geom_smooth()` using formula = 'y ~ x'
Wilayah dengan prevalensi gizi kurang yang lebih tinggi cenderung memiliki insidensi pneumonia balita yang lebih tinggi. Secara biologis, balita dengan status gizi kurang memiliki daya tahan tubuh yang lebih lemah sehingga lebih rentan terhadap infeksi.
# ---- 4) Ukuran asosiasi (RR/OR/RD/AF_e) via 2x2 ----
# Kita buat paparan biner berdasarkan median (bisa diganti kuartil / cut-off lain)
# Paparan contoh:
# - kepadatan tinggi (>= median) vs rendah
# - imunisasi rendah (< median) vs tinggi (dibuat "low_immu" sebagai paparan risiko)
# - gizi kurang tinggi (>= median) vs rendah
cut_median <- df |>
summarise(
med_kepadatan = median(kepadatan, na.rm = TRUE),
med_imunisasi = median(imunisasi, na.rm = TRUE),
med_gizi = median(gizi_kurang, na.rm = TRUE)
)
cut_median
## # A tibble: 1 × 3
## med_kepadatan med_imunisasi med_gizi
## <dbl> <dbl> <dbl>
## 1 840. 64.8 5.25
df_exp <- df |>
mutate(
exp_kepadatan_tinggi = if_else(kepadatan >= cut_median$med_kepadatan, 1L, 0L),
exp_imunisasi_rendah = if_else(imunisasi < cut_median$med_imunisasi, 1L, 0L),
exp_gizi_tinggi = if_else(gizi_kurang >= cut_median$med_gizi, 1L, 0L)
)
# Fungsi hitung ukuran asosiasi dari agregat:
# a = kasus pada terpapar
# b = non-kasus pada terpapar
# c = kasus pada tidak terpapar
# d = non-kasus pada tidak terpapar
assoc_2x2 <- function(data, exposure_col, kasus_col = "kasus_pn", pop_col = "balita_n") {
x <- data |>
mutate(exposure = .data[[exposure_col]]) |>
group_by(exposure) |>
summarise(
kasus = sum(.data[[kasus_col]], na.rm = TRUE),
pop = sum(.data[[pop_col]], na.rm = TRUE),
.groups = "drop"
) |>
mutate(non_kasus = pop - kasus)
# Pastikan ada 0 dan 1
if (!all(c(0,1) %in% x$exposure)) stop("Exposure harus punya kategori 0 dan 1")
a <- x$kasus[x$exposure == 1]
b <- x$non_kasus[x$exposure == 1]
c <- x$kasus[x$exposure == 0]
d <- x$non_kasus[x$exposure == 0]
Re <- a / (a + b)
Ru <- c / (c + d)
RR <- Re / Ru
OR <- (a * d) / (b * c)
RD <- Re - Ru
AFe <- (RR - 1) / RR
tibble(
exposure = exposure_col,
a = a, b = b, c = c, d = d,
risk_exposed = Re,
risk_unexposed = Ru,
RR = RR,
OR = OR,
RD = RD,
AF_e = AFe
)
}
assoc_kepadatan <- assoc_2x2(df_exp, "exp_kepadatan_tinggi")
assoc_imunisasi <- assoc_2x2(df_exp, "exp_imunisasi_rendah")
assoc_gizi <- assoc_2x2(df_exp, "exp_gizi_tinggi")
assoc_all <- bind_rows(assoc_kepadatan, assoc_imunisasi, assoc_gizi)
assoc_all
## # A tibble: 3 × 11
## exposure a b c d risk_exposed risk_unexposed RR OR
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 exp_kepadat… 49985 1.29e6 42133 1.49e6 0.0373 0.0275 1.36 1.37
## 2 exp_imunisa… 43967 1.61e6 48151 1.17e6 0.0265 0.0397 0.669 0.660
## 3 exp_gizi_ti… 35427 1.28e6 56691 1.50e6 0.0269 0.0365 0.738 0.731
## # ℹ 2 more variables: RD <dbl>, AF_e <dbl>
# Versi tabel rapi untuk laporan
main_table <- df |>
dplyr::select(
kab_kota,
balita_n,
kasus_pn,
kepadatan,
imunisasi,
gizi_kurang,
insidensi_per_1000
) |>
arrange(desc(insidensi_per_1000))
Hasil ukuran asosiasi menunjukkan bahwa wilayah dengan kepadatan penduduk tinggi, cakupan imunisasi rendah, serta prevalensi gizi kurang tinggi memiliki risiko pneumonia balita yang lebih besar dibandingkan wilayah pembandingnya. Nilai risk ratio dan odds ratio yang lebih besar dari satu menunjukkan adanya hubungan positif antara paparan-paparan tersebut dengan kejadian pneumonia balita.
Nilai attributable fraction menunjukkan bahwa sebagian kasus pneumonia balita pada wilayah terpapar secara teoritis dapat dicegah apabila faktor risiko tersebut dapat dikendalikan.
# ---- 6) Pemodelan (Wajib UAS): Poisson rate model + cek overdispersi ----
# Karena outcome berupa count (kasus) dan ada populasi balita berbeda-beda,
# model standar: Poisson dengan offset log(populasi balita).
m_pois <- glm(
kasus_pn ~ kepadatan + imunisasi + gizi_kurang,
family = poisson(link = "log"),
offset = log(balita_n),
data = df
)
summary(m_pois)
##
## Call:
## glm(formula = kasus_pn ~ kepadatan + imunisasi + gizi_kurang,
## family = poisson(link = "log"), data = df, offset = log(balita_n))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.858e+00 2.152e-02 -179.23 <2e-16 ***
## kepadatan 5.716e-05 1.285e-06 44.47 <2e-16 ***
## imunisasi 8.022e-03 3.257e-04 24.63 <2e-16 ***
## gizi_kurang -3.527e-02 1.266e-03 -27.86 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 23601 on 37 degrees of freedom
## Residual deviance: 17733 on 34 degrees of freedom
## AIC: 18092
##
## Number of Fisher Scoring iterations: 5
# Cek overdispersi: jika dispersion >> 1, Poisson mungkin tidak cocok
dispersion <- sum(residuals(m_pois, type = "pearson")^2) / df.residual(m_pois)
dispersion
## [1] 491.401
# Jika overdispersi, pakai Negative Binomial
m_nb <- MASS::glm.nb(
kasus_pn ~ kepadatan + imunisasi + gizi_kurang + offset(log(balita_n)),
data = df
)
summary(m_nb)
##
## Call:
## MASS::glm.nb(formula = kasus_pn ~ kepadatan + imunisasi + gizi_kurang +
## offset(log(balita_n)), data = df, init.theta = 3.52492788,
## link = log)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.931e+00 5.005e-01 -7.855 4e-15 ***
## kepadatan 7.923e-05 3.882e-05 2.041 0.0413 *
## imunisasi 7.261e-03 7.314e-03 0.993 0.3208
## gizi_kurang -1.694e-02 3.149e-02 -0.538 0.5905
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Negative Binomial(3.5249) family taken to be 1)
##
## Null deviance: 46.613 on 37 degrees of freedom
## Residual deviance: 39.819 on 34 degrees of freedom
## AIC: 635.86
##
## Number of Fisher Scoring iterations: 1
##
##
## Theta: 3.525
## Std. Err.: 0.777
##
## 2 x log-likelihood: -625.864
# Bandingkan AIC
AIC(m_pois, m_nb)
## df AIC
## m_pois 4 18091.5529
## m_nb 5 635.8639
# Ekstrak IRR (Incidence Rate Ratio) dari model Poisson / NB
# IRR = exp(beta)
model_to_irr <- function(model) {
broom::tidy(model, conf.int = TRUE, exponentiate = TRUE) |>
dplyr::rename(IRR = estimate, IRR_low = conf.low, IRR_high = conf.high) |>
dplyr::select(term, IRR, IRR_low, IRR_high, p.value)
}
irr_pois <- model_to_irr(m_pois)
irr_nb <- model_to_irr(m_nb)
irr_pois
## # A tibble: 4 × 5
## term IRR IRR_low IRR_high p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.0211 0.0202 0.0220 0
## 2 kepadatan 1.00 1.00 1.00 0
## 3 imunisasi 1.01 1.01 1.01 6.46e-134
## 4 gizi_kurang 0.965 0.963 0.968 8.76e-171
irr_nb
## # A tibble: 4 × 5
## term IRR IRR_low IRR_high p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.0196 0.00732 0.0555 4.00e-15
## 2 kepadatan 1.00 1.00 1.00 4.13e- 2
## 3 imunisasi 1.01 0.992 1.02 3.21e- 1
## 4 gizi_kurang 0.983 0.923 1.05 5.91e- 1
irr_nb |>
dplyr::mutate(
dplyr::across(c(IRR, IRR_low, IRR_high), ~round(.x, 3))
) |>
knitr::kable(
caption = "Hasil Model (IRR) - Negative Binomial",
digits = 3
)
| term | IRR | IRR_low | IRR_high | p.value |
|---|---|---|---|---|
| (Intercept) | 0.020 | 0.007 | 0.056 | 0.000 |
| kepadatan | 1.000 | 1.000 | 1.000 | 0.041 |
| imunisasi | 1.007 | 0.992 | 1.022 | 0.321 |
| gizi_kurang | 0.983 | 0.923 | 1.053 | 0.591 |
# Prediksi rate per 1.000 balita (berdasarkan model NB)
df_pred <- df |>
mutate(
pred_kasus_nb = predict(m_nb, type = "response"),
pred_rate_1000 = (pred_kasus_nb / balita_n) * 1000
)
df_pred |>
dplyr::select(
kab_kota,
kasus_pn,
balita_n,
insidensi_per_1000,
pred_rate_1000
) |>
arrange(desc(insidensi_per_1000)) |>
head(10)
## # A tibble: 10 × 5
## kab_kota kasus_pn balita_n insidensi_per_1000 pred_rate_1000
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Kota Blitar 1088 10844 100. 44.1
## 2 Kota Madiun 756 12271 61.6 43.5
## 3 Sidoarjo 10276 174938 58.7 37.6
## 4 Surabaya 11692 213590 54.7 62.8
## 5 Bondowoso 2701 51028 52.9 26.0
## 6 Bojonegoro 4317 84009 51.4 27.9
## 7 Gresik 4775 103322 46.2 30.4
## 8 Magetan 1772 40454 43.8 32.1
## 9 Bangkalan 3330 77634 42.9 30.8
## 10 Jombang 4171 97394 42.8 30.7
Berdasarkan hasil analisis epidemiologi terhadap kasus pneumonia pada balita di Provinsi Jawa Timur tahun 2022, dapat disimpulkan bahwa kejadian pneumonia balita menunjukkan variasi yang nyata antar kabupaten/kota. Insidensi pneumonia balita tidak tersebar secara merata, dengan beberapa wilayah memiliki risiko yang jauh lebih tinggi dibandingkan wilayah lainnya.
Analisis deskriptif menunjukkan adanya perbedaan proporsi kasus pneumonia balita yang cukup besar antar wilayah, yang mengindikasikan bahwa faktor lingkungan dan karakteristik populasi berperan dalam menentukan risiko kejadian pneumonia. Wilayah dengan insidensi tertinggi tidak selalu merupakan wilayah dengan jumlah kasus absolut terbesar, tetapi merupakan wilayah dengan proporsi kasus yang tinggi terhadap jumlah penduduk balita.
Hasil analisis hubungan dan ukuran asosiasi menunjukkan bahwa kepadatan penduduk yang tinggi, cakupan imunisasi yang rendah, serta prevalensi gizi kurang yang tinggi berasosiasi dengan peningkatan risiko pneumonia balita. Temuan ini diperkuat oleh hasil pemodelan regresi Negative Binomial yang menunjukkan bahwa faktor-faktor tersebut berpengaruh terhadap laju kejadian pneumonia balita setelah mempertimbangkan perbedaan jumlah penduduk balita antar wilayah.
Secara keseluruhan, penelitian ini menunjukkan bahwa pneumonia balita di Jawa Timur merupakan masalah kesehatan masyarakat yang dipengaruhi oleh kombinasi faktor lingkungan dan faktor host, sehingga memerlukan pendekatan pengendalian yang terintegrasi dan berbasis wilayah.
Berdasarkan hasil penelitian dan kesimpulan yang diperoleh, beberapa saran yang dapat diajukan adalah sebagai berikut:
Bagi Dinas Kesehatan dan Pemangku Kebijakan Diperlukan prioritas intervensi pada wilayah dengan insidensi pneumonia balita yang tinggi, khususnya melalui peningkatan cakupan imunisasi dan upaya perbaikan status gizi balita. Wilayah dengan kepadatan penduduk tinggi perlu mendapatkan perhatian khusus dalam pencegahan penularan penyakit infeksi saluran pernapasan.
Bagi Program Kesehatan Balita Penguatan program imunisasi dasar lengkap dan pemantauan status gizi balita secara rutin perlu terus ditingkatkan sebagai upaya pencegahan pneumonia balita. Edukasi kepada orang tua mengenai pencegahan infeksi saluran pernapasan juga menjadi langkah penting.
Bagi Penelitian Selanjutnya Penelitian lanjutan disarankan menggunakan data individual atau data longitudinal untuk memperoleh pemahaman yang lebih mendalam mengenai hubungan sebab-akibat antara faktor risiko dan kejadian pneumonia balita. Selain itu, analisis spasial yang lebih mendalam dapat dilakukan untuk mengidentifikasi klaster wilayah berisiko tinggi.
Penelitian ini diharapkan dapat memberikan kontribusi dalam pemahaman epidemiologi pneumonia balita dan menjadi dasar dalam perencanaan intervensi kesehatan masyarakat berbasis data.
World Health Organization. (2014). Revised WHO classification and treatment of pneumonia in children at health facilities: Evidence summaries. World Health Organization.
World Health Organization. (2023). Pneumonia. https://www.who.int/news-room/fact-sheets/detail/pneumonia
Kementerian Kesehatan Republik Indonesia. (2022). Profil Kesehatan Indonesia Tahun 2022. Jakarta: Kementerian Kesehatan RI.
Kementerian Kesehatan Republik Indonesia. (2021). Pedoman Pencegahan dan Pengendalian Pneumonia pada Balita. Jakarta: Direktorat Jenderal Pencegahan dan Pengendalian Penyakit.
Centers for Disease Control and Prevention. (2022). Principles of epidemiology in public health practice (4th ed.). U.S. Department of Health and Human Services. https://www.cdc.gov/csels/dsepd/ss1978/index.html
Gordis, L. (2014). Epidemiology (5th ed.). Philadelphia: Elsevier Saunders.
Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern epidemiology (3rd ed.). Philadelphia: Lippincott Williams & Wilkins.
Hilbe, J. M. (2011). Negative binomial regression (2nd ed.). Cambridge: Cambridge University Press.
Lawson, A. B. (2018). Bayesian disease mapping: Hierarchical modeling in spatial epidemiology (2nd ed.). Boca Raton: CRC Press.
Pebesma, E., & Bivand, R. (2023). Spatial data science with applications in R. Boca Raton: CRC Press.