---
title: "Tugas Praktikum Visualisasi Data 16 Sept 2026"
author: "Nurhalimah"
date: "2026-09-24"
date-format: "D MMMM YYYY"
format:
html:
theme: flatly # Pilihan lain: cosmo, spacelab, cerulean
highlight-style: nord
toc: true
toc-depth: 3
toc-location: left # Daftar isi diletakkan di panel kiri
toc-title: "Daftar Isi"
number-sections: false
code-fold: show # Tombol sembunyikan/tampilkan kode
code-tools: true # Menu utilitas kode di sudut kanan atas
code-copy: hover # Ikon salin kode otomatis saat mouse diarahkan
df-print: paged
embed-resources: true
execute:
warning: false
message: false
---
```{=html}
<style>
/* Latar kotak kode abu-abu gelap kebiruan (slate) yang teduh */
div.sourceCode, pre.sourceCode {
background-color: #2e3440 !important;
border: 1px solid #3b4252 !important;
border-left: 4px solid #88c0d0 !important;
border-radius: 6px !important;
}
/* Warna teks kode lebih redup/krem */
div.sourceCode code, pre.sourceCode code {
color: #d8dee9 !important;
}
/* Warna teks komentar (# ...) menjadi abu-abu kalem */
span.co {
color: #616e88 !important;
font-style: italic;
}
/* Latar hasil keluaran R (stdout) */
.cell-output-stdout pre {
background-color: #f8f9fa !important;
border: 1px solid #dee2e6 !important;
border-left: 4px solid #88c0d0 !important;
border-radius: 6px !important;
padding: 12px !important;
}
/* Khusus variabel/inline code di dalam kalimat */
code:not(pre code) {
background-color: #eef2f7 !important;
color: #c7254e !important;
padding: 2px 6px !important;
border-radius: 4px !important;
border: 1px solid #dce4ec !important;
font-size: 90% !important;
}
</style>
```
### Independent Exercise
### 1. Comparison — Data
Calculate the average cty for each manufacturer, select the top 10, create a comparison plot, and summarize the main finding.
```{r}
#Persiapan Dokumen (Setup & Library)
library(tidyverse)
library(ggridges)
library(scales)
library(ggrepel)
# 1. Agregasi data: Menghitung rata-rata cty dan mengambil top 10 produsen
top10_mfg <- mpg %>%
group_by(manufacturer) %>%
summarise(mean_cty = mean(cty), .groups = "drop") %>%
slice_max(mean_cty, n = 10)
# 2. Visualisasi Lollipop Chart terurut
ggplot(top10_mfg, aes(x = reorder(manufacturer, mean_cty), y = mean_cty)) +
geom_segment(aes(xend = reorder(manufacturer, mean_cty), y = 0, yend = mean_cty),
color = "steelblue", linewidth = 0.8) +
geom_point(color = "steelblue", size = 3.5) +
coord_flip() +
scale_y_continuous(limits = c(0, 30), breaks = seq(0, 30, 5)) +
labs(
title = "Top 10 Produsen Mobil Berdasarkan Efisiensi Bahan Bakar Kota",
subtitle = "Diurutkan dari rata-rata efisiensi kota tertinggi",
x = NULL,
y = "Rata-rata Konsumsi Bahan Bakar Kota (mpg)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12),
axis.text = element_text(size = 10)
)
```
**Interpretasi:**
- Produsen Honda dan Volkswagen menempati urutan teratas dalam efisiensi konsumsi bahan bakar di dalam kota (`cty`), dengan rata-rata melebihi 20 mpg.
- Sebaliknya, pabrikan asal Amerika Serikat seperti Dodge dan Lincoln tidak masuk ke dalam 10 besar efisiensi kota karena didominasi oleh kendaraan bermesin silinder besar dan kapasitas mesin tinggi.
### 2. Distribution — Data
Choose one numerical variable, compare its distribution across one categorical variable, improve the plot appearance, and interpret the pattern.
```{r}
# Visualisasi distribusi harga (price) menurut kualitas potongan (cut)
ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
geom_violin(alpha = 0.6, show.legend = FALSE, trim = FALSE) +
geom_boxplot(width = 0.12, outlier.shape = NA, alpha = 0.8, fill = "white") +
scale_fill_viridis_d() +
scale_y_continuous(labels = comma, limits = c(0, 20000), breaks = seq(0, 20000, 5000)) +
labs(
title = "Distribusi Harga Berlian Berdasarkan Kualitas Potongan (Cut)",
subtitle = "Kombinasi violin plot dan boxplot untuk melihat sebaran dan kuartil",
x = "Kualitas Potongan",
y = "Harga (USD)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12),
axis.title = element_text(size = 10, face = "bold")
)
```
**Interpretasi:**
- Distribusi harga pada seluruh kategori potongan berlian memiliki kemencengan positif (*right-skewed*), di mana sebagian besar berlian terkonsentrasi pada harga di bawah 5.000 USD.
- Menariknya, median harga berlian dengan potongan berkualitas *Ideal* justru sedikit lebih rendah dibandingkan potongan *Fair* atau *Good*. Hal ini terjadi karena berlian berpotongan *Ideal* banyak yang memiliki ukuran karat (*carat*) kecil.
### 3. Relationship — Data
Visualize the relationship between carat and price, add at least one relevant asthetic, apply suitable customization, and explain the relationship shown.
```{r}
# 1. Menyiapkan sampel 3000 data
set.seed(123)
diamonds_sample <- diamonds %>% slice_sample(n = 3000)
# 2. Scatter plot hubungan berat dan harga dengan warna berdasarkan cut
ggplot(diamonds_sample, aes(x = carat, y = price, color = cut)) +
geom_point(alpha = 0.5, size = 2) +
geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs"), se = FALSE, color = "black", linewidth = 0.8) +
scale_color_viridis_d() +
scale_y_continuous(labels = comma, breaks = seq(0, 20000, 5000)) +
scale_x_continuous(breaks = seq(0, 3, 0.5)) +
guides(color = guide_legend(override.aes = list(size = 4, alpha = 1))) +
labs(
title = "Pola Hubungan Berat Karat dan Harga Berlian",
subtitle = "Dilengkapi garis tren penghalus nonlinier (GAM) dan pemetaan kualitas potongan",
x = "Berat Berlian (Carat)",
y = "Harga (USD)",
color = "Kualitas Potongan"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12),
legend.position = "right"
)
```
**Interpretasi:**
- Terdapat hubungan nonlinier positif yang sangat kuat antara berat berlian (`carat`) dan harga (`price`); pertambahan karat meningkatkan harga secara eksponensial di awal, kemudian cenderung melandai pada karat di atas 2.
- Pada bobot karat yang setara, berlian dengan kualitas potongan *Ideal* (kuning) umumnya berada di lapisan harga atas dibandingkan potongan *Fair* (ungu).
### 4. Time Series — Data
Visualize psavert over time, use clear labels and a suitable theme, highlight or annotate a noticeable change, and provide ia short interpretation.
```{r}
# Visualisasi tingkat tabungan pribadi (psavert) dengan garis acuan dan anotasi
ggplot(economics, aes(x = date, y = psavert)) +
geom_line(color = "steelblue", linewidth = 0.8) +
geom_hline(yintercept = 5, linetype = "dashed", color = "firebrick") +
annotate("text", x = as.Date("2005-01-01"), y = 3.2,
label = "Titik Terendah Sejarah (2005)\nSaving Rate < 5%",
color = "firebrick", size = 3, fontface = "bold") +
annotate("point", x = as.Date("2005-07-01"), y = 2.2, color = "firebrick", size = 3) +
scale_y_continuous(labels = function(x) paste0(x, "%"), limits = c(0, 18), breaks = seq(0, 18, 3)) +
scale_x_date(date_breaks = "5 years", date_labels = "%Y") +
labs(
title = "Perkembangan Tingkat Tabungan Pribadi AS (1967–2015)",
subtitle = "Personal Savings Rate (psavert) menunjukkan tren penurunan jangka panjang",
x = "Tahun Pengamatan",
y = "Tingkat Tabungan (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12),
axis.title = element_text(size = 10, face = "bold")
)
```
**Interpretasi:**
- Tingkat tabungan masyarakat Amerika Serikat mengalami tren penurunan sekuler dari sekitar 13–14% pada dekade 1970-an menjadi di bawah 5% pada pertengahan dekade 2000-an.
- Titik terendah tabungan terjadi menjelang krisis keuangan global 2008 (sekitar tahun 2005 di angka 2,2%), sebelum kembali mengalami pemulihan moderat pasca-krisis.
### 5. Improve a Visualization
Create one visualization with at least three presentation problems, then redesign it using improvements such as color, theme, scale, labels, legend, or annotation, and briefly explain the changes.
#### A. Membuat Visualisasi dengan 3 Masalah Penyajian:
1. *Truncated Y-axis* (skala dimulai dari angka 70 sehingga perbedaan magnitudo terdistorsi secara manipulatif).
2. Warna kategori acak yang mencolok dan tidak memiliki makna informasi (*visual clutter*).
3. Label sumbu tidak deskriptif dan orientasi label horizontal saling bertumpuk.
```{r}
# Data contoh ringkasan
df_bad <- mpg %>%
filter(class %in% c("compact", "suv", "pickup")) %>%
group_by(class) %>%
summarise(mean_hwy = mean(hwy), .groups = "drop")
# Grafik Buruk (Sebelum Perbaikan)
plot_bad <- ggplot(df_bad, aes(x = class, y = mean_hwy, fill = class)) +
geom_col() +
coord_cartesian(ylim = c(15, 30)) + # Masalah 1: Sumbu Y dipotong
scale_fill_manual(values = c("magenta", "cyan", "yellow")) + # Masalah 2: Warna gonjreng tanpa makna
labs(title = "plot efisiensi", x = "cls", y = "val") # Masalah 3: Label mentah & tidak jelas
# Tampilkan grafik
plot_bad
```
#### B. Desain Ulang Visualisasi (Sesudah Perbaikan)
```{r}
# Grafik Diperbaiki
plot_good <- ggplot(df_bad, aes(x = reorder(class, mean_hwy), y = mean_hwy)) +
geom_col(fill = "steelblue", width = 0.6) + # Solusi 2: Warna monokromatik profesional
coord_flip() + # Solusi 3: Mudah dibaca
scale_y_continuous(limits = c(0, 32), breaks = seq(0, 30, 5)) + # Solusi 1: Sumbu Y mulai dari 0
labs(
title = "Perbandingan Efisiensi Bahan Bakar Jalan Raya",
subtitle = "Skala sumbu dimulai dari 0 untuk menjaga integritas perbandingan",
x = "Kelas Kendaraan",
y = "Rata-rata Konsumsi Bahan Bakar (mpg)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 12),
panel.grid.minor = element_blank()
)
# Tampilkan grafik
plot_good
```
**Penjelasan Perubahan Teknis:**
- **Skala Sumbu:** Sumbu Y dikembalikan mulai dari angka 0 menggunakan `scale_y_continuous(limits = c(0, 32))` agar rasio panjang batang mencerminkan nilai data yang sebenarnya tanpa ilusi pembesaran selisih.
- **Skema Warna:** Palet warna warna-warni yang mengganggu diganti dengan satu warna netral seragam (`"steelblue"`), karena kategori sudah terpisah secara fisik pada sumbu kategori.
- **Keterbacaan Label & Orientasi:** Variabel diurutkan menggunakan `reorder()`, posisi diputar horizontal dengan `coord_flip()`, serta judul dan satuan ukuran ditulis secara formal dan deskriptif.