Pemilihan grafik berdasarkan tujuan, alternatif desain, kode R, dan interpretasi yang dapat diuji.
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.
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.
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')| 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.
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.
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.
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')| hari | bor |
|---|---|
| 29 Jan | 54 |
| 30 Jan | 57 |
| 31 Jan | 57 |
| 1 Feb | 60 |
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 (%)')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')| 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')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.
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.
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.
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 (%)')| 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')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.
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.
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.
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')| 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 |
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')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)')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.
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.
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.
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)')| etnis | jumlah | persen |
|---|---|---|
| Kelompok A | 510 | 51 |
| Kelompok B | 340 | 34 |
| Kelompok C | 150 | 15 |
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 (%)')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')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')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.
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.
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.
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)')| 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 |
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)')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')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')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.
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.
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.
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')| 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 |
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')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')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.
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.
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.
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')| 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 |
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')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 (%)')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.
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.
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')| 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')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.
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.
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)')| 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))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.
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.
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.
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')| 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')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.
Kelima kasus berikut dipertahankan dari dokumen awal, termasuk perhitungan dan interpretasi berbasis dataset.
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.
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.
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.
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.
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.
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.
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.
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)')| 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.
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.
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%')| 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.
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.
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')| 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.
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.
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')| 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)')| 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 |
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.
edges |> arrange(desc(jumlah_penerbangan)) |> slice_head(n=8) |>
knitr::kable(caption='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.
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.
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)')| 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 |
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.
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')| 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.
| 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 |
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.
palmerpenguins: https://allisonhorst.github.io/palmerpenguins/gapminder: https://www.gapminder.org/data/nycflights13: https://nycflights13.tidyverse.org/AirPassengers: ?AirPassengers;
ggplot2::economics: ?ggplot2::economics.