Visualisasi Numerik & Kategorik Penyakit Tidak Menular di Indonesia

KELOMPOK 1

Anggota kelompok :

Muhammad Ariq Rafiansyah (3338240017)

Rizky Putra Hendrawan (3338240033)

Nais Fanisa Cahyani (3338240038)

Adrian Wijaya Kusuma (3338240043)

Numerik

Input Data

setwd("D:/Coolyeah/Mata Kuliah/Semester 4/Eksplorasi dan Visualisasi Data/Tugas Kelompok")
library(ggplot2)
library(readxl)
list.files()
##  [1] "data evd penyakit fikss.xlsx"                                                
##  [2] "Data Kesehatan_edited.xlsx"                                                  
##  [3] "Jumlah Kasus Penyakit Gagal Ginjal Berdasarkan Kabupaten.xlsx"               
##  [4] "jumlah_kasus_penyakit_tidak_menular_berdasarkan_jenisnya_menuru.xlsx"        
##  [5] "jumlah_kasus_penyakit_tidak_menular_berdasarkan_jenisnya_menuru_metadata.pdf"
##  [6] "Karawang SHP"                                                                
##  [7] "Penyebab Kematian di Indonesia yang Dilaporkan .xlsx"                        
##  [8] "Raw Data.csv"                                                                
##  [9] "Rplot.pdf"                                                                   
## [10] "SHP Karawang"                                                                
## [11] "Sleep health and lifestyle dataset.xlsx.csv"                                 
## [12] "static"                                                                      
## [13] "Testing Data Kategorik 2.R"                                                  
## [14] "Testing Data Kategorik.R"                                                    
## [15] "Visualisasi-Kategorik-Penyakit-Tidak-Menular-Krw.html"                       
## [16] "Visualisasi-Numerik---Kategorik-Penyakit-Tidak-Menular-Indonesia.html"       
## [17] "Visualisasi-Numerik---Kategorik-Penyakit-Tidak-Menular-Indonesia.Rmd"        
## [18] "Visualisasi-Numerik---Kategorik-Penyakit-Tidak-Menular-Indonesia_files"      
## [19] "Visualisasi Kategorik Penyakit Tidak Menular Karawang.Rmd"                   
## [20] "Visualisasi Kategorik Penyakit Tidak Menular Krw.Rmd"                        
## [21] "Visualisasi Kategorik PTM Karawang.Rmd"                                      
## [22] "Visualisasi Numerik & Kategorik Penyakit Tidak Menular Indonesia.Rmd"
penyakit_tidak_menular =read_xlsx("data evd penyakit fikss.xlsx")
DT::datatable(penyakit_tidak_menular)
penyakit_tidak_menular$RATE_PER_100_N  <- as.numeric(penyakit_tidak_menular$RATE_PER_100_N)
penyakit_tidak_menular$RATE_PER_100_NL <- as.numeric(penyakit_tidak_menular$RATE_PER_100_NL)
penyakit_tidak_menular$RATE_PER_100_NU <- as.numeric(penyakit_tidak_menular$RATE_PER_100_NU)

Alasan Pemilihan Data

Data ini dipilih karena memuat informasi numerik mengenai probabilitas kematian akibat penyakit tidak menular (Non-Communicable Diseases / NCDs) di Indonesia, yaitu sebesar 24,2% pada tahun 2019. Karena fokus data ini berupa data kuantitatif yang tersusun berdasarkan waktu, data tersebut sesuai untuk digunakan dalam analisis dan visualisasi numerik.

Melalui data ini, berbagai bentuk visualisasi numerik seperti histogram, density plot, boxplot, violin plot, QQ plot, scatter plot, dan line plot dapat diterapkan untuk mengeksplorasi karakteristik data secara lebih mendalam. Histogram dan density plot dapat digunakan untuk melihat distribusi data, boxplot dan violin plot untuk menunjukkan sebaran serta variasi data, QQ plot untuk menilai pola distribusi data, scatter plot untuk melihat hubungan antarvariabel numerik, dan line plot untuk menampilkan tren perubahan data dari tahun ke tahun.

Selain itu, data ini berasal dari World Health Organization (WHO), sehingga memiliki tingkat kredibilitas yang tinggi dan dapat dipertanggungjawabkan sebagai sumber data resmi di bidang kesehatan. Oleh karena itu, data ini dinilai tepat untuk digunakan dalam visualisasi numerik karena tidak hanya memuat data kuantitatif yang jelas, tetapi juga memungkinkan analisis distribusi, penyebaran, hubungan, dan tren data secara informatif.

Histogram

Histogram pada studi kasus ini digunakan untuk melihat distribusi atau sebaran nilai variabel RATE_PER_100_N, yaitu rate kematian akibat penyakit tidak menular per 100 penduduk di Indonesia. Melalui histogram, dapat diketahui rentang nilai yang muncul, frekuensi kemunculan masing-masing nilai, serta kecenderungan data apakah terkonsentrasi pada rentang tertentu atau tersebar luas.

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_histogram(bins = 30)

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_histogram(bins = 30, color = "white")

library(scales)
ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_histogram(bins = 30, color = "white", fill = "pink") + 
  scale_x_continuous(labels = comma) + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Rate_per_100_N", 
       y = "Frekuensi")

INTERPRETASI

Pada histogram, sumbu X menunjukkan nilai RATE_PER_100_N atau rate kematian per 100 penduduk, sedangkan sumbu Y menunjukkan frekuensi, yaitu banyaknya data yang berada pada rentang nilai tertentu.

Berdasarkan histogram, terlihat bahwa nilai RATE_PER_100_N berada pada kisaran sekitar 21 hingga 29 per 100 penduduk. Sebagian besar data tampak terkonsentrasi pada rentang 27–29, yang menunjukkan bahwa nilai rate kematian pada kisaran tersebut paling sering muncul dalam dataset. Sementara itu, terdapat juga beberapa data pada rentang 21–25, namun frekuensinya lebih sedikit dibandingkan rentang 27–29.

Secara umum, distribusi data tidak sepenuhnya simetris, karena penyebaran frekuensi lebih banyak berada pada nilai yang relatif tinggi. Hal ini menunjukkan bahwa sebagian besar observasi dalam dataset memiliki rate kematian akibat penyakit tidak menular per 100 penduduk yang cenderung berada pada kisaran menengah ke tinggi, khususnya di sekitar 27–29.

KESIMPULAN

Berdasarkan histogram variabel RATE_PER_100_N, dapat disimpulkan bahwa sebagian besar nilai rate kematian akibat penyakit tidak menular dalam dataset ini berada pada kisaran 27–29 per 100 penduduk. Hal ini menunjukkan bahwa nilai rate kematian dalam data cenderung terkonsentrasi pada rentang tersebut dan merupakan nilai yang paling sering muncul.

Selain itu, terdapat juga beberapa nilai yang berada pada kisaran 21–25, namun frekuensinya lebih sedikit dibandingkan dengan rentang 27–29. Hal ini menunjukkan bahwa meskipun terdapat observasi dengan rate kematian yang lebih rendah, jumlahnya tidak dominan dalam dataset.

Secara keseluruhan, histogram menunjukkan bahwa distribusi RATE_PER_100_N cenderung terkonsentrasi pada nilai yang relatif lebih tinggi, khususnya pada kisaran 27–29 per 100 penduduk.

Density Plot

Density plot pada studi kasus ini digunakan untuk melihat distribusi atau sebaran nilai variabel RATE_PER_100_N, yaitu rate kematian akibat penyakit tidak menular per 100 penduduk di Indonesia. Melalui density plot, dapat diketahui pola kepadatan data, rentang nilai yang muncul, serta kecenderungan data apakah terkonsentrasi pada nilai tertentu atau menyebar pada beberapa rentang nilai.

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_density()

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_density(fill = "pink", alpha = 0.7) + 
  scale_x_continuous(labels = comma) + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Rate kematian per 100 penduduk")

INTERPRETASI

Density plot pada gambar ini digunakan untuk melihat distribusi nilai RATE_PER_100_N secara keseluruhan. Berbeda dengan histogram yang menampilkan frekuensi dalam bentuk batang, density plot menunjukkan kepadatan data dalam bentuk kurva halus sehingga pola persebaran data dapat terlihat lebih jelas.

Pada grafik ini, sumbu X menunjukkan nilai rate kematian per 100 penduduk, sedangkan sumbu Y menunjukkan density atau kepadatan data. Semakin tinggi kurva pada suatu nilai, semakin besar konsentrasi data pada nilai tersebut.

Berdasarkan grafik, terlihat bahwa nilai RATE_PER_100_N berada pada kisaran sekitar 21 hingga 28,5 per 100 penduduk. Kepadatan tertinggi tampak pada rentang 27–28, yang menunjukkan bahwa sebagian besar data terkonsentrasi pada kisaran tersebut. Selain itu, masih terdapat kepadatan yang lebih rendah pada sekitar 23–25, sehingga distribusi data tidak hanya terpusat pada satu nilai.

Secara umum, density plot ini menunjukkan bahwa distribusi RATE_PER_100_N cenderung lebih padat pada nilai yang relatif tinggi, khususnya di sekitar 27–28 per 100 penduduk.

KESIMPULAN

Berdasarkan density plot secara keseluruhan, dapat disimpulkan bahwa sebagian besar nilai rate kematian akibat penyakit tidak menular per 100 penduduk terkonsentrasi pada kisaran 27–28, sedangkan sebagian kecil lainnya berada pada kisaran yang lebih rendah, yaitu sekitar 23–25.

Density Plot Berdasarkan jenis kelamin

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N, fill = DIM_SEX, color = DIM_SEX)) + 
  geom_density(alpha = 0.7) + 
  scale_x_continuous(labels = comma) + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Rate kematian per 100 penduduk")

INTERPRETASI

Density plot pada gambar ini digunakan untuk membandingkan distribusi nilai RATE_PER_100_N berdasarkan kategori jenis kelamin (DIM_SEX). Dengan grafik ini, dapat dilihat apakah distribusi rate kematian antara laki-laki dan perempuan berada pada kisaran yang sama atau berbeda.

Pada grafik ini:

  • warna merah muda mewakili FEMALE
  • warna biru kehijauan mewakili MALE

Sumbu X menunjukkan rate kematian per 100 penduduk, sedangkan sumbu Y menunjukkan density atau kepadatan data.

Berdasarkan grafik, terlihat bahwa distribusi FEMALE lebih banyak berada pada kisaran sekitar 21–25, dengan puncak kepadatan sekitar 24–25. Sementara itu, distribusi MALE cenderung berada pada kisaran yang lebih tinggi, yaitu sekitar 27–28, dengan puncak kepadatan di sekitar rentang tersebut.

Tumpang tindih antara kedua kurva terlihat sangat kecil, yang menunjukkan bahwa nilai rate kematian antara laki-laki dan perempuan memiliki perbedaan yang cukup jelas. Secara visual, rate kematian pada laki-laki cenderung lebih tinggi dibandingkan perempuan.

KESIMPULAN

Berdasarkan density plot menurut jenis kelamin, dapat disimpulkan bahwa laki-laki memiliki rate kematian akibat penyakit tidak menular per 100 penduduk yang cenderung lebih tinggi dibandingkan perempuan. Nilai pada kelompok laki-laki terkonsentrasi di sekitar 27–28, sedangkan kelompok perempuan lebih terkonsentrasi pada kisaran 21–25.

Density Ridge Plot Berdasarkan jenis kelamin

library(ggridges)
ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N, y= DIM_SEX,fill = DIM_SEX)) + 
  geom_density_ridges() + 
  labs(x = "Rate kematian per 100 penduduk", y = "Jenis Kelamin")
## Picking joint bandwidth of 0.49

INTERPRETASI

Density ridge plot pada gambar ini juga digunakan untuk melihat distribusi nilai RATE_PER_100_N berdasarkan jenis kelamin, tetapi dengan tampilan yang dipisahkan per kelompok agar pola masing-masing kategori terlihat lebih jelas.

Pada grafik ini:

  • sumbu X menunjukkan rate kematian per 100 penduduk
  • sumbu Y menunjukkan jenis kelamin
  • bentuk kurva pada masing-masing baris menunjukkan kepadatan data untuk tiap kelompok

Berdasarkan ridge plot, terlihat bahwa kelompok FEMALE memiliki distribusi yang lebih terkonsentrasi pada kisaran sekitar 20–25, dengan puncak kepadatan di sekitar 24–25. Sebaliknya, kelompok MALE memiliki distribusi yang lebih dominan pada kisaran 27–30, dengan puncak utama di sekitar 28.

Karena kedua kelompok ditampilkan terpisah, perbedaan distribusi keduanya menjadi lebih mudah dilihat dibandingkan plot sebelumnya. Grafik ini menegaskan bahwa kelompok laki-laki memiliki rate kematian yang lebih tinggi, sedangkan kelompok perempuan cenderung berada pada nilai yang lebih rendah.

KESIMPULAN

Berdasarkan density ridge plot, dapat disimpulkan bahwa terdapat perbedaan distribusi rate kematian akibat penyakit tidak menular antara laki-laki dan perempuan. Distribusi laki-laki terkonsentrasi pada nilai yang lebih tinggi, yaitu sekitar 27–30, sedangkan distribusi perempuan terkonsentrasi pada kisaran 20–25.

Boxplot

Boxplot pada studi kasus ini digunakan untuk melihat distribusi atau sebaran nilai variabel RATE_PER_100_N, yaitu rate kematian akibat penyakit tidak menular per 100 penduduk di Indonesia. Melalui boxplot, dapat diketahui nilai tengah data, sebaran data, rentang nilai, serta ada atau tidaknya pencilan (outlier) dalam dataset.

Pada boxplot, garis di dalam kotak menunjukkan median atau nilai tengah data, sedangkan batas bawah dan batas atas kotak menunjukkan kuartil pertama (Q1) dan kuartil ketiga (Q3). Garis di luar kotak menunjukkan rentang data minimum dan maksimum yang masih berada dalam batas sebaran normal. Dengan menggunakan boxplot, dapat diketahui apakah data terkonsentrasi pada rentang tertentu, menyebar luas, atau memiliki pencilan.

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_boxplot()

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N)) + 
  geom_boxplot()+
  coord_flip()

INTERPRETASI

Boxplot pada gambar ini digunakan untuk melihat ringkasan sebaran data variabel RATE_PER_100_N secara keseluruhan. Melalui boxplot, dapat diketahui nilai minimum, kuartil bawah, median, kuartil atas, dan nilai maksimum, sehingga pola penyebaran data lebih mudah diamati.

Pada grafik ini, garis di dalam kotak menunjukkan median, yaitu nilai tengah data. Batas bawah dan atas kotak menunjukkan kuartil 1 dan kuartil 3, sedangkan garis di luar kotak menunjukkan rentang data minimum dan maksimum yang masih termasuk dalam sebaran normal.

Berdasarkan boxplot, terlihat bahwa median nilai RATE_PER_100_N berada di sekitar 25 per 100 penduduk. Sebagian besar data berada pada kisaran sekitar 23 hingga 28, yang ditunjukkan oleh panjang kotak. Nilai minimum berada di sekitar 21, sedangkan nilai maksimum berada di sekitar 28,5.

Secara umum, boxplot ini menunjukkan bahwa distribusi data cukup lebar, dengan sebagian besar nilai berada pada kisaran menengah hingga tinggi. Selain itu, tidak terlihat adanya pencilan yang mencolok pada boxplot keseluruhan.

KESIMPULAN

Berdasarkan boxplot keseluruhan, dapat disimpulkan bahwa nilai RATE_PER_100_N memiliki median sekitar 25 per 100 penduduk, dengan sebagian besar data terkonsentrasi pada kisaran 23–28. Hal ini menunjukkan bahwa rate kematian akibat penyakit tidak menular dalam dataset cenderung berada pada rentang menengah ke tinggi.

Boxplot Berdasarkan jenis kelamin

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N, y = DIM_SEX)) + 
  geom_boxplot()

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N, y = DIM_SEX, fill = DIM_SEX)) + 
  geom_boxplot()

ggplot(data = penyakit_tidak_menular, mapping = aes(x = RATE_PER_100_N, y = DIM_SEX, fill = DIM_SEX)) + 
  geom_boxplot() + 
  theme(legend.position = "none")

INTERPRETASI

Boxplot pada gambar ini digunakan untuk membandingkan distribusi nilai RATE_PER_100_N berdasarkan jenis kelamin (DIM_SEX). Dengan boxplot ini, dapat dilihat perbedaan median, sebaran data, dan kemungkinan pencilan antara kelompok FEMALE dan MALE.

Berdasarkan grafik, terlihat bahwa kelompok FEMALE memiliki median sekitar 23–24 per 100 penduduk, dengan sebagian besar data berada pada kisaran sekitar 22 hingga 25. Sementara itu, kelompok MALE memiliki median yang lebih tinggi, yaitu sekitar 27,5–28, dengan sebagian besar data berada pada kisaran 27 hingga 28.

Perbedaan posisi kotak antara kedua kelompok menunjukkan bahwa distribusi rate kematian pada laki-laki cenderung lebih tinggi dibandingkan perempuan. Selain itu, pada kelompok MALE terlihat adanya satu pencilan di nilai yang lebih rendah, sekitar 23, yang berada cukup jauh dari kumpulan data utama laki-laki. Hal ini menunjukkan adanya satu observasi laki-laki dengan nilai rate kematian yang jauh lebih rendah dibandingkan sebagian besar observasi lainnya.

KESIMPULAN

Berdasarkan boxplot menurut jenis kelamin, dapat disimpulkan bahwa kelompok laki-laki memiliki rate kematian akibat penyakit tidak menular yang lebih tinggi dibandingkan perempuan. Nilai pada kelompok MALE terkonsentrasi pada kisaran 27–28, sedangkan kelompok FEMALE berada pada kisaran 22–25. Selain itu, terdapat satu pencilan pada kelompok laki-laki yang menunjukkan adanya observasi dengan nilai lebih rendah dari pola umum kelompok tersebut.

Violin Plot

Plot ini dibentuk dengan menggabungkan antara Density Plot dengan boxplot dengan fungsi geom_violin(). Violin Plot pada studi kasus ini ingin Melihat sebaran dan kepadatan data rate kematian pada tiap kategori jenis kelamin.

Dengan violin plot, kita bisa melihat apakah data terkonsentrasi pada nilai tertentu atau menyebar luas. Hasilnya sebagai berikut.

library(scales)

ggplot(data = penyakit_tidak_menular,
       aes(x = DIM_SEX, y = RATE_PER_100_N)) +
  geom_violin(fill="green", alpha=0.5) +
  geom_boxplot(fill="blue", width=0.1)

INTERPRETASI

isualisasi Violin Plot ini memberikan gambaran komprehensif mengenai distribusi dan densitas angka kematian (RATE_PER_100_N) yang dikelompokkan berdasarkan jenis kelamin. Bentuk luar “biola” menunjukkan bahwa kelompok Perempuan (Female) memiliki sebaran data yang lebih rendah dan terkonsentrasi secara merata pada rentang angka 21 hingga 25. Sebaliknya, kelompok Laki-laki (Male) memiliki kepadatan data yang jauh lebih tinggi, dengan bagian “perut” biola yang melebar di angka kematian 27 hingga 28. Kehadiran Boxplot biru di bagian dalam mempertegas bahwa nilai median kelompok laki-laki berada signifikan di atas kelompok perempuan. Selain itu, adanya “ekor” panjang ke bawah pada sisi laki-laki mengindikasikan keberadaan pencilan (outlier) atau penurunan angka kematian yang sangat drastis pada titik observasi tertentu, yang menunjukkan variabilitas data laki-laki lebih ekstrem dibandingkan perempuan.

QQ-Plot

Plot ini berguna untuk memeriksa apakah sebaran data (sebaran empirik) memiliki bentuk yang sama dengan sebaran tertentu yang dispesifikan (sebaran hipotetik). pada kasus ini kita ingin melihat pola sebaran apakah variabel numerik RATE_PER_100_N mengikuti pola distribusi normal dengan membandingkan data asli (titik biru) terhadap garis referensi ideal (garis merah).

ggplot(data = penyakit_tidak_menular, aes(sample =  RATE_PER_100_N)) +
  stat_qq(col="blue", cex=0.9) +
  stat_qq_line(col="red", lwd=1)

INTERPRETASI

Secara visual, data dinyatakan berdistribusi normal jika seluruh titik biru menempel ketat pada garis merah, namun pada plot ini terlihat titik-titik tersebut mulai menjauh dan melengkung di bagian ujung bawah dan atas. Penyimpangan ini menandakan adanya nilai-nilai ekstrem atau ketidakteraturan pola angka kematian pada tahun-tahun tertentu yang tidak simetris layaknya kurva lonceng. Oleh karena itu, dapat disimpulkan bahwa data angka kematian tersebut tidak berdistribusi normal, sehingga diperlukan pendekatan statistik yang lebih fleksibel untuk pengolahan data selanjutnya.

Scatter plot

Untuk membuat scatter plot menggunakan ggplot2 kita dapat menggunakan geom_point(). Misalnya kita ingin melihat pola sebaran antara DIM_TIME dan RATE_PER_100_N. Hasilnya sebagai berikut.

ggplot(data = penyakit_tidak_menular, mapping = aes(x = DIM_TIME, y = RATE_PER_100_N)) + 
  geom_point()

INTERPRETASI

Visualisasi Scatter Plot ini menyajikan hubungan bivariat antara variabel numerik waktu (DIM_TIME) dan angka kematian (RATE_PER_100_N). Secara statistik, munculnya dua jalur tren yang terpisah secara konsisten mengindikasikan adanya heterogenitas dalam data, di mana satu kumpulan data memiliki nilai mean (rata-rata) yang jauh lebih tinggi dibandingkan kumpulan data lainnya pada setiap titik waktu. Fenomena ini menunjukkan bahwa meskipun variabel yang diplot adalah numerik, terdapat pengaruh variabel kategorik (jenis kelamin) yang menciptakan stratifikasi atau pembagian lapisan data. Jalur bagian atas mencerminkan kelompok dengan risiko kematian yang lebih besar dan fluktuasi yang lebih dinamis, sementara jalur bawah menunjukkan kelompok dengan tingkat kematian yang lebih rendah dan cenderung lebih stabil. Hal ini membuktikan bahwa faktor biologis atau sosial terkait jenis kelamin merupakan prediktor yang signifikan dalam menentukan variabilitas angka kematian dari tahun ke tahun, sehingga analisis lebih lanjut memerlukan pendekatan per kelompok (group-based analysis) untuk mendapatkan akurasi yang lebih tinggi.

Kita juga dapat memberikan warna untuk setiap titik. Misalnya pola sebaran antara DIM_TIME dan RATE_PER_100_N berdasarkan kategori jenis kelamin (DIM_SEX). Hasilnya sebagai berikut.

ggplot(data = penyakit_tidak_menular, mapping = aes(x = DIM_TIME, y = RATE_PER_100_N, color = DIM_SEX)) + 
  geom_point()

INTERPRETASI

Visualisasi Scatter Plot ini menyajikan hubungan bivariat antara variabel numerik waktu (DIM_TIME) dan angka kematian (RATE_PER_100_N) dengan penambahan dimensi kategorik berupa jenis kelamin (DIM_SEX). Melalui pemberian warna, terlihat jelas adanya stratifikasi atau pemisahan data menjadi dua jalur tren yang berbeda secara konsisten, di mana kelompok Laki-laki (Male) menempati jalur atas dengan tingkat risiko kematian yang lebih tinggi dan sempat mengalami fluktuasi kenaikan hingga sekitar tahun 2010. Sebaliknya, kelompok Perempuan (Female) berada pada jalur bawah yang menunjukkan angka kematian lebih rendah dengan tren penurunan yang jauh lebih stabil dan signifikan dari tahun ke tahun. Munculnya celah (gap) yang lebar di antara kedua kelompok ini membuktikan bahwa faktor jenis kelamin merupakan prediktor yang sangat kuat dalam menentukan variabilitas data, sehingga sebaran angka kematian tidak berkumpul pada satu titik rata-rata melainkan terbagi secara tegas berdasarkan kategori biologis tersebut.

Line chart

Plot ini digunakan untuk melihat trend data berdasarkan perubahan waktu. Artinya pada Line Chart cocok untuk data-data deret waktu.

Line chart Dasar

Untuk membuat bentuk Line Chart sederhana dengan menggunakan fungsi geom_line(). Misalnya kita akan membuat trend banyaknya kasus kematian pada penyakit tidak menular INDONESIA. Hasilnya sebagai berikut.

ggplot(data = penyakit_tidak_menular, aes(x=DIM_TIME,y=RATE_PER_100_N, color = DIM_SEX)) +
  geom_line() +
  labs(x="waktu", y="banyaknya kasus tahunan") 

INTERPRETASI

Visualisasi Line Chart ini secara efektif menggambarkan tren angka kematian (RATE_PER_100_N) di Indonesia dari tahun 2000 hingga 2021 dengan memisahkan alur data berdasarkan jenis kelamin. Penggunaan variabel numerik pada kedua sumbu memungkinkan kita melihat pola perubahan yang kontinu, di mana terdapat perbedaan risiko yang sangat kontras antara kedua kelompok. Kelompok laki-laki (Male) menempati posisi angka kematian yang jauh lebih tinggi dan sempat mengalami fluktuasi kenaikan hingga mencapai puncaknya di sekitar tahun 2010 sebelum akhirnya menurun secara signifikan. Sebaliknya, kelompok perempuan (Female) menunjukkan tren penurunan yang jauh lebih konsisten, stabil, dan berada pada level yang lebih rendah sepanjang periode observasi. Pemisahan garis yang mulus ini membuktikan bahwa faktor jenis kelamin merupakan prediktor yang kuat dalam menentukan variabilitas angka kematian, serta menunjukkan bahwa program kesehatan masyarakat telah berhasil menurunkan angka kematian pada kedua kelompok meskipun dengan kecepatan yang berbeda.

Area Plot

Untuk menambah estetika dapat dilakukan dengan mengarsir daerah di bawah plot deret waktu. Plot seperti ini disebut Area Plot dengan menggunakan fungsi geom_area(). Hasilnya sebagai berikut.

ggplot(data = penyakit_tidak_menular, aes(x = DIM_TIME, y = RATE_PER_100_N, fill = DIM_SEX)) +
  geom_area(alpha = 0.1, position = "identity") + 
  geom_line(aes(color = DIM_SEX), linewidth = 1) +
  theme_minimal() +
  labs(x = "Waktu", y = "Banyaknya Kasus Tahunan")

INTERPRETASI

Line Chart dan Area Plot memberikan perspektif volume dan arah tren yang lebih jelas. Penggunaan geom_area dengan transparansi (alpha = 0.1) dan posisi identity memungkinkan kita melihat akumulasi besaran kasus secara visual tanpa menutupi perbedaan tren antar kedua kelompok. Arsir area tersebut menonjolkan “ruang risiko” yang lebih besar pada kelompok laki-laki dibandingkan perempuan sepanjang dua dekade terakhir. Secara keseluruhan, visualisasi ini membuktikan bahwa meskipun angka kematian akibat penyakit tidak menular di Indonesia menunjukkan tren penurunan secara umum, terdapat kesenjangan gender yang nyata di mana laki-laki tetap berada pada tingkat risiko yang lebih tinggi secara konsisten.

Multiple Line Chart

Pada plot ini dapat digunakan untuk membandingkan trend data deret waktu pada beberapa wilayah/kelompok. Misalnya kita akan membuat perbandingan angka kematian berdasarkan tentang batas bawah (NL) dan batas atas (NU). Hasilnya sebagai berikut.

ggplot(data = penyakit_tidak_menular, aes(x=DIM_TIME)) +
  geom_line(aes(y = RATE_PER_100_NL, color = DIM_SEX), lwd = 1.2) + 
  geom_line(aes(y = RATE_PER_100_NU, color = DIM_SEX), lty = "dashed") +
  labs(x = "tahun ", y = "banyaknya kasus tahunan")

INTERPRETASI

Visualisasi Multiple Line Chart ini menyajikan perbandingan tren angka kematian berdasarkan rentang estimasi batas bawah (NL) dan batas atas (NU) yang dipisahkan menurut jenis kelamin. Terlihat adanya stratifikasi yang jelas di mana kelompok laki-laki (Male) memiliki profil angka kematian yang jauh lebih tinggi dibandingkan kelompok perempuan (Female), baik pada batas bawah maupun batas atasnya. Penggunaan garis putus-putus (lty = “dashed”) pada variabel NU membantu membedakan batas estimasi secara visual. Tren menunjukkan bahwa kedua kelompok mengalami penurunan yang sangat signifikan setelah tahun 2010, namun jarak (gap) antar garis tetap lebar, membuktikan bahwa faktor jenis kelamin memberikan pengaruh yang sangat stabil terhadap variabilitas angka kematian selama dua dekade terakhir.

Untuk menambahkan nama kelompok digunakan fungsi geom_text(). Hasilnya sebagai berikut.

ggplot(data = penyakit_tidak_menular, aes(x = DIM_TIME, color = DIM_SEX)) +
  geom_line(aes(y = RATE_PER_100_NL), lwd = 1.2, linetype = "solid") + 
  geom_line(aes(y = RATE_PER_100_NU), lwd = 1.2, linetype = "dashed") +
  xlim(min(penyakit_tidak_menular$DIM_TIME), max(penyakit_tidak_menular$DIM_TIME) + 5) +
  
  # Tambah teks keterangan di ujung garis (Direct Labeling)
  # Keterangan untuk Laki-laki (Male)
  geom_text(data = subset(penyakit_tidak_menular, DIM_TIME == max(DIM_TIME) & DIM_SEX == "MALE"),
            aes(y = RATE_PER_100_NU, label = "Male (NU: Putus-putus)"), 
            size = 4, hjust = -0.1) +
            
  # Keterangan untuk Perempuan (Female)
  geom_text(data = subset(penyakit_tidak_menular, DIM_TIME == max(DIM_TIME) & DIM_SEX == "FEMALE"),
            aes(y = RATE_PER_100_NL, label = "Female (NL: Garis Biasa)"), 
            size = 4, hjust = -0.1) +
            
  labs(x = "waktu", y = "banyaknya kasus tahunan") +
  theme_minimal() +
  theme(legend.position = "none") # Menghilangkan legenda agar bersih seperti contoh dosen

INTERPRETASI

Visualisasi Multiple Line Chart ini menyajikan perbandingan tren angka kematian yang bersifat full numerik dengan membedakan indikator berdasarkan jenis garis dan warna. Melalui pemetaan warna, kelompok Laki-laki (Male) dan Perempuan (Female) dibedakan secara otomatis, di mana kelompok laki-laki secara konsisten menunjukkan angka kematian yang lebih tinggi. Untuk memperjelas struktur estimasi, garis putus-putus merepresentasikan Batas Atas (NU), sedangkan garis biasa (solid) merepresentasikan Batas Bawah (NL). Penempatan label teks secara langsung di ujung kanan grafik, yang memberikan kejelasan bahwa meskipun terdapat rentang estimasi (jarak antara NL dan NU), kedua kelompok jenis kelamin menunjukkan tren penurunan angka kematian yang sinkron menuju tahun 2020.

Kategorik

Input Data

Data yang digunakan pada studi kasus ini adalah data jumlah kasus penyakit tidak menular (PTM) berdasarkan jenisya di wilayah Kabupaten Karawang. Sebelumnya telah divisualisasikan data penyakit tidak menular di Indonesia, kemudian untuk data kali ini lebih spesifik pada salah satu daerah di Jawa Barat, yaitu Karawang.

Alasan Penggunaan Data

Data PTM di wilayah Karawang dipilih karena penyakit tidak menular merupakan salah satu penyebab kematian terbanyak di Indonesia, termasuk di tingkat kabupaten. Dengan mem-visualisasikan data ini dapat menjadi alasan pengambilan keputusan untuk perencanaan program kesehatan berdasarkan prioritas jenis penyakit tidak menular yang paling banyak tersebar di wilayah Karawang.

library(ggplot2)
library(tmap)
library(mapview)
library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
setwd("D:/Coolyeah/Mata Kuliah/Semester 4/Eksplorasi dan Visualisasi Data/Tugas Kelompok")
getwd()
## [1] "D:/Coolyeah/Mata Kuliah/Semester 4/Eksplorasi dan Visualisasi Data/Tugas Kelompok"
data<-read_xlsx("jumlah_kasus_penyakit_tidak_menular_berdasarkan_jenisnya_menuru.xlsx")
DT::datatable(data)

Bar Chart

Bar chart digunakan untuk menunjukkan jumlah kasus dari setiap jenis penyakit tidak menular di Kabupaten Karawang. Hasilnya sebagai berikut.

ggplot(data = data, mapping = aes(x = penyakit_tidak_menular, y = jumlah)) + 
  geom_bar(stat = "identity")

Secara default, geom_bar() menggunakan stat = "count", yang berarti ia akan menghitung jumlah observasi (frekuensi) untuk setiap kategori dari variabel yang disebutkan pada sumbu x dan menampilkannya sebagai tinggi batang. Namun, ketika Anda menggunakan stat = "identity", Anda memberitahu ggplot2 untuk menggunakan nilai yang sudah ada di data sebagai tinggi batang, bukan menghitung frekuensi.

Bar Chart dengan tabel frekuensi

Untuk menggunakan bar chart dengan perintah stat = "identity", kita harus membuat tabel frekuensi di setiap kategori.

Membuat tabel frekuensi

Tabel frekuensi dapat dibuat dengan menggunakan perintah table(). Misalnya kita akan membuat tabel frekuensi berdasarkan variabel kualitas potongan berlian (cut).

data_penyakit <- data %>%
  group_by(penyakit_tidak_menular) %>%
  summarise(jumlah = sum(jumlah))
data_penyakit
## # A tibble: 5 × 2
##   penyakit_tidak_menular jumlah
##   <chr>                   <dbl>
## 1 DIABETES                34709
## 2 HIPERTENSI             124791
## 3 JANTUNG                     0
## 4 KANKER PAYUDARA           136
## 5 KANKER RAHIM               64

Membuat Bar Chart

Cara lain yang dapat digunakan untuk membuat diagram batang ketika data yang kita miliki sudah dalam bentuk tabel frekuensi adalah dengan geom_col(). Hasilnya sebagai berikut.

ggplot(data = data, mapping = aes(x = penyakit_tidak_menular, y = jumlah)) + 
  geom_col()

Modifikasi Bar Chart

Untuk Menambahkan judul menggunakan perintah labs(), memberikan warna pada grafik menggunakan perintah fill, dan memberikan label pada setiap batang menggunakan perintah geom_text(). Hasilnya sebagai berikut.

ggplot(data_penyakit, aes(x = reorder(penyakit_tidak_menular, jumlah), y = jumlah)) +
  geom_col(fill = "orange", alpha = 0.8) +
  geom_text(aes(label = jumlah), vjust = -0.3, size = 4) +
  labs(
    x = "Jenis Penyakit Tidak Menular",
    y = "Jumlah Kasus",
    title = "Frekuensi Penyakit Tidak Menular di Karawang"
  )

Interpretasi

Berdasarkan visualisasi bar chart, dapat terlihat bahwa Hipertensi dengan jumlah kasus 124791 adalah jenis penyakit tidak menular dengan jumlah kasus tertinggi di Kabupaten Karawang, kemudian diikuti oleh Diabetes dengan jumlah kasus 34709 dan Kanker Payudara dengan jumlah kasus 136.

Perbedaan yang cukup signifikan diantara jenis-jenis penyakit ini menunjukkan bahwa pola peyakit tidak menullar di Karawang didominasi oleh penyakit yang sangat berkaitan dengan gaya hidup.

Kesimpulan

Penyakit Tidak Menular yang paling dominan terdapat pada wilayah kabupaten Karawang. Berdasarkan hasil tersebut, dibutuhkan pencegahan yang dapat dilakukan oleh seluruh puskesmas di kabupaten Karawang. Edukasi gaya hidup sehat, seperti edukasi pola makan sehat, rutin berolahraga dan pemeriksaan tekanan darah berkala.

Needle Chart

jenis diagram batang yang menampilkan data dalam bentuk garis vertikal tipis seperti jarum (needle) yang membentang dari sumbu horizontal ke titik data tertentu. Needle Chart sering digunakan untuk menggambarkan tren data diskrit, perubahan nilai dari waktu ke waktu, atau perbandingan antara kategori tertentu. Misal akan membuat grafik perbandingan jumlah jenis penyakit tidak menular di wilayah Kabupaten Karawang. Hasilnya sebagai berikut.

ggplot(data_penyakit,
       mapping = aes(x = reorder(penyakit_tidak_menular, jumlah), y = jumlah)) +
  geom_segment(aes(x = reorder(penyakit_tidak_menular, jumlah),
                   xend = reorder(penyakit_tidak_menular, jumlah),
                   y = 0, 
                   yend = jumlah), 
               color = "orange") +
  geom_point(color = "coral", size = 4, alpha = 0.6) +
  geom_text(aes(label = jumlah), vjust = -1.0) +
  coord_flip() +
  labs(
    y="Jumlah Kasus",
    x="Jenis Penyakit Tidak Menular",
    title="Frekuensi Penyakit Tidak Menular di Karawang")

Interpretasi

Pada bar diatas ditunjukkan jumlah kasus penyakit tidak menular di wilayah Kabupaten Karawang. Hipertensi mendominasi dengan jumlah kasus 124791, disusul dengan 34709 kasus, kemudian kanker payudara 136 kasus, dan yang terakhir adalah kanker rahim dengan jumlah kasus 64. Sedangkan jenis penyakit tidak menular yang tidak memiliki penderita adalah penyakit jantung

Kesimpulan

Jumlah kasus yang ditampilkan tidak memiliki perbedaan yang signifikan dengan chart sebelumnya, yang dimana menunjukkan bahwa Hipertensi adalah penyakit tidak menular yang paling banyak ditemukan, disusul dengan Diabetes. Jenis kanker dan jantung lebih jarang ditemukan dibandingkan jenis penyakit lainnya. Kondisi ini menandakan bahwa penyakit berbasis gaya hidup menjadi tantangan kesehatan umum di wilayah Karawang. Kasus-kasus ini dapat dicegah dengan edukasi seperti sosialisasi gaya hidup sehat dan pola makan bergizi.

Grouped Bar Chart

Untuk membuat kelompok/grup pada bar chart dapat menambahkan perintah mapping. Misalnya kita akan membuat grafik jumlah kasus penyakit tidak menular berdasarkan puskesmas. Hasilnya sebagai berikut.

Var_PTM<-data %>%
  filter(jumlah>0) %>%
  group_by(nama_puskesmas) %>%
  summarise(variasi=n_distinct(penyakit_tidak_menular),
            total_kasus=sum(jumlah))%>%
  arrange(desc(variasi),desc(total_kasus))%>%
  slice_head(n=10) %>%
  pull(nama_puskesmas)

data_filter<- data %>%
  filter(nama_puskesmas %in% Var_PTM) %>%
  mutate(nama_puskesmas=factor(nama_puskesmas, levels=Var_PTM))

ggplot(data=data_filter, mapping= aes(x = nama_puskesmas, y= jumlah, fill= as.factor(penyakit_tidak_menular)))+
  geom_bar(position="dodge",stat="identity")+
  labs(
    x="Nama Puskesmas(Kecamatan)",
    y="Jumlah Kasus",
    fill="Jenis Penyakit Tidak Menular",
    title="10 Puskesmas dengan Variasi Jenis PTM Terbanyak di Karawang"
  )+
  scale_fill_brewer(palette="Oranges")+
  theme_light()+
  theme(axis.text.x = element_text(angle=45,hjust = 1))

Interpretasi

Grouped bar chart menujukkan 10 puskesmas di Kabupaten Karawang dengan jenis penyakit tidak menular yang bervariasi. Pada 10 puskesmas tersebut, tercatat kasus Hipertensi menjadi jenis PTM dengan jumlah kasus tertinggi di setiap puskesmas.

Kesimpulan

Setiap puskesmas memiliki distribusi PTM yang berbeda-beda sehingga penanganan prioritas tidak bisa diseragamkan. Pemetaan ini dapat menjadi alat pengambilan keputusan berdasarkan prioritas wilayah dengan kasus PTM tertinggi dan menyesuaikan program edukasi dengan kondisi masing-masing puskesmas

Stacked Bar Chart

Untuk membuat tampilan menumpuk pada kelompok/grup bar chart dapat digunakan perintah position = "stack". Hasilnya sebagai berikut.

ggplot(data=data_filter, mapping= aes(x = nama_puskesmas, y= jumlah, fill= as.factor(penyakit_tidak_menular)))+
  geom_bar(position="stack",stat="identity")+
  labs(
    x="Nama Puskesmas(Kecamatan)",
    y="Jumlah Kasus",
    fill="Jenis Penyakit Tidak Menular",
    title="10 Puskesmas dengan Variasi Jenis PTM Terbanyak di Karawang"
  )+
  scale_fill_brewer(palette="Oranges")+
  theme_light()+
  theme(axis.text.x = element_text(angle=45,hjust = 1))

Interpretasi

Chart Stacked Bar ini menunjukkan komposisi total kasus PTM di 10 puskesmas yang secara kumulatif terpilih. Semakin cerah warna dan semakin tebal bar, menunjukkan dominasi dari jenis penyakit tidak menular tersebut.

Kesimpulan

Stacked Bar memperkua hasil dari temuan sebelumnya bahwa terdapat distribusi beban tidak merata pada jumlah kasus di antara puskesmas karawang. Puskesmas dengan jumlah kasus tertinggi pastinya memerlukan fasilitas, dana, dan sumber daya manusia yang lebih dibandingkan puskesmas lainnya

Pie Chart

Untuk membuat pie chart, pertama kita harus menyiapkan data dengan meringkas menjadi tabel frekuensi. Misalnya akan membuat pie chart persentase jumlah kasus berdasarkan jenis penyakit tidak menular.

library(dplyr)
df_PTM <- data %>%
  group_by(penyakit_tidak_menular) %>%
  summarise(counts = sum(jumlah))
df_PTM
## # A tibble: 5 × 2
##   penyakit_tidak_menular counts
##   <chr>                   <dbl>
## 1 DIABETES                34709
## 2 HIPERTENSI             124791
## 3 JANTUNG                     0
## 4 KANKER PAYUDARA           136
## 5 KANKER RAHIM               64

Selanjutnya mengitung posisi label teks sebagai jumlah kumulatif proporsi.

df_PTM <- df_PTM %>%
  arrange(desc(penyakit_tidak_menular)) %>%
  mutate(prop = round(counts*100/sum(counts), 1),
         lab.ypos = cumsum(prop) - 0.5*prop)
head(df_PTM, 4)
## # A tibble: 4 × 4
##   penyakit_tidak_menular counts  prop lab.ypos
##   <chr>                   <dbl> <dbl>    <dbl>
## 1 KANKER RAHIM               64   0       0   
## 2 KANKER PAYUDARA           136   0.1     0.05
## 3 JANTUNG                     0   0       0.1 
## 4 HIPERTENSI             124791  78.1    39.1

Setelah itu, kita dapat membuat grafik Pie Chart dengan perintah geom_bar() dan coord_polar(). Hasilnya sebagai berikut.

ggplot(df_PTM, aes(x = "", y = prop, fill = penyakit_tidak_menular)) +
  geom_bar(width = 1, stat = "identity", color = "white") +
  geom_text(aes(y = lab.ypos, label = prop), color = "white")+
  coord_polar("y", start = 0)+
  ggpubr::fill_palette("jco")+
  labs(fill="Jenis PTM",
       title = "Persentase Jumlah Kasus Berdasarkan Jenis PTM")

  theme_void()
## <theme> List of 144
##  $ line                            : <ggplot2::element_blank>
##  $ rect                            : <ggplot2::element_rect>
##   ..@ fill         : chr "#00000000"
##   ..@ colour       : logi NA
##   ..@ linewidth    : num 0
##   ..@ linetype     : num 1
##   ..@ linejoin     : chr "round"
##   ..@ inherit.blank: logi TRUE
##  $ text                            : <ggplot2::element_text>
##   ..@ family       : chr ""
##   ..@ face         : chr "plain"
##   ..@ italic       : chr NA
##   ..@ fontweight   : num NA
##   ..@ fontwidth    : num NA
##   ..@ colour       : chr "black"
##   ..@ size         : num 11
##   ..@ hjust        : num 0.5
##   ..@ vjust        : num 0.5
##   ..@ angle        : num 0
##   ..@ lineheight   : num 0.9
##   ..@ margin       : <ggplot2::margin> num [1:4] 0 0 0 0
##   ..@ debug        : logi FALSE
##   ..@ inherit.blank: logi TRUE
##  $ title                           : <ggplot2::element_text>
##   ..@ family       : NULL
##   ..@ face         : NULL
##   ..@ italic       : chr NA
##   ..@ fontweight   : num NA
##   ..@ fontwidth    : num NA
##   ..@ colour       : NULL
##   ..@ size         : NULL
##   ..@ hjust        : NULL
##   ..@ vjust        : NULL
##   ..@ angle        : NULL
##   ..@ lineheight   : NULL
##   ..@ margin       : NULL
##   ..@ debug        : NULL
##   ..@ inherit.blank: logi TRUE
##  $ point                           : <ggplot2::element_blank>
##  $ polygon                         : <ggplot2::element_blank>
##  $ geom                            : <ggplot2::element_geom>
##   ..@ ink        : chr "black"
##   ..@ paper      : chr "#00000000"
##   ..@ accent     : chr "#3366FF"
##   ..@ linewidth  : num 0.5
##   ..@ borderwidth: num 0.5
##   ..@ linetype   : int 1
##   ..@ bordertype : int 1
##   ..@ family     : chr ""
##   ..@ fontsize   : num 3.87
##   ..@ pointsize  : num 1.5
##   ..@ pointshape : num 19
##   ..@ colour     : NULL
##   ..@ fill       : NULL
##  $ spacing                         : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ margins                         : <ggplot2::margin> num [1:4] 5.5 5.5 5.5 5.5
##  $ aspect.ratio                    : NULL
##  $ axis.title                      : <ggplot2::element_blank>
##  $ axis.title.x                    : NULL
##  $ axis.title.x.top                : NULL
##  $ axis.title.x.bottom             : NULL
##  $ axis.title.y                    : NULL
##  $ axis.title.y.left               : NULL
##  $ axis.title.y.right              : NULL
##  $ axis.text                       : <ggplot2::element_blank>
##  $ axis.text.x                     : NULL
##  $ axis.text.x.top                 : NULL
##  $ axis.text.x.bottom              : NULL
##  $ axis.text.y                     : NULL
##  $ axis.text.y.left                : NULL
##  $ axis.text.y.right               : NULL
##  $ axis.text.theta                 : NULL
##  $ axis.text.r                     : NULL
##  $ axis.ticks                      : NULL
##  $ axis.ticks.x                    : NULL
##  $ axis.ticks.x.top                : NULL
##  $ axis.ticks.x.bottom             : NULL
##  $ axis.ticks.y                    : NULL
##  $ axis.ticks.y.left               : NULL
##  $ axis.ticks.y.right              : NULL
##  $ axis.ticks.theta                : NULL
##  $ axis.ticks.r                    : NULL
##  $ axis.minor.ticks.x.top          : NULL
##  $ axis.minor.ticks.x.bottom       : NULL
##  $ axis.minor.ticks.y.left         : NULL
##  $ axis.minor.ticks.y.right        : NULL
##  $ axis.minor.ticks.theta          : NULL
##  $ axis.minor.ticks.r              : NULL
##  $ axis.ticks.length               : 'rel' num 0
##  $ axis.ticks.length.x             : NULL
##  $ axis.ticks.length.x.top         : NULL
##  $ axis.ticks.length.x.bottom      : NULL
##  $ axis.ticks.length.y             : NULL
##  $ axis.ticks.length.y.left        : NULL
##  $ axis.ticks.length.y.right       : NULL
##  $ axis.ticks.length.theta         : NULL
##  $ axis.ticks.length.r             : NULL
##  $ axis.minor.ticks.length         : NULL
##  $ axis.minor.ticks.length.x       : NULL
##  $ axis.minor.ticks.length.x.top   : NULL
##  $ axis.minor.ticks.length.x.bottom: NULL
##  $ axis.minor.ticks.length.y       : NULL
##  $ axis.minor.ticks.length.y.left  : NULL
##  $ axis.minor.ticks.length.y.right : NULL
##  $ axis.minor.ticks.length.theta   : NULL
##  $ axis.minor.ticks.length.r       : NULL
##  $ axis.line                       : NULL
##  $ axis.line.x                     : NULL
##  $ axis.line.x.top                 : NULL
##  $ axis.line.x.bottom              : NULL
##  $ axis.line.y                     : NULL
##  $ axis.line.y.left                : NULL
##  $ axis.line.y.right               : NULL
##  $ axis.line.theta                 : NULL
##  $ axis.line.r                     : NULL
##  $ legend.background               : <ggplot2::element_blank>
##  $ legend.margin                   : <ggplot2::margin> num [1:4] 0 0 0 0
##  $ legend.spacing                  : NULL
##  $ legend.spacing.x                : NULL
##  $ legend.spacing.y                : NULL
##  $ legend.key                      : NULL
##  $ legend.key.size                 : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height               : NULL
##  $ legend.key.width                : NULL
##  $ legend.key.spacing              : 'rel' num 1
##  $ legend.key.spacing.x            : NULL
##  $ legend.key.spacing.y            : NULL
##  $ legend.key.justification        : NULL
##  $ legend.frame                    : <ggplot2::element_blank>
##  $ legend.ticks                    : NULL
##  $ legend.ticks.length             : 'rel' num 0.2
##  $ legend.axis.line                : NULL
##  $ legend.text                     : <ggplot2::element_text>
##   ..@ family       : NULL
##   ..@ face         : NULL
##   ..@ italic       : chr NA
##   ..@ fontweight   : num NA
##   ..@ fontwidth    : num NA
##   ..@ colour       : NULL
##   ..@ size         : 'rel' num 0.8
##   ..@ hjust        : NULL
##   ..@ vjust        : NULL
##   ..@ angle        : NULL
##   ..@ lineheight   : NULL
##   ..@ margin       : NULL
##   ..@ debug        : NULL
##   ..@ inherit.blank: logi TRUE
##  $ legend.text.position            : NULL
##  $ legend.title                    : <ggplot2::element_text>
##   ..@ family       : NULL
##   ..@ face         : NULL
##   ..@ italic       : chr NA
##   ..@ fontweight   : num NA
##   ..@ fontwidth    : num NA
##   ..@ colour       : NULL
##   ..@ size         : NULL
##   ..@ hjust        : num 0
##   ..@ vjust        : NULL
##   ..@ angle        : NULL
##   ..@ lineheight   : NULL
##   ..@ margin       : NULL
##   ..@ debug        : NULL
##   ..@ inherit.blank: logi TRUE
##  $ legend.title.position           : NULL
##  $ legend.position                 : chr "right"
##  $ legend.position.inside          : NULL
##  $ legend.direction                : NULL
##  $ legend.byrow                    : NULL
##  $ legend.justification            : NULL
##  $ legend.justification.top        : NULL
##  $ legend.justification.bottom     : NULL
##  $ legend.justification.left       : NULL
##  $ legend.justification.right      : NULL
##  $ legend.justification.inside     : NULL
##   [list output truncated]
##  @ complete: logi TRUE
##  @ validate: logi TRUE

Interpretasi

Pie Chart menunjukkan hasil sebaran kasus penyakit tidak menular didominasi oleh penyakit Hipertensi sebesar 78.1%, kemudian disusul oleh Diabetes sebesai 21.7%. Diikuti oleh penyakit-penyakit lainnya dengan proporsi yang sangat kecil.

Kesimpulan

Secara keseluruhan, penyakit tidak menular yang terdapat di wilayah Karawang didominasi oleh Hipertensi dan Diabetes, keduanya adalah jenis penyakit yang merupakan bersumber dari gaya hidup. Penyakit tersebut dapat dicegah dengan adanya edukasi ataupun pengarahan dari pihak puskesmas untuk mengajak masyarakat untuk lebih memperhatikan gaya hidup dan pola makan. Program-program seperti pendeteksi penyakit sejak dini, konseling gizi, edukasi penyakit tidak menular pun harus lebih ditingkatkan untuk mengurangi angka kasus penyakit-penyakit ini.

Peta Spasial

Pada pembuatan peta spasial, yang perlu disiapkan adalah data excel dan peta SHP. Download data excel disini, kemudian bisa download data SHP disini

## Linking to GEOS 3.13.1, GDAL 3.11.4, PROJ 9.7.0; sf_use_s2() is TRUE
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.2.0     ✔ tidyr     1.3.1
## ✔ readr     2.1.6     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ readr::col_factor() masks scales::col_factor()
## ✖ purrr::discard()    masks scales::discard()
## ✖ 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

Import Data Excel dan SHP

Pertama, kita import data excel dan peta SHP menggunakan perintah read_xlsx() dan read_sf(). Data Excel

#Set Working Directory
setwd("D:/Coolyeah/Mata Kuliah/Semester 4/Eksplorasi dan Visualisasi Data/Tugas Kelompok")
#Import Data PTM Excel
data_PTM=read_xlsx("jumlah_kasus_penyakit_tidak_menular_berdasarkan_jenisnya_menuru.xlsx")
#Import Data SHP Karawang
shp_karawang=read_sf("SHP Karawang/ADMINISTRASI_AR_KECAMATAN.shp")

Selanjutnya gabungkan data excel ke dalam data SHP dengan perintah left_join(). Dalam proses penggabungan ini menggunakan variabel kunci ID. Artinya dalam data excel dan peta SHP ada variabel ID sehingga kedua data tersebut dapat digabungkan. Variabel ID merupakan kode angka untuk mewakili setiap lokasi/wilayah yang akan dipetakan.

#Filter hanya penyakit HIPERTENSI yang digunakan
data_PTM = data_PTM%>%
  filter(penyakit_tidak_menular == "HIPERTENSI")
data_PTM$nama_puskesmas=toupper(data_PTM$nama_puskesmas)
shp_karawang$WADMKC=toupper(shp_karawang$WADMKC)
#Menggabungkan data SHP dan Excel
gabung_KRW=left_join(shp_karawang,data_PTM,by=c("WADMKC"="nama_puskesmas"))
head(gabung_KRW)
## Simple feature collection with 6 features and 35 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 107.125 ymin: -6.625 xmax: 107.625 ymax: -6.384551
## Geodetic CRS:  WGS 84
## # A tibble: 6 × 36
##   NAMOBJ  FCODE REMARK METADATA SRS_ID KDBBPS KDCBPS KDCPUM KDEBPS KDEPUM KDPBPS
##   <chr>   <chr> <chr>  <chr>    <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
## 1 Jonggol BA03… <NA>   TASWIL1… SRGI … <NA>   <NA>   32.01… <NA>   <NA>   <NA>  
## 2 Cariu   BA03… <NA>   TASWIL1… SRGI … <NA>   <NA>   32.01… <NA>   <NA>   <NA>  
## 3 Tanjun… BA03… <NA>   TASWIL1… SRGI … <NA>   <NA>   32.01… <NA>   <NA>   <NA>  
## 4 Cikalo… BA03… <NA>   TASWIL1… SRGI … <NA>   <NA>   32.03… <NA>   <NA>   <NA>  
## 5 Kalija… BA03… <NA>   TASWIL1… SRGI … <NA>   <NA>   32.13… <NA>   <NA>   <NA>  
## 6 Pabuar… BA03… <NA>   TASWIL1… SRGI … <NA>   <NA>   32.13… <NA>   <NA>   <NA>  
## # ℹ 25 more variables: KDPKAB <chr>, KDPPUM <chr>, LUASWH <dbl>, TIPADM <int>,
## #   WADMKC <chr>, WADMKD <chr>, WADMKK <chr>, WADMPR <chr>, WIADKC <chr>,
## #   WIADKK <chr>, WIADPR <chr>, WIADKD <chr>, UUPP <chr>, SHAPE_Leng <dbl>,
## #   SHAPE_Area <dbl>, geometry <MULTIPOLYGON [°]>, id <dbl>,
## #   kode_provinsi <dbl>, nama_provinsi <chr>, kode_kabupaten_kota <dbl>,
## #   nama_kabupaten_kota <chr>, penyakit_tidak_menular <chr>, jumlah <dbl>,
## #   satuan <chr>, tahun <dbl>

Pemetaan data Spasial

Selanjutnya dilakukan pemetaan dengan perintah geom_sf(). Misal akan dipetakan kasus penyakit tidak Menular di Karawang pada tingkat Kecamatan. Hasilnya adalah sebagai berikut.

#Pemetaan Kasus Penyakit Tidak Menular di Karawang
plot_ptm=ggplot(data=gabung_KRW)+
  geom_sf(aes(fill=jumlah))+
  scale_fill_distiller(palette="YlOrRd",direction=1)+
  labs(title="Peta Sebaran Kasus PTM Hipertensi per Kecamatan",
       subtitle = "Kabupaten Karawang 2023",
       fill = "Jumlah Kasus Hipertensi")+
  theme_minimal()
plot_ptm

Pemetaan data interaktif

library(tmap)
library(mapview)
mapview(gabung_KRW,zcol="jumlah",layer.name="Jumlah Kasus PTM Hipertensi")

Interpretasi

Pada peta spasial ataupun interaktif telah ditunjukkan variasi jumlah kasus di setiap daerah. Kecamatan yang ditandai dengan warna gelap menunjukkan jumlah kasus hipertensi tinggi sekitar 5000 kasus. Sementara wilayah dengan warna terang memiliki jumlah kasus relatif rendah berkisar 1000-2000. Untuk wilayah abu-abu adalah wilayah yang tidak memiliki kecocokan data antara Excel dengan SHP.

Kesimpulan

Hasil pemetaan peta kasus Penyakit Tidak Menular khususnya jenis Hipertensi berhasil menujukkan pola distribusi yang tidak merata antar kecamatan. Kecamatan dengan beban tinggi ataupun warna gelap menjadi prioritas puskesmas sekitar untuk segera menangani kasus penyakit tersebut.

Terima kasih sudah membaca blog ini. Semoga bermanfaat. ^_^