Video Penjelasan
Jika video tidak muncul mohon klik link YouTube di bawah ini:
Jika video tidak muncul mohon klik link YouTube di bawah ini:
https://youtu.be/hGh5QpUwaqI?si=-REXRSguabXmDsPt
1 Pendahuluan
Analisis ini bertujuan untuk memahami karakteristik data pasien dari beberapa rumah sakit dengan fokus pada variabel demografis, kondisi kesehatan, dan hasil perawatan. Dataset mencakup informasi mengenai rumah sakit, jenis perawatan, status merokok, serta berbagai indikator kesehatan seperti tekanan darah, indeks massa tubuh, dan skor kesehatan. Melalui eksplorasi data dan visualisasi interaktif, diharapkan dapat diperoleh wawasan signifikan terkait distribusi pasien, pola pemulihan, dan faktor-faktor yang memengaruhi kondisi kesehatan pasien. Hasil analisis ini akan mendukung pengambilan keputusan yang lebih tepat dalam manajemen perawatan dan peningkatan layanan kesehatan.
Dataset Overview
library(dplyr)
library(ggplot2)
library(DT)
library(gridExtra)
library(DescTools)
library(knitr)
library(forcats)
library(highcharter)
library(plotly)
# Load data
dataset <- read.csv("https://raw.githubusercontent.com/YanDraa/Midterm_Exam/main/Midterm_Exam.csv")
# Membaca file CSV langsung dari link GitHub ke dalam variabel dataset
# Membuat tabel overview
overview_table <- data.frame(
Variabel = c(
"`Hospital`", "`Treatment`", "`Region`", "`SmokingStatus`",
"`Age`", "`BMI`", "`SystolicBP`", "`Cholesterol`",
"`ExerciseHours`", "`ComorbidityScore`", "`RecoveryTime`", "`HealthScore`"
),
Contoh = c(
"Hospital_A", "Medication", "Urban", "Never",
"76", "24.5", "111", "214",
"2", "1", "16.9", "68.3"
),
Tipe_Data = c(
"Nominal", "Nominal", "Nominal", "Nominal",
"Diskrit", "Kontinu", "Diskrit", "Diskrit",
"Kontinu", "Diskrit", "Kontinu", "Kontinu"
),
Deskripsi = c(
"Nama rumah sakit tempat pasien dirawat (A, B, C, D, E)",
"Jenis perawatan yang diterima pasien: Medication, Therapy, Surgery",
"Wilayah tempat rumah sakit berada: Urban, Suburban, Rural",
"Status merokok pasien: Current, Former, Never",
"Usia pasien dalam tahun (bilangan bulat)",
"Body Mass Index pasien (indeks massa tubuh)",
"Tekanan darah sistolik pasien (mmHg)",
"Kadar kolesterol total pasien (mg/dL)",
"Jam olahraga per minggu yang dilakukan pasien",
"Skor komorbiditas (penyakit penyerta) pasien (0-3+)",
"Waktu pemulihan pasien dalam hari",
"Skor kesehatan keseluruhan pasien (0-100)"
)
)
# Menampilkan tabel
kable(overview_table,
col.names = c("Variabel", "Contoh", "Tipe Data", "Deskripsi"),
align = c("l", "l", "l", "l"))
| Variabel | Contoh | Tipe Data | Deskripsi |
|---|---|---|---|
Hospital |
Hospital_A | Nominal | Nama rumah sakit tempat pasien dirawat (A, B, C, D, E) |
Treatment |
Medication | Nominal | Jenis perawatan yang diterima pasien: Medication, Therapy, Surgery |
Region |
Urban | Nominal | Wilayah tempat rumah sakit berada: Urban, Suburban, Rural |
SmokingStatus |
Never | Nominal | Status merokok pasien: Current, Former, Never |
Age |
76 | Diskrit | Usia pasien dalam tahun (bilangan bulat) |
BMI |
24.5 | Kontinu | Body Mass Index pasien (indeks massa tubuh) |
SystolicBP |
111 | Diskrit | Tekanan darah sistolik pasien (mmHg) |
Cholesterol |
214 | Diskrit | Kadar kolesterol total pasien (mg/dL) |
ExerciseHours |
2 | Kontinu | Jam olahraga per minggu yang dilakukan pasien |
ComorbidityScore |
1 | Diskrit | Skor komorbiditas (penyakit penyerta) pasien (0-3+) |
RecoveryTime |
16.9 | Kontinu | Waktu pemulihan pasien dalam hari |
HealthScore |
68.3 | Kontinu | Skor kesehatan keseluruhan pasien (0-100) |
Dataset Table
DT::datatable(
dataset, # Data yang akan ditampilkan dalam tabel
caption = "Tabel Utama: Data Lengkap Hospital", # Judul tabel
rownames = FALSE, # Tampilkan nomor baris pada tabel
options = list(pageLength = 10) # Atur tampilan tabel: 10 baris per halaman
)
2 Visualisasi
2.1 Barplot
Kolom Variabel yang di gunakan
hospital_summary <- dataset %>%
count(Hospital) %>%
arrange(desc(n)) %>%
mutate(
Hospital = factor(Hospital, levels = Hospital) # Maintain order for table
) %>%
rename(
`Rumah Sakit` = Hospital,
`Jumlah Pasien` = n,
)
kable(hospital_summary, caption = "Distribusi Pasien per Rumah Sakit")
| Rumah Sakit | Jumlah Pasien |
|---|---|
| Hospital_A | 425 |
| Hospital_D | 420 |
| Hospital_B | 406 |
| Hospital_C | 381 |
| Hospital_E | 368 |
Visualisasi
# Data tetap sama seperti sebelumnya
hospital_counts <- dataset %>%
count(Hospital) %>%
arrange(desc(n)) %>%
mutate(Hospital = fct_reorder(Hospital, n))
# Grafik interaktif menggunakan Highcharter
highchart() %>%
hc_title(
text = "Jumlah Pasien per Rumah Sakit",
style = list(fontFamily = "SF Pro Display", color = "#1d1d1f", fontSize = "20px")
) %>%
hc_subtitle(
text = "Klik atau arahkan kursor untuk melihat detail",
style = list(color = "#6e6e73", fontFamily = "Inter", fontSize = "14px")
) %>%
hc_xAxis(
categories = hospital_counts$Hospital,
title = list(text = "Rumah Sakit", style = list(color = "#1d1d1f")),
labels = list(rotation = -45, style = list(color = "#1d1d1f"))
) %>%
hc_yAxis(
title = list(text = "Jumlah Pasien", style = list(color = "#1d1d1f")),
gridLineColor = "#E5E5E5"
) %>%
hc_add_series(
name = "Jumlah Pasien",
data = hospital_counts$n,
type = "column",
color = "#0071E3",
dataLabels = list(enabled = TRUE, color = "#1d1d1f", style = list(fontSize = "13px"))
) %>%
hc_tooltip(
headerFormat = "<b>{point.key}</b><br>",
pointFormat = "Jumlah Pasien: <b>{point.y}</b>",
backgroundColor = "#f9f9f9",
borderColor = "#0071E3",
style = list(color = "#1d1d1f", fontFamily = "Inter")
) %>%
hc_exporting(enabled = TRUE) %>% # bisa ekspor PNG/JPEG
hc_chart(backgroundColor = "#ffffff") %>%
hc_add_theme(hc_theme_flat())
Interpretasi
Distribusi Pasien per Rumah Sakit : Visualisasi ini menunjukkan perbandingan jumlah pasien di lima rumah sakit berbeda, dengan rumah sakit A memiliki jumlah pasien tertinggi diikuti secara berurutan oleh rumah sakit D, C, B, dan E. Bar plot dipilih karena efektif menampilkan perbandingan kuantitatif antar kategori dan memudahkan identifikasi rumah sakit dengan volume pasien terbesar dan terkecil. Kesimpulannya, terdapat variasi signifikan dalam distribusi pasien across rumah sakit, dengan rumah sakit A menjadi pusat perawatan utama yang menangani jumlah pasien terbanyak dalam dataset ini.
2.2 Pie Chart
Kolom Variabel yang di gunakan
treatment_ComorbidityScore <- dataset %>%
count(ComorbidityScore) %>%
arrange(desc(n)) %>%
mutate(
Persentase = round(n / nrow(dataset) * 100, 1)
) %>%
rename(
`ComorbidityScore` = ComorbidityScore,
`Jumlah Pasien` = n,
`Persentase (%)` = Persentase
)
kable(treatment_ComorbidityScore, caption = "sebaran data ComorbidityScore")
| ComorbidityScore | Jumlah Pasien | Persentase (%) |
|---|---|---|
| 0 | 993 | 49.6 |
| 1 | 598 | 29.9 |
| 2 | 303 | 15.2 |
| 3 | 106 | 5.3 |
Visualisasi
# Hitung jumlah pasien per Region
ComorbidityScore_counts <- table(dataset$ComorbidityScore)
ComorbidityScore_data <- data.frame(
Region = names(ComorbidityScore_counts),
Jumlah = as.numeric(ComorbidityScore_counts)
)
# Hitung persentase
ComorbidityScore_data <- ComorbidityScore_data %>%
mutate(Persen = round(100 * Jumlah / sum(Jumlah), 1))
# Buat Donut Chart interaktif
highchart() %>%
hc_title(
text = "Distribusi Pasien Berdasarkan ComorbidityScore",
style = list(fontFamily = "SF Pro Display", color = "#1d1d1f", fontSize = "20px")
) %>%
hc_subtitle(
text = "Klik atau arahkan kursor untuk melihat proporsi",
style = list(color = "#6e6e73", fontFamily = "Inter", fontSize = "14px")
) %>%
hc_chart(type = "pie", backgroundColor = "#ffffff") %>%
hc_plotOptions(
pie = list(
innerSize = "60%", # buat jadi donut
allowPointSelect = TRUE, # ✅ BARU: Enable klik
cursor = "pointer",
dataLabels = list(
enabled = TRUE,
format = "{point.percentage:.1f} %",
style = list(color = "#1d1d1f", fontFamily = "Inter", fontSize = "13px")
),
showInLegend = TRUE,
borderWidth = 0,
point = list( # ✅ BARU: Click handler
events = list(
click = JS("function() {
this.series.data.forEach(function(point) {
point.update({ sliced: false }, false);
});
this.update({ sliced: true }, false);
}")
)
)
)
) %>%
hc_add_series(
name = "Persentase Pasien",
data = list_parse2(ComorbidityScore_data %>% mutate(y = Persen)),
colors = c("#FF9999", "#66B3FF", "#99FF99","#ffff00")
) %>%
hc_tooltip(
pointFormat = "<b>Banyaknya Pasien</b>: {point.y}",
backgroundColor = "#f9f9f9",
borderColor = "#0071E3",
style = list(color = "#1d1d1f", fontFamily = "Inter")
) %>%
hc_exporting(enabled = TRUE) %>%
hc_add_theme(hc_theme_flat())
Interpretasi
Pie Chart Distribusi Pasien Berdasarkan Region: secara visual menggambarkan distribusi pasien berdasarkan tingkat kompleksitas kesehatan mereka, yang diukur melalui Comorbidity Score. Mayoritas pasien (79.5%) terkonsentrasi pada kategori risiko rendah hingga sedang (Skor 0 dan 1), yang menunjukkan bahwa sebagian besar populasi memiliki sedikit atau tanpa penyakit penyerta yang signifikan. Namun, chart ini juga menyoroti adanya minoritas yang kritis, yaitu 20.5% pasien (Skor 2 dan 3) yang memiliki kondisi lebih kompleks dan berisiko tinggi. Pola penurunan eksponensial ini mengisyaratkan bahwa meskipun sebagian besar beban kerja klinis mungkin bersifat rutin, sumber daya dan perhatian khusus harus dialokasikan untuk menangani minoritas pasien dengan multi-morbiditas yang memerlukan penanganan lebih intensif dan terintegrasi.
2.3 Line Chart
Kolom Variabel yang di gunakan
# Fungsi modus yang lebih robust untuk data kontinu
get_mode_robust <- function(x, precision = 1) {
# Bulatkan data untuk mengelompokkan nilai yang hampir sama
x_rounded <- round(x, precision)
ux <- unique(x_rounded)
freq <- tabulate(match(x_rounded, ux))
ux[which.max(freq)]
}
# Buat tabel gabungan yang diperbaiki
stats_gabungan <- data.frame(
Variabel = c("`ExerciseHours`", "`HealthScore`"),
Deskripsi = c("Jam olahraga per Minggu", "Skor kesehatan pasien (0-100)")
)
# Tampilkan tabel
kable(stats_gabungan, caption = "Statistik Deskriptif Variabel dalam Visualisasi")
| Variabel | Deskripsi |
|---|---|
ExerciseHours |
Jam olahraga per Minggu |
HealthScore |
Skor kesehatan pasien (0-100) |
Visualisasi
# Data preparation
exercise_trend <- dataset %>%
mutate(ExerciseGroup = cut(ExerciseHours,
breaks = c(0, 2, 4, 6, 8, Inf),
labels = c("0-2 jam", "2-4 jam", "4-6 jam", "6-8 jam", "8+ jam"),
include.lowest = TRUE)) %>%
group_by(ExerciseGroup) %>%
summarise(
Avg_HealthScore = round(mean(HealthScore), 1),
Jumlah_Pasien = n()
)
# SIMPLE VERSION DULU - tanpa JavaScript complex
highchart() %>%
hc_title(text = "Pengaruh Frekuensi Olahraga terhadap Kesehatan") %>%
hc_xAxis(categories = exercise_trend$ExerciseGroup) %>%
hc_yAxis(title = list(text = "Rata-rata Skor Kesehatan")) %>%
hc_add_series(
name = "Health Score",
data = exercise_trend$Avg_HealthScore,
type = "line",
color = "#0071E3"
) %>%
hc_tooltip(
pointFormat = "Olahraga: <b>{point.x}</b><br>Health Score: <b>{point.y}</b>"
) %>%
hc_exporting(enabled = TRUE) %>%
hc_add_theme(hc_theme_flat())
Interpretasi
Pengaruh Frekuensi Olahraga terhadap Kesehatan :
Visualisasi ini menunjukkan hubungan positif antara intensitas olahraga
mingguan dan skor kesehatan pasien, dimana kelompok pasien dengan
olahraga 0-2 jam memiliki rata-rata HealthScore terendah
sementara kelompok 8+ jam mencapai skor kesehatan tertinggi. Line chart
dipilih karena efektif menampilkan trend progresif dan hubungan linear
antara dua variabel kontinu. Kesimpulannya, terdapat korelasi positif
yang jelas antara peningkatan frekuensi olahraga dan perbaikan kondisi
kesehatan pasien, menunjukkan pentingnya aktivitas fisik dalam program
pemulihan kesehatan.
2.4 Densityplot
Kolom Variabel yang di gunakan
smoking_summary <- dataset %>%
group_by(SmokingStatus) %>%
summarise(
`Rata-rata SystolicBP` = round(mean(SystolicBP, na.rm = TRUE), 1),
`Jumlah Pasien` = n(),
.groups = 'drop'
)
kable(smoking_summary, caption = "Tekanan Darah Sistolik berdasarkan Status Merokok")
| SmokingStatus | Rata-rata SystolicBP | Jumlah Pasien |
|---|---|---|
| Current | 130.2 | 383 |
| Former | 130.6 | 425 |
| Never | 130.4 | 1192 |
Visualisasi
# Buat density plots terpisah
density_current <- density(dataset$SystolicBP[dataset$SmokingStatus == "Current"])
density_former <- density(dataset$SystolicBP[dataset$SmokingStatus == "Former"])
density_never <- density(dataset$SystolicBP[dataset$SmokingStatus == "Never"])
highchart() %>%
hc_title(text = "Distribusi Tekanan Darah per Status Merokok") %>%
hc_subtitle(text = "Density plot + Boxplot") %>%
hc_xAxis(
categories = c("Current", "Former", "Never"),
title = list(text = "Status Merokok")
) %>%
hc_yAxis(title = list(text = "Frekuensi Density / Tekanan Darah")) %>%
# Density plots (seperti violin)
hc_add_series(
name = "Current - Density",
data = list_parse2(data.frame(x = density_current$x, y = density_current$y)),
type = "area",
color = "rgba(0, 113, 227, 0.3)"
) %>%
hc_add_series(
name = "Former - Density",
data = list_parse2(data.frame(x = density_former$x, y = density_former$y)),
type = "area",
color = "rgba(52, 199, 89, 0.3)"
) %>%
hc_add_series(
name = "Never - Density",
data = list_parse2(data.frame(x = density_never$x, y = density_never$y)),
type = "area",
color = "rgba(255, 149, 0, 0.3)"
) %>%
hc_tooltip(shared = TRUE)
Interpretasi
Density Plot Distribusi Tekanan Darah per Status Merokok: Visualisasi ini menunjukkan kepadatan distribusi tekanan darah sistolik pada ketiga kelompok status merokok, dimana terlihat pola distribusi yang berbeda dengan kelompok “Never” (tidak pernah merokok) menunjukkan puncak density yang lebih tajam dibandingkan kelompok “Current” (perokok aktif) yang distribusinya lebih menyebar. Density plot dipilih karena mampu menampilkan bentuk distribusi yang smooth dan perbandingan kepadatan probabilitas antar kelompok secara visual yang elegan. Kesimpulannya, terdapat perbedaan karakteristik distribusi tekanan darah yang jelas antar kelompok status merokok, dengan indikasi bahwa status merokok berhubungan dengan variabilitas tekanan darah yang lebih tinggi.
2.5 Histogram - Central Tendency
recovery_summary <- data.frame(
Variabel = "`RecoveryTime`",
Mean = round(mean(dataset$RecoveryTime, na.rm = TRUE), 1),
Median = round(median(dataset$RecoveryTime, na.rm = TRUE), 1),
Modus = as.numeric(names(sort(table(round(dataset$RecoveryTime, 0)), decreasing = TRUE)[1]))
)
kable(recovery_summary, caption = "Overview Measure untuk Variabel RecoveryTime")
| Variabel | Mean | Median | Modus |
|---|---|---|---|
RecoveryTime |
14.5 | 14.2 | 16 |
Visualisasi
library(highcharter)
library(dplyr)
# --- Hitung nilai Mean, Median, dan Mode (tetap sama) ---
mean_val <- mean(dataset$RecoveryTime, na.rm = TRUE)
median_val <- median(dataset$RecoveryTime, na.rm = TRUE)
mode_val <- as.numeric(names(sort(table(round(dataset$RecoveryTime, 0)),
decreasing = TRUE)[1]))
# --- Buat histogram data untuk highcharter ---
hist_data <- hist(dataset$RecoveryTime, breaks = 30, plot = FALSE)
# --- Buat data frame untuk histogram ---
hist_df <- data.frame(
x = hist_data$mids,
y = hist_data$counts,
from = hist_data$breaks[-length(hist_data$breaks)],
to = hist_data$breaks[-1]
)
# --- Buat data density dengan lebih banyak titik ---
density_data <- density(dataset$RecoveryTime, n = 512)
density_df <- data.frame(
x = density_data$x,
y = density_data$y * max(hist_data$counts) * 15.0
)
# --- Visualisasi Interaktif dengan Highcharter ---
highchart() %>%
# Tambahkan histogram TANPA data labels (clean look)
hc_add_series(hist_df, type = "column",
hcaes(x = x, y = y),
name = "Frekuensi",
color = "#5ab4ac",
borderColor = "white",
borderWidth = 1,
pointPadding = 0.1,
groupPadding = 0,
pointWidth = 15) %>%
# Tambahkan garis density yang TIDAK INTERAKTIF
hc_add_series(density_df,
type = "line",
name = "Density",
color = "#d8b365",
lineWidth = 2,
marker = list(enabled = FALSE),
step = FALSE,
enableMouseTracking = FALSE,
showInLegend = FALSE) %>%
# Series untuk Mean (garis vertikal penuh)
hc_add_series(
data.frame(
x = rep(mean_val, 2),
y = c(0, max(hist_data$counts)),
value = mean_val
),
type = "line",
name = "Mean",
color = "#FF6B6B",
dashStyle = "Solid",
lineWidth = 2,
marker = list(enabled = FALSE),
enableMouseTracking = TRUE,
showInLegend = TRUE
) %>%
# Series untuk Median (garis vertikal penuh)
hc_add_series(
data.frame(
x = rep(median_val, 2),
y = c(0, max(hist_data$counts)),
value = median_val
),
type = "line",
name = "Median",
color = "#4ECDC4",
dashStyle = "Dash",
lineWidth = 2,
marker = list(enabled = FALSE),
enableMouseTracking = TRUE,
showInLegend = TRUE
) %>%
# Series untuk Mode (garis vertikal penuh)
hc_add_series(
data.frame(
x = rep(mode_val, 2),
y = c(0, max(hist_data$counts)),
value = mode_val
),
type = "line",
name = "Mode",
color = "#45B7D1",
dashStyle = "Dot",
lineWidth = 2,
marker = list(enabled = FALSE),
enableMouseTracking = TRUE,
showInLegend = TRUE
) %>%
# Konfigurasi chart
hc_title(text = "Distribusi Waktu Pemulihan Pasien") %>%
hc_subtitle(text = "Perbandingan antara Mean, Median, dan Mode dari variabel RecoveryTime") %>%
hc_xAxis(
title = list(text = "Waktu Pemulihan (Hari)"),
crosshair = TRUE
) %>%
hc_yAxis(
title = list(text = "Frekuensi"),
min = 0
) %>%
# Tooltip untuk semua series
hc_tooltip(
shared = FALSE,
crosshairs = TRUE,
formatter = JS("function() {
if (this.series.name === 'Mean') {
return '<b>Mean</b><br/>Nilai: <b>' + this.point.value.toFixed(2) + ' hari</b>';
} else if (this.series.name === 'Median') {
return '<b>Median</b><br/>Nilai: <b>' + this.point.value.toFixed(2) + ' hari</b>';
} else if (this.series.name === 'Mode') {
return '<b>Mode</b><br/>Nilai: <b>' + this.point.value.toFixed(2) + ' hari</b>';
} else if (this.series.name === 'Frekuensi') {
return '<b>Frekuensi</b><br/>Rentang: <b>' + this.point.from.toFixed(1) + ' - ' + this.point.to.toFixed(1) + ' hari</b><br/>Jumlah: <b>' + this.point.y + ' pasien</b>';
} else {
return false;
}
}")
) %>%
# Legend
hc_legend(enabled = TRUE,
align = "center",
verticalAlign = "bottom",
layout = "horizontal") %>%
# Styling
hc_chart(backgroundColor = "white") %>%
hc_plotOptions(
column = list(
grouping = FALSE,
shadow = FALSE,
borderWidth = 1,
pointPadding = 0.1,
groupPadding = 0,
dataLabels = list(enabled = FALSE) # PASTIKAN data labels MATI
),
line = list(
step = FALSE,
marker = list(enabled = FALSE)
)
)
Interpretasi Distribusi Waktu Pemulihan Pasien
Visualisasi Histogram dengan Density Plot: Visualisasi ini menunjukkan distribusi waktu pemulihan pasien dengan kombinasi histogram untuk frekuensi observasi dan garis density untuk pola distribusi, dilengkapi tiga garis vertikal yang merepresentasikan mean, median, dan modus. Kombinasi visualisasi ini dipilih karena mampu menampilkan karakteristik distribusi secara komprehensif sekaligus membandingkan ketiga ukuran pemusatan data dalam satu tampilan.
Perhitungan Manual Berdasarkan Data Sample:
1. Mean (Rata-rata):
2. Median (Nilai Tengah):
3. Modus (Nilai Paling Sering Muncul):
Kesimpulannya Distribusi waktu pemulihan menunjukkan pola yang mendekati normal dengan mean 15.21 hari, median 15.45 hari, dan Modus sekitar 16 hari. Ketiga ukuran pemusatan yang relatif berdekatan mengindikasikan distribusi yang simetris tanpa skewness yang signifikan, dengan sebagian besar pasien mengalami waktu pemulihan antara 14-17 hari.
2.6 Boxplot + Violin - Measures of Dispersion
Kolom Variabel yang di gunakan
# Buat tabel dataset overview untuk Statistical Dispersion
dispersion_table <- dataset %>%
filter(!is.na(RecoveryTime) & !is.na(Treatment)) %>%
group_by(Perawatan = Treatment) %>%
summarise(
Mean = round(mean(RecoveryTime), 2),
Min = min(RecoveryTime),
Max = max(RecoveryTime),
Range = Max - Min,
Variance = round(var(RecoveryTime), 2),
SD = round(sd(RecoveryTime), 2),
.groups = 'drop'
)
# Tampilkan tabel
kable(dispersion_table,
caption = "Tabel Statistical Dispersion - Waktu Pemulihan per Jenis Perawatan",
align = c('l', 'c', 'c', 'c', 'c', 'c', 'c'))
| Perawatan | Mean | Min | Max | Range | Variance | SD |
|---|---|---|---|---|---|---|
| Medication | 13.96 | 1.0 | 30.9 | 29.9 | 29.36 | 5.42 |
| Surgery | 22.21 | 2.3 | 53.6 | 51.3 | 59.88 | 7.74 |
| Therapy | 12.92 | 1.0 | 32.2 | 31.2 | 26.95 | 5.19 |
Visualisasi
treatment_data <- dataset %>%
filter(!is.na(RecoveryTime) & !is.na(Treatment))
# Violin dengan tampilan lebih bold
fig <- treatment_data %>%
plot_ly(
x = ~Treatment,
y = ~RecoveryTime,
color = ~Treatment,
type = 'violin',
box = list(
visible = TRUE,
width = 0.15,
line = list(color = 'black', width = 1.5)
),
meanline = list(visible = TRUE),
points = FALSE,
side = 'both',
width = 1.5,
scalemode = 'width',
hoverinfo = 'y',
colors = c('#0071E3', '#34C759', '#FF9500'),
opacity = 0.8,
showlegend = FALSE
)
fig <- fig %>%
layout(
title = "<b>Distribusi Waktu Pemulihan - Violin Plot</b>",
xaxis = list(title = "<b>Jenis Treatment</b>"),
yaxis = list(
title = "<b>Waktu Pemulihan (Hari)</b>",
zeroline = FALSE
)
)
fig
Interpretasi
Boxplot + Violin Plot Distribusi Waktu Pemulihan per Jenis Treatment: Visualisasi ini menampilkan distribusi waktu pemulihan pasien untuk tiga jenis perawatan (Medication, Therapy, Surgery) menggunakan kombinasi violin plot dan boxplot. Violin plot dipilih karena mampu menunjukkan kepadatan distribusi, bentuk sebaran data, dan statistical dispersion secara visual, sementara boxplot memberikan summary statistik yang jelas.
Contoh perhitungan Manual Statistical Dispersion
:
Data Sample Surgery (10 observasi):
24.4, 18.6, 34.3, 19.7, 28.6, 22.3, 25.1, 21.4, 18.4, 22.5
Kesimpulannya Berdasarkan analisis statistical dispersion dari visualisasi, Surgery merupakan perawatan dengan variabilitas waktu pemulihan tertinggi (SD = 7.74 hari, Range = 51.3 hari), mencerminkan keberagaman tingkat kompleksitas kasus dan hasil perawatan yang lebih bervariasi dibandingkan Medication dan Therapy yang menunjukkan konsistensi lebih tinggi dalam waktu pemulihan pasien.
3 Kesimpulan
Analisis data pasien di beberapa rumah sakit memperlihatkan gambaran penting yang dapat diambil berdasarkan visualisasi yang telah disajikan.
Pertama, barplot menunjukkan bahwa Rumah Sakit A menjadi rumah sakit dengan jumlah pasien terbanyak, menegaskan perannya sebagai pusat pelayanan kesehatan utama. Hal ini penting untuk memahami distribusi sumber daya dan beban pelayanan pada masing-masing rumah sakit.
Kedua, pie chart mengilustrasikan sebaran pasien berdasarkan Comorbidity Score. Mayoritas pasien memiliki skor komorbiditas 0 (49.6%), diikuti skor 1 (29.9%) dan skor 2 (15.2%). Sementara itu, pasien dengan skor 3 merupakan kelompok paling sedikit, yakni hanya 5.3% dari keseluruhan populasi.
Ketiga, line chart mengungkapkan hubungan positif antara frekuensi olahraga mingguan dengan skor kesehatan pasien. Pasien yang rutin melakukan olahraga lebih banyak cenderung memiliki skor kesehatan yang lebih tinggi, menegaskan pentingnya aktivitas fisik dalam mendukung proses pemulihan dan peningkatan kondisi kesehatan.
Keempat, density plot mengindikasikan perbedaan distribusi tekanan darah sistolik berdasarkan status merokok, dengan perokok aktif menunjukkan variasi yang lebih besar dibandingkan perokok lama dan yang tidak pernah merokok, menunjukkan adanya risiko kesehatan tambahan pada kelompok perokok aktif.
Kelima, kombinasi boxplot dan violin plot menunjukkan bahwa waktu pemulihan pasien bervariasi menurut jenis perawatan, di mana perawatan bedah memiliki rentang waktu dan variabilitas pemulihan yang paling luas. Ini menunjukkan kompleksitas dan variasi kasus yang lebih tinggi dalam perawatan bedah dibandingkan dengan perawatan medikasi atau terapi.
Secara keseluruhan, kesimpulan dari visualisasi ini memberikan gambaran yang jelas mengenai faktor-faktor yang memengaruhi kesehatan dan pemulihan pasien, serta distribusi pasien di rumah sakit dan wilayah. Temuan ini dapat menjadi dasar dalam pengembangan strategi pengelolaan pasien dan peningkatan kualitas layanan kesehatan yang lebih efektif dan efisien.