1 Pengantar

Dokumen ini memuat perbaikan beberapa visualisasi . Tiap bagian disusun dalam tiga bagian, yaitu alasan perbaikan, perbaikan yang dilakukan, dan interpretasi. Grafik hasil perbaikan ditampilkan di antara bagian kedua dan ketiga.

Catatan data. Seluruh data di dokumen ini adalah data bangkitan (simulasi) yang dibuat sendiri untuk keperluan latihan, mengikuti pola gambar pada slide. Data yang mengandung unsur acak memakai set.seed supaya hasilnya sama setiap kali dijalankan. Fokus tugas ini ada pada cara memvisualisasikan, jadi angka pastinya tidak dijadikan patokan dan tidak bersumber dari lembaga mana pun.

2 Tingkat Keterisian Tempat Tidur RS di DKI Jakarta

2.1 Alasan perbaikan

  • Pie chart dipakai untuk data yang bukan komposisi. Keempat irisan adalah persentase keterisian pada hari yang berbeda dan jumlahnya lebih dari 100%
  • Datanya deret waktu, tetapi pie chart tidak punya sumbu waktu sehingga arah perubahan tidak terbaca.
  • Keempat irisan tampak hampir sama besar padahal nilainya berbeda (54% sampai 60%).
  • Efek 3D membuat irisan yang dekat tampak lebih besar dan menambah distorsi.
  • Warna hijau, biru, kuning, dan merah tidak membawa makna, bahkan bisa memberi kesan keliru seperti hijau berarti aman dan merah berarti bahaya.

2.2 Perbaikan yang dilakukan

  • Pie chart diganti line chart dengan tanggal pada sumbu x dan persentase pada sumbu y.
  • Sumbu y dimulai dari 0% agar kenaikan tidak tampak berlebihan.
  • Efek 3D dan latar dekoratif dihapus, warna dibuat satu saja, dan nilai ditulis langsung pada titik.
data_bor <- data.frame(
  tanggal    = c("29 Jan", "30 Jan", "31 Jan", "1 Feb"),
  keterisian = c(54, 57, 57, 60)
)
data_bor$tanggal <- factor(data_bor$tanggal, levels = data_bor$tanggal)

ggplot(data_bor, aes(x = tanggal, y = keterisian, group = 1)) +
  geom_line(color = "#1f4e79", linewidth = 1.2) +
  geom_point(color = "#1f4e79", size = 3.5) +
  geom_text(aes(label = paste0(keterisian, "%")), vjust = -1, size = 4.2) +
  scale_y_continuous(limits = c(0, 100), labels = function(x) paste0(x, "%")) +
  labs(
    title    = "Keterisian Tempat Tidur RS di DKI Jakarta Naik dari 54% menjadi 60%",
    subtitle = "Periode 29 Januari sampai 1 Februari",
    x = "Tanggal", y = "Tingkat keterisian tempat tidur",
    caption  = "Data bangkitan untuk latihan visualisasi"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.minor = element_blank())

2.3 Interpretasi

Keterisian tempat tidur rumah sakit di DKI Jakarta naik dari 54% pada 29 Januari menjadi 60% pada 1 Februari. Kenaikannya bertahap, yaitu 3 poin persentase di hari pertama, tidak berubah di hari berikutnya, lalu naik 3 poin lagi. Totalnya 6 poin persentase dalam empat hari dengan rata-rata sekitar 57%. Pola ini menandakan kebutuhan rawat inap terus bertambah sehingga kapasitas perlu dipantau.

3 Sistem Pembayaran Pelanggan

3.1 Alasan perbaikan

  • Keempat irisan memakai gradasi krem sampai oranye yang sangat berdekatan sehingga batas antarkategori sulit dibedakan.
  • Irisan Paylater/Cicilan (2%) berwarna oranye yang hampir sama dengan latar kuning, jadi nyaris menyatu dengan latar.
  • Gradasi terang ke gelap memberi kesan tingkatan, padahal metode pembayaran adalah data kategorik tanpa urutan.
  • Label persentase abu-abu di atas latar kuning-oranye kontrasnya rendah.
  • Nama kategori hanya ada di legenda kecil di bawah, jadi pembaca harus bolak-balik mencocokkan warna.
  • Urutan irisan tidak dari yang terbesar, dekorasi tidak menambah informasi, dan judul hanya menyebut topik tanpa temuan.

3.2 Perbaikan yang dilakukan

  • Warna diganti palet Okabe-Ito yang kontras dan aman bagi pembaca buta warna.
  • Latar dibuat putih polos, dekorasi dihapus, lalu nama kategori dan persentase ditaruh langsung di dekat irisan sehingga legenda tidak diperlukan.
  • Irisan diurutkan dari terbesar searah jarum jam mulai pukul 12, dengan garis pemisah putih yang tegas.
data_bayar <- data.frame(
  metode = c("M-Banking", "COD", "Lainnya", "Paylater/Cicilan"),
  persen = c(64, 20, 14, 2)
)

data_bayar <- data_bayar %>%
  mutate(
    metode = factor(metode, levels = metode),
    pos    = cumsum(persen) - persen / 2,
    label  = paste0(metode, "\n", persen, "%")
  )

warna <- c("M-Banking" = "#0072B2", "COD" = "#E69F00",
           "Lainnya" = "#009E73", "Paylater/Cicilan" = "#CC79A7")

ggplot(data_bayar, aes(x = 1, y = persen, fill = metode)) +
  geom_col(width = 1, color = "white", linewidth = 1.2,
           position = position_stack(reverse = TRUE)) +
  geom_text(aes(x = 1.75, y = pos, label = label),
            size = 4.3, lineheight = 0.95) +
  coord_polar(theta = "y", start = 0) +
  scale_fill_manual(values = warna, guide = "none") +
  labs(
    title    = "M-Banking Menjadi Metode Pembayaran Pilihan Utama Pelanggan (64%)",
    subtitle = "Persentase pelanggan menurut metode pembayaran",
    caption  = "Data bangkitan untuk latihan visualisasi"
  ) +
  theme_void(base_size = 13) +
  theme(
    plot.title      = element_text(face = "bold", hjust = 0.5),
    plot.subtitle   = element_text(hjust = 0.5),
    plot.caption    = element_text(hjust = 0.5),
    plot.background = element_rect(fill = "white", color = NA),
    plot.margin     = margin(10, 20, 10, 20)
  )

3.3 Interpretasi

Metode pembayaran yang paling banyak dipilih pelanggan adalah M-Banking dengan 64%, jauh di atas COD yang berada di 20%. Kategori Lainnya mencakup 14% pelanggan dan Paylater/Cicilan paling jarang dipakai dengan hanya 2%. M-Banking dipilih hampir tiga kali lipat lebih banyak daripada COD, dan keduanya bersama-sama mencakup 84% pelanggan.

4 Persentase Penduduk yang Menggunakan Komputer menurut Provinsi

4.1 Alasan perbaikan

  • Provinsi disusun mengikuti urutan kode wilayah dari barat ke timur sehingga provinsi tertinggi, terendah, dan peringkatnya sulit ditentukan.
  • Label provinsi pada grafik vertikal miring 90 derajat sehingga sulit dibaca.
  • Tidak ada label nilai, jadi pembaca menebak angka dari garis bantu.
  • Semua batang berwarna sama dan tidak ada pembanding, sehingga tidak ada informasi utama yang menonjol.

4.2 Perbaikan yang dilakukan

  • Batang diurutkan dari terbesar ke terkecil supaya peringkat dan kesenjangan langsung terlihat.
  • Lima provinsi tertinggi diberi warna biru, lima terendah oranye kemerahan, dan sisanya abu-abu.
  • Nilai ditulis di ujung batang, ditambah garis putus-putus rata-rata sederhana antarprovinsi sebagai pembanding.
# Data bangkitan mengikuti pola gambar slide.
komputer <- data.frame(
  provinsi = c("Aceh","Sumatera Utara","Sumatera Barat","Riau","Jambi",
               "Sumatera Selatan","Bengkulu","Lampung","Kep. Bangka Belitung",
               "Kep. Riau","DKI Jakarta","Jawa Barat","Jawa Tengah",
               "DI Yogyakarta","Jawa Timur","Banten","Bali",
               "Nusa Tenggara Barat","Nusa Tenggara Timur","Kalimantan Barat",
               "Kalimantan Tengah","Kalimantan Selatan","Kalimantan Timur",
               "Kalimantan Utara","Sulawesi Utara","Sulawesi Tengah",
               "Sulawesi Selatan","Sulawesi Tenggara","Gorontalo",
               "Sulawesi Barat","Maluku","Maluku Utara","Papua Barat","Papua"),
  persen = c(11.7,14.2,17.0,14.5,12.2,11.1,14.9,9.9,12.0,
             20.7,23.5,14.5,13.2,23.3,14.2,15.3,18.6,
             12.0,11.4,10.4,13.6,17.3,19.4,18.0,14.3,13.6,
             15.4,15.8,16.4,12.3,13.8,11.2,14.0,8.2)
)
stopifnot(nrow(komputer) == 34)

rata2 <- mean(komputer$persen)

komputer <- komputer %>%
  arrange(desc(persen)) %>%
  mutate(
    peringkat = row_number(),
    grup = case_when(
      peringkat <= 5 ~ "Tertinggi",
      peringkat > n() - 5 ~ "Terendah",
      TRUE ~ "Lainnya"
    ),
    provinsi = factor(provinsi, levels = rev(provinsi))
  )

ggplot(komputer, aes(x = provinsi, y = persen, fill = grup)) +
  geom_col(width = 0.7) +
  geom_hline(yintercept = rata2, linetype = "dashed", color = "grey30") +
  annotate("text", x = 3, y = rata2 + 0.4,
           label = paste0("Rata-rata antarprovinsi: ", round(rata2, 1), "%"),
           hjust = 0, size = 3.5, color = "grey30") +
  geom_text(aes(label = paste0(persen, "%")), hjust = -0.15, size = 3.2) +
  scale_fill_manual(values = c("Tertinggi" = "#0072B2",
                               "Terendah"  = "#D55E00",
                               "Lainnya"   = "#b0b7bf"), name = NULL) +
  scale_y_continuous(limits = c(0, 27), expand = c(0, 0)) +
  coord_flip() +
  labs(
    title    = "Penggunaan Komputer Tertinggi di DKI Jakarta dan DI Yogyakarta",
    subtitle = "Persentase penduduk yang menggunakan komputer menurut provinsi, 2019",
    x = NULL, y = "Persentase penduduk (%)",
    caption  = "Data bangkitan untuk latihan visualisasi"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.major.y = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top")

4.3 Interpretasi

Persentase penduduk yang menggunakan komputer pada 2019 menunjukkan kesenjangan yang jelas antarprovinsi. DKI Jakarta (sekitar 23,5%) dan DI Yogyakarta (sekitar 23,3%) berada paling atas, disusul Kepulauan Riau, Kalimantan Timur, dan Bali. Di ujung bawah ada Papua dengan angka sekitar 8%, lalu Lampung dan Kalimantan Barat di kisaran 10%. Selisih provinsi tertinggi dan terendah sekitar tiga kali lipat. Yang menarik, angka tertinggi pun baru sedikit di atas seperlima penduduk, jadi penggunaan komputer secara umum masih rendah di semua provinsi.

5 Noise vs Signal: Kasus Harian dan Rata-rata Bergerak

5.1 Alasan perbaikan

  • Warna Daily Cases dan 3-day moving average sama-sama abu-abu dengan tingkat terang yang hampir sama. Saat keduanya ditampilkan, data mentah dan rata-rata 3 hari menyatu dan tidak bisa dibedakan.
  • Garis 3-day dan 7-day sama-sama berupa garis dengan ketebalan serupa sehingga tingkat kehalusan keduanya tidak tampak.
  • Legenda terpisah di bawah grafik memaksa pembaca mencocokkan warna bolak-balik, dan kotak centang adalah sisa tampilan web yang tidak berguna di slide.

5.2 Perbaikan yang dilakukan

  • Batang harian dibuat abu-abu muda sebagai latar karena perannya data mentah (noise).
  • Rata-rata 3 hari diberi warna oranye dengan garis tipis, sedangkan rata-rata 7 hari biru dengan garis tebal. Perbedaan warna dan ketebalan membuat ketiga elemen mudah dibedakan.
  • Legenda diganti label langsung pada garis.
  • Sumbu x memakai label bulan dan tahun, sumbu y memakai pemisah ribuan dan dimulai dari 0.
# Data bangkitan mengikuti pola grafik pada slide.
set.seed(2026)
tgl <- seq(as.Date("2020-01-22"), as.Date("2020-08-31"), by = "day")
kunci <- data.frame(
  t = as.Date(c("2020-01-22","2020-02-15","2020-03-02","2020-03-18",
                "2020-04-03","2020-05-05","2020-05-29","2020-06-22",
                "2020-07-08","2020-07-24","2020-08-09","2020-08-31")),
  y = c(0, 4000, 2500, 25000, 75000, 85000, 120000, 160000,
        210000, 255000, 262000, 260000)
)
dasar <- approx(as.numeric(kunci$t), kunci$y, xout = as.numeric(tgl))$y
pola  <- c(0.80, 0.97, 1.03, 1.05, 1.04, 1.02, 0.90)
hari  <- as.POSIXlt(tgl)$wday + 1
covid <- data.frame(
  tanggal    = tgl,
  kasus_baru = round(dasar * pola[hari] * exp(rnorm(length(tgl), 0, 0.04)))
)

covid <- covid %>%
  mutate(
    rata3 = rollmean(kasus_baru, k = 3, fill = NA, align = "right"),
    rata7 = rollmean(kasus_baru, k = 7, fill = NA, align = "right")
  )

tgl_akhir <- max(covid$tanggal)
n3 <- covid$rata3[covid$tanggal == tgl_akhir]
n7 <- covid$rata7[covid$tanggal == tgl_akhir]

ggplot(covid, aes(x = tanggal)) +
  geom_col(aes(y = kasus_baru), fill = "#d9dce0", width = 1) +
  geom_line(aes(y = rata3), color = "#E69F00", linewidth = 0.7, na.rm = TRUE) +
  geom_line(aes(y = rata7), color = "#0072B2", linewidth = 1.4, na.rm = TRUE) +
  annotate("text", x = tgl_akhir, y = max(n3, n7) * 1.25,
           label = "Rata-rata 7 hari", color = "#0072B2",
           hjust = 1, fontface = "bold", size = 4) +
  annotate("text", x = tgl_akhir, y = min(n3, n7) * 0.72,
           label = "Rata-rata 3 hari", color = "#E69F00",
           hjust = 1, fontface = "bold", size = 4) +
  annotate("text", x = as.Date("2020-02-10"), y = max(covid$kasus_baru) * 1.02,
           label = "Batang abu-abu: kasus harian",
           color = "grey40", size = 3.8, hjust = 0) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b %Y") +
  scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ","),
                     expand = expansion(mult = c(0, 0.05))) +
  labs(
    title    = "Semakin Panjang Rentang Rata-rata Bergerak, Semakin Jelas Tren Kasus Harian",
    subtitle = "Kasus baru harian, rata-rata 3 hari, dan rata-rata 7 hari (data simulasi)",
    x = NULL, y = "Kasus baru per hari",
    caption  = "Data bangkitan untuk latihan visualisasi"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank())

5.3 Interpretasi

Batang abu-abu memperlihatkan kasus harian yang naik turun tajam dari hari ke hari. Rata-rata 3 hari meredam sebagian fluktuasi itu, tetapi garisnya masih bergerigi. Rata-rata 7 hari paling mulus dan menampilkan arah tren yang sebenarnya, yaitu naik tajam sejak Maret, melandai pada April sampai Mei, naik lagi mulai Juni, lalu relatif mendatar di sekitar 260 ribu kasus per hari menjelang akhir periode.

6 Negara Tujuan Ekspor

6.1 Alasan Perbaikan

  • Tidak ada label nilai angka di atas atau di dalam batang, sehingga pembaca harus menarik garis imajiner sendiri ke sumbu y untuk memperkirakan angka pastinya.
  • Semua batang berwarna biru polos yang seragam, sehingga tidak ada penekanan visual pada negara dengan porsi ekspor paling dominan atau kelompok negara tertentu.
  • Keterangan gambar menyebutkan “nilai ekspor kopi”, padahal sumbu y menampilkan label “Berat Bersih (ribu ton)”. Terdapat ketidaksesuaian antara deskripsi narasi dan satuan pada grafik.

6.2 Perbaikan yang dilakukan

  • Diagram batang diubah menjadi bentuk horizontal agar seluruh label nama negara dapat dibaca dengan datar dari kiri ke kanan secara alami
  • Nilai angka (ribu ton) ditampilkan secara langsung (direct labeling) di ujung setiap batang.
  • Negara tujuan utama (Amerika Serikat) diberi penekanan warna khusus (biru tua), sedangkan negara lainnya diberi warna abu-abu netral agar fokus utama pembaca langsung tertuju pada pasar terbesar
library(ggplot2)
library(dplyr)
library(scales)

# Data ekspor kopi Indonesia 2018 berdasarkan slide
kopi <- data.frame(
  negara = c("Amerika Serikat", "Malaysia", "Jepang", "Mesir", "Italia", 
             "Jerman", "Maroko", "Georgia", "Singapura", "Inggris"),
  berat  = c(52.1, 37.3, 30.2, 29.1, 27.8, 13.1, 11.2, 10.8, 7.6, 7.4)
)

# Pengurutan faktor agar batang tertinggi berada di posisi paling atas pada coord_flip
kopi <- kopi %>%
  arrange(desc(berat)) %>%
  mutate(
    sorot = ifelse(negara == "Amerika Serikat", "Utama", "Lainnya"),
    negara = factor(negara, levels = rev(negara))
  )

ggplot(kopi, aes(x = negara, y = berat, fill = sorot)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = paste0(format(berat, nsmall = 1), " ribu ton")), 
            hjust = -0.15, size = 3.8) +
  scale_fill_manual(values = c("Utama" = "#1F4E79", "Lainnya" = "#B0B7BF"), guide = "none") +
  scale_y_continuous(limits = c(0, 62), expand = c(0, 0)) +
  coord_flip() +
  labs(
    title    = "Amerika Serikat Menjadi Tujuan Ekspor Kopi Terbesar Indonesia pada 2018",
    subtitle = "Sepuluh negara tujuan ekspor kopi berdasarkan berat bersih (ribu ton)",
    x = NULL, 
    y = "Berat Bersih (ribu ton)",
    caption  = "Sumber: Badan Pusat Statistik (BPS), 2018"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title         = element_text(face = "bold", size = 13),
    panel.grid.major.y = element_blank(),
    panel.grid.minor   = element_blank(),
    plot.margin        = margin(10, 20, 10, 10)
  )

6.3 Interpretasi

Amerika Serikat merupakan negara tujuan ekspor kopi terbesar dari Indonesia pada tahun 2018, dengan volume mencapai lebih dari 52 ribu ton. Jumlah ini jauh melampaui negara tujuan lainnya, seperti Malaysia (sekitar 37 ribu ton) dan Jepang (sekitar 30 ribu ton).

Terdapat perbedaan yang cukup signifikan antara 5 negara tujuan teratas (Amerika Serikat, Malaysia, Jepang, Mesir, dan Italia) yang masing-masing mengimpor di atas 25 ribu ton, dibanding 5 negara bawah (Jerman, Maroko, Georgia, Singapura, dan Inggris) yang angka impornya berada di bawah 15 ribu ton. Visualisasi ini menunjukkan konsentrasi pasar ekspor kopi Indonesia yang masih bertumpu pada beberapa negara konsumen utama.

7 Komposisi SUN Rupiah menurut Jatuh Tempo

7.1 Alasan perbaikan

  • Keempat warna hijau terlalu mirip sehingga batas antarkategori, terutama >3-5 tahun dan >5-10 tahun, sulit dibedakan.
  • Pada stacked chart, hanya kategori paling bawah yang punya garis dasar sama. Kategori di tengah ikut bergeser mengikuti kategori di bawahnya sehingga perubahannya sulit dibaca.
  • Batang kuartalan yang rapat dengan celah putih menimbulkan kesan bergaris-garis dan menyembunyikan sifat data sebagai deret waktu yang kontinu.
  • Legenda berjudul “period” tidak informatif dan terpisah dari grafik, sedangkan bahasa judul (Inggris) berbeda dari keterangan gambar (Indonesia).

7.2 Perbaikan yang dilakukan

  • Batang diganti area chart 100% bertumpuk karena komposisinya berubah kontinu dari waktu ke waktu.
  • Palet diganti gradasi dengan rentang terang-gelap yang lebar (kuning kehijauan, tosca, biru, biru tua) dan kategori terpanjang diberi warna paling gelap.
  • Legenda diganti label langsung di ujung kanan area, dengan garis putih tipis sebagai pemisah lapisan.
  • Bahasa diseragamkan ke bahasa Indonesia dan judul diganti kalimat temuan.
# Data bangkitan: nilai kunci diinterpolasi per kuartal mengikuti pola slide.
tahun <- c(2002, 2003, 2005, 2007, 2009, 2011, 2013, 2015, 2016, 2017, 2019, 2021)
g10   <- c(.26, .50, .50, .62, .59, .56, .57, .55, .47, .43, .38, .35)
g510  <- c(.39, .27, .24, .18, .19, .20, .22, .24, .26, .28, .30, .33)
g35   <- c(.22, .12, .14, .09, .11, .10, .09, .10, .13, .14, .17, .18)

kuartal <- seq(as.Date("2002-01-01"), as.Date("2021-01-01"), by = "quarter")
th <- as.numeric(format(kuartal, "%Y")) + (as.numeric(format(kuartal, "%m")) - 1) / 12

lv <- c(">1-3 tahun", ">3-5 tahun", ">5-10 tahun", ">10 tahun")
i10  <- approx(tahun, g10,  xout = th)$y
i510 <- approx(tahun, g510, xout = th)$y
i35  <- approx(tahun, g35,  xout = th)$y

sun <- data.frame(
  tanggal  = rep(kuartal, 4),
  kategori = factor(rep(lv, each = length(kuartal)), levels = lv),
  persen   = c(1 - i10 - i510 - i35, i35, i510, i10)
) %>%
  group_by(tanggal) %>%
  mutate(share = persen / sum(persen)) %>%
  ungroup()

lab <- sun %>%
  filter(tanggal == max(tanggal)) %>%
  arrange(kategori) %>%
  mutate(top = 1 - cumsum(lag(share, default = 0)),
         ymid = top - share / 2)

warna <- c(">1-3 tahun" = "#C7E9B4", ">3-5 tahun" = "#41B6C4",
           ">5-10 tahun" = "#2C7FB8", ">10 tahun" = "#253494")

ggplot(sun, aes(x = tanggal, y = share, fill = kategori)) +
  geom_area(color = "white", linewidth = 0.25) +
  geom_text(data = lab,
            aes(x = max(sun$tanggal) + 100, y = ymid, label = kategori),
            hjust = 0, size = 4, fontface = "bold", color = "grey20",
            inherit.aes = FALSE) +
  scale_fill_manual(values = warna, guide = "none") +
  scale_x_date(date_breaks = "2 years", date_labels = "%Y", expand = c(0, 0)) +
  scale_y_continuous(labels = percent_format(accuracy = 1), expand = c(0, 0)) +
  coord_cartesian(clip = "off") +
  labs(
    title    = "Porsi SUN Bertenor Lebih dari 10 Tahun Menyusut Sejak 2014",
    subtitle = "Komposisi SUN rupiah menurut jatuh tempo, data kuartalan",
    x = NULL, y = "Persentase dari total SUN",
    caption  = "Data bangkitan untuk latihan visualisasi"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank(),
        plot.margin = margin(10, 90, 10, 10))

7.3 Interpretasi

Porsi SUN bertenor lebih dari 10 tahun naik cepat dari sekitar seperempat total pada awal 2000-an menjadi kisaran 60% pada 2007, lalu bertahan di 55% sampai 60% hingga sekitar 2014. Sesudah itu porsinya menurun dan berada di sekitar 35% pada ujung periode. Pada saat yang sama porsi tenor menengah (>5-10 tahun) membesar sampai sekitar sepertiga total, sedangkan tenor pendek (>1-3 tahun) relatif kecil dan stabil di kisaran 10% sampai 15%. Struktur utang pemerintah jadi bergeser dari dominasi tenor sangat panjang ke komposisi yang lebih merata. Penyebabnya belum bisa disimpulkan dari grafik, jadi hanya boleh ditulis sebagai dugaan, misalnya strategi penerbitan atau kondisi pasar. Semua angka merupakan data bangkitan, jadi pola ini tidak mencerminkan komposisi SUN yang sebenarnya.

8 Komposisi Tujuan Ekspor Indonesia 2019

8.1 Alasan perbaikan

  • Negara-negara di luar Asia (termasuk Eropa) tidak terlihat: Karena Asia sangat mendominasi nilai ekspor, benua lain terdesak di pojok kanan bawah treemap sebagai kotak-kotak mikro yang tidak bisa dibaca
  • Label bertumpuk dan kontras rendah: Teks nama negara berwarna biru di atas latar pastel membuat keterbacaan sangat buruk
  • Perbandingan luas tidak presisi: Mata manusia kesulitan membandingkan luas persegi panjang yang bentuk/rasionya berbeda-beda.
  • Tidak ada label nilai langsung: Ukuran tiap negara pada treemap hanya bisa ditebak tanpa angka persentase.

8.2 Perbaikan yang dilakukan

  • Mengganti treemap menjadi Diagram Batang Horizontal yang Dipisah per Benua (Facet Bar Chart).
  • Menambahkan label nilai persentase secara langsung (direct labeling) di ujung setiap batang.
  • Memberikan warna yang berbeda untuk setiap benua
  • Mengurutkan negara dari persentase terbesar ke terkecil di dalam masing-masing benua.
library(ggplot2)
library(dplyr)
library(scales)

# Data ekspor 2019 dengan cakupan benua yang jelas
ekspor_benua <- data.frame(
  negara = c("China", "Jepang", "India", "Singapura", "Malaysia",
             "Amerika Serikat", 
             "Belanda", "Jerman", "Spanyol", "Inggris",
             "Australia"),
  benua  = c("Asia", "Asia", "Asia", "Asia", "Asia",
             "Amerika Utara", 
             "Eropa", "Eropa", "Eropa", "Eropa",
             "Oceania"),
  nilai  = c(17, 11, 8, 7, 5.5, 
             10, 
             2.0, 1.8, 1.2, 1.0,
             2.5)
)

ggplot(ekspor_benua, aes(x = reorder(negara, nilai), y = nilai, fill = benua)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  geom_text(aes(label = paste0(nilai, "%")), hjust = -0.15, size = 3.5) +
  facet_wrap(~ benua, scales = "free_y", ncol = 2) +
  scale_fill_manual(values = c("Asia" = "#0072B2", "Amerika Utara" = "#E69F00", 
                               "Eropa" = "#009E73", "Oceania" = "#CC79A7")) +
  scale_y_continuous(limits = c(0, 20), expand = c(0, 0)) +
  coord_flip() +
  labs(
    title    = "Pasar Ekspor Utama Indonesia Didominasi Asia, disusul Amerika & Eropa",
    subtitle = "Persentase nilai ekspor Indonesia tahun 2019 dikelompokkan berdasarkan benua",
    x = NULL, 
    y = "Persentase Nilai Ekspor (%)",
    caption  = "Sumber: BPS, 2019 (Data olahan latihan)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title         = element_text(face = "bold"),
    strip.background   = element_rect(fill = "grey90", color = NA),
    strip.text         = element_text(face = "bold"),
    panel.grid.major.y = element_blank(),
    panel.grid.minor   = element_blank()
  )

8.3 Interpretasi

Ekspor Indonesia pada 2019 terkonsentrasi di Asia. China dan Jepang tampak sebagai dua tujuan terbesar, disusul Singapura, India, dan Malaysia. Amerika Serikat menjadi tujuan terbesar di luar Asia, sedangkan kawasan Eropa terdiri dari banyak negara dengan porsi kecil masing-masing. Pola ini menunjukkan ketergantungan pada beberapa pasar utama.

9 Komposisi Pelanggan Perusahaan Telekomunikasi menurut Usia

9.1 Alasan perbaikan

  • Dua grafik menampilkan data yang sama sehingga redundan dan membagi perhatian pembaca.
  • Pada grafik kiri, sumbu y berisi label kategori usia dengan jarak yang tidak sama, sehingga tinggi segmen sulit ditafsirkan. Lebar kolomnya juga sama untuk semua perusahaan.
  • Urutan legenda (< 15 di atas) berlawanan dengan urutan tumpukan (< 15 di bawah).
  • Usia adalah data berurutan tetapi diberi palet pastel yang berbeda-beda, sehingga urutan usia tidak tampak dari warnanya.
  • Tidak ada label persentase dan perusahaan tidak diurutkan, jadi pola perbedaan antarperusahaan sulit ditangkap.

9.2 Perbaikan yang dilakukan

  • Dua grafik disatukan menjadi satu batang bertumpuk 100% horizontal.
  • Warna diganti palet berurutan dari muda ke tua, sehingga usia yang makin tinggi tampak dari warna yang makin gelap.
  • Urutan legenda disamakan dengan urutan tumpukan.
  • Persentase ditulis di dalam segmen dengan warna teks yang kontras terhadap latarnya.
  • Perusahaan diurutkan menurut porsi usia 15-25 tahun dan judul diganti kalimat temuan.
# Data bangkitan: tiap perusahaan diberi total 1000 pelanggan supaya
# angkanya mudah dibaca sebagai proporsi.
pelanggan <- data.frame(
  perusahaan = rep(c("Impulse", "Kriya", "Scope", "Telexa"), each = 4),
  usia       = rep(c("< 15", "15-25", "26-40", "40+"), times = 4),
  jumlah     = c(150, 240, 310, 300,
                  80, 200, 400, 320,
                 190, 710,  50,  50,
                 150, 570, 140, 140)
)
pelanggan$usia <- factor(pelanggan$usia, levels = c("< 15", "15-25", "26-40", "40+"))

tabel <- pelanggan %>%
  group_by(perusahaan) %>%
  mutate(share = jumlah / sum(jumlah)) %>%
  ungroup()

urut <- tabel %>% filter(usia == "15-25") %>% arrange(share) %>% pull(perusahaan)
tabel$perusahaan <- factor(tabel$perusahaan, levels = urut)

ggplot(tabel, aes(x = perusahaan, y = share, fill = usia)) +
  geom_col(width = 0.7, color = "white", linewidth = 0.6,
           position = position_stack(reverse = TRUE)) +
  geom_text(aes(label = percent(share, accuracy = 1), color = usia),
            position = position_stack(vjust = 0.5, reverse = TRUE), size = 4) +
  scale_fill_viridis_d(option = "mako", direction = -1, name = "Kelompok usia") +
  scale_color_manual(values = c("< 15" = "black", "15-25" = "black",
                                "26-40" = "white", "40+" = "white"),
                     guide = "none") +
  scale_y_continuous(labels = percent_format(accuracy = 1), expand = c(0, 0)) +
  coord_flip() +
  labs(
    title    = "Pelanggan Scope Paling Dominan Berusia 15-25 Tahun",
    subtitle = "Komposisi pelanggan empat perusahaan telekomunikasi menurut kelompok usia",
    x = NULL, y = "Persentase pelanggan",
    caption  = "Data bangkitan untuk latihan visualisasi"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid = element_blank(),
        legend.position = "top")

9.3 Interpretasi

Komposisi usia pelanggan berbeda cukup jelas antarperusahaan. Scope paling menonjol karena sekitar tujuh dari sepuluh pelanggannya berusia 15-25 tahun, sementara porsi usia 26 tahun ke atas sangat kecil. Telexa juga condong ke usia muda dengan kelompok 15-25 tahun sebagai yang terbesar, tetapi porsi usia 26 tahun ke atasnya lebih besar daripada Scope. Impulse dan Kriya lebih tersebar, dengan sekitar sepertiga pelanggan berusia 40 tahun ke atas dan kelompok 26-40 tahun yang besar. Scope paling bergantung pada segmen anak muda, sedangkan Impulse dan Kriya punya basis pelanggan yang lebih beragam.

10 Hubungan Berat Kendaraan dan Jarak Tempuh per Liter BBM

10.1 Alasan perbaikan

Tiga grafik pada slide masing-masing hanya memuat sebagian informasi. - Grafik pertama hanya sebaran titik tanpa garis yang merangkum arah hubungan. - Grafik kedua punya garis tren tetapi menganggap semua titik satu kelompok, sehingga perbedaan jenis BBM tidak tampak. - Grafik ketiga membedakan jenis BBM tetapi tidak punya garis tren. - Pembaca harus membandingkan ketiganya sendiri untuk mendapat gambaran utuh, dan titik yang saling menumpuk menyulitkan pembacaan kepadatan data.

10.2 Perbaikan yang dilakukan

Dari ketiganya, versi terbaik adalah gabungan grafik kedua dan ketiga. - Titik diwarnai menurut jenis BBM dengan dua warna kontras yang aman bagi buta warna. - Garis tren (loess) ditambahkan dengan warna netral supaya tidak bersaing dengan warna kelompok, lengkap dengan pita interval kepercayaan. - Transparansi titik dipertahankan agar area padat tetap terbaca.

# Data simulasi mengikuti pola scatter pada slide.
set.seed(2026)
n_gas    <- 150
n_diesel <- 25
berat_gas    <- pmin(pmax(rnorm(n_gas, 2700, 560), 1500), 4050)
berat_diesel <- runif(n_diesel, 2200, 3800)

mobil <- data.frame(
  berat     = c(berat_gas, berat_diesel),
  fuel.type = rep(c("gas", "diesel"), c(n_gas, n_diesel))
)
mobil$jarak <- 22.5 * (1500 / mobil$berat)^0.9 *
  exp(rnorm(nrow(mobil), 0, 0.07)) *
  ifelse(mobil$fuel.type == "diesel", 1.15, 1)

ggplot(mobil, aes(x = berat, y = jarak)) +
  geom_point(aes(color = fuel.type), size = 3.5, alpha = 0.6) +
  geom_smooth(method = "loess", se = TRUE,
              color = "grey20", fill = "grey70", linewidth = 1.1) +
  scale_color_manual(values = c("diesel" = "#D55E00", "gas" = "#0072B2"),
                     labels = c("diesel" = "Diesel", "gas" = "Bensin/Gas"),
                     name = "Jenis bahan bakar") +
  labs(
    title    = "Makin Berat Kendaraan, Makin Pendek Jarak Tempuh per Liter BBM",
    subtitle = "Kendaraan diesel cenderung menempuh jarak lebih jauh pada berat yang sama",
    x = "Berat bersih kendaraan (kg)",
    y = "Jarak tempuh per liter BBM (km)",
    caption = "Data simulasi mengikuti pola slide"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"),
        legend.position = "top")

10.3 Interpretasi

Terdapat hubungan negatif antara berat kendaraan dan jarak tempuh per liter BBM. Kendaraan yang lebih berat cenderung menempuh jarak lebih pendek, dari sekitar 20 km per liter pada berat 1.500 sampai 2.000 kg menjadi kurang dari 10 km per liter pada berat di atas 3.500 kg. Garis tren melengkung dengan penurunan paling curam di rentang berat yang lebih ringan, lalu melandai pada kendaraan yang lebih berat. Titik diesel umumnya berada di atas titik gas pada berat yang sama, yang menunjukkan kendaraan diesel cenderung lebih irit. Jumlah titik diesel jauh lebih sedikit, jadi perbandingan ini harus dibaca hati-hati. Grafik ini hanya menunjukkan asosiasi dan bukan sebab akibat, karena faktor lain seperti ukuran mesin juga bisa memengaruhi konsumsi BBM.

11 Tren Kasus Baru Harian

11.1 Alasan perbaikan

  • Empat dari lima visualisasi pada slide menampilkan data harian mentah yang berfluktuasi tajam, sehingga arah tren tertutup oleh noise.
  • Scatter plot tanpa garis tidak menunjukkan kesinambungan waktu.
  • Line chart data mentah memperlihatkan lonjakan dan penurunan mendadak yang bisa disalahartikan sebagai perubahan nyata, padahal sebagian besar kemungkinan berasal dari pola pelaporan.
  • Versi yang sudah dihaluskan lebih jelas, tetapi garis hitam polos tanpa penekanan belum mengarahkan pembaca pada informasi utama.
  • Judul dan sumber data belum tercantum, dan sumbu y belum menjelaskan bahwa nilainya sudah dirata-ratakan.

11.2 Perbaikan yang dilakukan

  • Dipilih area chart dari rata-rata bergerak 7 hari sebagai tampilan utama karena paling jelas memperlihatkan bentuk gelombang.
  • Data harian mentah tetap muncul sebagai batang abu-abu tipis di belakang, supaya pembaca tahu data aslinya tidak dibuang.
  • Warna biru dipakai hanya untuk elemen utama, sedangkan puncak disorot dengan warna oranye kemerahan beserta label tanggal dan nilai.
# Data simulasi mengikuti pola slide (kasus harian, April 2020 - Maret 2021).
set.seed(2026)
tgl <- seq(as.Date("2020-04-01"), as.Date("2021-03-31"), by = "day")
kunci <- data.frame(
  t = as.Date(c("2020-04-01","2020-06-15","2020-07-15","2020-08-31",
                "2020-10-10","2020-11-25","2020-12-15","2021-01-01",
                "2021-01-20","2021-02-05","2021-02-15","2021-03-01",
                "2021-03-31")),
  y = c(100, 130, 250, 550, 1180, 800, 1250, 1700,
        2700, 3200, 2400, 1500, 1350)
)
dasar <- approx(as.numeric(kunci$t), kunci$y, xout = as.numeric(tgl))$y
pola  <- c(0.75, 1.0, 1.08, 1.1, 1.05, 1.0, 0.85)
hari  <- as.POSIXlt(tgl)$wday + 1
kasus <- data.frame(
  tanggal    = tgl,
  kasus_baru = round(dasar * pola[hari] * exp(rnorm(length(tgl), 0, 0.12)))
)

kasus <- kasus %>%
  mutate(rata7 = rollmean(kasus_baru, k = 7, fill = NA, align = "right"))

puncak <- kasus %>% filter(rata7 == max(rata7, na.rm = TRUE)) %>% slice(1)

ggplot(kasus, aes(x = tanggal)) +
  geom_col(aes(y = kasus_baru), fill = "#d9dce0", width = 1) +
  geom_area(aes(y = rata7), fill = "#0072B2", alpha = 0.35, na.rm = TRUE) +
  geom_line(aes(y = rata7), color = "#0072B2", linewidth = 1.2, na.rm = TRUE) +
  geom_point(data = puncak, aes(y = rata7), color = "#D55E00", size = 4) +
  geom_text(data = puncak,
            aes(y = rata7,
                label = paste0("Puncak: ", format(tanggal, "%d %b %Y"),
                               "\n", format(round(rata7), big.mark = "."),
                               " kasus/hari")),
            vjust = -0.5, color = "#D55E00", fontface = "bold", size = 3.8) +
  scale_x_date(date_breaks = "2 months", date_labels = "%b %Y") +
  scale_y_continuous(labels = label_number(big.mark = "."),
                     expand = expansion(mult = c(0, 0.2))) +
  labs(
    title    = "Kasus Harian Naik dalam Dua Gelombang dan Mencapai Puncak pada Awal 2021",
    subtitle = "Garis dan area biru: rata-rata bergerak 7 hari. Batang abu-abu: kasus harian",
    x = NULL, y = "Kasus baru per hari",
    caption  = "Data simulasi mengikuti pola slide"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank())

11.3 Interpretasi

Kasus baru harian bertahan rendah di awal periode, lalu naik bertahap mulai pertengahan 2020 hingga membentuk gelombang pertama di sekitar Oktober 2020. Setelah itu angkanya sempat turun, naik lagi lebih tinggi, dan mencapai puncak pada awal 2021 di kisaran 3.200 kasus per hari menurut rata-rata 7 hari. Sesudah puncak, kasus turun cukup cepat sampai akhir periode. Jadi pola yang tampak adalah dua gelombang dengan gelombang kedua jauh lebih besar. Rata-rata bergerak meredam fluktuasi harian, tetapi membuat puncak tampak lebih rendah dan sedikit terlambat dibanding data mentah, dan cara ini tidak menghilangkan keterlambatan pelaporan. Angka yang dipakai adalah simulasi yang mengikuti pola slide.

12 Visualisasi Perdagangan antar Negara ASEAN (Network)

12.1 Alasan perbaikan

  • Garis hanya menunjukkan ada atau tidaknya hubungan tanpa informasi besar kecilnya perdagangan, sehingga satu aliran tidak bisa dibandingkan dengan aliran lain.
  • Ketebalan garis serta warna merah dan biru tidak dijelaskan maknanya dan tidak ada legenda.
  • Semua node berukuran sama, padahal peran tiap negara dalam perdagangan tentu berbeda.
  • Node abu-abu (Kamboja dan Vietnam) tidak dijelaskan, apakah berarti tidak ada data atau tidak ada perdagangan.
  • Garis melengkung yang saling bersilangan menyulitkan pembacaan arah, dan tidak ada judul temuan, satuan, periode, maupun sumber.

12.2 Perbaikan yang dilakukan

  • Ketebalan garis dipetakan ke nilai perdagangan dan node dipetakan ke total perdagangan (ekspor ditambah impor), lengkap dengan legenda satuan.
  • Warna dipakai untuk satu tujuan saja, yaitu menyorot ekspor dari Indonesia (oranye), sedangkan aliran lain dibuat abu-abu sebagai konteks.
  • Node ditata melingkar dengan jarak sama dan ujung panah diberi jarak dari node supaya tidak tertutup.
  • Aliran kecil disaring agar grafik tidak menjadi bola benang.
  • Data dibangkitkan sendiri (simulasi)
library(ggplot2)
library(dplyr)
library(tidygraph)
library(ggraph)

set.seed(2026)
negara <- c("Indonesia", "Singapura", "Malaysia", "Thailand", 
            "Vietnam", "Filipina", "Kamboja")

# 1. Matriks Data Simulasi Perdagangan (miliar USD)
dagang <- expand.grid(from = negara, to = negara, stringsAsFactors = FALSE) %>%
  filter(from != to) %>%
  mutate(nilai = round(rexp(n(), rate = 1/10) + 1, 1))

# 2. Hitung Rincian Ekspor, Impor, dan Total Perdagangan per Negara
ekspor_df <- dagang %>% group_by(from) %>% summarize(total_ekspor = sum(nilai))
impor_df  <- dagang %>% group_by(to)   %>% summarize(total_impor  = sum(nilai))

ringkasan_perdagangan <- full_join(ekspor_df, impor_df, by = c("from" = "to")) %>%
  rename(name = from) %>%
  mutate(
    total_dagang = total_ekspor + total_impor,
    label_node   = paste0(name, "\nTotal: ", sprintf("%.1f", total_dagang), " M USD",
                          "\n(X: ", sprintf("%.1f", total_ekspor), " | M: ", sprintf("%.1f", total_impor), ")")
  )

# 3. Filter Aliran Perdagangan Utama untuk Garis Jaringan
batas <- quantile(dagang$nilai, 0.65)
dagang_filter <- dagang %>%
  filter(nilai >= batas | from == "Indonesia") %>%
  mutate(fokus = ifelse(from == "Indonesia", "Ekspor Indonesia", "Aliran lain"))

tujuan_utama <- dagang %>% filter(from == "Indonesia") %>% slice_max(nilai, n = 1)

# 4. Buat Graf
g <- tbl_graph(nodes = ringkasan_perdagangan, edges = dagang_filter, directed = TRUE)

# Kalkulasi Tata Letak Melingkar
layout_g <- create_layout(g, layout = "circle")

ggraph(layout_g) +
  # Garis panah aliran ekspor antarnegara (sudah diperbaiki di baris alpha)
  geom_edge_arc(aes(edge_width = nilai, edge_colour = fokus),
                strength = 0.15, alpha = 0.5,
                arrow = arrow(length = unit(2.5, "mm"), type = "closed"),
                start_cap = circle(7, "mm"), end_cap = circle(7, "mm")) +
  
  # Node/Titik Negara
  geom_node_point(aes(size = total_dagang, fill = ifelse(name == "Indonesia", "Indonesia", "Lainnya")),
                  shape = 21, color = "white", stroke = 1.2) +
  
  # Label Teks Lengkap di Luar Lingkaran
  geom_node_text(aes(label = label_node),
                 nudge_x = layout_g$x * 0.25,
                 nudge_y = layout_g$y * 0.25,
                 size = 3.3, fontface = "bold", lineheight = 0.85) +
  
  scale_edge_width(range = c(0.4, 2.5), name = "Nilai Transaksi Ekspor (miliar USD)") +
  scale_edge_colour_manual(values = c("Ekspor Indonesia" = "#D55E00", "Aliran lain" = "#9AA5B1"), name = NULL) +
  scale_fill_manual(values = c("Indonesia" = "#D55E00", "Lainnya" = "#0072B2"), guide = "none") +
  scale_size_continuous(range = c(6, 13), guide = "none") +
  
  labs(
    title    = paste0("Simulasi Perdagangan ASEAN: Ekspor Indonesia Terbesar Mengarah ke ", tujuan_utama$to),
    subtitle = "Catatan: Total Perdagangan = Total Ekspor (X) + Total Impor (M) intra-ASEAN | Tebal garis = Nilai Ekspor",
    caption  = "Data simulasi latihan | X = Ekspor, M = Impor (Satuan: Miliar USD)"
  ) +
  coord_fixed(clip = "off") +
  theme_void(base_size = 12) +
  theme(
    plot.title       = element_text(face = "bold", hjust = 0.5, size = 13),
    plot.subtitle    = element_text(hjust = 0.5, margin = margin(b = 20), size = 10, color = "grey20"),
    plot.caption     = element_text(hjust = 0.5, color = "grey40", margin = margin(t = 15)),
    legend.position  = "bottom",
    legend.box       = "horizontal",
    plot.margin      = margin(30, 80, 30, 80)
  )

12.3 Interpretasi

Pusat Jaringan Perdagangan Regional: Singapura mencatatkan nilai Total Perdagangan terbesar dalam simulasi ini, yaitu sebesar 265,0 Miliar USD (dengan perimbangan Ekspor \(X = 132,4\) M USD dan Impor \(M = 132,6\) M USD). Hal ini ditunjukkan oleh ukuran lingkaran biru yang paling besar, mengonfirmasi posisinya sebagai hub utama transaksi barang dan jasa di kawasan ASEAN. Kinerja dan Fokus Ekspor Indonesia: Indonesia mencatatkan total transaksi sebesar 101,4 Miliar USD (\(X = 48,5\) M USD | \(M = 52,9\) M USD). Garis oranye tebal memperlihatkan bahwa tujuan aliran ekspor terbesar Indonesia mengarah ke Thailand

13 Persentase Penduduk Miskin menurut Provinsi (Peta)

13.1 Alasan perbaikan

  • Rentang warna terlalu sempit karena hanya bergerak dari putih ke biru muda, sehingga selisih beberapa poin persen nyaris tidak tampak.
  • Provinsi bernilai rendah diwarnai putih, sama dengan latar peta, sehingga wilayah seperti sebagian besar Kalimantan tampak kosong.
  • Wilayah yang berjauhan sulit dibandingkan, karena gradasi mulus tidak membantu pembaca memastikan apakah dua provinsi berwarna sama atau berbeda.
  • Legenda kontinu memaksa pembaca menebak angka dari posisi warna.
  • Garis batas gelap dan tebal mendominasi tampilan sehingga mengganggu warna isian.

13.2 Perbaikan yang dilakukan

  • Nilai dikelompokkan ke dalam enam kelas supaya tiap kelas punya warna yang jelas berbeda.
  • Palet diganti ke YlOrRd (kuning ke merah tua) yang rentangnya lebar dan tidak memakai putih untuk nilai rendah.
  • Warna abu-abu khusus disediakan untuk data yang tidak tersedia, dan garis batas dibuat putih serta tipis.
  • legenda diberi satuan, dan ditambah keterangan tahun serta sumber.
# Peta provinsi dari rnaturalearth. Nilai kemiskinan di bawah ini adalah
# data bangkitan yang mengikuti pola warna pada slide.
peta <- tryCatch(ne_states(country = "indonesia", returnclass = "sf"),
                 error = function(e) NULL)

if (is.null(peta)) {
  cat("Peta provinsi tidak dapat dimuat. Pasang paket rnaturalearthhires lalu knit ulang.")
} else {
  set.seed(2026)
  nilai_sim <- c("Papua" = 26, "Papua Barat" = 22, "Nusa Tenggara Timur" = 20,
                 "Maluku" = 17, "Aceh" = 15, "Bengkulu" = 15, "Gorontalo" = 15,
                 "Sulawesi Tengah" = 13, "Sumatera Selatan" = 12, "Lampung" = 12,
                 "Kalimantan Barat" = 7, "Kalimantan Tengah" = 5.5,
                 "Kalimantan Selatan" = 5, "Bali" = 4.5)

  peta$miskin <- coalesce(unname(nilai_sim[peta$name]),
                          round(runif(nrow(peta), 6, 11), 1))

  peta <- peta %>%
    mutate(kelas = cut(miskin,
                       breaks = c(0, 7.5, 10, 12.5, 15, 20, Inf),
                       labels = c("< 7,5", "7,5 - 10", "10 - 12,5",
                                  "12,5 - 15", "15 - 20", "> 20"),
                       right = FALSE))

  ggplot(peta) +
    geom_sf(aes(fill = kelas), color = "white", linewidth = 0.15) +
    scale_fill_brewer(palette = "YlOrRd", name = "Penduduk miskin (%)",
                      na.value = "grey85", drop = FALSE) +
    labs(
      title    = "Kemiskinan Terkonsentrasi di Kawasan Timur Indonesia",
      subtitle = "Persentase penduduk miskin menurut provinsi",
      caption  = "Data bangkitan untuk latihan visualisasi. Abu-abu: data tidak tersedia"
    ) +
    theme_void(base_size = 13) +
    theme(plot.title = element_text(face = "bold"),
          legend.position = "right",
          plot.margin = margin(10, 10, 10, 10))
}

13.3 Interpretasi

Persentase penduduk miskin tampak paling tinggi di Papua, dan wilayah timur lain seperti Papua Barat, Maluku, serta Nusa Tenggara Timur juga berada pada kelas yang relatif tinggi. Di Sumatera, beberapa provinsi seperti Aceh, Bengkulu, dan Sumatera Selatan berada di kelas menengah. Provinsi di Kalimantan dan sebagian Jawa tampak berada di kelas paling rendah. Pola ini memperlihatkan ketimpangan yang cukup jelas antara kawasan barat dan timur.