Analisis Epidemiologi Kasus Kanker Leher Rahim pada Kota Cimahi Tahun 2017 - 2024

Laporan ini guna menyelesaikan Ujian Akhir Semester Epidemiologi

Dosen Pengampu :
I Gede Mindra Jaya

Shahnaz Putri Dendawijaya, 140610230017
Kelas A
Program Studi Statistika
Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Padjadjaran
2025

abstrak

Kanker leher rahim merupakan salah satu masalah kesehatan masyarakat dengan beban penyakit yang tinggi pada perempuan di Indonesia. Penelitian ini bertujuan untuk menganalisis gambaran epidemiologi kasus kanker leher rahim di Kota Cimahi selama periode tahun 2017–2024 berdasarkan analisis temporal, spasial, serta pemodelan statistik. Penelitian menggunakan desain cross sectional berulang dengan data sekunder yang bersumber dari Open Data Kota Cimahi dan Badan Pusat Statistik. Analisis dilakukan secara deskriptif meliputi jumlah kasus, prevalensi, tren tahunan, serta pemetaan persebaran kasus berdasarkan kecamatan, dan dilanjutkan dengan pemodelan regresi Poisson dan Negative Binomial untuk menganalisis pengaruh waktu dan wilayah terhadap jumlah kasus.

Hasil penelitian menunjukkan bahwa selama periode pengamatan tercatat 57 kasus kanker leher rahim di Kota Cimahi. Jumlah kasus dan prevalensi tertinggi terjadi pada tahun 2017, kemudian cenderung menurun dengan fluktuasi ringan hingga tahun 2024, dengan penurunan paling nyata pada periode 2020–2021. Secara spasial, distribusi kasus tidak merata, dengan Kecamatan Cimahi Selatan menunjukkan prevalensi yang relatif lebih tinggi dibandingkan kecamatan lainnya. Hasil pemodelan menunjukkan adanya overdispersi pada model Poisson sehingga model Negative Binomial memberikan kecocokan yang lebih baik berdasarkan nilai Akaike Information Criterion (AIC).

Kesimpulan penelitian ini menunjukkan bahwa meskipun terdapat tren penurunan kasus kanker leher rahim di Kota Cimahi, perbedaan beban penyakit antar wilayah masih terlihat. Pemodelan statistik memperkuat temuan deskriptif dan dapat digunakan sebagai dasar dalam perencanaan program pencegahan dan deteksi dini yang lebih terarah berbasis wilayah.

Kata kunci: kanker leher rahim, epidemiologi deskriptif, prevalensi, tren temporal, spasial, regresi Poisson, Negative Binomial, Kota Cimahi


PENDAHULUAN

1.1 Latar Belakang

Kanker leher rahim merupakan salah satu masalah kesehatan masyarakat yang memiliki beban tinggi di Indonesia. Berdasarkan data Kementrian Kesehatan, kanker leher rahim menempati peringkat kedua jenis kanker terbanyak pada perempuan di Indonesia dengan sekitar 36.000 kasus baru yang terdiagnosis setiap tahunnya. Tingginya angka kejadian tersebut juga diikuti oleh tingkat fatalitas yang besar, di mana hampir tiga dari lima perempuan yang terdiagnosis kanker leher rahim meninggal dunia akibat penyakit ini. Kondisi ini menunjukkan bahwa kanker leher rahim masih menjadi ancaman serius bagi kesehatan perempuan di Indonesia.

Meskipun kanker leher rahim pada dasarnya merupakan penyakit yang dapat dicegah dan dideteksi lebih dini, tingkat pengetahuan dan kesadaran masyarakat terhadap penyakit ini masih tergolong rendah. Rendahnya pemahaman mengenai menyebabkan banyak kasus baru ditemukan pada stadium lanjut, sehingga peluang keberhasilan pengobatan menjadi lebih kecil. Hal ini turut berkontribusi terhadap tingginya angka kematian akibat kanker leher rahim.

Dalam kajian epidemiologi, analisis deskriptif terhadap jumlah kasus penyakit dari waktu ke waktu memiliki peranan penting untuk menggambarkan beban dan pola kejadian penyakit di suatu wilayah. Kota Cimahi sebagai bagian dari Provinsi Jawa Barat memiliki dinamika penduduk dan pelayanan kesehatan yang dapat memengaruhi jumlah kasus kanker leher rahim yang terlaporkan setiap tahunnya.

Oleh karena itu, penelitian ini bertujuan untuk melakukan analisis epidemiologi terhadap kasus kanker leher rahim di Kota Cimahi selama periode 2017–2024. Analisis difokuskan pada gambaran jumlah kasus dari waktu ke waktu untuk mengetahui tren kejadian kanker leher rahim di wilayah tersebut. Hasil penelitian diharapkan dapat menjadi dasar informasi bagi pemangku kepentingan dalam perencanaan upaya pencegahan, deteksi dini, serta pengendalian kanker leher rahim di tingkat daerah.

1.2 Rumusan Masalah

Berdasarkan latar belakang tersebut, maka rumusan masalah dalam penelitian ini adalah :

  1. Bagaimana gambaran jumlah kasus kanker leher rahim di Kota Cimahi selama periode tahun 2017–2024?

  2. Bagaimana perkembangan (tren) kasus kanker leher rahim di Kota Cimahi dari tahun ke tahun selama periode 2017–2024?

  3. Bagaimana gambaran prevalensi kanker leher rahim di Kota Cimahi selama periode tahun 2017–2024?

  4. Bagaimana persebaran spasial kasus kanker leher rahim di Kota Cimahi berdasarkan kecamatan?

1.3 Tujuan Penelitian

Tujuan umum dari penelitian ini adalah Menganalisis gambaran epidemiologi kasus kanker leher rahim di Kota Cimahi selama periode tahun 2017–2024 melalui analisis temporal dan spasial, untuk tujuan khusunya adalah :

  1. Mendeskripsikan jumlah kasus kanker leher rahim di Kota Cimahi pada setiap tahun selama periode 2017–2024.

  2. Menganalisis tren kejadian kanker leher rahim di Kota Cimahi dari tahun ke tahun selama periode 2017–2024.

  3. Menghitung dan mendeskripsikan prevalensi kanker leher rahim di Kota Cimahi selama periode 2017–2024.

  4. Memetakan persebaran kasus kanker leher rahim di Kota Cimahi berdasarkan wilayah administratif untuk mengidentifikasi pola spasial kejadian penyakit.


TINJAUAN PUSTAKA

2.1 Kanker Leher Rahim

Kanker leher rahim (serviks) adalah keganasan pada leher rahim yang disebabkan oleh infeksi Human Papillomavirus (HPV), yang bisa menular melalui hubungan seksual. Penyakit ini berkembang secara perlahan melalui tahap prakanker sebelum akhirnya menjadi kanker invasif. Kanker leher rahim merupakan salah satu penyebab utama morbiditas dan mortalitas pada perempuan, khususnya di negara berkembang, termasuk Indonesia. Tingginya beban penyakit ini berkaitan dengan keterbatasan akses deteksi dini, rendahnya kesadaran masyarakat, serta faktor pelayanan kesehatan.

2.2 Konsep Dasar Epidemiologi

Epidemiologi merupakan ilmu yang mempelajari distribusi dan determinan kejadian penyakit dalam populasi serta penerapannya untuk pengendalian masalah kesehatan. Dalam konteks kanker leher rahim, pendekatan epidemiologi berperan penting dalam memahami pola kejadian penyakit berdasarkan waktu, tempat, dan populasi.

2.2.1 Agen Host Environment

Pendekatan ini digunakan untuk menjelaskan interaksi antara faktor penyebab penyakit, individu yang berisiko, dan lingkungan yang memengaruhi terjadinya penyakit.

Agent
Agen utama penyebab kanker leher rahim adalah Human Papillomavirus (HPV), terutama tipe berisiko tinggi seperti HPV-16 dan HPV-18 yang bertanggung jawab atas lebih dari 70% kasus kanker serviks. Infeksi HPV yang persisten dapat menyebabkan perubahan sel serviks yang berujung pada kanker.

Host
Faktor host meliputi karakteristik individu perempuan, seperti usia, status imun, perilaku seksual, serta tingkat pengetahuan dan kesadaran terhadap deteksi dini kanker leher rahim. Meskipun faktor-faktor ini tidak dianalisis secara langsung dalam penelitian ini, keberadaan populasi perempuan menjadi dasar dalam pengukuran prevalensi penyakit.

Environment
Faktor lingkungan mencakup akses terhadap fasilitas pelayanan kesehatan, ketersediaan program skrining, serta kondisi sosial dan wilayah tempat tinggal. Dalam penelitian ini, faktor lingkungan direpresentasikan melalui pembagian wilayah administratif (kecamatan dan puskesmas) yang digunakan untuk analisis spasial persebaran kasus.

2.3 Ukuran Frekuensi Penyakit

Ukuran frekuensi penyakit digunakan untuk menggambarkan besarnya masalah kesehatan dalam suatu populasi.

2.3.1 Jumlah Kasus

Jumlah kasus merupakan indikator dasar dalam epidemiologi deskriptif yang menunjukkan banyaknya penderita suatu penyakit dalam periode tertentu. Jumlah Kasus ini dicatat berdasarkan puskesmas yang ada di setiap kecamatan Kota Cimahi, di rentang 2017 - 2024. Analisis jumlah kasus kanker leher rahim dari tahun ke tahun digunakan untuk melihat beban penyakit dan perubahan kejadian secara temporal.

2.3.2 Prevalensi

Prevalensi adalah proporsi individu dalam suatu populasi yang menderita penyakit pada suatu waktu atau periode tertentu. Prevalensi kanker leher rahim dalam penelitian ini dihitung dengan membandingkan jumlah kasus kanker leher rahim dengan total populasi perempuan di Kota Cimahi, berdasarkan kecamatannya. Pengukuran prevalensi memberikan gambaran tingkat beban penyakit dalam populasi perempuan di suatu wilayah.

2.4 Desain Studi

Penelitian ini menggunakan desain cross-sectional berulang, dengan pengamatan jumlah kasus dan prevalensi kanker leher rahim di Kota Cimahi selama periode 2017–2024. Variabel utama penelitian adalah jumlah kasus kanker leher rahim, sedangkan variabel independen meliputi tahun pengamatan dan kecamatan. Populasi penelitian adalah seluruh perempuan yang berdomisili di Kota Cimahi, dengan populasi terjangkau berupa seluruh kasus kanker leher rahim yang tercatat dalam Open Data Kota Cimahi. Penelitian ini menggunakan total sampling, karena seluruh data yang tersedia digunakan dalam analisis. Potensi bias meliputi bias informasi akibat penggunaan data sekunder, bias pelaporan karena kemungkinan under-diagnosis, serta bias ekologis karena analisis dilakukan pada tingkat agregat wilayah.


METODOLOGI PENELITIAN

3.1 Sumber Data

Data yang digunakan dalam penelitian ini merupakan data sekunder yang diperoleh dari Open Data Kota Cimahi dan Badan Pusat Statistik. Data tersebut mencakup informasi kasus kanker leher rahim yang tercatat di fasilitas pelayanan kesehatan di Kota Cimahi selama periode tahun 2017–2024. Selain itu, digunakan data jumlah populasi perempuan sebagai penyebut dalam perhitungan prevalensi.

3.2 Variabel Penelitian

Variabel yang digunakan dalam penelitian ini bersifat deskriptif dan disesuaikan dengan ketersediaan data. Adapun variabel penelitian meliputi:

Tahun
Tahun pengamatan kejadian kanker leher rahim dari 2017 hingga 2024.

Kecamatan
Wilayah administratif tempat kasus kanker leher rahim dilaporkan. Terdapat 3 kecamatan, yaitu Cimahi Utara, Cimahi Selatan, dan Cimahi Tengah.

Puskesmas
Fasilitas pelayanan kesehatan yang melaporkan kasus kanker leher rahim. Pada data ini terdapat 6 puskesmas di Cimahi Selatan yaitu puskesmas cimahi selatan, cibeureum, melong asih, cibeber, leuwigajah, melong tengah. Terdapat 3 puskesmas di Cimahi Tengah yaitu puskesmas cimahi tengah, cigugur tengah, dan padasuka. Terdapat 4 puskesmas di Cimaho Utara yaitu puskesmas cimahi utara, pasirkaliki, cipageran, citeureup.

Jumlah Kasus Kanker Lahir Rahim
Jumlah kasus kanker leher rahim yang tercatat pada masing-masing tahun dan wilayah.

Populasi Perempuan
Jumlah penduduk perempuan pada masing-masing kecamatan dan tahun yang digunakan sebagai dasar perhitungan prevalensi. Berdasarkan data sensus pada Badan Pusat Statistik.

3.3 Metode Analisis Data

Analisis data dilakukan secara deskriptif dengan tahapan sebagai berikut:

3.3.1 Analisis Statistik Deskriptif

Analisis statistik deskriptif digunakan untuk menggambarkan besarnya kasus kanker leher rahim di Kota Cimahi. Analisis ini meliputi: 1. Penyajian jumlah kasus kanker leher rahim per tahun, 2. Visualisasi data dalam bentuk tabel dan grafik untuk melihat pola kejadian penyakit.

3.3.2 Analisis Prevalensi

Prevalensi kanker leher rahim dihitung untuk menggambarkan proporsi kasus dalam populasi perempuan. Prevalensi diperoleh dengan membandingkan jumlah kasus kanker leher rahim dengan total populasi perempuan pada tahun yang sama. Hasil perhitungan prevalensi digunakan untuk melihat tingkat beban penyakit di Kota Cimahi selama periode pengamatan.

Disajikan Prevalensi dengan bentuk grafik distribusi dan tabel tiap wilayah, agar dapat menjadi perbandingan untuk tiap wilayah administratif di Kota Cimahi.

3.3.3 Analisis Spasial

Analisis spasial dilakukan dengan memetakan prevalensi kanker leher rahim berdasarkan wilayah administratif kecamatan dan per tahun. Pemetaan bertujuan untuk memvisualisasikan persebaran kasus dan mengidentifikasi wilayah dengan jumlah atau prevalensi kasus yang relatif lebih tinggi. Hasil pemetaan diharapkan dapat memberikan gambaran awal wilayah prioritas dalam upaya pencegahan dan deteksi dini kanker leher rahim.

3.3.4 Model Regresi Poisson

Model regresi Poisson digunakan sebagai model awal untuk menganalisis hubungan antara jumlah kasus kanker leher rahim dengan variabel penjelas, yaitu tahun dan kecamatan. Model ini mengasumsikan bahwa nilai harapan dan varians dari variabel respon adalah sama.

Secara matematis, model Poisson dapat dituliskan sebagai berikut:

\[ Y_i \sim \text{Poisson}(\mu_i) \]

dengan fungsi hubungan logaritmik:

\[ \log(\mu_i) = \beta_0 + \beta_1 X_{1i} + \beta_2 X_{2i} \]

di mana:

  • \(Y_i\) : jumlah kasus kanker leher rahim ke-\(i\),

  • \(\mu_i\) : nilai harapan jumlah kasus,

  • \(X_{1i}\) : variabel tahun,

  • \(X_{2i}\) : variabel kecamatan,

  • \(\beta_0, \beta_1, \beta_2\) : parameter regresi.

pada penelitian ini Kecamatan Cimahi Selatan akan menjadi dasar perbandingan yang diletakkan pada Bo.Evaluasi kecocokan model dilakukan melalui nilai deviance, parameter dispersi, serta Akaike Information Criterion (AIC).

3.3.5 Model Regresi Negative Binomial

Apabila pada model Poisson ditemukan kondisi overdispersi, yaitu varians data lebih besar daripada nilai rata-ratanya, maka digunakan model regresi Negative Binomial sebagai alternatif. Model ini merupakan pengembangan dari regresi Poisson dengan menambahkan parameter dispersi untuk mengakomodasi variasi data yang lebih besar.

Bentuk Umum :

\[ Y_i \sim \text{NB}(\mu_i, \theta) \]

dengan fungsi hubungan logaritmik:

\[ \log(\mu_i) = \beta_0 + \beta_1 X_{1i} + \beta_2 X_{2i} \]

Model Negative Binomial memberikan estimasi parameter yang lebih stabil pada data dengan overdispersi dan dievaluasi menggunakan nilai AIC untuk dibandingkan dengan model Poisson.

3.4 Alur Kerja Penelitian

Alur kerja penelitian ini dilakukan melalui beberapa tahapan, yaitu:

  1. Pengumpulan data kasus kanker leher rahim dari Open Data Kota Cimahi dan populasi perempuan dari Badan Pusat Statistik.

  2. Analisis statistik deskriptif untuk menggambarkan jumlah kasus kanker leher rahim.

  3. Perhitungan prevalensi kanker leher rahim berdasarkan populasi perempuan.

  4. Pemetaan spasial kasus kanker leher rahim berdasarkan kecamatan.

  5. Interpretasi hasil analisis dan penyusunan kesimpulan penelitian.


HASIL DAN PEMBAHASAN

4.1 Gambaran Umum Kasus Kanker Leher Rahim di Kota Cimahi

Selama periode tahun 2017–2024, tercatat sebanyak 57 kasus kanker leher rahim di Kota Cimahi berdasarkan data Open Data Kota Cimahi. Jumlah kasus tersebut menunjukkan variasi antar tahun dengan kecenderungan penurunan setelah tahun 2017 dan fluktuasi pada tahun-tahun berikutnya. Analisis statistik deskriptif dilakukan untuk memberikan gambaran awal mengenai distribusi kasus kanker leher rahim pada masing-masing tahun pengamatan.

4.2 Analisis Statistik Deskriptif

Tahapan ini akan menyajikan statistik deskriptif jumlah kasus kanker leher rahim per wilayah (kecamatan/puskesmas) pada setiap tahun pengamatan.

library(knitr)

tabel_stat <- data.frame(
  Tahun = c(2017,2018,2019,2020,2021,2022,2023,2024),
  Mean = c(2.23,0.54,0.38,0.08,0.08,0.38,0.23,0.46),
  Median = c(1,0,0,0,0,0,0,0),
  SD = c(2.83,1.20,0.77,0.28,0.28,1.39,0.44,1.13),
  Min = c(0,0,0,0,0,0,0,0),
  Max = c(8,4,2,1,1,5,1,4)
)

kable(
  tabel_stat,
  caption = "Statistik Deskriptif Jumlah Kasus Kanker Leher Rahim per Tahun"
)
Statistik Deskriptif Jumlah Kasus Kanker Leher Rahim per Tahun
Tahun Mean Median SD Min Max
2017 2.23 1 2.83 0 8
2018 0.54 0 1.20 0 4
2019 0.38 0 0.77 0 2
2020 0.08 0 0.28 0 1
2021 0.08 0 0.28 0 1
2022 0.38 0 1.39 0 5
2023 0.23 0 0.44 0 1
2024 0.46 0 1.13 0 4

Rata-rata jumlah kasus tertinggi terjadi pada tahun 2017, dengan nilai mean sebesar 2,23 kasus, diikuti oleh standar deviasi yang relatif besar (2,83). Hal ini menunjukkan adanya ketimpangan distribusi kasus antarwilayah pada tahun tersebut. Pada tahun-tahun selanjutnya, nilai median yang konsisten sebesar 0 mengindikasikan bahwa sebagian besar wilayah tidak melaporkan kasus kanker leher rahim, sementara kasus terkonsentrasi pada wilayah tertentu. Penurunan nilai mean pada periode 2020–2021 kemungkinan berkaitan dengan gangguan pelayanan kesehatan dan pencatatan kasus pada masa pandemi COVID-19.

4.3 Analisis Distribusi Jumlah Kasus Kanker Leher Rahim

4.3.1 Gambaran Distribusi Jumlah Kasus Per Tahun

Perbandingan jumlah kasus kanker leher rahim dapat dilihat melalui diagram batang. Chart ini memperlihatkan visualisasi mudah per tahunnnya.

Berdasarkan bar chart jumlah kasus kanker leher rahim per tahun di Kota Cimahi, terlihat bahwa jumlah kasus tertinggi terjadi pada tahun 2017, yang menunjukkan beban paling besar pada awal periode pengamatan. Setelah itu, jumlah kasus mengalami penurunan cukup signifikan pada tahun 2018 dan cenderung lebih rendah pada tahun-tahun berikutnya. Pada periode 2019–2024, jumlah kasus relatif stabil dengan sedikit fluktuasi, meskipun terdapat peningkatan kembali pada tahun 2024. Sementara itu, jumlah kasus terendah tercatat pada tahun 2020 dan 2021. Secara umum, grafik ini menunjukkan tren penurunan kasus kanker leher rahim setelah tahun 2017 dengan kondisi yang relatif terkendali pada tahun-tahun selanjutnya.

Distribusi jumlah kasus kanker leher rahim juga divisualisasikan menggunakan boxplot untuk melihat sebaran dan pencilan data pada setiap tahun pengamatan.

Boxplot tahun 2017 menunjukkan bahwa jumlah kasus kanker leher rahim di Kota Cimahi memiliki sebaran yang cukup lebar dengan median berada pada nilai yang relatif rendah, namun terdapat beberapa nilai ekstrem di bagian atas. Hal ini mengindikasikan bahwa meskipun sebagian besar wilayah atau unit pengamatan memiliki jumlah kasus yang rendah hingga sedang, terdapat beberapa wilayah dengan jumlah kasus yang jauh lebih tinggi. Keberadaan nilai maksimum yang tinggi mencerminkan bahwa tahun 2017 merupakan periode dengan tingkat kasus tertinggi selama rentang pengamatan, sekaligus menunjukkan ketimpangan distribusi kasus antarwilayah pada tahun tersebut.

Boxplot tahun 2020 memperlihatkan bahwa sebagian besar data terkonsentrasi di sekitar nilai nol dengan rentang antar kuartil yang sangat sempit, serta median yang mendekati nol. Hal ini menunjukkan rendahnya variasi dan jumlah kasus kanker leher rahim pada tahun tersebut di Kota Cimahi. Meskipun terdapat beberapa titik pencilan, nilainya relatif kecil dibandingkan tahun 2017. Secara keseluruhan, pola ini menegaskan bahwa tahun 2020 merupakan tahun dengan jumlah kasus terendah selama periode pengamatan, yang mengindikasikan penurunan signifikan kasus dibandingkan tahun-tahun lainnya.

4.4 Analisis Distribusi Prevalensi Kanker Leher Rahim

4.4.1 Distribusi Prevalensi per Kecamatan

Angka Prevalensi dihitung setiap kecamatan dengan membagikan angka kasus dengan populasi perempuan di kecamatan tersebut. Maka didapatkan hasil perhitungan prevalensi sebagai berikut :

library(knitr)

tabel_preval <- data.frame(
  Kecamatan = c("Cimahi Selatan","Cimahi Utara","Cimahi Tengah"),
  "2017" = c(0.013,0.012,0.005),
  "2018" = c(0.004,0.001,0.002),
  "2019" = c(0.002,0.002,0.001),
  "2020" = c(0,0.001,0),
  "2021" = c(0,0.001,0),
  "2022" = c(0.004,0,0),
  "2023" = c(0.001,0.001,0.001),
  "2024" = c(0.004,0,0.001)
)

kable(
  tabel_preval,
  caption = "Analisis Prevalensi Per Tahun"
)
Analisis Prevalensi Per Tahun
Kecamatan X2017 X2018 X2019 X2020 X2021 X2022 X2023 X2024
Cimahi Selatan 0.013 0.004 0.002 0.000 0.000 0.004 0.001 0.004
Cimahi Utara 0.012 0.001 0.002 0.001 0.001 0.000 0.001 0.000
Cimahi Tengah 0.005 0.002 0.001 0.000 0.000 0.000 0.001 0.001

Distribusi kasus dan prevalensi menunjukkan adanya variasi antar kecamatan. Beberapa kecamatan memiliki jumlah kasus dan prevalensi yang relatif lebih tinggi dibandingkan wilayah lainnya, yang mengindikasikan adanya perbedaan beban penyakit secara geografis di Kota Cimahi.

4.4.1 Gambaran Prevalensi Tahunan

Perbandingan hasil prevalensi per tahun dilakukan dengan diagram batang, agar lebih mudah secara visualisasi.

Berdasarkan chart tersebut, Prevalensi tertinggi terjadi pada tahun 2017, yang menunjukkan beban kasus kanker leher rahim paling besar dibandingkan tahun-tahun lainnya. Setelah tahun 2017, prevalensi mengalami penurunan tajam pada 2018 dan cenderung berada pada tingkat yang lebih rendah hingga tahun-tahun berikutnya. Pada periode 2019–2024, prevalensi relatif stabil dengan variasi kecil, meskipun terdapat sedikit peningkatan pada beberapa tahun tertentu. Sementara itu, prevalensi terendah tampak pada tahun 2020 dan 2021. Secara umum, pola ini mengindikasikan bahwa setelah puncak kasus pada tahun 2017, prevalensi kanker leher rahim di Kota Cimahi cenderung menurun dan terkendali pada tahun-tahun selanjutnya.

Selama periode pengamatan diperoleh ringkasan prevalensi sebagai berikut :

library(knitr)

tabel_ringkas <- data.frame(
  Ringkasan = c("Total Kasus","Rata rata Prevalensi Tahunan","Prevalensi Tertinggi","Prevalensi Terendah","Standar Deviasi Prevalensi","Koefisien Variasi"),
  Nilai = c("57 Kasus",0.003,"0.01 (Tahun 2017)","0 (Tahun 2020)",0.003,"127.85%")
)

kable(
  tabel_ringkas,
  caption = "Ringkasan Analisis Prevalensi"
)
Ringkasan Analisis Prevalensi
Ringkasan Nilai
Total Kasus 57 Kasus
Rata rata Prevalensi Tahunan 0.003
Prevalensi Tertinggi 0.01 (Tahun 2017)
Prevalensi Terendah 0 (Tahun 2020)
Standar Deviasi Prevalensi 0.003
Koefisien Variasi 127.85%

Prevalensi tertinggi pada tahun 2017 menunjukkan beban penyakit yang relatif lebih besar pada awal periode pengamatan. Nilai koefisien variasi yang tinggi (>100%) mengindikasikan fluktuasi prevalensi yang cukup besar antar tahun, yang dapat dipengaruhi oleh variasi jumlah kasus, perubahan populasi perempuan, serta faktor pencatatan dan pelaporan kasus.

4.5 Analisis Tren Kanker Leher Rahim

4.5.1 Grafik Tren Jumlah Kasus

Grafik tren menunjukkan penurunan jumlah kasus yang cukup tajam dari tahun 2017 hingga 2020, diikuti oleh peningkatan kembali pada tahun 2022–2024. Pola ini mencerminkan dinamika kejadian penyakit serta kemungkinan pengaruh faktor eksternal seperti pandemi terhadap pelayanan kesehatan.

4.5.2 Grafik Tren Prevalensi

Tren prevalensi mengikuti pola yang relatif serupa dengan jumlah kasus, dengan puncak prevalensi pada tahun 2017 dan nilai terendah pada tahun 2020. Hal ini menunjukkan bahwa perubahan prevalensi terutama dipengaruhi oleh fluktuasi jumlah kasus dibandingkan perubahan populasi perempuan.

4.6 Peta Spasial Prevalensi

Peta spsial akan memberikan visualisasi yang lebih jelas terhadap pengelompokan prevalensi berdasarkan wilayah dan tahun selama periode pengamatan.

Peta prevalensi kanker leher rahim di Kota Cimahi menunjukkan adanya variasi beban penyakit antar kecamatan, dengan prevalensi tertinggi secara konsisten teridentifikasi di Kecamatan Cimahi Selatan. Temuan ini mengindikasikan bahwa wilayah tersebut memiliki proporsi kasus kanker leher rahim yang relatif lebih besar dibandingkan jumlah populasi perempuannya, sehingga berpotensi mencerminkan kombinasi faktor kepadatan penduduk, akses dan pemanfaatan layanan kesehatan, serta perbedaan tingkat deteksi kasus. Dari sudut pandang program pemerintah daerah, hasil pemetaan ini memberikan dasar penting bagi penentuan wilayah prioritas intervensi, khususnya dalam penguatan program skrining dan deteksi dini kanker leher rahim seperti IVA atau Pap smear, peningkatan edukasi kesehatan reproduksi, serta optimalisasi peran puskesmas di wilayah Cimahi Selatan. Dengan pendekatan berbasis wilayah, upaya pencegahan dan pengendalian kanker leher rahim diharapkan dapat dilakukan secara lebih terarah dan efisien, sehingga berkontribusi pada penurunan beban penyakit secara keseluruhan di Kota Cimahi.

4.7 Pemodelan

4.7.1 Model Poisson

Pemodelan awal menggunakan model Poisson. Regresi Poisson digunakan karena variabel respon berupa jumlah kasus kanker leher rahim yang bersifat diskrit dan merupakan data hitung (count data). Model ini mengasumsikan bahwa jumlah kejadian mengikuti distribusi Poisson dengan rata-rata yang sama dengan varians serta observasi saling independen.

Proses fitting model dilakukan menggunakan metode Maximum Likelihood Estimation (MLE). Evaluasi performa model dilakukan menggunakan Akaike Information Criterion (AIC), di mana nilai AIC yang lebih kecil menunjukkan model yang lebih baik.

data <- read.csv("Dataepidem.csv")

model_poisson <- glm(
  jumlah ~ tahun + kecamatan,
  family = poisson,
  data = data
)

summary(model_poisson)
## 
## Call:
## glm(formula = jumlah ~ tahun + kecamatan, family = poisson, data = data)
## 
## Coefficients:
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            682.50865  138.10895   4.942 7.74e-07 ***
## tahun                   -0.33813    0.06841  -4.943 7.70e-07 ***
## kecamatanCIMAHI TENGAH  -0.57536    0.37730  -1.525    0.127    
## kecamatanCIMAHI UTARA   -0.28768    0.30618  -0.940    0.347    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 207.71  on 103  degrees of freedom
## Residual deviance: 176.05  on 100  degrees of freedom
## AIC: 241.73
## 
## Number of Fisher Scoring iterations: 6
dispersion <- sum(residuals(model_poisson, type = "pearson")^2) /
  model_poisson$df.residual
dispersion
## [1] 3.21206

Hasil estimasi menunjukkan bahwa variabel tahun berpengaruh signifikan terhadap jumlah kasus, sedangkan perbedaan antar kecamatan tidak signifikan secara statistik. Namun, evaluasi lebih lanjut menunjukkan adanya overdispersi pada data, sehingga asumsi model Poisson tidak sepenuhnya terpenuhi dan hasil inferensial perlu ditafsirkan secara hati-hati. Oleh karena itu, analisis dilanjutkan menggunakan model alternatif yang lebih sesuai.

4.7.2 Model Negative Binomial

Model Negative Binomial digunakan karena data jumlah kasus bersifat count dan menunjukkan adanya overdispersion, yaitu varians yang lebih besar dibandingkan rata-rata. Model ini merupakan pengembangan dari regresi Poisson yang mampu mengakomodasi variasi data yang berlebih. Estimasi parameter dilakukan menggunakan metode Maximum Likelihood Estimation (MLE) dengan asumsi observasi saling independen dan hubungan log-linear antara variabel penjelas dan nilai harapan jumlah kasus.

library(MASS)
data <- read.csv("Dataepidem.csv")
model_nb <- glm.nb(
  jumlah ~ tahun + kecamatan,
  data = data
)

summary(model_nb)
## 
## Call:
## glm.nb(formula = jumlah ~ tahun + kecamatan, data = data, init.theta = 0.2155653394, 
##     link = log)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)  
## (Intercept)            502.5938   235.9558   2.130   0.0332 *
## tahun                   -0.2490     0.1168  -2.132   0.0330 *
## kecamatanCIMAHI TENGAH  -0.6754     0.6845  -0.987   0.3238  
## kecamatanCIMAHI UTARA   -0.5383     0.6101  -0.882   0.3776  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(0.2156) family taken to be 1)
## 
##     Null deviance: 63.416  on 103  degrees of freedom
## Residual deviance: 56.181  on 100  degrees of freedom
## AIC: 186.83
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  0.2156 
##           Std. Err.:  0.0772 
## 
##  2 x log-likelihood:  -176.8350

Hasil pemodelan menggunakan model Negative Binomial menunjukkan bahwa variabel waktu (tahun) berpengaruh signifikan terhadap jumlah kasus, yang mengindikasikan adanya perubahan jumlah kasus dari tahun ke tahun. Sementara itu, variabel kecamatan tidak menunjukkan pengaruh yang signifikan secara statistik, sehingga perbedaan jumlah kasus antar kecamatan relatif tidak bermakna setelah mengontrol faktor waktu. Model ini memberikan kecocokan yang lebih baik terhadap data dibandingkan model Poisson, sehingga hasil estimasi yang diperoleh lebih reliabel.

Model ini digunakan untuk mengidentifikasi pengaruh faktor waktu dan perbedaan wilayah terhadap jumlah kasus secara lebih akurat dan reliabel. Selain itu, model ini memungkinkan peneliti memperoleh estimasi dan inferensi statistik yang valid sebagai dasar analisis pola temporal serta evaluasi kebijakan dan program kesehatan yang berkaitan dengan pencegahan dan deteksi dini.


KESIMPULAN DAN SARAN

5.1 Kesimpulan

Berdasarkan hasil analisis epidemiologi terhadap kasus kanker leher rahim di Kota Cimahi selama periode tahun 2017–2024, dapat disimpulkan bahwa jumlah kasus dan prevalensi kanker leher rahim menunjukkan tren yang cenderung menurun dari tahun ke tahun, meskipun masih terjadi fluktuasi pada beberapa periode pengamatan. Tahun 2017 merupakan tahun dengan jumlah kasus dan prevalensi tertinggi, yang mencerminkan beban penyakit terbesar selama periode studi. Secara spasial, distribusi kasus dan prevalensi tidak merata antar kecamatan, dengan Kecamatan Cimahi Selatan secara konsisten menunjukkan dominasi kasus dan prevalensi yang lebih tinggi dibandingkan wilayah lainnya. Temuan ini mengindikasikan adanya perbedaan beban penyakit secara geografis di Kota Cimahi dan menegaskan pentingnya pendekatan epidemiologi deskriptif berbasis waktu dan wilayah dalam memahami pola kejadian kanker leher rahim.

Selain analisis deskriptif, penelitian ini juga menerapkan pemodelan regresi binomial negative untuk menganalisis pola jumlah kasus kanker leher rahim sebagai data bertipe count. Hasil pemodelan menunjukkan bahwa jumlah kasus memiliki kecenderungan perubahan yang signifikan secara temporal, dengan arah koefisien yang sejalan dengan tren penurunan kasus pada periode pengamatan. Penggunaan model Binomial Negative dinilai sesuai karena karakteristik data berupa jumlah kejadian dan estimasi parameter dilakukan menggunakan metode Maximum Likelihood Estimation (MLE). Evaluasi model berdasarkan kriteria informasi (AIC) menunjukkan bahwa model mampu merepresentasikan pola data secara memadai, sehingga dapat digunakan sebagai pendekatan awal dalam memahami dinamika kejadian kanker leher rahim di Kota Cimahi.

5.2 Saran

Berdasarkan hasil penelitian, disarankan agar pemerintah daerah dan pemangku kepentingan terkait dapat memanfaatkan hasil analisis ini sebagai dasar dalam penentuan wilayah prioritas program pencegahan dan pengendalian kanker leher rahim, khususnya di Kecamatan Cimahi Selatan. Upaya yang dapat dilakukan meliputi penguatan program skrining dan deteksi dini melalui pelayanan IVA atau Pap smear di tingkat puskesmas, peningkatan edukasi kesehatan reproduksi bagi perempuan usia berisiko, serta penguatan sistem pencatatan dan pelaporan kasus agar data yang dihasilkan lebih akurat dan berkesinambungan. Selain itu, penelitian selanjutnya disarankan untuk mengintegrasikan faktor risiko individu dan sosial ekonomi agar analisis yang dihasilkan dapat memberikan gambaran yang lebih komprehensif mengenai determinan kejadian kanker leher rahim.


REFERENSI

  1. Kementerian Kesehatan Republik Indonesia. (n.d.). Kanker Serviks (Kanker Leher Rahim). Ayo Sehat – Kementerian Kesehatan RI. https://ayosehat.kemkes.go.id/topik-penyakit/neoplasma/kanker-serviks-leher-rahim

  2. Akib, A., Wahyuni, S., Rukina, R., Pammu, R., Wahyuni, R., Lele, F., & Tunggadewi, A. P. (2024). Peningkatan pengetahuan dan deteksi dini kanker leher rahim pada wanita usia subur melalui pemeriksaan IVA. Abdimas Polsaka, 3(2). https://doi.org/10.35816/abdimaspolsaka.v3i2.82

  3. Sunarti, N.T.S. Deteksi Dini Kanker Serviks: Studi Cross Sectional pada Ibu Rumah Tangga di Pedesaan. 2016.

  4. Dewanti, N.P.P.; et al. Perbandingan Regresi Zero Inflated Poisson (ZIP) dan Regresi Zero Inflated Negative Binomial (ZINB) pada Data Overdispersion (Studi Kasus: Angka Kematian Ibu di Provinsi Bali). E-Jurnal Matematika 2016.

  5. Tiara, Y.; et al. Overdispersion Handling in Poisson Regression Model by Applying Negative Binomial Regression. Barekeng 2023. https://doi.org/xxxxx

  6. Fauziah, D.; et al. Early Detection of Breast and Cervical Cancer of the Residents of Proppo Pamekasan District. 2021. https://doi.org/xxxxx

  7. Author(s). A New Mixed Negative Binomial Regression Model to Analyze Factors Influencing the Number of Patients with Respiratory Disease and Long-Term Effects of Lung Cancer. Year. https://doi.org/xxxxx

  8. Musunuru, A.; et al. Poisson and Negative Binomial Regression Analysis. 2020.

  9. Espinoza, E.; et al. Modeling the Count Data of Public Health Service Visits with Overdispersion Problem by Using Negative Binomial Regression. 2021. https://doi.org/xxxxx

  10. Setiyawati, N.; et al. Prevention of Cervical Cancer among Mother in Yogyakarta, Indonesia. Year. https://doi.org/xxxxx

  11. Agustiansyah, P. Prevention of Cervical Cancer. Year. https://doi.org/xxxxx

  12. Nuranna, L. See and Treat: Cervical Cancer Prevention Strategy in Indonesia with VIA-DoVIA Screening and Prompt Treatment. Year. https://doi.org/xxxxx

  13. Al-Manji, A.; et al. Predicting Mosquito-Borne Disease Outbreaks Using Poisson and Negative Binomial Models: A Comparative Study. Journal of Infection and Public Health 2025. https://doi.org/xxxxx

  14. Agustina, W.; et al. Determinant Factors of Behavior of Women of Reproductive Age on Early Detection of Cervical Cancer. KESANS International Journal of Health and Science 2023. https://doi.org/xxxxx

  15. Dewi, Y.S.; et al. Comparison of Bivariate Negative Binomial Regression Models for Handling Overdispersion. International Journal of Applied Mathematics and Statistics 2017.

  16. Adyani, K.; et al. Factors That Influence the Participation among Women in Inspection Visual Acetic Acid (IVA) Test. 2020. https://doi.org/xxxxx

  17. Putri, G.N.; et al. Comparing Poisson–Inverse Gaussian Model and Negative Binomial Model on Case Study: Horseshoe Crabs Data. 2020. https://doi.org/xxxxx

  18. Asrina, A.; et al. Update Terbaru Kanker Serviks di Indonesia. Obat 2025. https://doi.org/xxxxx

  19. Sutrisno; et al. Elevated Body Mass Index as a Predictor of Cervical Cancer and Precancerous Lesions. Medical Science Monitor 2025. https://doi.org/xxxxx

  20. Peprah, S.; et al. A Spatiotemporal Analysis of Invasive Cervical Cancer Incidence in the State of Maryland between 2003 and 2012. Cancer Causes & Control 2018. https://doi.org/xxxxx

  21. Iriansyah, M.I.; et al. Profil Pasien Kanker Serviks di Rumah Sakit Ibnu Sina Makassar Tahun 2021 sampai dengan Tahun 2023. Galenical 2025. https://doi.org/xxxxx


LAMPIRAN

Dashboard Analisis Epidemiologi Kasus Kanker Leher Rahim di Kota Cimahi Tahun 2017 - 2024 = https://shahnazdendawijaya.shinyapps.io/DashboardAnalisisKankerLeherRahimKotaCimahi/

Link Video Penjelasan Project = https://youtu.be/i8llrw1aDOI?si=r2Laft9ufBnlKzH4

Full Syntax Dashboard R = https://drive.google.com/file/d/1cZk3PNsceRUzUC1yJcv98zTUqPwa6gZ1/view?usp=sharing

Data yang digunakan

data <- read.csv("Dataepidem.csv")
data
library(knitr)

tabel_populasi <- data.frame(
  Kecamatan = c("CIMAHI SELATAN", "CIMAHI TENGAH", "CIMAHI UTARA"),
  Populasi_Perempuan = c(119354, 80188, 82033)
)

kable(
  tabel_populasi,
  caption = "Populasi Perempuan Kota Cimahi Berdasarkan Sensus BPS"
)
Populasi Perempuan Kota Cimahi Berdasarkan Sensus BPS
Kecamatan Populasi_Perempuan
CIMAHI SELATAN 119354
CIMAHI TENGAH 80188
CIMAHI UTARA 82033

Syntax Analisis menggunakan software R

Syntax statistif deskriptif =

output$summary_stats <- DT::renderDataTable({
  summary_data <- data_processed %>%
    dplyr::group_by(Tahun) %>%
    dplyr::summarise(
      Mean   = round(mean(Jumlah, na.rm = TRUE), 2),
      Median = as.character(as.integer(median(Jumlah, na.rm = TRUE))),
      SD     = round(sd(Jumlah, na.rm = TRUE), 2),
      Min    = as.character(as.integer(min(Jumlah, na.rm = TRUE))),
      Max    = as.character(as.integer(max(Jumlah, na.rm = TRUE))),
      .groups = "drop"
    )
})
    
    DT::datatable(
      summary_data,
      options = list(
        dom = 't',
        autoWidth = FALSE,
        columnDefs = list(
          list(className = 'dt-center', targets = 1:5),
          list(width = '80px', targets = 0),
          list(width = '90px', targets = 1:5)
        )
      ),
      rownames = FALSE
    )
  })

Syntax Boxplot dan Histogram =

  output$desc_plot <- renderPlotly({
    req(input$desc_tahun, input$desc_plot_type)
    
    df <- data_processed %>%
      dplyr::filter(Tahun == input$desc_tahun, !is.na(Jumlah))
    
    validate(
      need(nrow(df) > 0, "Data tidak tersedia untuk tahun ini.")
    )
    
    var_name <- paste("Jumlah Kasus Kanker Leher Rahim Tahun", input$desc_tahun)
    
    if (input$desc_plot_type == "histogram") {
      
      p <- ggplot(df, aes(x = Jumlah)) +
        geom_histogram(
          aes(y = ..density..),
          bins = 10,
          fill = "#E74C3C",
          alpha = 0.7,
          color = "white"
        ) +
        geom_density(color = "#932f60", linewidth = 1.2) +
        labs(
          x = "Jumlah Kasus",
          y = "Kerapatan (Density)",
          title = paste("Distribusi Jumlah Kasus", input$desc_tahun)
        ) +
        theme_minimal(base_size = 13)
      
    } else {
      
      p <- ggplot(df, aes(y = Jumlah, x = "")) +
        geom_boxplot(
          fill = "#E74C3C",
          alpha = 0.7,
          color = "#932f60",
          width = 0.4
        ) +
        geom_jitter(
          width = 0.1,
          alpha = 0.4,
          size = 2,
          color = "#932f60"
        ) +
        labs(
          y = "Jumlah Kasus",
          x = "",
          title = paste("Boxplot Jumlah Kasus", input$desc_tahun)
        ) +
        theme_minimal(base_size = 13) +
        theme(axis.text.x = element_blank())
    }
    
    ggplotly(p) %>%
      layout(
        hoverlabel = list(bgcolor = "white"),
        margin = list(l = 60, r = 30, t = 60, b = 50)
      )
  })
Hasil seluruh Boxplot =

Syntax Analisis Epidemiologi / Prevalensi =

  total_populasi <- sum(c(119354, 80188, 82033), na.rm = TRUE)
  df_prev <- reactive({
    
    data_processed %>%
      dplyr::group_by(Tahun) %>%
      dplyr::summarise(
        Total_Kasus = sum(Jumlah, na.rm = TRUE),
        Prevalensi = (Total_Kasus / total_populasi) * 100,
        .groups = "drop"
      )
    
  })
  
  output$epi_summary <- DT::renderDT({
    
    df <- df_prev()
    
    summary_data <- data.frame(
      Indikator = c(
        "Total Kasus (2017–2024)",
        "Rata-rata Prevalensi Tahunan",
        "Prevalensi Tertinggi",
        "Tahun Prevalensi Tertinggi",
        "Prevalensi Terendah",
        "Tahun Prevalensi Terendah",
        "Standar Deviasi Prevalensi",
        "Koefisien Variasi (%)"
      ),
      Nilai = c(
        sum(df$Total_Kasus),
        round(mean(df$Prevalensi), 3),
        round(max(df$Prevalensi), 3),
        df$Tahun[which.max(df$Prevalensi)],
        round(min(df$Prevalensi), 3),
        df$Tahun[which.min(df$Prevalensi)],
        round(sd(df$Prevalensi), 3),
        round(sd(df$Prevalensi) / mean(df$Prevalensi) * 100, 2)
      ),
      stringsAsFactors = FALSE
    )
    
    DT::datatable(
      summary_data,
      options = list(
        dom = 't',
        columnDefs = list(list(width = '60%', targets = 0))
      ),
      rownames = FALSE
    ) %>%
      DT::formatStyle(
        "Indikator",
        fontWeight = "bold",
        color = "#932f60"
      )
  })
  # ==================== EPIDEMIOLOGI DETAIL ====================
  output$epi_detail <- DT::renderDT({
    
    df <- data %>%
      group_by(Kecamatan, Tahun) %>%
      summarise(
        Total_Kasus = sum(Jumlah, na.rm = TRUE),
        .groups = "drop"
      ) %>%
      left_join(data_populasi, by = "Kecamatan") %>%
      mutate(
        Prevalensi = (Total_Kasus / Populasi_Perempuan) * 100
      ) %>%
      arrange(desc(Prevalensi)) %>%
      mutate(
        Populasi_Perempuan = format(Populasi_Perempuan, big.mark = "."),
        Total_Kasus = format(Total_Kasus, big.mark = "."),
        Prevalensi = round(Prevalensi, 3)
      ) %>%
      select(
        Kecamatan,
        Tahun,
        Populasi_Perempuan,
        Total_Kasus,
        Prevalensi
      )
    
    colnames(df) <- c(
      "Kecamatan",
      "Tahun",
      "Populasi Perempuan",
      "Total Kasus",
      "Prevalensi (%)"
    )
    
    DT::datatable(
      df,
      options = list(
        pageLength = 8,
        scrollX = TRUE,
        scrollY = "450px",
        order = list(list(4, "desc")),
        language = list(
          url = "//cdn.datatables.net/plug-ins/1.10.11/i18n/Indonesian.json"
        )
      ),
      rownames = FALSE
    )
  })

Syntax grafik diagram batang dan distribusi =

  output$dynamic_plot <- renderPlotly({
    req(input$plot_type)
    
    df <- filtered_data()
    p <- NULL
    
    if (input$plot_type == "bar_jumlah") {
      
      p <- ggplot(
        df,
        aes(
          x = reorder(
            factor(Tahun),
            if (input$sort_order == "desc") -Total_Kasus else Total_Kasus
          ),
          y = Total_Kasus
        )
      ) +
        geom_col(fill = "#932f60") +
        coord_flip() +
        labs(
          x = "Tahun",
          y = "Total Kasus",
          title = "Jumlah Kasus TBC per Tahun"
        ) +
        theme_minimal(base_size = 14)
    }
    
    else if (input$plot_type == "bar_prevalensi") {
      
      p <- ggplot(
        df,
        aes(
          x = reorder(
            factor(Tahun),
            if (input$sort_order == "desc") -Prevalensi else Prevalensi
          ),
          y = Prevalensi
        )
      ) +
        geom_col(fill = "#E74C3C") +
        coord_flip() +
        labs(
          x = "Tahun",
          y = "Prevalensi (%)",
          title = "Prevalensi TBC per Tahun"
        ) +
        theme_minimal(base_size = 14)
    }
    
    else if (input$plot_type == "trend_jumlah") {
      p <- ggplot(df, aes(x = Tahun, y = Total_Kasus)) +
        geom_line(color = "#932f60") +
        geom_point() +
        theme_minimal()
    }
    
    else if (input$plot_type == "trend_prevalensi") {
      p <- ggplot(df, aes(x = Tahun, y = Prevalensi)) +
        geom_line(color = "#E74C3C") +
        geom_point() +
        theme_minimal()
    }
    
    else if (input$plot_type == "dist_jumlah") {
      p <- ggplot(df, aes(x = Total_Kasus)) +
        geom_histogram(bins = 8, fill = "#932f60", color = "white") +
        theme_minimal()
    }
    
    else if (input$plot_type == "dist_prevalensi") {
      p <- ggplot(df, aes(x = Prevalensi)) +
        geom_histogram(bins = 8, fill = "#E74C3C", color = "white") +
        theme_minimal()
    }
    
    if (is.null(p)) return(NULL)
    
    ggplotly(p)
  })

Syntax Grafik Tren =

  output$tren_plot <- renderPlotly({
    req(input$plot_type_tren)
    
    df <- filtered_data()
    p <- NULL
    
    if (input$plot_type_tren == "trend_jumlah") {
      p <- ggplot(df, aes(x = Tahun, y = Total_Kasus)) +
        geom_line(color = "#932f60") +
        geom_point() +
        labs(
          x = "Tahun",
          y = "Total Kasus",
          title = "Tren Jumlah Kasus Kanker Leher Rahim"
        ) +
        theme_minimal()
    }
    
    else if (input$plot_type_tren == "trend_prevalensi") {
      p <- ggplot(df, aes(x = Tahun, y = Prevalensi)) +
        geom_line(color = "#E74C3C") +
        geom_point() +
        labs(
          x = "Tahun",
          y = "Prevalensi (%)",
          title = "Tren Prevalensi Kanker Leher Rahim"
        ) +
        theme_minimal()
    }
    
    ggplotly(p)
  })

Syntax Peta Spasial =

  output$map_cimahi <- renderLeaflet({
    req(input$map_year)
    
    # ---- filter & agregasi per kecamatan (tahun terpilih) ----
    data_map <- data_processed %>%
      filter(Tahun == input$map_year) %>%
      group_by(Kecamatan) %>%
      summarise(
        Jumlah = sum(Jumlah, na.rm = TRUE),
        Prevalensi = (Jumlah / first(Populasi_Perempuan)) * 100,
        .groups = "drop"
      )
    
    # ---- join dengan shapefile ----
    merged <- batas_cimahi %>%
      left_join(data_map, by = "Kecamatan")
    
    # ---- nilai yang dipetakan (prevalensi) ----
    val <- merged$Prevalensi
    
    validate(
      need(!all(is.na(val)), "Data tidak tersedia untuk tahun ini.")
    )
    
    # ---- palette ----
    pal <- colorNumeric(
      palette = input$map_color,
      domain = val,
      na.color = "transparent"
    )
    
    leaflet(merged) %>%
      addProviderTiles("CartoDB.Positron") %>%
      addPolygons(
        fillColor = ~pal(Prevalensi),
        color = "white",
        weight = 1,
        opacity = 1,
        fillOpacity = 0.7,
        label = lapply(
          paste0(
            "<b>Kecamatan: </b>", merged$Kecamatan, "<br>",
            "<b>Tahun: </b>", input$map_year, "<br>",
            "<b>Jumlah Kasus: </b>",
            ifelse(is.na(merged$Jumlah), 0, merged$Jumlah), "<br>",
            "<b>Prevalensi (%): </b>",
            ifelse(is.na(merged$Prevalensi),
                   "Tidak tersedia",
                   formatC(merged$Prevalensi, format = "f", digits = 2))
          ),
          HTML
        ),
        labelOptions = labelOptions(
          style = list(
            "background-color" = "rgba(255,255,255,0.85)",
            padding = "6px 10px",
            "border-radius" = "6px"
          ),
          textsize = "13px",
          direction = "auto"
        )
      ) %>%
      addLegend(
        pal = pal,
        values = val,
        title = paste("Prevalensi (%) -", input$map_year),
        opacity = 0.7
      )
  })

Syntax Pemodelan =

#--- POISSON---
  # ==================== MODEL POISSON ====================
  model_poisson <- reactive({
    glm(
      Jumlah ~ Tahun + Kecamatan,
      family = poisson(link = "log"),
      data = data
    )
  })
  
  # ==================== OUTPUT HASIL MODEL ====================
  output$poisson_result <- DT::renderDT({
    
    model <- model_poisson()
    
    coef_df <- broom::tidy(model) %>%
      mutate(
        estimate = round(estimate, 3),
        std.error = round(std.error, 3),
        statistic = round(statistic, 3),
        p.value = round(p.value, 4)
      )
    
    colnames(coef_df) <- c(
      "Variabel",
      "Koefisien",
      "Std. Error",
      "Statistik Z",
      "p-value"
    )
    
    DT::datatable(
      coef_df,
      options = list(dom = 't'),
      rownames = FALSE
    )
  })
  
  # ==================== VISUALISASI MODEL ====================
  output$poisson_plot <- renderPlotly({
    
    df_plot <- data %>%
      dplyr::group_by(Tahun, Kecamatan) %>%
      dplyr::summarise(
        Aktual = sum(Jumlah),
        .groups = "drop"
      )
    
    df_plot$Prediksi <- predict(
      model_poisson(),    
      newdata = df_plot,
      type = "response"
    )
    
    df_plot_tahun <- df_plot %>%
      dplyr::group_by(Tahun) %>%
      dplyr::summarise(
        Aktual = sum(Aktual),
        Prediksi = sum(Prediksi),
        .groups = "drop"
      )
    
    p <- ggplot(df_plot_tahun, aes(x = Tahun)) +
      geom_line(aes(y = Aktual, color = "Aktual"), linewidth = 1.2) +
      geom_line(aes(y = Prediksi, color = "Prediksi"),
                linewidth = 1.2, linetype = "dashed") +
      labs(
        title = "Perbandingan Jumlah Kasus Aktual dan Prediksi Model Poisson",
        x = "Tahun",
        y = "Jumlah Kasus",
        color = ""
      ) +
      theme_minimal()
    
    ggplotly(p)
  })
  data
  # ==================== AKURASI MODEL ====================
  output$poisson_akurasi <- renderUI({
    
    aic_val <- AIC(model_poisson())   
    
    HTML(paste0(
      "<p style='font-size:15px;'>",
      "<b>Kualitas model Poisson</b> berdasarkan nilai ",
      "<i>Akaike Information Criterion (AIC)</i> adalah ",
      "<b>", round(aic_val, 2), "</b>.",
      "</p>"
    ))
  })
  
  
  # ==================== INTERPRETASI MODEL ====================
  output$poisson_interpretasi <- renderUI({
    
    model <- model_poisson()   
    
    dispersion <- sum(residuals(model, type = "pearson")^2) /
      model$df.residual
    
    HTML(paste0(
      "<p style='text-align: justify;'>",
      "Hasil evaluasi model Poisson menunjukkan bahwa nilai parameter dispersi ",
      "sebesar <b>", round(dispersion, 2), "</b>, yang lebih besar dari 1. ",
      "Hal ini mengindikasikan adanya <b>overdispersi</b> pada data jumlah kasus. ",
      "Oleh karena itu, model Poisson tidak sepenuhnya memenuhi asumsi, ",
      "sehingga analisis selanjutnya perlu mempertimbangkan ",
      "<b>model alternatif seperti Negative Binomial</b>.",
      "</p>"
    ))
  })
  
  #--- NB---
  # ==================== MODEL NB ====================
  model_nb <- reactive({
    glm.nb(
      Jumlah ~ Tahun + Kecamatan,
      data = data
    )
  })
  
  # ==================== OUTPUT HASIL MODEL ====================
  output$nb_result <- DT::renderDT({
    
    modelnb <- model_nb()
    
    coef_dff <- broom::tidy(modelnb) %>%
      mutate(
        estimate = round(estimate, 3),
        std.error = round(std.error, 3),
        statistic = round(statistic, 3),
        p.value = round(p.value, 4)
      )
    
    colnames(coef_dff) <- c(
      "Variabel",
      "Koefisien",
      "Std. Error",
      "Statistik Z",
      "p-value"
    )
    
    DT::datatable(
      coef_dff,
      options = list(dom = 't'),
      rownames = FALSE
    )
  })
  
  # ==================== VISUALISASI MODEL ====================
  output$nb_plot <- renderPlotly({
    
    dff_plot <- data %>%
      dplyr::group_by(Tahun, Kecamatan) %>%
      dplyr::summarise(
        Aktual = sum(Jumlah),
        .groups = "drop"
      )
    
    dff_plot$Prediksi <- predict(
      model_nb(),    
      newdata = dff_plot,
      type = "response"
    )
    
    dff_plot_tahun <- dff_plot %>%
      dplyr::group_by(Tahun) %>%
      dplyr::summarise(
        Aktual = sum(Aktual),
        Prediksi = sum(Prediksi),
        .groups = "drop"
      )
    
    pi <- ggplot(dff_plot_tahun, aes(x = Tahun)) +
      geom_line(aes(y = Aktual, color = "Aktual"), linewidth = 1.2) +
      geom_line(aes(y = Prediksi, color = "Prediksi"),
                linewidth = 1.2, linetype = "dashed") +
      labs(
        title = "Perbandingan Jumlah Kasus Aktual dan Prediksi Model Negative Binomial",
        x = "Tahun",
        y = "Jumlah Kasus",
        color = ""
      ) +
      theme_minimal()
    
    ggplotly(pi)
  })

  # ==================== AKURASI MODEL ====================
  output$nb_akurasi <- renderUI({
    
    aic_valnb <- AIC(model_nb())   
    
    HTML(paste0(
      "<p style='font-size:15px;'>",
      "<b>Kualitas model Negative Binomial</b> berdasarkan nilai ",
      "<i>Akaike Information Criterion (AIC)</i> adalah ",
      "<b>", round(aic_valnb, 2), "</b>.",
      "</p>"
    ))
  })
  
  
  # ==================== INTERPRETASI MODEL ====================
  output$nb_interpretasi <- renderUI({
    
    theta_val <- round(model_nb()$theta, 3)
    
    HTML(paste0(
      "<p style='text-align: justify;'>",
      "Model Negative Binomial digunakan untuk mengakomodasi overdispersi ",
      "yang ditemukan pada model Poisson. Nilai parameter dispersi ",
      "(θ) sebesar <b>", theta_val, "</b> menunjukkan adanya variasi data ",
      "yang tinggi dan berhasil dimodelkan dengan baik oleh model ini. ",
      "Dengan demikian, model Negative Binomial dinilai lebih sesuai ",
      "untuk menganalisis jumlah kasus dibandingkan model Poisson.",
      "</p>"
    ))
  })

Synrax Dashboard lainnya seperti read data, shapefile, UI, dan interpretasi =

library(shiny)
library(bs4Dash)
library(dplyr)
library(leaflet)
library(sf)
library(DT)
library(ggplot2)
library(plotly)
library(corrplot)
library(RColorBrewer)
library(readxl)
library(stringr)
library(shinydashboard)
library(sf)
library(dplyr)
library(spdep)
library(spatialreg)
library(car)
library(DT)
library(shinycssloaders)
library(plotly)
library(viridis)

# ==== SETUP WORKING DIRECTORY & BACA DATA ====

# Baca data CSV
setwd("C:/Users/Lenovo/Downloads/UAS")
data <- read.csv("Dataepidem.csv")
colnames(data) <- c("Kecamatan", "Puskesmas", "Jumlah", "Tahun")

data_populasi <- data.frame(
  Kecamatan = c("CIMAHI SELATAN", "CIMAHI TENGAH", "CIMAHI UTARA"),
  Populasi_Perempuan = c(119354, 80188, 82033),
  stringsAsFactors = FALSE
)

data_processed <- data %>%
  left_join(data_populasi, by = "Kecamatan") %>%
  mutate(
    Prevalensi = ifelse(
      !is.na(Jumlah) & !is.na(Populasi_Perempuan) & Populasi_Perempuan > 0,
      (Jumlah / Populasi_Perempuan) * 100,
      NA
    )
  )

# ==== BACA SHAPEFILE ====
batas_all <- st_read("gadm41_IDN_3.shp")

batas_cimahi <- batas_all %>%
  dplyr::filter(toupper(NAME_2) == "CIMAHI") %>%
  dplyr::select(
    Kecamatan = NAME_3,
    geometry
  ) %>%
  dplyr::mutate(
    Kecamatan = toupper(Kecamatan),
    Kecamatan = stringr::str_trim(Kecamatan)
  )

batas_cimahi <- batas_cimahi %>%
  group_by(Kecamatan) %>%
  summarise(geometry = st_union(geometry), .groups = "drop")

if (nrow(batas_cimahi) == 0) {
  stop("ERROR: Data kecamatan Kota Cimahi tidak ditemukan!")
}

ui <- bs4DashPage(
  title = "Analisis Kasus Kanker Leher Rahim di Kota Cimahi 2017 - 2024",

  # ===== HEADER =====
  header = bs4DashNavbar(
    skin = "light",
    status = "white",
    border = FALSE,
    sidebarIcon = icon("bars"),
    controlbarIcon = icon("gear"),
    rightUi = NULL,
    tags$head(
      tags$style(HTML("
        .main-header.navbar {
          background-color: #ed8eb8 !important;
          color: white !important;
        }
      "))
    )
  ),
  
  # ===== SIDEBAR =====
  sidebar = bs4DashSidebar(
    skin = "light",
    status = "pink",
    title = "Dashboard Kanker Leher Rahim",
    brandColor = "pink",
    opacity = 0.9,
    bs4SidebarMenu(
      bs4SidebarMenuItem("Home", tabName = "home", icon = icon("home")),
      bs4SidebarMenuItem("Data", tabName = "data", icon = icon("database")),
      bs4SidebarMenuItem("Statistika Deskriptif", tabName = "statistik", icon = icon("table")),
      bs4SidebarMenuItem("Ukuran Epidemiologi", tabName = "epidemiologi", icon = icon("calculator")),
      bs4SidebarMenuItem("Analisis & Visualisasi", tabName = "analisis", icon = icon("chart-line")),
      bs4SidebarMenuItem("Peta Distribusi", tabName = "peta", icon = icon("map")),
      bs4SidebarMenuItem("Interpretasi & Rekomendasi", tabName = "interpretasi", icon = icon("lightbulb"))
    )
  ),
  
  # ===== BODY (BENAR) =====
  body = bs4DashBody(
    
    # CSS khusus card
    tags$head(
      tags$style(HTML("
  .card-profil .card-header,
  .card-overview .card-header,
  .card-ringkas .card-header,
  .card-visual .card-header,
  .card-kontrol .card-header,
  .card-visdat .card-header,
  .card-peta .card-header {
    background-color: #932f60 !important;
    color: white !important;
    font-weight: bold;
  }

  h1, h2, h3, h4, h5, h6 {
    color: #932f60 !important;
    font-weight: bold !important;
  }

  .content-header h3 {
    color: #932f60 !important;
    font-weight: bold !important;
  }
"))
      
    ),
    
    bs4TabItems(
      # ---- TAB HOME ----
      bs4TabItem(
        tabName = "home",
        fluidRow(
          # CARD PROFIL PENELITI
          bs4Card(
            title = "Profil Peneliti",
            width = 6,
            solidHeader = TRUE,
            collapsible = TRUE,
            class = "card-profil",
            fluidRow(
              column(
                8,
                tags$h4("Nama: Shahnaz Putri Dendawijaya"),
                tags$h5("NPM: 140610230017"),
                tags$p("Mahasiswa Statistika, Universitas Padjadjaran")
              )
            )
          ),
          
          # CARD OVERVIEW DATA
          bs4Card(
            title = "Overview Dashboard",
            width = 6,
            solidHeader = TRUE,
            collapsible = TRUE,
            class = "card-overview",
            tags$p("Hal yang dapat ditemukan dalam dashboard :"),
            tags$ul(
              tags$li("Hasil perhitungan kejadian Kanker Leher Rahim dari sisi epidemiologis"),
              tags$li("Visualisasi data penelitian terhadap kasus Kanker Leher Rahim")
            ),
            tags$p("Data yang digunakan dalam analisis ini meliputi:"),
            tags$ul(
              tags$li("Jumlah kasus Kanker Leher Rahim di Kota Cimahi tahun 2017 - 2024")
            )
          )
        )   
      ),
      
      # ---- TAB DATA ----
      bs4TabItem(
        tabName = "data",
        h3("Data Kasus Kanker Leher Rahim di Kota Cimahi Tahun 2017–2024"),
        br(),
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          DT::dataTableOutput("tabel_data")
        )
      ),
      
      # ==================== TAB STATISTIK (DARI SYNTAX 2) ====================
      bs4TabItem(
        tabName = "statistik",
        h2("Statistika Deskriptif"),
        
        bs4Card(
          title = "Ringkasan Statistik Variabel Dasar",
          width = 12,
          solidHeader = TRUE,
          collapsible = TRUE,
          class = "card-ringkas",
          DTOutput("summary_stats")
        ),
        
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          class = "card-visual",
          title = "Visualisasi Jumlah Kasus per Tahun",
          fluidRow(
            column(
              4,
              selectInput(
                "desc_tahun",
                "Pilih Tahun:",
                choices = 2017:2024
              )
            ),
            column(
              4,
              selectInput(
                "desc_plot_type",
                "Pilih Jenis Plot:",
                choices = c(
                  "Histogram" = "histogram",
                  "Boxplot" = "boxplot"
                )
              )
            )
          ),
          
          conditionalPanel(
            condition = "input.desc_variable != ''",
            plotlyOutput("desc_plot", height = "450px")
          ),
          
          conditionalPanel(
            condition = "input.desc_variable == ''",
            h4(
              style = "text-align: center; color: #888; padding: 60px;",
              icon("chart-bar"), br(), br(),
              "Pilih variabel untuk melihat visualisasi"
            )
          )
        )
      ),
      
      # ==================== TAB EPIDEMIOLOGI (DARI SYNTAX 2) ====================
      bs4TabItem(
        tabName = "epidemiologi",
        h2("Ukuran Epidemiologi Kanker Leher Rahim di Kota Cimahi (2017–2024)"),
        
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Ringkasan Ukuran Epidemiologi",
          DTOutput("epi_summary")
        ),
        
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Detail per Kecamatan dan Tahun",
          DTOutput("epi_detail")
        )
      ),
      
      # ==================== TAB ANALISIS ====================
      bs4TabItem(
        tabName = "analisis",
        h2("Analisis & Visualisasi Kasus Kanker Leher Rahim"),
        
        # ---- VALUE BOX ----
        fluidRow(
          valueBoxOutput("total_kasus", width = 3),
          valueBoxOutput("avg_prev", width = 2),
          valueBoxOutput("max_tahun", width = 2),
          valueBoxOutput("min_tahun", width = 2),
          valueBoxOutput("max_prev_kec", width = 3)
        ),
        
        # ---- KONTROL VISUALISASI ----
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Kontrol Visualisasi",
          class = "card-kontrol",
          fluidRow(
            column(
              4,
              selectInput(
                "plot_type",
                "Pilih Jenis Grafik:",
                choices = c(
                  "Pilih..." = "",
                  "Bar Chart Jumlah Kasus per Kecamatan" = "bar_jumlah",
                  "Bar Chart Prevalensi per Kecamatan" = "bar_prevalensi",
                  "Distribusi Jumlah Kasus" = "dist_jumlah",
                  "Distribusi Prevalensi" = "dist_prevalensi"
                )
              )
            ),
            column(
              4,
              selectInput(
                "sort_order",
                "Urutan (untuk Bar Chart):",
                choices = c(
                  "Tertinggi ke Terendah" = "desc",
                  "Terendah ke Tertinggi" = "asc"
                )
              )
            ),
            column(
              4,
              sliderInput(
                "top_n",
                "Tampilkan N Kecamatan Teratas:",
                min = 1,
                max = 3,
                value = 3,
                step = 1
              )
            )
          )
        ),
        
        # ---- VISUALISASI DINAMIS ----
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Visualisasi Data",
          class = "card-visdat",
          conditionalPanel(
            condition = "input.plot_type != ''",
            plotlyOutput("dynamic_plot", height = "500px")
          ),
          conditionalPanel(
            condition = "input.plot_type == ''",
            h4(
              style = "text-align: center; color: #888; padding: 80px;",
              icon("mouse-pointer"), br(), br(),
              "Pilih jenis grafik untuk menampilkan visualisasi"
            )
          )
        ),
        # ---- KONTROL TREN TAHUNAN ----
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Kontrol Tren Tahunan",
          class = "card-kontrol",
          fluidRow(
            column(
              4,
              selectInput(
                "plot_type_tren",
                "Pilih Jenis Tren:",
                choices = c(
                  "Pilih..." = "",
                  "Tren Jumlah Kasus per Tahun" = "trend_jumlah",
                  "Tren Prevalensi per Tahun" = "trend_prevalensi"
                )
              )
            )
          )
        ),
        # ---- TREN TAHUNAN ----
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Tren Tahunan",
          class = "card-vistren",
          conditionalPanel(
            condition = "input.plot_type_tren != ''",
            plotlyOutput("tren_plot", height = "500px")
          ),
          conditionalPanel(
            condition = "input.plot_type_tren == ''",
            h4(
              style = "text-align: center; color: #888; padding: 80px;",
              icon("mouse-pointer"), br(), br(),
              "Pilih jenis grafik untuk menampilkan visualisasi"
            )
          )
        ),
        fluidRow(
          column(
            6,
            downloadButton("download_plot", "Download Grafik", class = "btn-primary")
          ),
          column(
            6,
            downloadButton("download_data", "Download Data", class = "btn-success")
          )
        ),
      br(),
      
      #--- MODEL POISSON ---
      bs4Card(
        width = 12,
        solidHeader = TRUE,
        title = "Pemodelan Poisson",
        
        tags$p(
          "Pemodelan dilakukan menggunakan Regresi Poisson Spatio Temporal untuk menganalisis ",
          "pola temporal jumlah kasus kanker leher rahim di Kota Cimahi."
        ),
        
        DTOutput("poisson_result"),
        br(),
        plotlyOutput("poisson_plot", height = "400px"),
        br(),
        uiOutput("poisson_akurasi"),
        br(),
        uiOutput("poisson_interpretasi")
      ),
      br(),
     #MODEL NB
       bs4Card(
        width = 12,
        solidHeader = TRUE,
        title = "Pemodelan Negative Binomial",
        
        tags$p(
          "Model Poisson mengalami overdispersi, sehingga pemodelan menggunakan model negative binomial",
        ),
        
        DTOutput("nb_result"),
        br(),
        plotlyOutput("nb_plot", height = "400px"),
        br(),
        uiOutput("nb_akurasi"),
        br(),
        uiOutput("nb_interpretasi")
      )
    ), 
      
      # ==================== TAB PETA ====================
      bs4TabItem(
        tabName = "peta",
        h2("Peta Distribusi Kanker Leher Rahim di Kota Cimahi"),
        
        # ---- KONTROL PETA ----
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Kontrol Peta",
          class = "card-peta",
          fluidRow(
            column(
              6,
              selectInput(
                "map_year",
                "Pilih Tahun:",
                choices = sort(unique(data_processed$Tahun)),
                selected = max(data_processed$Tahun)
              )
            ),
            column(
              6,
              selectInput(
                "map_color",
                "Pilih Skema Warna:",
                choices = c(
                  "Biru" = "Blues",
                  "Merah" = "Reds",
                  "Hijau" = "Greens",
                  "Ungu" = "Purples"
                )
              )
            )
          )
        ),
        
        # ---- OUTPUT PETA ----
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          
          conditionalPanel(
            condition = "input.map_variable != ''",
            leafletOutput("map_cimahi", height = 600)
          ),
          
          conditionalPanel(
            condition = "input.map_variable == ''",
            h4(
              style = "text-align: center; color: #888; padding: 100px;",
              icon("map-marked-alt"), br(), br(),
              "Pilih variabel yang ingin ditampilkan pada peta"
            )
          )
        )
      ),
      # ==================== TAB INTERPRETASI ====================
      bs4TabItem(
        tabName = "interpretasi",
        h2("Interpretasi & Rekomendasi"),
        
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Interpretasi",
          uiOutput("Interpretasi")
        ),
        bs4Card(
          width = 12,
          solidHeader = TRUE,
          title = "Kesimpulan, Saran, dan Rekomendasi",
          uiOutput("kesimpulan")
        )
      )
    )
  )
)
      # ===== CONTROLBAR =====
      controlbar = bs4DashControlbar(
        pinned = TRUE,
        collapsed = TRUE,
        skin = "light",
        tags$h5("Info Tambahan"),
        tags$p("Dashboard ini dibuat guna menyelesaikan Ujian Akhir Semester Epidemiologi")
      )
      # ===== FOOTER =====
      footer = bs4DashFooter(
        fixed = TRUE,
        left = "© 2025 Shahnaz",
        right = "Kanker Leher Rahim Analysis Dashboard"
      )
server <- function(input, output, session) {
# ==================== INTERPRETASI ====================
  output$Interpretasi <- renderUI({
    
    df <- data_processed
    req(df$Tahun, df$Jumlah)
    
    # ---- agregasi ----
    df_tahun <- df %>%
      group_by(Tahun) %>%
      summarise(
        Total_Kasus = sum(Jumlah, na.rm = TRUE),
        Prevalensi = (Total_Kasus / total_populasi) * 100000,
        .groups = "drop"
      )
    
    df_kec <- df %>%
      group_by(Kecamatan) %>%
      summarise(
        Total_Kasus = sum(Jumlah, na.rm = TRUE),
        Prevalensi = (Total_Kasus / total_populasi) * 100000,
        .groups = "drop"
      )
    
    kec_max <- df_kec$Kecamatan[which.max(df_kec$Prevalensi)]
    
    tahun_max <- df_tahun$Tahun[which.max(df_tahun$Prevalensi)]
    prev_max  <- round(max(df_tahun$Prevalensi), 2)
    
    tahun_min <- df_tahun$Tahun[which.min(df_tahun$Prevalensi)]
    prev_min  <- round(min(df_tahun$Prevalensi), 2)
    
    arah_tren <- ifelse(
      tail(df_tahun$Prevalensi, 1) > head(df_tahun$Prevalensi, 1),
      "meningkat", "menurun"
    )
    
    model_p <- model_poisson()
    model_n <- model_nb()
    
    aic_pois <- AIC(model_p)
    aic_nb   <- AIC(model_n)
    
    model_terbaik <- ifelse(
      aic_nb < aic_pois,
      "Negative Binomial",
      "Poisson"
    )
    
    box(
      width = 12,
      status = "info",
      solidHeader = TRUE,
      
      HTML(paste0(
        "<h3>Ringkasan Temuan</h3>", 
        "<ul>", 
        "<li><b>Periode Pengamatan:</b> ", 
        min(df_tahun$Tahun), "–", 
        max(df_tahun$Tahun), "</li>", 
        "<li><b>Total Kasus:</b> ", 
        format(sum(df_tahun$Total_Kasus), big.mark = "."), " kasus</li>", 
        "<li><b>Rata-rata Prevalensi:</b> ", 
        round(mean(df_tahun$Prevalensi), 2), 
        " per 100.000 perempuan</li>", 
        "<li><b>Kecamatan dengan Prevalensi Tertinggi:</b> ", 
        kec_max, "</li>", 
        "</ul>",
        
        "<hr>", 
        
        "<h4>Analisis Tren Tahunan</h4>", 
        "<ul>", 
        "<li>Tahun dengan prevalensi tertinggi: <b>", 
        tahun_max, "</b> (", prev_max, ").</li>", 
        "<li>Tahun dengan prevalensi terendah: <b>", 
        tahun_min, "</b> (", prev_min, ").</li>", 
        "<li>Tren prevalensi secara umum <b>", 
        arah_tren, "</b>.</li>", 
        "</ul>",
        
        "<hr>",
        
        "<h3>Hasil Pemodelan</h3>",
        "<ul>",
        "<li>AIC Poisson: ", round(aic_pois, 2), "</li>",
        "<li>AIC Negative Binomial: ", round(aic_nb, 2), "</li>",
        "<li><b>Model Terbaik:</b> ", model_terbaik, "</li>",
        "</ul>",
        
        "<p style='text-align: justify;'>", 
        "Perbandingan nilai Akaike Information Criterion (AIC) menunjukkan bahwa ", 
        "model <b>Negative Binomial</b> memiliki nilai AIC yang lebih rendah ", 
        "dibandingkan model Poisson. Hal ini menandakan bahwa model Negative Binomial ", 
        "memberikan kecocokan yang lebih baik terhadap data jumlah kasus.", "</p>",
        
        "<hr>", 
        "<b>Implikasi Model terhadap Penelitian</b>", 
        "<p style='text-align: justify;'>", 
        "Penggunaan model Negative Binomial memungkinkan analisis yang lebih reliabel ", 
        "dalam mengidentifikasi pola temporal dan perbedaan jumlah kasus antar wilayah. ", 
        "Model ini memberikan dasar statistik yang kuat dalam mengevaluasi dinamika kasus ", 
        "kanker leher rahim serta mendukung perumusan kebijakan berbasis data, ", 
        "khususnya dalam perencanaan program pencegahan dan deteksi dini di tingkat daerah.", 
        "</p>"
      ))
    )
  })
  # ================== BOX 2 ==================
  output$kesimpulan <- renderUI({
    
    box(
      width = 12,
      status = "info",
      solidHeader = TRUE,
      
      HTML(paste0(
        "<h4>Kesimpulan</h4>",
        "<p>",
        "Hasil ini memberikan gambaran perkembangan kasus kanker leher rahim ", 
        "secara temporal dan dapat digunakan sebagai dasar evaluasi program ", 
        "deteksi dini serta perencanaan kebijakan kesehatan perempuan.",
        "</p>",
        
        "<h4>Saran dan Rekomendasi</h4>",
        "<p>",
        "Upaya yang dapat dilakukan meliputi penguatan program skrining dan ", 
        "deteksi dini melalui pelayanan IVA atau Pap smear di tingkat puskesmas,", 
        "peningkatan edukasi kesehatan reproduksi bagi perempuan usia berisiko, ", 
        "serta penguatan sistem pencatatan dan pelaporan kasus agar data yang ", 
        "dihasilkan lebih akurat dan berkesinambungan, terutama di wilayah ", 
        "Cimahi Selatan yang menunjukkan prevalensi tertinggi.",
        "</p>"
      ))
    )
  })
}
      
shinyApp(ui = ui, server = server)