Evaluasi & Redesain 15 Visualisasi Data

Pemilihan grafik berdasarkan tujuan, alternatif desain, kode R, dan interpretasi yang dapat diuji.

1 Pendahuluan

Visualisasi yang baik harus sesuai dengan jenis data dan tujuan analisis. Kemudian lima visualisasi lanjutan mempraktikkan (1) violin plot + boxplot, (2) density ridgeline plot, (3) diagram batang + error bar, (4) jaringan berarah berbobot, dan (5) peta choropleth. Setiap bagian menyebutkan sumber, satuan, cara membangun, serta interpretasi temuan konkret yang otomatis mengikuti hasil perhitungan R.

1.1 Alur kerja analisis

Setiap visualisasi mengikuti enam tahapan: (1) memahami pertanyaan, (2) memanggil dataset, (3) memeriksa tipe variabel dan nilai hilang, (4) menyiapkan data, (5) membangun grafik, dan (6) membaca pola serta keterbatasannya. Sintaks ditampilkan agar hasil dapat direplikasi.

1.2 Persiapan lingkungan dan importasi data

Langkah 1 — Buat satu folder proyek yang berisi berkas .Rmd dan kemiskinan_2020.csv. Buka berkas R Markdown di RStudio, pastikan koneksi internet tersedia untuk instalasi paket dan unduhan batas peta, kemudian pilih Knit → Knit to HTML.

Langkah 2 — Jalankan kode berikut untuk memanggil dataset. Paket diinstal otomatis pada chunk setup apabila belum tersedia. Data penguin digunakan pada dua grafik agar perbedaan tujuan visualisasi dapat dibandingkan secara langsung.

data_penguins <- palmerpenguins::penguins
data_gapminder <- gapminder::gapminder
data_penerbangan <- nycflights13::flights
data_kemiskinan <- readr::read_csv('kemiskinan_2020.csv', show_col_types=FALSE)
ringkasan_dataset <- data.frame(
  Dataset=c('Palmer Penguins','Gapminder','NYC Flights 2013','Kemiskinan provinsi 2020'),
  Observasi=c(nrow(data_penguins),nrow(data_gapminder),nrow(data_penerbangan),nrow(data_kemiskinan)),
  Variabel=c(ncol(data_penguins),ncol(data_gapminder),ncol(data_penerbangan),ncol(data_kemiskinan))
)
knitr::kable(ringkasan_dataset, caption='Dimensi dataset yang berhasil dimuat')
Dimensi dataset yang berhasil dimuat
Dataset Observasi Variabel
Palmer Penguins 344 8
Gapminder 1704 6
NYC Flights 2013 336776 19
Kemiskinan provinsi 2020 34 2

Catatan reproduksibilitas. File CSV harus tersedia di direktori kerja saat dokumen di-Knit. Dataset gapminder bersifat historis, nycflights13 hanya mencakup keberangkatan NYC pada 2013, sedangkan batas administratif untuk data kemiskinan harus sesuai tahun 2020.

2 Panduan tugas dan kriteria penilaian

Laporan revisi ini mencakup 15 studi kasus: 10 slide yang dipilih (6, 7, 10, 20, 21, 22, 23, 24, 25, 26) dari Kuliah 9. Unsur dan Jenis Visualisasi, ditambah 5 visualisasi lanjutan dari tugas sebelumnya. Pada setiap studi kasus, tiga unsur penilaian dituliskan terpisah: alasan perbaikan, perbaikan yang dilakukan, dan interpretasi.

Gambar slide asli dipertahankan sebagai referensi visual. Sebagian slide merupakan contoh konseptual dan tidak menyediakan tabel data mentah. Karena itu, hasil R memakai data demonstrasi yang disebutkan dengan jelas, bukan klaim merekonstruksi nilai asli slide. Slide 6 dan 7 menggunakan transkripsi visual terbatas dan harus dipahami sebagai ilustrasi, bukan dataset resmi.

Alur praktik: baca slide asli → evaluasi kendala desain → input dan validasi data → olah data → tampilkan grafik baru → baca output → rumuskan kesimpulan dan keterbatasan.

3 1. Slide 6 — Persentase keterisian tempat tidur: pilih grafik sesuai struktur data

3.1 Gambar asli dan evaluasi

Slide asli memperlihatkan tingkat keterisian tempat tidur (BOR) pada beberapa tanggal menggunakan lingkaran 3D, dekorasi berlebih, dan garis penunjuk. Masalah mendasarnya bukan sekadar estetika: angka BOR pada tanggal berbeda bukan komponen dari satu keseluruhan, sehingga tidak tepat disajikan sebagai irisan satu pie chart. Perspektif 3D juga mendistorsi luas dan sudut irisan.

3.2 Alasan perbaikan dan pemilihan grafik

Versi A — diagram batang/lollipop: paling sesuai untuk membandingkan persentase BOR antarhari, karena semua angka memakai sumbu yang sama, 0–100%. Versi B — pie/donut: hanya sesuai bila data adalah komposisi kapasitas pada satu tanggal, misalnya 60 tempat tidur terisi dan 40 kosong dari total 100 tempat tidur. Dengan demikian, versi B membutuhkan variabel jumlah terisi dan jumlah tersedia, bukan empat BOR antarhari.

Langkah kerja: (1) tentukan unit pengamatan dan penyebut persentase; (2) susun tabel; (3) validasi rentang 0–100%; (4) buat grafik perbandingan antarhari; (5) untuk pie, pilih satu hari dan turunkan komposisi terisi–kosong dari kapasitas.

bor <- data.frame(hari=factor(c('29 Jan','30 Jan','31 Jan','1 Feb'), levels=c('29 Jan','30 Jan','31 Jan','1 Feb')),
                  bor=c(54,57,57,60))
stopifnot(all(bor$bor >= 0 & bor$bor <= 100))
knitr::kable(bor, caption='Angka ilustratif yang terbaca pada slide; tahun dan seri resmi perlu diverifikasi')
Angka ilustratif yang terbaca pada slide; tahun dan seri resmi perlu diverifikasi
hari bor
29 Jan 54
30 Jan 57
31 Jan 57
1 Feb 60

3.2.1 Versi A — Lollipop untuk membandingkan hari

ggplot(bor,aes(x=hari,y=bor)) +
 geom_segment(aes(xend=hari,y=0,yend=bor),linewidth=3,color='#B8D8E7')+
 geom_point(size=5,color='#156B9A')+
 geom_text(aes(label=paste0(bor,'%')),vjust=-1,fontface='bold',size=3.7,color='#17324D')+
 scale_y_continuous(limits=c(0,100),breaks=seq(0,100,20),labels=function(x)paste0(x,'%'))+
 labs(title='Keterisian tempat tidur menurut tanggal',subtitle='Persentase antarhari dibandingkan pada skala 0–100%',x=NULL,y='Keterisian (%)')

3.2.2 Versi B — Donut untuk komposisi kapasitas pada satu hari

Contoh ini menggunakan kapasitas hipotetis 100 tempat tidur pada 1 Februari. Karena kapasitas aktual tidak tersedia di slide, jumlah berikut bukan klaim angka rumah sakit yang sebenarnya.

kapasitas_ilustrasi <- 100
terisi <- kapasitas_ilustrasi * tail(bor$bor,1)/100
kapasitas <- data.frame(status=c('Terisi','Kosong'),jumlah=c(terisi,kapasitas_ilustrasi-terisi))
knitr::kable(kapasitas,caption='Contoh komposisi kapasitas hipotetis, bukan data resmi')
Contoh komposisi kapasitas hipotetis, bukan data resmi
status jumlah
Terisi 60
Kosong 40
ggplot(kapasitas,aes(x=2,y=jumlah,fill=status))+
 geom_col(width=.7,color='white',linewidth=1.3)+
 coord_polar(theta='y')+xlim(.6,2.5)+
 geom_text(aes(label=paste0(status,'\n',jumlah,'%')),position=position_stack(vjust=.5),size=3.8,fontface='bold',color='white')+
 scale_fill_manual(values=c('Terisi'='#D65362','Kosong'='#277DA1'))+
 labs(title='Komposisi kapasitas pada satu tanggal',subtitle='Contoh: 100 tempat tidur, 60 terisi dan 40 kosong',fill='Status')+
 theme_void(base_size=11.5)+theme(plot.title=element_text(face='bold',size=15,color='#17365D'),legend.position='bottom')

3.3 Interpretasi hasil dan kesimpulan

APA YANG TERLIHAT?

Versi A: BOR bergerak dari 54% ke 60%, naik 6 poin persentase; tanggal 30 dan 31 Januari memiliki nilai sama. Grafik tidak menunjukkan kapasitas absolut maupun penyebab perubahan. Versi B: pada contoh kapasitas 100, 60% terisi dan 40% kosong. Dua irisan menjumlah 100%, sehingga tepat untuk grafik komposisi. Kesimpulan: gunakan lollipop untuk perubahan antarhari, donut untuk pembagian satu total.

Sumber: slide 6 materi perkuliahan; transkripsi angka ilustratif. Batasan: data resmi, tahun, kapasitas, dan definisi BOR harus diverifikasi bila hendak menyimpulkan kondisi nyata.


4 2. Slide 7 — Pie chart sistem pembayaran: grafiknya tepat, warnanya diperjelas

Alasan perbaikan dan alasan memilih grafik: Grafik pie dipertahankan karena kategori sistem pembayaran merupakan bagian dari satu total. Yang diperbaiki ialah warna kategori yang sulit dibedakan, label, dan legenda; penggantian jenis grafik tidak diperlukan jika tujuan utamanya menunjukkan komposisi.

4.1 Gambar asli dan evaluasi

Pie chart masih cocok untuk menjawab pertanyaan “berapa bagian tiap metode pembayaran dari seluruh responden?”, asalkan kategori tidak terlalu banyak, saling eksklusif, dan persentase berjumlah 100%. Masalah pada slide lebih bersifat desain: beberapa warna jingga hampir serupa, label kecil, legenda sulit dipasangkan dengan irisan, dan dekorasi mengurangi fokus.

4.2 Perbaikan yang dilakukan

Bentuk pie dipertahankan. Warna diganti dengan empat rona yang berjauhan, label persentase ditaruh langsung pada irisan, dan legenda diberi nama lengkap. Angka di bawah merupakan rekonstruksi ilustratif dari label slide; verifikasi kembali label kecil bila memakai data asli.

pay <- data.frame(metode=c('M-Banking','Paylater/Cicilan','Tunai','Lainnya'),persen=c(64,20,14,2))
stopifnot(sum(pay$persen)==100)
pay <- pay |> arrange(desc(persen))
knitr::kable(pay,caption='Komposisi ilustratif metode pembayaran (%)')
Komposisi ilustratif metode pembayaran (%)
metode persen
M-Banking 64
Paylater/Cicilan 20
Tunai 14
Lainnya 2
ggplot(pay,aes(x='',y=persen,fill=metode))+
 geom_col(color='white',linewidth=1.4,width=1)+
 coord_polar(theta='y')+
 geom_text(aes(label=ifelse(persen>=5,paste0(persen,'%'),'')),
           position=position_stack(vjust=.5),color='white',fontface='bold',size=4)+
 scale_fill_manual(values=c('M-Banking'='#166A99','Paylater/Cicilan'='#E38B37','Tunai'='#9C4D9D','Lainnya'='#3D9B75'),
                   breaks=pay$metode)+
 labs(title='Proporsi penggunaan metode pembayaran',subtitle='Warna kontras dan label langsung pada irisan',fill='Metode pembayaran')+
 theme_void(base_size=11.5)+theme(plot.title=element_text(face='bold',size=15,color='#17365D'),legend.position='right')

4.3 Interpretasi hasil

APA YANG TERLIHAT?

Pada data ilustrasi, M-Banking (64%) mendominasi. Paylater/cicilan 20%, tunai 14%, dan lainnya 2%. Irisan “Lainnya” terlalu kecil untuk label internal; kategorinya tetap dapat dikenali dari legenda. Kesimpulan: dominasi kategori langsung terbaca tanpa harus mengubah jenis grafik. Ukuran sampel dan metode survei tidak tersedia, sehingga belum dapat digeneralisasi.

Sumber: slide 7 materi perkuliahan; angka transkripsi ilustratif.


5 3. Slide 10 — Noise vs signal: garis 3-day moving average harus terlihat

Alasan perbaikan dan alasan memilih grafik: Garis moving average 3 hari pada slide kurang menonjol dibanding seri mentah. Perbaikan menekankan kontras dan ketebalan garis agar pembaca dapat membedakan sinyal jangka pendek dari fluktuasi harian; alternatif hanya untuk pertanyaan analisis yang berbeda.

5.1 Gambar asli dan evaluasi

Slide membandingkan kasus harian COVID-19 dengan moving average. Pesan utamanya tepat: data harian memiliki fluktuasi tinggi, sedangkan rata-rata bergerak membantu mengenali pola. Namun garis 3-day moving average kurang menonjol dan hampir tertutup elemen lain. Satu warna garis yang tegas, pengurangan opasitas batang, dan anotasi langsung akan memperbaikinya.

5.2 Data serupa dan langkah pengolahan

Untuk menghindari klaim mereproduksi angka Worldometer dari gambar, dipakai seri demonstrasi kasus harian sintetis dengan tren naik, gelombang, dan fluktuasi mingguan. Angka dibuat deterministik agar bisa direplikasi. Rata-rata bergerak 3 hari dihitung dari tiga observasi terakhir; 7 hari dari tujuh observasi terakhir.

set.seed(104)
kasus <- data.frame(hari=1:90)
kasus$harian <- round(pmax(0, 120+2.4*kasus$hari+90*exp(-((kasus$hari-64)/16)^2)+
                          28*sin(2*pi*kasus$hari/7)+rnorm(90,0,18)))
kasus$ma3 <- as.numeric(stats::filter(kasus$harian,rep(1/3,3),sides=1))
kasus$ma7 <- as.numeric(stats::filter(kasus$harian,rep(1/7,7),sides=1))
knitr::kable(head(kasus,9),caption='Contoh penghitungan moving average dari data demonstrasi')
Contoh penghitungan moving average dari data demonstrasi
hari harian ma3 ma7
1 138 NA NA
2 163 NA NA
3 151 150.6667 NA
4 112 142.0000 NA
5 124 129.0000 NA
6 118 118.0000 NA
7 136 126.0000 134.5714
8 187 147.0000 141.5714
9 179 167.3333 143.8571

5.2.1 Versi A — Batang harian dengan MA 3 dan MA 7 yang kontras

ggplot(kasus,aes(hari,harian))+
 geom_col(fill='#B7C9D8',alpha=.65,width=.8)+
 geom_line(aes(y=ma3,color='MA 3 hari'),linewidth=1.15,na.rm=TRUE)+
 geom_line(aes(y=ma7,color='MA 7 hari'),linewidth=1.25,na.rm=TRUE)+
 scale_color_manual(values=c('MA 3 hari'='#D44747','MA 7 hari'='#115A92'))+
 labs(title='Kasus harian dan dua tingkat penghalusan',subtitle='MA 3 hari (merah) lebih responsif; MA 7 hari (biru) lebih stabil',x='Hari pengamatan',y='Jumlah kasus (ilustrasi)',color='Garis')

5.2.2 Versi B — Grafik garis yang menonjolkan signal

Alternatif ini cocok jika tujuan utama adalah membaca arah tren, bukan besarnya setiap batang harian. Garis harian ditampilkan tipis dan transparan; MA 7 hari diberi fokus visual.

ggplot(kasus,aes(hari))+
 geom_line(aes(y=harian),color='#AEBECB',linewidth=.65,alpha=.8)+
 geom_line(aes(y=ma7),color='#126C83',linewidth=1.6,na.rm=TRUE)+
 labs(title='Signal utama: rata-rata bergerak 7 hari',subtitle='Deret harian dipertahankan sebagai konteks, bukan fokus',x='Hari pengamatan',y='Kasus per hari (ilustrasi)')

5.3 Interpretasi hasil

APA YANG TERLIHAT?

Pola naik-turun harian lebih bergerigi dibanding MA 3 hari. MA 3 hari masih mengikuti perubahan cepat; MA 7 hari lebih halus tetapi sedikit tertinggal saat tren berubah. Pada seri demonstrasi, nilai harian maksimum 408 terjadi sekitar hari ke-66. Kesimpulan: untuk mendeteksi arah umum, MA 7 lebih mudah dibaca; untuk perubahan jangka pendek, MA 3 memberi respons lebih cepat. Penghalusan tidak menghilangkan ketidakpastian atau membuktikan penyebab lonjakan.

Sumber: bentuk visual dari slide 10; data demonstrasi sintetis, bukan statistik COVID-19 aktual.


6 4. Slide 20 — Proporsi ibu melahirkan: tiga grafik untuk tiga tujuan berbeda

Alasan perbaikan dan alasan memilih grafik: Ketiga jenis grafik tidak sama efektifnya untuk semua tujuan. Perbaikan menjelaskan bahwa pilihan bergantung pada apakah pembaca ingin melihat proporsi sederhana, perubahan komposisi, atau perbandingan kategori secara presisi; tidak ada grafik yang selalu unggul.

6.1 Gambar asli dan evaluasi

Slide menampilkan pie chart, stacked bar, dan bar chart untuk ilustrasi proporsi ibu melahirkan berdasarkan etnis. Ketiganya sah secara teknis, tetapi diagram batang biasa paling tepat untuk membandingkan proporsi antaretnis secara presisi, karena panjang batang mempunyai titik awal sama. Pie chart berguna untuk melihat bagian dari total, sedangkan stacked bar unggul untuk membandingkan komposisi antarkelompok, bukan sekadar satu populasi.

6.2 Data dan tiga pilihan yang sesuai

Data berikut adalah simulasi ilustratif, bukan statistik etnis ibu melahirkan yang sebenarnya. Skenario A/B menggunakan satu distribusi yang sama, sedangkan skenario C menggunakan dua wilayah agar stacked bar mempunyai fungsi analitis yang jelas.

kelahiran <- data.frame(etnis=c('Kelompok A','Kelompok B','Kelompok C'),jumlah=c(510,340,150))
kelahiran$persen <- 100*kelahiran$jumlah/sum(kelahiran$jumlah)
kelahiran_wilayah <- data.frame(wilayah=rep(c('Wilayah Utara','Wilayah Selatan'),each=3),
  etnis=rep(kelahiran$etnis,2),jumlah=c(250,170,80,180,160,160))
knitr::kable(kelahiran,caption='Skenario satu populasi (simulasi)')
Skenario satu populasi (simulasi)
etnis jumlah persen
Kelompok A 510 51
Kelompok B 340 34
Kelompok C 150 15

6.2.1 A. Bar chart — paling direkomendasikan untuk membandingkan etnis

ggplot(kelahiran,aes(x=reorder(etnis,persen),y=persen,fill=etnis))+
 geom_col(width=.62,show.legend=FALSE)+
 geom_text(aes(label=paste0(round(persen,1),'%')),hjust=-.2,size=3.7,fontface='bold')+
 coord_flip()+scale_y_continuous(limits=c(0,62),breaks=seq(0,60,10))+
 scale_fill_manual(values=c('#246A96','#D28C3F','#8C65AB'))+
 labs(title='Perbandingan proporsi ibu melahirkan menurut etnis',subtitle='Titik awal yang sama memudahkan membandingkan besaran',x=NULL,y='Persentase (%)')

6.2.2 B. Pie chart — tepat untuk bagian dari satu total

ggplot(kelahiran,aes(x='',y=jumlah,fill=etnis))+
 geom_col(width=1,color='white',linewidth=1.2)+coord_polar(theta='y')+
 geom_text(aes(label=paste0(persen,'%')),position=position_stack(vjust=.5),size=4,color='white',fontface='bold')+
 scale_fill_manual(values=c('#246A96','#D28C3F','#8C65AB'))+
 labs(title='Komposisi tiga kelompok dari seluruh kelahiran',fill='Etnis')+
 theme_void(base_size=11.5)+theme(plot.title=element_text(face='bold',size=14,color='#17365D'),legend.position='bottom')

6.2.3 C. 100% stacked bar — tepat untuk komposisi antarwilayah

ggplot(kelahiran_wilayah,aes(x=wilayah,y=jumlah,fill=etnis))+
 geom_col(position='fill',width=.55,color='white',linewidth=.6)+
 scale_y_continuous(labels=scales::percent)+
 scale_fill_manual(values=c('#246A96','#D28C3F','#8C65AB'))+
 labs(title='Perbandingan komposisi etnis di dua wilayah',subtitle='Setiap batang mewakili 100% kelahiran pada wilayahnya',x=NULL,y='Proporsi',fill='Etnis')

6.3 Interpretasi hasil dan keputusan

APA YANG TERLIHAT?

Pada simulasi satu populasi, Kelompok A 51%, B 34%, C 15%. Selisih A dan C 36 poin persentase paling mudah dilihat pada bar chart. Pie menjelaskan bagian dari total, tetapi selisih kecil lebih sulit diukur dari sudut. Stacked bar memperlihatkan bahwa komposisi kedua wilayah berbeda; jangan membaca tinggi absolut batang sebagai jumlah kelahiran karena sudah dinormalisasi menjadi 100%. Rekomendasi untuk kasus asli slide: bar chart jika tujuannya membandingkan antaretnis.

Sumber: konsep grafik dari slide 20; seluruh angka contoh disimulasikan.


7 5. Slide 21 — Proporsi banyak kategori: sesuaikan grafik dengan pertanyaan

Alasan perbaikan dan alasan memilih grafik: Saat kategori proporsi bertambah banyak, pie chart menjadi sulit dibaca karena sudut irisan kecil sulit dibandingkan. Perbaikan menyesuaikan jenis grafik dengan jumlah kategori dan tujuan, serta memperjelas urutan, label, dan warna.

7.1 Gambar asli dan evaluasi

Slide memperlihatkan pie, stacked bar, dan bar chart dengan kategori lebih banyak. Pie dengan banyak irisan membuat sudut kecil sulit dibedakan, sedangkan satu stacked bar memaksa pembaca membandingkan panjang segmen yang tidak memiliki garis dasar sama. Bar chart terurut paling mudah dipakai untuk peringkat kategori; 100% stacked bar lebih cocok jika ada lebih dari satu kelompok pembanding.

7.2 Tiga contoh penggunaan yang tepat

Data ilustratif berikut terdiri atas delapan jenis layanan. Untuk versi stacked bar, kategori yang sama dipecah ke dua periode, sehingga semua jenis layanan tetap tercakup.

layanan <- data.frame(kategori=paste('Layanan',LETTERS[1:8]),jumlah=c(280,210,155,120,95,65,45,30))
layanan$persen <- 100*layanan$jumlah/sum(layanan$jumlah)
layanan_periode <- data.frame(periode=rep(c('Periode 1','Periode 2'),each=8),
 kategori=rep(layanan$kategori,2),jumlah=c(280,210,155,120,95,65,45,30,230,245,170,140,80,55,45,35))
knitr::kable(layanan,caption='Contoh komposisi delapan layanan (simulasi)')
Contoh komposisi delapan layanan (simulasi)
kategori jumlah persen
Layanan A 280 28.0
Layanan B 210 21.0
Layanan C 155 15.5
Layanan D 120 12.0
Layanan E 95 9.5
Layanan F 65 6.5
Layanan G 45 4.5
Layanan H 30 3.0

7.2.1 A. Bar chart terurut — paling mudah untuk membandingkan delapan kategori

ggplot(layanan,aes(x=reorder(kategori,jumlah),y=jumlah))+
 geom_col(fill='#237CA0',width=.7)+coord_flip()+
 geom_text(aes(label=jumlah),hjust=-.15,size=3.4)+
 scale_y_continuous(limits=c(0,320))+
 labs(title='Peringkat penggunaan delapan layanan',x=NULL,y='Jumlah (ilustrasi)')

7.2.2 B. Pie chart — untuk gambaran keseluruhan, bukan peringkat presisi

ggplot(layanan,aes(x='',y=jumlah,fill=kategori))+
 geom_col(color='white',linewidth=.8)+coord_polar(theta='y')+
 scale_fill_manual(values=c('#185A82','#D67C44','#739E56','#9865B0','#C65272','#E3B04B','#4B9FA0','#6C7D96'))+
 labs(title='Bagian tiap layanan dari total',subtitle='Delapan irisan: pembacaan angka presisi lebih sulit',fill='Kategori')+
 theme_void(base_size=11.5)+theme(plot.title=element_text(face='bold',size=14,color='#17365D'),legend.position='right')

7.2.3 C. 100% stacked bar — untuk perubahan komposisi antarperiode

ggplot(layanan_periode,aes(x=periode,y=jumlah,fill=kategori))+
 geom_col(position='fill',color='white',linewidth=.35,width=.55)+
 scale_y_continuous(labels=scales::percent)+
 scale_fill_manual(values=c('#185A82','#D67C44','#739E56','#9865B0','#C65272','#E3B04B','#4B9FA0','#6C7D96'))+
 labs(title='Perubahan komposisi layanan antarperiode',x=NULL,y='Persentase dari total periode',fill='Kategori')

7.3 Interpretasi hasil

APA YANG TERLIHAT?

Layanan A terbesar dengan 280 unit (28%), sedangkan H terkecil 30 unit (3%). Bar chart memperlihatkan urutan delapan kategori tanpa kesulitan membandingkan irisan kecil. Stacked bar menunjukkan perubahan struktur persentase antara periode, tetapi kurang tepat untuk membandingkan jumlah absolut karena tiap periode dipaksa setinggi 100%. Kesimpulan: bar untuk peringkat, pie untuk komposisi sederhana, stacked bar untuk perbandingan komposisi beberapa kelompok.

Sumber: prinsip pada slide 21; data contoh simulasi.


8 6. Slide 22 — Banyak stacked bar: kapan tepat dan bagaimana membacanya?

Alasan perbaikan dan alasan memilih grafik: Stacked bar dengan banyak periode dapat mempertahankan seluruh komponen, tetapi segmen tengah sulit dibandingkan karena tidak memiliki garis dasar yang sama. Perbaikan mempertahankan grafik komposisi dan menyediakan tampilan alternatif per kategori tanpa menghapus seri.

8.1 Gambar asli dan evaluasi

Slide menampilkan komposisi Surat Utang Negara (SUN) yang diterbitkan Pemerintah Indonesia berdasarkan maturitas selama 2000–2020. Bentuk 100% stacked bar sudah tepat bila pertanyaan utamanya bagaimana komposisi tenor berubah tiap tahun, bukan berapa nilai penerbitan rupiah. Kelemahannya adalah batang tahunan sangat rapat, warna hijau antarkategori mirip, dan kategori tengah tidak punya titik awal sama sehingga sulit diikuti.

8.2 Langkah perbaikan dan data serupa

Dipakai data demonstrasi yang mengikuti struktur slide: 21 tahun × 4 kelompok maturitas. Ini bukan rekonstruksi nilai SUN sebenarnya. Dua versi memakai dataset yang persis sama. Versi A mempertahankan seluruh kategori/tahun dalam stacked bar, sedangkan versi B memakai small multiples empat panel sehingga tren setiap tenor lebih mudah dibandingkan.

tahun <- 2000:2020
maturitas <- data.frame(tahun=tahun,
  `kurang_3`=pmax(8,40-.7*(tahun-2000)+3*sin((tahun-2000)/2)),
  `tiga_5`=pmax(8,23+.25*(tahun-2000)+2*cos((tahun-2000)/3)),
  `lima_10`=pmax(8,24+.1*(tahun-2000)+2*sin((tahun-2000)/4)))
maturitas$lebih_10 <- 100-maturitas$kurang_3-maturitas$tiga_5-maturitas$lima_10
maturitas_long <- maturitas |>
 tidyr::pivot_longer(-tahun,names_to='tenor',values_to='persen') |>
 mutate(tenor=factor(tenor,levels=c('kurang_3','tiga_5','lima_10','lebih_10'),
 labels=c('<3 tahun','3–5 tahun','5–10 tahun','>10 tahun')))
stopifnot(all(abs(rowSums(maturitas[-1])-100)<1e-7))
knitr::kable(head(maturitas,4),digits=1,caption='Contoh komposisi maturitas SUN (%) — data demonstrasi')
Contoh komposisi maturitas SUN (%) — data demonstrasi
tahun kurang_3 tiga_5 lima_10 lebih_10
2000 40.0 25.0 24.0 11.0
2001 40.7 25.1 24.6 9.5
2002 41.1 25.1 25.2 8.6
2003 40.9 24.8 25.7 8.6

8.2.1 Versi A — Stacked bar dengan empat warna kontras

ggplot(maturitas_long,aes(x=factor(tahun),y=persen,fill=tenor))+
 geom_col(width=.86,color='white',linewidth=.2)+
 scale_fill_manual(values=c('<3 tahun'='#256D9B','3–5 tahun'='#E39B43','5–10 tahun'='#8E5DA8','>10 tahun'='#389A85'))+
 scale_y_continuous(labels=function(x)paste0(x,'%'),expand=c(0,0))+
 scale_x_discrete(breaks=as.character(seq(2000,2020,4)))+
 labs(title='Komposisi maturitas SUN menurut tahun',subtitle='Setiap batang = 100% total pada tahun tersebut (simulasi)',x='Tahun',y='Proporsi',fill='Maturitas')

8.2.2 Versi B — Empat panel garis, seluruh tahun dan kategori tetap ada

ggplot(maturitas_long,aes(x=tahun,y=persen,color=tenor))+
 geom_line(linewidth=1)+geom_point(size=.9)+
 facet_wrap(~tenor,ncol=2)+
 scale_color_manual(values=c('<3 tahun'='#256D9B','3–5 tahun'='#E39B43','5–10 tahun'='#8E5DA8','>10 tahun'='#389A85'))+
 scale_x_continuous(breaks=seq(2000,2020,5))+
 labs(title='Tren setiap kelompok maturitas tanpa tumpang tindih',subtitle='Alternatif yang mempertahankan 21 tahun × 4 kategori',x='Tahun',y='Proporsi (%)')+
 theme(legend.position='none')

8.3 Cara membaca dan interpretasi

APA YANG TERLIHAT?

Cara membaca stacked bar: pilih satu tahun pada sumbu X; tinggi total batang = 100%; tinggi setiap warna adalah proporsi kategori maturitas, bukan nilai rupiah. Bandingkan perubahan luas warna dari kiri ke kanan untuk membaca pergeseran komposisi. Dalam data demonstrasi, tenor <3 tahun berubah dari 40% (2000) ke 24.4% (2020). Pada grafik panel, perubahan ini lebih jelas karena tiap kategori mempunyai garis dasar dan ruang sendiri. Kesimpulan: grafik asli cocok untuk gambaran komposisi; small multiples lebih cocok untuk membaca tren tiap kategori secara akurat.

Sumber: struktur visual slide 22; nilai demonstrasi sintetis. Tidak boleh ditafsirkan sebagai data SUN resmi.


9 7. Slide 23 — Treemap, heatmap, dan alternatif perbandingan yang mudah dibaca

Alasan perbaikan dan alasan memilih grafik: Treemap baik untuk menunjukkan komposisi melalui luas bidang, tetapi kotak kecil dan warna serupa menyulitkan pembacaan. Perbaikan mengatur label dan kontras; bar chart terurut ditambahkan karena panjang batang lebih mudah dibandingkan daripada luas kotak.

9.1 Gambar asli dan evaluasi

Slide menampilkan treemap komposisi ekspor dan mosaic plot komposisi pelanggan. Treemap tidak sama dengan heatmap: treemap menggunakan luas kotak untuk besaran, sedangkan heatmap menggunakan warna pada sel berkisi untuk nilai. Pada treemap asli, banyak kotak kecil dan label yang rapat membuat kategori sukar dikenali. Perbaikan dilakukan dengan pembatasan label, kontras kategori utama, legenda, dan alternatif bar chart terurut menggunakan data yang sama.

9.2 Data serupa dan langkah

Gunakan contoh nilai ekspor menurut delapan kelompok produk (data demonstrasi, satuan indeks nilai). Urutkan, hitung kontribusi, lalu tampilkan dua visualisasi dari tabel yang sama.

ekspor <- data.frame(produk=c('Bahan bakar','Mesin','Logam','Tekstil','Pangan','Kimia','Karet','Lainnya'),
 nilai=c(29,22,16,12,9,6,4,2))
ekspor$proporsi <- 100*ekspor$nilai/sum(ekspor$nilai)
knitr::kable(ekspor,caption='Ilustrasi komposisi ekspor: indeks nilai, bukan statistik resmi')
Ilustrasi komposisi ekspor: indeks nilai, bukan statistik resmi
produk nilai proporsi
Bahan bakar 29 29
Mesin 22 22
Logam 16 16
Tekstil 12 12
Pangan 9 9
Kimia 6 6
Karet 4 4
Lainnya 2 2

9.2.1 Versi A — Treemap dengan label kategori dan persentase

ggplot(ekspor,aes(area=nilai,fill=produk,label=paste0(produk,'\n',proporsi,'%')))+
 treemapify::geom_treemap(color='white',linewidth=1.6)+
 treemapify::geom_treemap_text(color='white',fontface='bold',place='centre',grow=FALSE,
                               min.size=8,reflow=TRUE)+
 scale_fill_manual(values=c('#235A83','#C77942','#8B5BA6','#308D83','#C44E69','#7C9A45','#627AA5','#A66C7C'))+
 labs(title='Komposisi nilai ekspor menurut produk',subtitle='Luas kotak sebanding dengan nilai; label kecil disembunyikan jika tidak muat',fill='Produk')+
 theme(legend.position='none')

9.2.2 Versi B — Bar chart dari data yang sama (lebih mudah dibandingkan)

ggplot(ekspor,aes(x=reorder(produk,nilai),y=proporsi))+
 geom_col(fill='#286F94',width=.68)+
 geom_text(aes(label=paste0(proporsi,'%')),hjust=-.18,size=3.5)+
 coord_flip()+scale_y_continuous(limits=c(0,34))+
 labs(title='Peringkat kontribusi ekspor per produk',subtitle='Alternatif ketika prioritasnya membandingkan kategori secara presisi',x=NULL,y='Kontribusi (%)')

9.3 Interpretasi dan pilihan

APA YANG TERLIHAT?

Kotak Bahan bakar paling luas karena menyumbang 29% dari total ilustrasi. Dua kategori terbesar bersama-sama menyumbang 51%. Treemap efisien untuk menunjukkan struktur bagian-keseluruhan, tetapi kotak kecil sulit dibandingkan. Bar chart menampilkan urutan dan selisih kontribusi lebih presisi. Kesimpulan: pertahankan treemap untuk eksplorasi komposisi; gunakan bar chart untuk menyampaikan peringkat dan besaran ke pembaca umum.

Sumber: konsep treemap/mosaic pada slide 23; data demonstrasi sintetis. Visualisasi alternatif mempertahankan semua delapan kategori.


10 8. Slide 24 — Scatter plot dua warna dengan SATU garis arah hubungan

10.1 Gambar asli dan alasan perbaikan

Apa yang sudah benar? Grafik kedua pada slide sudah memisahkan kelompok berdasarkan warna sehingga pola kelompok terlihat. Grafik ketiga sudah menambahkan garis yang menunjukkan arah hubungan. Apa yang kurang? Keduanya masih terpisah, sehingga pembaca harus membandingkan dua gambar untuk memahami kelompok sekaligus arah hubungan.

Alasan memilih scatter plot: kedua sumbu adalah variabel numerik kontinu. Posisi titik mempertahankan pasangan pengamatan individual; warna membedakan jenis bahan bakar; satu garis regresi linear membantu pembaca menilai arah hubungan secara keseluruhan tanpa mengganti titik menjadi grafik garis. Tidak digunakan garis penghubung antartitik karena setiap kendaraan adalah observasi independen, bukan urutan waktu.

10.2 Data, langkah perbaikan, dan visualisasi

Untuk mendekati contoh asli tentang konsumsi bahan bakar kendaraan, digunakan dataset riil ggplot2::mpg: ukuran mesin (displ, liter), efisiensi bahan bakar jalan raya (hwy, mil/galon), dan kode bahan bakar (fl). Kelompok d diartikan diesel; r dan p digabung sebagai bensin. Perbedaan dari gambar asli: sumbu X menggunakan kapasitas mesin, bukan berat kendaraan, karena berat kendaraan tidak tersedia dalam dataset ini. Tidak ada angka berat yang direkayasa.

Langkah: (1) impor mpg; (2) pilih diesel dan bensin; (3) hapus nilai kosong; (4) tampilkan titik dengan dua warna; (5) tambahkan satu garis regresi keseluruhan; (6) hitung korelasi untuk mendukung interpretasi.

kendaraan <- ggplot2::mpg |>
  dplyr::filter(fl %in% c('d','r','p'), !is.na(displ), !is.na(hwy)) |>
  dplyr::mutate(bahan_bakar = factor(ifelse(fl == 'd','Diesel','Bensin'),
                                       levels=c('Diesel','Bensin')))
ringkasan_kendaraan <- kendaraan |>
  dplyr::group_by(bahan_bakar) |>
  dplyr::summarise(n=dplyr::n(), rerata_mpg=mean(hwy), .groups='drop')
knitr::kable(ringkasan_kendaraan, digits=2,
  caption='Jumlah kendaraan dan rerata efisiensi menurut jenis bahan bakar')
Jumlah kendaraan dan rerata efisiensi menurut jenis bahan bakar
bahan_bakar n rerata_mpg
Diesel 5 33.60
Bensin 220 23.52
ggplot(kendaraan, aes(x=displ, y=hwy)) +
  geom_point(aes(color=bahan_bakar), size=2.6, alpha=.78) +
  geom_smooth(method='lm', se=FALSE, color='#23395B',
              linewidth=1.25, linetype='solid') +
  scale_color_manual(values=c('Diesel'='#E98983','Bensin'='#16B7BE')) +
  labs(title='Kapasitas mesin dan efisiensi bahan bakar',
       subtitle='Dua warna titik menurut bahan bakar; satu garis tren untuk seluruh kendaraan',
       x='Kapasitas mesin (liter)', y='Efisiensi jalan raya (mil/galon)',
       color='Jenis bahan bakar',
       caption='Sumber: ggplot2::mpg. Garis = regresi linear keseluruhan.') +
  theme(legend.position='right')

10.3 Interpretasi output dan kesimpulan

APA YANG DAPAT DISIMPULKAN?

Setiap titik adalah satu kendaraan; warna koral mewakili diesel dan toska mewakili bensin. Garis biru tua merupakan tren keseluruhan, bukan garis yang menghubungkan titik. Korelasi kapasitas mesin dan efisiensi adalah -0.76. Kemiringan garis yang menurun berarti kendaraan dengan mesin lebih besar cenderung memiliki efisiensi mil per galon lebih rendah. Kedua warna juga memungkinkan kita memeriksa apakah jenis bahan bakar menempati area sebaran yang berbeda. Kesimpulan: kombinasi dua warna titik dan satu garis regresi menyampaikan kelompok serta arah asosiasi dalam satu gambar, tanpa menyatakan hubungan sebab-akibat.


11 9. Slide 25 — Bentuk kurva asli dipertahankan, area bawah diberi warna

11.1 Gambar asli dan alasan perbaikan

Grafik contoh menampilkan satu kurva deret waktu yang meningkat, mencapai puncak, kemudian menurun. Bentuk kurva seperti gambar pengguna tetap dipertahankan; perbaikannya hanya menambahkan bidang berwarna di bawah kurva sampai sumbu nol, bukan mengganti grafik menjadi kurva moving average atau menambahkan garis pembanding lain.

Mengapa area chart cocok? Data memiliki urutan tanggal dan satu besaran nonnegatif. Garis mempertahankan informasi kapan puncak dan penurunan terjadi, sedangkan isian transparan mempertegas besar level relatif terhadap nol. Area tidak dipakai untuk menyimpulkan total tanpa perhitungan data.

11.2 Data serupa, langkah, dan visualisasi

Gambar asli tidak menyediakan tabel numerik mentah. Karena itu, digunakan data demonstrasi sintetis dengan rentang April 2020–April 2021 yang dirancang memiliki pola gelombang seperti gambar (awal rendah, gelombang pertama, gelombang kedua lebih tinggi, lalu turun). Nilai bukan data kasus resmi dan tidak boleh ditafsirkan sebagai angka epidemiologis nyata.

Langkah: (1) bentuk deret tanggal; (2) buat nilai contoh nonnegatif dengan dua gelombang; (3) gambar geom_area() lebih dahulu; (4) gambar geom_line() di atasnya menggunakan nilai yang sama; (5) atur transparansi dan skala sumbu agar kurva tetap jelas.

tanggal25 <- seq(as.Date('2020-04-01'), as.Date('2021-04-01'), by='day')
t25 <- seq_along(tanggal25)
set.seed(2026)
nilai25 <- 70 + 1050*exp(-((t25-185)/57)^2) +
  2500*exp(-((t25-306)/44)^2) + 600*exp(-((t25-365)/80)^2)
nilai25 <- pmax(0, nilai25 + rnorm(length(t25),0,35))
tren25 <- data.frame(tanggal=tanggal25, nilai=nilai25)
knitr::kable(head(tren25,6), digits=1,
  caption='Contoh enam baris data demonstrasi deret waktu (bukan data resmi)')
Contoh enam baris data demonstrasi deret waktu (bukan data resmi)
tanggal nilai
2020-04-01 88.3
2020-04-02 32.2
2020-04-03 74.9
2020-04-04 67.1
2020-04-05 46.7
2020-04-06 0.0
ggplot(tren25, aes(x=tanggal, y=nilai)) +
  geom_area(fill='#4D9FBE', alpha=.38) +
  geom_line(color='#234E70', linewidth=.85) +
  scale_y_continuous(limits=c(0,NA), expand=expansion(mult=c(0,.04))) +
  scale_x_date(date_breaks='2 months', date_labels='%b %Y') +
  labs(title='Perubahan nilai sepanjang April 2020–April 2021',
       subtitle='Bentuk kurva dipertahankan; area bawah garis diberi warna transparan',
       x='Tanggal', y='Nilai pengamatan (ilustratif)',
       caption='Data demonstrasi sintetis, bukan angka kejadian resmi') +
  theme(axis.text.x=element_text(angle=35,hjust=1))

11.3 Interpretasi output dan kesimpulan

APA YANG DAPAT DISIMPULKAN?

Kurva memperlihatkan dua periode peningkatan, dengan gelombang kedua lebih tinggi, lalu diikuti penurunan menjelang akhir pengamatan. Nilai puncak demonstrasi sebesar 2994 terjadi sekitar 02 February 2021. Warna area memperjelas periode dengan nilai relatif tinggi; garis gelap tetap menunjukkan tanggal dan perubahan level secara lebih presisi. Kesimpulan visual: kombinasi garis dan isian area mempermudah pembacaan pola waktu tanpa mengubah data atau menambahkan kurva lain. Karena datanya sintetis, tidak dapat digunakan untuk menyimpulkan kejadian nyata.


12 10. Slide 26 — Dua deret waktu: apa yang sudah benar dan apa yang perlu diperjelas?

Alasan perbaikan dan alasan memilih grafik: Dua garis waktu pada slide dapat dipertahankan bila satuan sebanding. Jika satuannya berbeda, sumbu bersama atau dua sumbu Y berpotensi menyesatkan; panel terpisah mempertahankan data dan memperjelas satuan masing-masing.

12.1 Gambar asli dan evaluasi

Slide menampilkan dua deret waktu dengan warna berbeda. Ini sudah baik jika kedua seri memiliki satuan dan skala yang sebanding, karena pembaca dapat melihat kapan masing-masing naik, turun, dan berpotongan. Namun bila variabel berbeda satuan, dua garis dalam satu panel atau dua sumbu Y dapat menyesatkan: posisi dan titik potong bergantung pada skala yang dipilih. Karena itu, perbaikannya tidak harus mengganti grafik, melainkan memastikan kesetaraan skala dan memperjelas label.

12.2 Data serupa dan langkah

Dipakai data ggplot2::economics yang berisi tingkat pengangguran (unemploy, dalam ribuan orang) dan lama pengangguran (uempmed, dalam minggu). Keduanya berbeda satuan, sehingga lebih aman dibuat dalam dua panel yang sejajar dengan sumbu waktu yang sama. Data asli tidak diubah atau dinormalisasi secara tersembunyi.

ekonomi <- ggplot2::economics |>
 filter(date>=as.Date('2000-01-01'),date<=as.Date('2015-12-01')) |>
 select(date,unemploy,uempmed)
ekonomi_long <- ekonomi |>
 pivot_longer(c(unemploy,uempmed),names_to='indikator',values_to='nilai') |>
 mutate(indikator=factor(indikator,levels=c('unemploy','uempmed'),
 labels=c('Jumlah penganggur (ribu orang)','Median lama menganggur (minggu)')))
knitr::kable(head(ekonomi,6),caption='Dua deret waktu dengan satuan berbeda')
Dua deret waktu dengan satuan berbeda
date unemploy uempmed
2000-01-01 5708 5.8
2000-02-01 5858 6.1
2000-03-01 5733 6.0
2000-04-01 5481 6.1
2000-05-01 5758 5.8
2000-06-01 5651 5.7
ggplot(ekonomi_long,aes(x=date,y=nilai,color=indikator))+
 geom_line(linewidth=1.1)+
 facet_wrap(~indikator,ncol=1,scales='free_y')+
 scale_color_manual(values=c('Jumlah penganggur (ribu orang)'='#D78241','Median lama menganggur (minggu)'='#177F94'))+
 labs(title='Dua indikator pengangguran pada sumbu waktu yang sama',
 subtitle='Panel terpisah menjaga satuan asli dan menghindari sumbu ganda yang arbitrer',
 x='Tahun',y='Nilai sesuai satuan pada judul panel')+
 theme(legend.position='none')

12.3 Interpretasi hasil dan evaluasi

APA YANG TERLIHAT?

Panel atas memperlihatkan perubahan jumlah penganggur dan panel bawah durasi median pengangguran. Pada rentang data terpilih, jumlah penganggur mencapai maksimum 15.352 ribu orang, sedangkan median lama menganggur mencapai maksimum 25.2 minggu. Puncak dua indikator tidak harus terjadi bersamaan. Kesimpulan: desain asli dengan dua garis sudah tepat untuk seri bersatuan sama; untuk dua satuan berbeda, panel sejajar lebih jujur dan lebih mudah dijelaskan daripada sumbu Y ganda. Ketinggian garis antar-panel tidak boleh dibandingkan langsung karena skalanya berbeda.

Sumber: bentuk grafik slide 26; data ggplot2::economics (indikator ekonomi Amerika Serikat). Bukan data mentah slide.


13 Bagian B — Lima visualisasi lanjutan dari tugas sebelumnya

Kelima kasus berikut dipertahankan dari dokumen awal, termasuk perhitungan dan interpretasi berbasis dataset.

14 11. Violin Plot dengan Boxplot

Alasan perbaikan dan alasan memilih grafik: Violin plot dipilih untuk memperlihatkan bentuk distribusi yang tidak tampak pada rerata saja; boxplot di dalamnya memberi median dan rentang kuartil sebagai acuan yang lebih mudah dibaca.

14.1 Pertanyaan analisis

Bagaimana sebaran massa tubuh penguin, di mana letak nilai tengahnya, dan apakah distribusinya memperlihatkan konsentrasi pada lebih dari satu rentang? Violin plot memperlihatkan bentuk estimasi distribusi, sedangkan boxplot menambahkan ringkasan statistik yang lebih mudah dibandingkan.

Langkah analisis: pilih variabel numerik body_mass_g → keluarkan nilai hilang → hitung statistik ringkas → tampilkan violin dan boxplot pada sumbu yang sama → interpretasikan bentuk, median, dan rentang antar-kuartil.

Tujuan. Menunjukkan bentuk distribusi dan ringkasan kuartil pada satu grafik.

Data. palmerpenguins::penguins, hasil pengukuran penguin Palmer Archipelago, Antarktika. Variabel body_mass_g adalah massa tubuh penguin (gram). Data penguin digunakan sebagai pengganti berat lahir pada gambar contoh; tidak boleh disebut data bayi.

Sumber: https://allisonhorst.github.io/palmerpenguins/ (data berasal dari Palmer Station LTER).

d1 <- palmerpenguins::penguins |>
  filter(!is.na(body_mass_g))
d1 |> summarise(n=n(), mean=mean(body_mass_g), median=median(body_mass_g),
                q1=quantile(body_mass_g,.25), q3=quantile(body_mass_g,.75))
ggplot(d1, aes(x='Seluruh penguin', y=body_mass_g)) +
  geom_violin(fill='#91cbbf', alpha=.75, color='#3e6b68', trim=FALSE) +
  geom_boxplot(width=.13, fill='white', outlier.size=.8) +
  coord_flip() +
  labs(title='Distribusi Massa Tubuh Penguin', x=NULL, y='Massa tubuh (gram)',
       caption='Sumber: palmerpenguins / Palmer Station LTER') +
  theme(panel.grid.major.y=element_blank())

Cara membaca. Bagian violin yang lebih lebar berarti estimasi kepadatan lebih tinggi, bukan otomatis jumlah absolut lebih besar. Kotak putih membentang dari kuartil pertama (Q1) sampai ketiga (Q3), garis di dalam kotak adalah median. Panjang whisker boxplot mengikuti aturan 1,5×IQR dari ggplot2, bukan otomatis nilai minimum dan maksimum. KDE menghaluskan distribusi sehingga bentuk puncak dipengaruhi bandwidth.

14.2 Interpretasi hasil visualisasi: apa yang terlihat dan apa artinya?

01 · TEMUAN UTAMA

Pusat distribusi. Dari 342 penguin dengan pengukuran massa tubuh tersedia, median massa tubuh adalah 4050 gram. Artinya, sekitar separuh pengamatan memiliki massa tubuh di bawah atau sama dengan nilai tersebut dan separuh lainnya di atas atau sama dengannya. Ini lebih informatif daripada hanya menyebutkan posisi garis di dalam boxplot.

Sebaran 50% data tengah. Kuartil pertama adalah 3550 gram, sedangkan kuartil ketiga 4750 gram. Dengan demikian, 50% pengamatan tengah berada pada kisaran 3550–4750 gram. Lebar rentang tersebut menggambarkan keragaman massa tubuh penguin yang relatif besar.

Bentuk distribusi. Perhatikan bagian violin yang melebar: itulah kisaran massa yang lebih padat menurut estimasi kernel. Bila tampak lebih dari satu tonjolan, pola itu dapat terjadi karena data menggabungkan beberapa spesies penguin dengan karakteristik tubuh berbeda. Namun, tonjolan bukan bukti bahwa data pasti memiliki sejumlah kelompok tertentu.

Kesimpulan. Massa tubuh penguin tidak cukup diringkas dengan satu angka rata-rata; posisi tengah, rentang kuartil, dan bentuk distribusi bersama-sama menunjukkan keragaman individu. Untuk mengetahui apakah perbedaan spesies menjelaskan bentuk tersebut, langkah berikutnya adalah membuat violin plot menurut spesies.

14.3 Ringkasan statistik pendukung

d1 |> summarise(n=n(), minimum=min(body_mass_g), q1=quantile(body_mass_g,.25),
                median=median(body_mass_g), mean=mean(body_mass_g),
                q3=quantile(body_mass_g,.75), maksimum=max(body_mass_g),
                IQR=IQR(body_mass_g)) |> knitr::kable(digits=1)
n minimum q1 median mean q3 maksimum IQR
342 2700 3550 4050 4201.8 4750 6300 1200

Insight berbasis output: Median menunjukkan titik tengah sampel, sementara IQR menunjukkan rentang 50% pengamatan bagian tengah. Bila violin menampakkan beberapa tonjolan, hal itu dapat mengindikasikan campuran subpopulasi (misalnya spesies), tetapi bukan bukti formal multimodalitas. Untuk memeriksa dugaan ini, buat grafik terpisah per spesies.

15 12. Density Ridgeline Plot

Alasan perbaikan dan alasan memilih grafik: Ridgeline plot cocok membandingkan bentuk distribusi beberapa kelompok pada skala numerik yang sama; jarak dan label diperjelas agar puncak serta tumpang tindih tidak disalahartikan.

15.1 Pertanyaan analisis

Apakah distribusi harapan hidup antarnegara pada 2007 bergeser ke nilai yang lebih tinggi pada benua tertentu? Ridgeline menyusun kurva kepadatan secara bertingkat agar posisi puncak, rentang, dan tumpang tindih distribusi lebih mudah dibandingkan.

Langkah analisis: filter tahun 2007 → kelompokkan berdasarkan benua → cek jumlah negara → estimasi kepadatan harapan hidup → bandingkan letak puncak dan lebar kurva.

Tujuan. Membandingkan distribusi harapan hidup negara di berbagai benua pada tahun yang sama.

Data. gapminder::gapminder, variabel lifeExp (harapan hidup, tahun), continent (benua), dan year (tahun). Gunakan tahun 2007 agar setiap negara diwakili satu observasi. Dataset historis ini tidak merepresentasikan kondisi terkini.

Sumber: https://www.gapminder.org/data/ dan https://cran.r-project.org/package=gapminder.

d2 <- gapminder::gapminder |> filter(year==2007, !is.na(lifeExp))
d2 |> count(continent, name='jumlah_negara')
ggplot(d2, aes(x=lifeExp, y=continent, fill=continent)) +
  ggridges::geom_density_ridges(alpha=.82, color='white', scale=1.1, rel_min_height=.01) +
  scale_fill_brewer(palette='Set2', guide='none') +
  labs(title='Distribusi Harapan Hidup Menurut Benua (2007)',
       x='Harapan hidup (tahun)', y='Benua',
       caption='Sumber: Gapminder (tahun 2007)')

Cara membaca. Puncak kurva menandai nilai dengan kepadatan tinggi; kurva lebih ke kanan mengindikasikan harapan hidup cenderung lebih tinggi. Setiap kepadatan dinormalisasi, sehingga tinggi puncak bukan jumlah negara. Hati-hati pada kelompok dengan jumlah negara sedikit: estimasi kepadatan bisa kurang stabil.

15.2 Interpretasi hasil visualisasi: perbandingan antarbenua

02 · TEMUAN UTAMA

Perbedaan posisi kurva. Kurva yang dominan di sisi kanan mewakili negara-negara dengan harapan hidup lebih tinggi, sedangkan kurva yang bergeser ke kiri menunjukkan konsentrasi pada nilai lebih rendah. Pada tahun 2007, benua dengan median tertinggi adalah Oceania (80.7 tahun), sementara median terendah adalah Africa (52.9 tahun).

Besar kesenjangan. Selisih median kedua kelompok tersebut mencapai 27.8 tahun. Selisih ini membantu mengukur perbedaan posisi pusat distribusi, bukan hanya mengandalkan kesan visual dari jarak antarkurva.

Keragaman dalam benua. Perhatikan panjang sebaran horizontal setiap kurva. Kurva yang lebih menyebar mengisyaratkan heterogenitas harapan hidup antarnegaranya. Jika dua kurva saling tumpang tindih, berarti sebagian negara dari kedua benua memiliki nilai harapan hidup yang mirip, meskipun median benuanya berbeda.

Kesimpulan. Distribusi harapan hidup antarnegara pada 2007 menunjukkan perbedaan yang nyata secara deskriptif antarwilayah. Akan tetapi, grafik ini tidak menjelaskan penyebabnya, tidak otomatis membuktikan perbedaan signifikan secara statistik, dan tidak menggambarkan harapan hidup rata-rata penduduk karena setiap negara memiliki bobot yang sama.

15.3 Ringkasan statistik pendukung

d2 |> group_by(continent) |> summarise(jumlah_negara=n(),
   rerata=mean(lifeExp), median=median(lifeExp), minimum=min(lifeExp),
   maksimum=max(lifeExp), .groups='drop') |>
  arrange(desc(median)) |> knitr::kable(digits=1,
    caption='Ringkasan harapan hidup menurut benua (2007)')
Ringkasan harapan hidup menurut benua (2007)
continent jumlah_negara rerata median minimum maksimum
Oceania 2 80.7 80.7 80.2 81.2
Europe 30 77.6 78.6 71.8 81.8
Americas 25 73.6 72.9 60.9 80.7
Asia 33 70.7 72.4 43.8 82.6
Africa 52 54.8 52.9 39.6 76.4

Insight berbasis output: Bandingkan posisi median dan rerata untuk memeriksa apakah pusat distribusi antarbenua berbeda. Jarak minimum–maksimum membantu melihat heterogenitas dalam satu benua. Setiap negara memiliki satu observasi; rerata ini bukan rerata tertimbang menurut jumlah penduduk.

16 13. Diagram Batang dan Error Bar

Alasan perbaikan dan alasan memilih grafik: Batang rerata tanpa ketidakpastian dapat membuat selisih kecil tampak terlalu pasti. Error bar CI 95% ditambahkan dari pengamatan individual agar pembaca melihat presisi estimasi, bukan hanya tinggi batang.

16.1 Pertanyaan analisis

Seberapa berbeda rata-rata massa tubuh antarspesies dan seberapa presisi estimasi rata-rata tersebut? Diagram batang menjawab pertanyaan besaran rerata; interval kepercayaan menambah informasi ketidakpastian akibat variasi sampel.

Langkah analisis: kelompokkan spesies → hitung n, rerata, simpangan baku → hitung galat baku dan CI 95% → bandingkan grafik tanpa dan dengan error bar.

Tujuan. Membandingkan rerata massa tubuh antarspesies penguin serta menampilkan ketidakpastian estimasinya.

Data. palmerpenguins::penguins, variabel species dan body_mass_g. Setiap bar adalah rata-rata sampel; error bar adalah interval kepercayaan 95% untuk rata-rata, menggunakan distribusi t.

Rumus: SE = s/sqrt(n); CI95% = mean ± t(0.975, df=n-1) × SE. Ini bukan ±SD, dan CI bukan rentang tempat 95% individu berada.

d3 <- palmerpenguins::penguins |>
  filter(!is.na(body_mass_g), !is.na(species)) |>
  group_by(species) |>
  summarise(n=n(), rerata=mean(body_mass_g), sd=sd(body_mass_g),
            se=sd/sqrt(n),
            batas_bawah=rerata-qt(.975, df=n-1)*se,
            batas_atas=rerata+qt(.975, df=n-1)*se, .groups='drop')
knitr::kable(d3, digits=2, caption='Ringkasan dan perhitungan CI 95%')
Ringkasan dan perhitungan CI 95%
species n rerata sd se batas_bawah batas_atas
Adelie 151 3700.66 458.57 37.32 3626.93 3774.40
Chinstrap 68 3733.09 384.34 46.61 3640.06 3826.12
Gentoo 123 5076.02 504.12 45.45 4986.03 5166.00
p_kiri <- ggplot(d3, aes(species, rerata)) +
  geom_col(fill='#a9d8d0', width=.65) +
  coord_cartesian(ylim=c(0,6500)) +
  labs(title='Tanpa Error Bar', x='Spesies', y='Rerata massa (gram)')
p_kanan <- ggplot(d3, aes(species, rerata)) +
  geom_col(fill='#a9d8d0', width=.65) +
  geom_errorbar(aes(ymin=batas_bawah, ymax=batas_atas),
                width=.18, linewidth=.85, color='#126d73') +
  geom_point(color='#126d73', size=2) +
  coord_cartesian(ylim=c(0,6500)) +
  labs(title='Dengan CI 95%', x='Spesies', y='Rerata massa (gram)')
p_kiri + p_kanan + patchwork::plot_annotation(
  title='Perbandingan Rerata Massa Tubuh Penguin',
  caption='Sumber: palmerpenguins; CI 95% berbasis distribusi t')

Cara membaca. Ujung atas dan bawah error bar adalah batas CI. CI lebih sempit biasanya berarti estimasi lebih presisi, tetapi juga dipengaruhi variasi dan ukuran sampel. Overlap atau tidak overlap antardua CI bukan uji signifikansi formal; untuk pengujian perbedaan gunakan prosedur inferensi yang sesuai.

16.2 Interpretasi hasil visualisasi: rerata dan ketidakpastian

03 · TEMUAN UTAMA

Siapa yang memiliki rerata terbesar? Spesies Gentoo memiliki rerata massa tubuh tertinggi, sekitar 5076 gram; sedangkan Adelie memiliki rerata terendah, sekitar 3701 gram. Perbedaan rerata keduanya sekitar 1375 gram dalam sampel ini.

Apa informasi tambahan dari error bar? Pada spesies Gentoo, interval kepercayaan 95% untuk rerata adalah sekitar 4986 hingga 5166 gram. Interval ini menunjukkan rentang estimasi rerata populasi berdasarkan metode yang digunakan, bukan rentang yang mencakup 95% berat penguin individual.

Bagaimana membandingkan presisi? Di antara tiga spesies, Adelie memiliki interval paling sempit, dengan lebar sekitar 147 gram. Interval yang lebih sempit menunjukkan estimasi rerata yang lebih presisi menurut model interval tersebut; presisi dipengaruhi oleh variasi sampel dan banyaknya pengamatan.

Kesimpulan. Diagram batang saja menunjukkan perbedaan rerata, sedangkan error bar mengungkap ketidakpastian estimasi. Selisih rerata yang terlihat tidak boleh langsung disebut signifikan secara statistik hanya dari tampilan interval; untuk klaim inferensial dibutuhkan analisis perbandingan yang sesuai.

16.3 Ringkasan statistik pendukung

d3 |> arrange(desc(rerata)) |>
  mutate(lebar_CI=batas_atas-batas_bawah) |>
  select(species,n,rerata,lebar_CI) |>
  knitr::kable(digits=1,caption='Peringkat rerata dan lebar interval kepercayaan')
Peringkat rerata dan lebar interval kepercayaan
species n rerata lebar_CI
Gentoo 123 5076.0 180.0
Chinstrap 68 3733.1 186.1
Adelie 151 3700.7 147.5

Insight berbasis output: Spesies dengan rerata tertinggi tidak otomatis memiliki ketidakpastian terkecil. Periksa kolom lebar_CI: interval dipengaruhi ukuran sampel dan variasi massa tubuh. Grafik ini bersifat deskriptif; kesimpulan perbedaan yang signifikan membutuhkan pengujian atau interval untuk selisih rerata yang sesuai.

17 14. Weighted Directed Network Graph

Alasan perbaikan dan alasan memilih grafik: Grafik jaringan memerlukan arah dan bobot hubungan yang dapat dibedakan. Panah menunjukkan asal–tujuan, sedangkan ketebalan garis dan angka bobot memperlihatkan intensitas hubungan.

17.1 Pertanyaan analisis

Bandara asal mana yang terhubung ke tujuan-tujuan populer, dan rute mana yang mempunyai frekuensi penerbangan terbesar? Grafik jaringan cocok karena informasi utamanya adalah relasi antarentitas, bukan sekadar nilai masing-masing entitas.

Langkah analisis: pilih delapan tujuan dengan penerbangan terbanyak → hitung penerbangan per pasangan asal–tujuan → buat daftar edge → bangun graf berarah → petakan ketebalan garis ke bobot.

Tujuan. Memvisualisasikan arah rute dan banyaknya penerbangan dari tiga bandara New York ke beberapa bandara tujuan.

PENTING: Gambar contoh menggunakan perdagangan ASEAN, sedangkan laporan ini memakai data penerbangan sungguhan karena setiap edge memiliki sumber, tujuan, dan bobot terukur yang bisa direproduksi. Bobot adalah jumlah penerbangan, bukan volume perdagangan atau jumlah penumpang.

Data. nycflights13::flights, data penerbangan berangkat dari NYC selama 2013, bersumber dari Bureau of Transportation Statistics (BTS), AS. Pilih 8 bandara tujuan dengan penerbangan terbanyak, lalu hitung jumlah penerbangan menurut bandara asal-tujuan.

Sumber: https://nycflights13.tidyverse.org/reference/flights.html

top_dest <- nycflights13::flights |> count(dest, sort=TRUE) |> slice_head(n=8) |> pull(dest)
edges <- nycflights13::flights |>
  filter(dest %in% top_dest) |>
  count(origin, dest, name='jumlah_penerbangan') |>
  rename(from=origin, to=dest)
knitr::kable(edges, caption='Bobot hubungan: jumlah penerbangan 2013')
Bobot hubungan: jumlah penerbangan 2013
from to jumlah_penerbangan
EWR ATL 5022
EWR BOS 5327
EWR CLT 5026
EWR FLL 3793
EWR LAX 4912
EWR MCO 4941
EWR ORD 6100
EWR SFO 5127
JFK ATL 1930
JFK BOS 5898
JFK CLT 2870
JFK FLL 4254
JFK LAX 11262
JFK MCO 5464
JFK ORD 2326
JFK SFO 8204
LGA ATL 10263
LGA BOS 4283
LGA CLT 6168
LGA FLL 4008
LGA MCO 3677
LGA ORD 8857
g <- igraph::graph_from_data_frame(edges, directed=TRUE)
set.seed(42)
ggraph(g, layout='fr') +
  geom_edge_link(aes(edge_width=jumlah_penerbangan),
                 arrow=grid::arrow(length=grid::unit(3,'mm'), type='closed'),
                 end_cap=ggraph::circle(4,'mm'),
                 alpha=.7, color='#1685a6', show.legend=TRUE) +
  scale_edge_width(range=c(.5,3.5), name='Jumlah penerbangan') +
  geom_node_point(size=9, color='#f59e0b') +
  geom_node_text(aes(label=name), color='#172b4d', size=4,
                 vjust=1.9, fontface='bold') +
  labs(title='Jaringan Penerbangan Berarah dari New York (2013)',
       subtitle='Panah = asal → tujuan; ketebalan = jumlah penerbangan',
       caption='Sumber: nycflights13 / US Bureau of Transportation Statistics') +
  theme_void() + theme(plot.title=element_text(face='bold'))

Cara membaca. Node adalah bandara (kode IATA), panah dari asal ke tujuan, dan garis yang lebih tebal berarti frekuensi penerbangan lebih besar. Karena data hanya berisi penerbangan yang berangkat dari NYC, ketiadaan panah balik tidak berarti tidak ada penerbangan balik di dunia nyata. out-strength menghitung total penerbangan keluar dalam jaringan yang digambarkan, sedangkan in-strength menghitung penerbangan masuk ke node tujuan dalam cakupan dataset.

data.frame(bandara=igraph::V(g)$name,
           masuk=igraph::strength(g, mode='in', weights=igraph::E(g)$jumlah_penerbangan),
           keluar=igraph::strength(g, mode='out', weights=igraph::E(g)$jumlah_penerbangan)) |>
  knitr::kable(caption='In-strength dan out-strength (jumlah penerbangan)')
In-strength dan out-strength (jumlah penerbangan)
bandara masuk keluar
EWR EWR 0 40248
JFK JFK 0 42208
LGA LGA 0 37256
ATL ATL 17215 0
BOS BOS 15508 0
CLT CLT 14064 0
FLL FLL 12055 0
LAX LAX 16174 0
MCO MCO 14082 0
ORD ORD 17283 0
SFO SFO 13331 0

17.2 Interpretasi hasil visualisasi: arah, intensitas, dan simpul penting

04 · TEMUAN UTAMA

Rute dengan hubungan terkuat. Pada jaringan yang dipilih, garis dengan bobot terbesar menghubungkan JFK → LAX, dengan 11.262 penerbangan pada 2013. Panah menunjukkan arah keberangkatan, sementara ketebalan garis menunjukkan intensitas rute tersebut.

Bandara asal dan tujuan dominan. Dalam subjaringan ini, JFK memiliki total penerbangan keluar terbesar (42.208). Dari sisi tujuan, ORD menerima penerbangan terbanyak dari tiga bandara NYC (17.283). Kedua angka menjawab pertanyaan berbeda: asal yang paling aktif dan tujuan yang paling sering dilayani.

Apa yang tidak boleh dibaca dari gambar? Node yang tampak berdekatan tidak berarti bandara tersebut dekat secara geografis, sebab posisi node ditentukan algoritma tata letak. Tidak adanya garis dari bandara tujuan kembali ke NYC juga bukan bukti bahwa rute pulang tidak tersedia.

Kesimpulan. Grafik memperlihatkan bahwa intensitas koneksi penerbangan tidak merata: sejumlah pasangan asal–tujuan lebih dominan daripada lainnya. Temuan ini hanya berlaku untuk delapan tujuan teratas yang dipilih dari penerbangan keberangkatan NYC tahun 2013, bukan keseluruhan jaringan transportasi udara.

17.3 Ringkasan statistik pendukung

edges |> arrange(desc(jumlah_penerbangan)) |> slice_head(n=8) |>
  knitr::kable(caption='Delapan hubungan asal–tujuan dengan frekuensi tertinggi')
Delapan hubungan asal–tujuan dengan frekuensi tertinggi
from to jumlah_penerbangan
JFK LAX 11262
LGA ATL 10263
LGA ORD 8857
JFK SFO 8204
LGA CLT 6168
EWR ORD 6100
JFK BOS 5898
JFK MCO 5464

Insight berbasis output: Rute teratas mengindikasikan konektivitas teramati yang lebih intensif dalam dataset. Posisi node pada tata letak force-directed tidak merepresentasikan jarak geografis. Karena hanya delapan destinasi teratas yang ditampilkan, ini adalah subjaringan terpilih, bukan seluruh jaringan penerbangan Amerika Serikat.

18 15. Peta Choropleth Persentase Kemiskinan Indonesia 2020

Alasan perbaikan dan alasan memilih grafik: Warna peta yang terlalu mirip membuat kelas kemiskinan sulit dibedakan. Perbaikan memakai warna kategori yang kontras, legenda berinterval jelas, serta garis batas wilayah agar pembacaan spasial lebih efektif.

18.1 Pertanyaan analisis

Bagaimana variasi persentase penduduk miskin antarprovinsi pada tahun 2020, dan wilayah mana yang masuk kategori persentase lebih tinggi? Choropleth menggunakan warna untuk memperlihatkan perbedaan indikator yang telah dinormalisasi menurut wilayah.

Langkah analisis: impor CSV → periksa jumlah provinsi dan nilai kosong → unduh geometri provinsi → samakan nama provinsi → audit hasil join → buat kelas persentase → tampilkan peta dan tabel wilayah tertinggi.

Tujuan. Menampilkan variasi persentase penduduk miskin antardaerah dengan kelas warna diskret yang mudah dibedakan.

Data. kemiskinan_2020.csv berisi 34 provinsi sesuai pembagian administratif tahun 2020 dan angka persentase kemiskinan 2020. Angka berasal dari tabel BPS yang dikutip dalam laporan resmi Bappenas, Lampiran “Persentase Penduduk Miskin Menurut Provinsi, 2019–2023”. Perhatikan: Papua dan Papua Barat masih memakai pembagian provinsi tahun 2020; jangan langsung mencampurnya dengan 38 provinsi sekarang.

Sumber: https://stranasakpsh.bappenas.go.id/uploads/publikasi/laporan/2d6c0fdd03ed5cb6c8e49b9d15177fe9.pdf (Lampiran, tabel persentase penduduk miskin per provinsi); BPS.

Peta batas administratif: GADM melalui package geodata. Unduhan peta pertama memerlukan internet. File CSV harus berada satu folder dengan Rmd.

kemiskinan <- readr::read_csv('kemiskinan_2020.csv', show_col_types=FALSE)
stopifnot(nrow(kemiskinan)==34, !anyNA(kemiskinan$kemiskinan))
# GADM dapat memperbarui batas provinsi. Unduh layer tingkat provinsi.
dir.create('geodata_cache', showWarnings=FALSE)
indo <- geodata::gadm(country='IDN', level=1, path='geodata_cache')
indo_sf <- sf::st_as_sf(indo)
# Normalisasi ejaan: gunakan pencocokan nama yang eksplisit dan audit hasil.
normal <- function(x) {
  x <- stringr::str_to_lower(x)
  x <- iconv(x, to='ASCII//TRANSLIT')
  x <- gsub('[^a-z0-9]', '', x)
  x
}
indo_sf$kunci <- normal(indo_sf$NAME_1)
kemiskinan$kunci <- normal(kemiskinan$provinsi)
# Variasi ejaan yang sering muncul pada GADM:
alias <- c('jakartaraya'='dkijakarta', 'jakarta'='dkijakarta',
           'yogyakarta'='diyogyakarta', 'bangkabelitung'='kepulauanbangkabelitung',
           'riauislands'='kepulauanriau',
           'westpapua'='papuabarat', 'papuabarat'='papuabarat',
           'northsumatra'='sumaterautara', 'westsumatra'='sumaterabarat',
           'southsumatra'='sumateraselatan', 'westjava'='jawabarat',
           'centraljava'='jawatengah', 'eastjava'='jawatimur',
           'westkalimantan'='kalimantanbarat', 'centralkalimantan'='kalimantantengah',
           'southkalimantan'='kalimantanselatan', 'eastkalimantan'='kalimantantimur',
           'northkalimantan'='kalimantanutara', 'northsulawesi'='sulawesiutara',
           'centralsulawesi'='sulawesitengah', 'southsulawesi'='sulawesiselatan',
           'southeastsulawesi'='sulawesitenggara', 'westsulawesi'='sulawesibarat',
           'northmaluku'='malukuutara', 'westnusatenggara'='nusatenggarabarat',
           'eastnusatenggara'='nusatenggaratimur')
idx <- match(indo_sf$kunci, names(alias))
indo_sf$kunci[!is.na(idx)] <- unname(alias[idx[!is.na(idx)]])
# Cek nama yang gagal cocok: jika ada, jangan diam-diam dianggap kemiskinan nol.
print(setdiff(indo_sf$NAME_1, indo_sf$NAME_1[indo_sf$kunci %in% kemiskinan$kunci]))
## character(0)
peta <- dplyr::left_join(indo_sf, kemiskinan, by='kunci')
# Jika GADM terbaru memiliki provinsi hasil pemekaran, jangan menyamakan
# angka 2020 dengan wilayah baru tanpa rekonsiliasi batas.
if(anyNA(peta$kemiskinan)) {
  warning('Ada provinsi tanpa pasangan! Periksa tabel nama GADM dan pembagian provinsi 2020.')
}
peta <- peta |>
  mutate(kelas=cut(kemiskinan,
                   breaks=c(-Inf,5,10,15,20,25,Inf),
                   labels=c('< 5%','5–<10%','10–<15%','15–<20%','20–<25%','≥ 25%'),
                   right=FALSE))
# Palet 6 tingkat: rona kontras, tanpa hijau/toska/biru yang berdekatan.
# Urutan kategori tetap dari kemiskinan rendah ke tinggi.
warna <- c('< 5%'='#FFE45E','5–<10%'='#FB8500',
           '10–<15%'='#E63946','15–<20%'='#B5179E',
           '20–<25%'='#6930C3','≥ 25%'='#14213D')
ggplot(peta) +
  geom_sf(aes(fill=kelas), color='#FFFFFF', linewidth=.30) +
  scale_fill_manual(values=warna, drop=FALSE, na.value='#dadada',
                    name='Kemiskinan (%)') +
  labs(title='Persentase Penduduk Miskin Menurut Provinsi, 2020',
       subtitle='Kuning → jingga → merah → magenta → ungu → navy: persentase semakin tinggi',
       caption='Sumber: BPS (2020), tabel dalam laporan Bappenas; batas peta: GADM') +
  theme_void(base_size=12) +
  theme(legend.position='bottom', legend.direction='horizontal',
        plot.title=element_text(face='bold', size=16),
        legend.text=element_text(size=10)) +
  guides(fill=guide_legend(nrow=1, byrow=TRUE))

Cara membaca. Setiap poligon adalah provinsi; warna menunjukkan kategori persentase, bukan jumlah absolut penduduk miskin. Kelas warna diskret, garis batas putih, dan label interval membantu membedakan daerah. Provinsi berwarna abu-abu berarti data tidak berhasil dipasangkan atau tidak tersedia, bukan kemiskinan nol. Jika muncul provinsi baru karena perubahan batas administratif, gunakan batas 2020 yang sesuai sebelum menjadikan peta sebagai hasil analisis final.

kemiskinan |> arrange(desc(kemiskinan)) |> slice_head(n=5) |>
  knitr::kable(caption='Lima provinsi dengan persentase kemiskinan tertinggi (2020)')
Lima provinsi dengan persentase kemiskinan tertinggi (2020)
provinsi kemiskinan kunci
Papua 26.64 papua
Papua Barat 21.37 papuabarat
Nusa Tenggara Timur 20.90 nusatenggaratimur
Maluku 17.44 maluku
Gorontalo 15.22 gorontalo

18.2 Interpretasi hasil visualisasi: pola spasial kemiskinan

05 · TEMUAN UTAMA

Wilayah dengan persentase tertinggi dan terendah. Berdasarkan tabel 34 provinsi tahun 2020, persentase kemiskinan tertinggi terdapat di Papua (26.64%), sedangkan yang terendah di Bali (3.78%). Selisih keduanya mencapai 22.86 poin persentase; gunakan satuan poin persentase, bukan persen, untuk selisih dua persentase.

Bagaimana membaca pola warna? Provinsi dengan warna lebih gelap berada pada kelas persentase kemiskinan lebih tinggi. Pada data ini terdapat 3 provinsi dengan persentase kemiskinan setidaknya 20%. Pola spasial tersebut memperlihatkan ketidakmerataan indikator antardaerah, tetapi warna tidak memberikan informasi tentang jumlah absolut penduduk miskin.

Mengapa luas wilayah bukan ukuran masalah? Provinsi yang sangat luas mungkin terlihat menonjol di peta meskipun penduduknya lebih sedikit. Karena peta menampilkan persentase, provinsi dengan persentase tinggi belum tentu mempunyai jumlah penduduk miskin terbanyak. Rerata sederhana antarprovinsi juga tidak setara dengan angka kemiskinan nasional.

Kesimpulan. Pada 2020 terdapat disparitas persentase kemiskinan antarprovinsi Indonesia. Peta bermanfaat untuk menemukan wilayah yang perlu diperhatikan lebih lanjut, tetapi tidak menjelaskan penyebab perbedaan, tidak dapat dipakai untuk menyimpulkan perubahan dari tahun ke tahun, dan harus memakai batas provinsi yang cocok dengan tahun data.

18.3 Ringkasan statistik pendukung

kemiskinan |>
  summarise(jumlah_provinsi=n(), terendah=min(kemiskinan),
            median=median(kemiskinan), tertinggi=max(kemiskinan),
            rerata_tanpa_bobot=mean(kemiskinan)) |>
  knitr::kable(digits=2,caption='Ringkasan persentase kemiskinan provinsi 2020')
Ringkasan persentase kemiskinan provinsi 2020
jumlah_provinsi terendah median tertinggi rerata_tanpa_bobot
34 3.78 8.73 26.64 10.43

Insight berbasis output: Selisih antara persentase terendah dan tertinggi menunjukkan ketimpangan antardaerah pada indikator ini. Rerata persentase provinsi tanpa bobot tidak sama dengan tingkat kemiskinan nasional, karena jumlah penduduk provinsi berbeda. Jangan menafsirkan area peta yang lebih luas sebagai jumlah penduduk miskin yang lebih besar.

19 Sintesis dan evaluasi keseluruhan

Aspek Perbaikan yang paling berdampak Prinsip pembacaan
Ketepatan perbandingan Sumbu sama, batang terurut, tanpa efek 3D Bandingkan posisi/panjang, bukan sudut semata
Proporsi Label persentase dan denominator Bedakan pangsa relatif dari jumlah absolut
Hubungan Titik transparan dan kelompok Korelasi tidak berarti sebab-akibat
Deret waktu Pemulusan yang dinyatakan eksplisit Pisahkan noise, tren, dan musiman
Ketidakpastian Interval dan jenisnya dijelaskan Estimasi tidak identik dengan kepastian
Jaringan dan peta Arah, bobot, batas, dan legenda Hindari tafsir berlebihan terhadap posisi/luas

19.1 Kesimpulan akhir

Tugas ini memperlihatkan bahwa perbaikan visualisasi tidak cukup dengan mengganti warna. Perbaikan perlu mempertimbangkan jenis data, akurasi skala, konteks pembaca, keterbacaan label, dan kesimpulan yang dapat dipertanggungjawabkan. Sepuluh kasus pertama merujuk slide 6, 7, 10, 20–26; lima kasus berikutnya memperdalam distribusi, estimasi, jaringan, dan peta.

19.2 Sumber dan atribusi