Hospital Dataset

Midterm Exam

KELOMPOK 2

Naifah Edria Arta (52250056)

Kayla Aprilia (52250057)

Morris Alexander Pangaribuan (52250058)

Fityanandra Athar Adyaksa (52250059)

Syafif Azmi Lontoh (52250060)

Boma Satrio Wicaksono Dewantoro (52250061)

November 14, 2025

Logo


Video Penjelasan

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")
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")
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")
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")
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")
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):
x ¯ = Σ x n = 16.9 + 16.5 + 16.7 + 15.6 + 11.7 + 15.3 + 14.3 + 14.5 + 17.4 + 14.2 10 = 152.1 10 = 15.21


2. Median (Nilai Tengah):
Data terurut: 11.7, 14.2, 14.3, 14.5, 15.3, 15.6, 16.5, 16.7, 16.9, 17.4
Median = data ke-5 + data ke-6 2 = 15.3 + 15.6 2 = 30.9 2 = 15.45

3. Modus (Nilai Paling Sering Muncul):
Data: 17, 16, 16, 16, 12, 15, 14, 15, 17, 14
Urutkan semua nilai 12, 14, 14, 15, 15, 16, 16, 16, 17, 17
Modus data adalah 16 hari

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'))
Tabel Statistical Dispersion - Waktu Pemulihan per Jenis Perawatan
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

1. Mean (Rata-rata):
x ¯ = Σx n = 24.4 + 18.6 + 34.3 + 19.7 + 28.6 + 22.3 + 25.1 + 21.4 + 18.4 + 22.5 10 = 235.3 10 = 23.53


2. Range (Rentang):
Range = Max - Min = 34.3 - 18.4 = 15.9


3. Variance (Ragam):
σ 2 = i=1 n ( x i x ¯ ) 2 n

∑(xi - x̄)² = (24.4-23.53)² + (18.6-23.53)² + … + (22.5-23.53)² = 238.7

σ 2 = 238.7 10 = 23.87


4. Standard Deviation (Simpangan Baku):
σ = σ 2 = 23.87 = 4.89



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.