Email: putriangelina865@gmail.com
RPubs: https://rpubs.com/putriangelinaw/
Visualisasi Data adalah cara untuk menampilkan informasi pada data kedalam bentuk visual seperti diagram, grafik, dan peta. Visualisasi Data bisa menangani data yang kecil ataupun data yang besar, sehingga mudah dimengerti atau dipahami oleh sesama. Dan Visualisasi data dapat mendeteksi pola, tren, dan outlier pada data.
R merupakan software terbaik untuk data analisis, karena bisa membuat hampir semua bentuk grafik. Pada publikasi ini akan membantu kalian bagaimana membuat visualisasi data yang sering digunakan (populer). Disini kita akan mempelajari bagaimana memvisualisasikan dari data univariate, bivariate, dan multivariate. Mari kita simak materi berikut dengan seksama.
Univariate plot biasa digunakan untuk menampilkan distribusi dara dengan satu variabel. Variabel tersebut bisa berbentuk kategori (mis: jenis kelamin, ras, negara, kota, dll) atau berbentuk kuantitatif (mis: umur, berat badan, inflasi, penilaian, dll).
Distribusi dengan satu variabel kategori biasanya divisualisasikan dengan diagram-batang, diagram-lingkaran, atau treemap (cukup jarang).
Ini merupakan contoh yang menampilkan frekuensi dari data Marriage, saya dapatkan dari mosaicData. Kita mau menampilkan distribusi undangan pernikahan berdasarkan Zodiac menggunakan diagram batang.
library(ggplot2) # untuk visualisasi
#setwd("D:/Documents/Campus Documents/Semester 3/Algoritma dan Struktur Data/Week 13") # jangan lupa atur tempat kerja kita
Marriage <- read.csv("Marriage.csv") # masukkan data marriage dari PC kita
ggplot(Marriage, aes(x = zodiacs)) + # tampilkan diagram dari `Zodiacs`
geom_bar(fill = "coral1",color= "black") + # kamu juga bisa atur warnanya
theme_minimal() + # kita gunakan tema untuk background
labs(x = "Zodiak", # juga atur nama label tiap variabel
y = "Frekuensi",
title = "Zodiak Peserta Nikah") Categorical Bar Chart 1
diagram batang bisa menampilkan persentase daripada jumlah. Untuk diagram batang (zodiak), kode aes(x=sign) sebetulnya adalah shortcut untuk aes(x = sign, y = ..count..), dimana ..count.. adalah variabel spesial menampilkan frekuensi setiap kategori. Kamu bisa gunakan ini untuk menghitung persentase, dengan mengutamakan variabel y.
Didalam R, warna bisa ditunjukkan dengan nama (misalnya col = “red”). Untuk list nama setiap warna ada pada gambar berikut.
atau kau bisa menampilkan warna menggunakan hexadecimal RGB triplet (seperti col = “#FFCC00”) More. Ada juga, kita bisa menggunakan cara lain yaitu dari package RColorBrewer More dan dari package grDevices (yang ini sudah terdapat pada R) mengandung angka palette, ketik ?rainbow pada Rconsole untuk mengetahui lebih lanjut. Mari kita fokus pada grafik berikut:
ggplot(Marriage,
aes(x = zodiacs,
y = ..count.. / sum(..count..))) +
geom_bar(fill = rainbow(12,rev = T), color= "black") +
theme_minimal() + # gunakan tema untuk background
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Peserta Nikah") +
scale_y_continuous(labels = scales::percent) # tambahkan simbol % untuk variabel y nya Categorical Bar Chart 2
Biasanya sangat penting untuk mengurutkan data berdasarkan frekuensi. Pada koding dibawah ini, frekuensi terkalkulasi dengan jelas. Lalu fungsi reorder digunakan untuk mengurutkan kategori berdasarkan frekuensi. Untuk opisi stat="identity" memberitahu bahwa fungsi grafik/ plot tidak menjumlahkan (count).
library(dplyr) # untuk manipulasi data
plotdata <- Marriage %>% # memuat
count(zodiacs) # menghitung partisipan setiap `zodiak`
# gambar diagram batang dengan urutan menaik
ggplot(plotdata,
aes(x = reorder(zodiacs, n),
y = n)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color= "black") +
theme_minimal() + # gunakan tema minimal untuk background
labs(x = "Zodiak",
y = "Frekuensi",
title = "Kategori Zodiak Terurut")Categorical Bar Chart 3
Jika kamu ingin memberi nama setiap batang dengan nilainya, bisa kita lihat dari koding dibawah ini:
library(scales) # menentukan breaks/labels secara otomatis
plotdata <- Marriage %>%
count(zodiacs) %>%
mutate(pct = n / sum(n),
pctlabel = paste0(round(pct*100), "%"))
# gambarkan diagram dengan variabel y persentase, diurutkan secara menurun dan label setiap batang
ggplot(plotdata,
aes(x = reorder(zodiacs, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color = "black") +
geom_text(aes(label = pctlabel),
vjust = -0.25) +
theme_minimal() + # gunakan tema minimal untuk background
scale_y_continuous(labels = percent) +
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Setiap Zodiak")Categorical Bar Chart 4
Terkadang kategori pada variabel x bisa terlalu panjang dan cukup mengganggu. Jadi kita bisa memutar kategori variabel \(x\) nya dengan derajat tertentu.
# gambar diagram batang dengan variabel y persentasenya, diurutkan secara menurun dan label setiap batang
ggplot(plotdata,
aes(x = reorder(zodiacs, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color = "black") +
geom_text(aes(label = pctlabel),
vjust = -0.25) +
scale_y_continuous(labels = percent) +
theme_minimal() +
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Setiap Zodiak")+
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # mengatur perputaran kategori variabel xCategorical Bar Chart 5
Adapun cara lain dengan memutar balikkan posisi variabel \(x\) dengan variabel \(y\).
# gambar diagram batang dengan variabel y persentasenya, diurutkan secara menurun dan label setiap batang
ggplot(plotdata,
aes(x = reorder(zodiacs, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color = "black") +
geom_text(aes(label = pctlabel),
hjust = -0.10) +
scale_y_continuous(labels = percent) +
theme_minimal() +
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Setiap Zodiak")+
coord_flip()Categorical Bar Chart 6
Diagram Lingkaran sangat kontroversial didalam statistika. Jika tujuanmu adalah membandingkan frekuensi kategori, lebih baik menggunakan diagram batang (orang-orang biasanya lebih cocok dalam membandingkan panjang dari batangnya, jadi lebih terlihat) Jika tujuanmu membandingkan setiap kategori dengan keseluruhan (misalnya, proporsi partisipan yang Hispanic dibandingkan dengan seluruh partisipan), dan angka kategosinya kecil, maka diagram lingkaran bisa menjadi pilihan.
Berikut koding membuat diagram lingkaran menggunakan basic ggplot2 di R.
plotdata <- Marriage %>%
count(race) %>%
arrange(desc(race)) %>%
mutate(prop = round(n*100/sum(n), 1),
lab.ypos = cumsum(prop) - 0.5*prop)
# Membuat Diagram Lingkaran
mycols <- c("#ceadfe", "#d4f1ff", "#d1f1d4","#ffbef2")
ggplot(plotdata, aes(x = "", y = prop, fill = race)) +
geom_bar(width = 1, stat = "identity", color = "white") +
coord_polar("y", start = 0)+
geom_text(aes(y = lab.ypos, label = prop), color = "black")+
scale_fill_manual(values = mycols) +
theme_void()+
labs(title = "Peserta Nikah Berdasarkan Ras")Categorical Pie Chart
Diagram Donat sama seperti diagram lingkaran, hanya saja bentuknya seperti donat. Perbedaannya ada pada \(x = 2\) dan xlim = c(0.5, 2.5) untuk membuat lubang ditengahnya seperti donat. Dan argumen width pada fungsi geom_bar() tidak lagi dibutuhkan.
# Membuat Diagram Donat
ggplot(plotdata, aes(x = 2, y = prop, fill = race)) +
geom_bar(stat = "identity", color = "white") +
coord_polar(theta = "y", start = 0)+
geom_text(aes(y = lab.ypos, label = prop), color = "black")+
scale_fill_manual(values = mycols) +
theme_void()+
xlim(0.5, 2.5)+
labs(title = "Peserta Nikah Berdasarkan Ras")Categorical Donut Chart 1
Sekarang kita coba memberi label disetiap kategori.
# Memberi label Persen
plotdata$percent <- paste0(plotdata$race, "\n",
round(plotdata$prop), "%")
# Membuat Diagram Donat dalam Persen
ggplot(plotdata, aes(x = 2, y = prop, fill = race)) +
geom_bar(stat = "identity", color = "white") +
coord_polar(theta = "y", start = 0)+
geom_text(aes(y = lab.ypos, label = percent), color = "black")+
scale_fill_manual(values = mycols) +
theme_void()+
xlim(0.5, 2.5)+
labs(title = "Peserta Nikah Berdasarkan Ras")+
theme(legend.position = "FALSE")Categorical Donut Chart 2
Contoh lainnya yaitu treemap. Tidak seperti diagram lingkaran, treemap bisa menangani kategori dari variabel yang memiliki banyak level atau cukup kompleks.
library(treemapify)
plotdata <- Marriage %>%
count(officialTitle)
ggplot(plotdata,
aes(fill = officialTitle,
area = n)) +
geom_treemap() +
labs(title = "Peserta Nikah Dengan Pengurus")Categorical Tree Map 1
Kita juga bisa memberikan label disetiap kategori
ggplot(plotdata,
aes(fill = officialTitle,
area = n,
label = officialTitle)) +
geom_treemap() +
geom_treemap_text(colour = "black",
place = "centre") +
labs(title = "Peserta Nikah Dengan Pengurus") +
theme(legend.position = "none")Categorical Tree Map 2
Distribusi dari satu variabel kuantitatif biasanya didistribusikan menggunakan histogram, kernel density plot, atau dot plot.
Dengan menggunakan data set Marriage, Mari kita gambarkan histogram umur dari peserta nikah.
ggplot(Marriage, aes(x = age)) +
geom_histogram(fill = "#CBAACB",
color = "black",
bins = 20) +
theme_minimal() +
labs(title="Umur Peserta Pernikahan (Basic, menggunakan bin)",
x = "Umur",
y = "Frekuensi")Quantitative Histogram
Kebanyakan peserta yang muncul yaitu di umur 20-an dan 40-an, dan untuk yang paling sedikit yaitu di umur 60-70an. Ini merupakan distribusi multimodel. Warna histogram dapat diatur menggunakan 2 opsi:
Kita bisa menggunakan binwidth, maka range value pada variabel \(y\) akan mengikuti nilai dari bindwidth
ggplot(Marriage,
aes(x = age,
y= ..count.. / sum(..count..))) +
geom_histogram(fill = "#CBAACB",
color = "black",
binwidth = 5) +
theme_minimal() +
labs(title="Umur Peserta Nikah (Membedakan antara bin dan binwidth)",
y = "Persen",
x = "Umur") +
scale_y_continuous(labels = percent)Quantitative Histogram 2
Seperti pada diagram batang, kategori di variabel \(y\) bisa menunjukkan jumlah atau persen dari total keseluruhan.
ggplot(Marriage,
aes(x = age,
y= ..count.. / sum(..count..))) +
geom_histogram(fill = "#CBAACB",
color = "black",
binwidth = 5) +
theme_minimal() + # use a minimal theme
labs(title="Persentase Umur Peserta Pernikahan",
y = "Persen",
x = "Umur") +
scale_y_continuous(labels = percent)Quantitative Histogram 3
Cara lain untuk menampilkan histogram yaitu kernel density plot. Secara teknik, estimasi kepadatan kernel adalah metode non-parameter untuk mengestimasi fungsi kepadatan peluang (PDF) dari variabel random kontinu. (Apa??!) Secara umum, kita mencoba untuk menggambarkan histogram mulus dengan cara Kernel, dimana area dibawah kurva sama dengan satu.
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "#57838d") +
theme_minimal() +
labs(title = "Umur Peserta Pernikahan",
x = "Umur",
y = "Kepadatan")Quantitative Kenel Density Plot
Grafik tersebut menunjukkan nilai distribusi. Sebagai conoth, proporsi pada kasus antara 20 dan 40 tahun ditampilkan dengan area bawah kurva antara 20-40 di kategori variabel \(x\). Seperti pada diagram sebelumnya, Kita juga bisa mengisi dan mewarnai untuk pewarnaan isi dan border.
Tingkat kehalusan suatu grafik diatur oleh parameter bandwidth bw. Untuk menemukan nilai default untuk nilai tertentu, gunakan fungsi bw.nrd0. Nilai yang besar akan menghasilkan hasil yang lebih smooth/halus, sedangkan nilai yang kecil menghasilkan hasil kehalusan yang sedikit.
## [1] 5.181946
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "#57838d",
bw = 1) +
theme_minimal() +
labs(title = "Umur Peserta",
subtitle = "bandwidth = 1")Smoothing Parameter Plot
Kernel density plots membuat kita mudah untuk melihat nilai mana yang memiliki frekuensi tinggi dan nilai mana yang tidak. Tetapi hal ini bisa membuat kita sulit mengidentifikasi arti dari variabel \(y\).
Adapula cara lainnya yaitu Diagram Titik. Bentuknya mirip seperti histogram, hanya saja ditampilkan seperti kumpulan titik-titik. Secara default, lebar sebuah titik sama dengan lebar bin, dan titik-titik bertumpuk dengan setiap titik mewakili satu observasi. Ini bekerja paling baik jika jumlah observasi kecil (katakanlah, kurang dari 150).
ggplot(Marriage, aes(x = age)) +
geom_dotplot(fill = "#57838d",
binwidth = 2) +
theme_minimal() +
labs(title = "Umur Peserta",
y = "Proporsi",
x = "Umur",
subtitle = "binwidth = 2")Dot Chart
Ada beberapa opsi disini, Klik disini for details and examples.
Data Bivariate menampilkan hubungan antara dua variabel. Tipe grafik ini tergantung level pengukuran dari variabel (kategori atau kuantitatif)
Ayo kita membuat grafik hubungan pada data for the automobiles in the Fuel economy dataset (front-wheel, rear-wheel, atau 4-wheel drive).
mpg$drv<-factor(mpg$drv,
levels = c("f", "r", "4"),
labels = c("front-wheel", "rear-wheel", "4-wheel"))
# Diagram Batang Betumpuk
ggplot(mpg,
aes(x = class,
fill = drv)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(y = "Proporsi")Stacked Bar Chart
Bagan batang yang dikelompokkan menempatkan batang untuk variabel kategori kedua secara berdampingan. Untuk membuat diagram batang yang dikelompokkan, gunakan opsi position =" single ". Perhatikan bahwa opsi ini hanya tersedia di versi pengembangan terbaru ggplot2, tetapi akan segera tersedia secara umum.
ggplot(mpg, aes(x = class, fill = drv)) +
theme_minimal() +
geom_bar(position = position_dodge(preserve = "single"))Grouped Bar Chart
Diagram Batang Bersegmen itu sama seperti diagram batang bertumpuk hanya saja ditampilkan dalam 100 persen. Kamu bisa membuat diagram ini menggunakan opsi position = "filled". Tipe diagram ini cukup berguna jika memiliki tujuan untuk membandingkan persentase setiap kategori variabel. Sebagai contoh, proporsi mobil penggerak roda depan naik saat Anda beralih dari kompak ke menengah, ke minivan.
# Buat data ringkasan (manipulasi data)
plotdata <- mpg %>%
group_by(class, drv) %>%
dplyr::summarize(n = n()) %>%
mutate(pct = n/sum(n),
lbl = scales::percent(pct))
# Buat diagram batang bersegmen
# tambahkan label di setiap segmen
ggplot(plotdata,
aes(x = factor(class),
y = pct,
fill = factor(drv))) +
geom_bar(stat = "identity",
position = "fill") +
scale_y_continuous(breaks = seq(0, 1, .2),
label = percent)+
geom_text(aes(label = lbl),
size = 3,
position = position_stack(vjust = 0.5)) +
scale_fill_brewer(palette = "Set2") +
theme_minimal() +
labs(y = "Persen",
fill = "Drive Train",
x = "Kelas",
title = "Penggerak Mobil berdasarkan Kelas") +
theme_minimal()Segmented Bar Chart
Catatan: Kamu bisa gunakan opsi tambahan ini untuk meningkatkan pewarnaan dan pelabelan pada diagram,
factor mengatur urutan kategori untuk kelas variabellabels untuk variabel drivescale_y_continuous mengubah label tanda centang sumbu ylabs menyediakan judul dan mengubah label untuk sumbu x dan y serta legendascale_fill_brewer mengubah skema warna isiantheme_minimal menghapus latar belakang abu-abu dan mengubah warna kisiFungsi lainnya dibahas lebih lengkap pada Bab Visualisasi Data Lanjutan.
Diagram Mosaic bisa menampilkan hubungan antara variabel kategorimenggunakan persegi dimana daerahnya menunjukkan proporsi dari kombinasi level yang diberikan. Warnanya bisa juga menunjukkan hubungan derajat antar variabel.
Walaupun diagram mosaic bisa dibuat dengan ggplot2 menggunakan package ggmosaic, saya lebih merekomendasikan menggunakan package vcd. Walau itu tidak membuat grafiknya ggplot2, package ini memberikan pendekatan yang lebih komprehensif untuk memvisualisasikan data kategori.
Orang-orang terkagum dengan Titanic. Pada masalah Titanic, peran apa yang dimainkan gender dan kelas dalam bertahan hidup? Kita dapat memvisualisasikan hubungan antara ketiga variabel kategori ini dengan menggunakan kode di bawah ini.
## Sex Male Female
## Survived Class
## No 1st 118 4
## 2nd 154 13
## 3rd 422 106
## Crew 670 3
## Yes 1st 62 141
## 2nd 25 93
## 3rd 88 90
## Crew 192 20
## Loading required package: grid
Basic mosaic plot
Ukuran persegi sebanding dengan persentase kasus dalam kombinasi level tersebut. Jelas, lebih banyak penumpang yang tewas daripada yang selamat. Mereka yang tewas terutama adalah penumpang pria kelas 3 dan crew pria (kelompok terbesar).
Jika kita mengasumsikan bahwa ketiga variabel ini independen, kita bisa memeriksa residual dari model dan memberi bayangan pada persegi agar sesuai. Pada grafik di bawah ini, biru tua menunjukkan lebih banyak kasus daripada yang diharapkan jika diberikan kebebasan. Merah tua mewakili lebih sedikit kasus dari yang diharapkan jika kebebasan berlaku.
mosaic(tbl,
shade = TRUE,
legend = TRUE,
labeling_args = list(set_varnames = c(Sex = "Jenis Kelamin",
Survived = "Yang Berhasil Selamat",
Class = "Kelas Penumpang")),
set_labels = list(Survived = c("Tidak", "Ya"),
Class = c("1st", "2nd", "3rd", "Crew"),
Sex = c("F", "M")),
main = "Titanic data")Mosaic plot with shading
Kita dapat melihat bahwa jika kelas, jenis kelamin, dan kelangsungan hidup independen, kita melihat lebih banyak crew pria yang tewas, dan perempuan kelas 1, 2, dan 3 bertahan hidup daripada yang diharapkan. Sebaliknya, jauh lebih sedikit penumpang kelas satu (pria dan wanita) yang meninggal daripada yang diperkirakan. Dengan demikian asumsi Independence ditolak.
Membahas mengenai hubungan antara dua variabel yang kontinu dan biasa ditampilkan menggunakan scatterplot dan diagram garis.
Scatterplot digunakan untuk membahas mengenai hubunagan dua variabel. Jadi ini sering bersinggungan dengan koefisien korelasi, yang biasanya mencoba menghitung hibingan liniernya. Akan tetapi, hubungan lainnya juga bisa dideteksi menggunakan scatterplot, dan tugas umum terdiri untuk menyesuaikan model yang menjelaskan \(Y\) dalam fungsi \(X\). Berikut adalah beberapa pola yang dapat kamu deteksi dengan scatterplot.
library(hrbrthemes) # untuk `theme_ipsum()` dan legend
# Membuat data
d1 <- data.frame(x=seq(1,100),
y=rnorm(100),
name="No trend")
d2 <- d1 %>%
mutate(y=x*10 + rnorm(100,sd=60)) %>%
mutate(name="Linear relationship")
d3 <- d1 %>%
mutate(y=x^2 + rnorm(100,sd=140)) %>%
mutate(name="Square")
d4 <- data.frame( x=seq(1,10,0.1),
y=sin(seq(1,10,0.1)) +
rnorm(91,sd=0.6)) %>%
mutate(name="Sin")
don <- do.call(rbind, list(d1, d2, d3, d4))
# Plot
don %>%
ggplot(aes(x=x, y=y)) +
geom_point(color="#69b3a2", alpha=0.8) +
theme_ipsum() +
facet_wrap(~name, scale="free")relationship scatterplots
Cara paling mudah untuk menampilkan dua variabel kuantitatif adalah scatterplot, dengan setiap variabel ada pada sumbu. Sebagai contoh, menggunakan data Gaji, kita menampilkan variabel pengalaman (yrs.since.phd) vs. gaji akademik (salary) dengan scatterplot untuk college Professors.
data(Salaries, package="carData")
# Peningkatan Scatterplot
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color="#cc7952",
size = 2,
alpha=.8) +
scale_y_continuous(label = scales::dollar,
limits = c(50000, 250000)) +
scale_x_continuous(breaks = seq(0, 60, 10),
limits=c(0, 60)) +
theme_minimal() +
labs(x = "Tahun Sejak PhD",
y = "",
title = "Pengalaman vs. Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Scatterplot 1
Notes: opsi geom_point bisa digunakan untuk mengubah
color - warna titiksize - ukuran titikshape - bentuk titikalpha - kejelasan titik. Jarak kejelasan dari 0 (transparan) to 1 (opak) dan berguna untuk titk parameter yang banyak kategorinya.Fungsi scale_x_continuous danscale_y_continuous mengontrol penskalaan masing-masing pada sumbu x dan y. Kita dapat menggunakan opsi dan fungsi ini untuk membuat scatterplot yang lebih menarik.
Seringkali berguna untuk meringkas hubungan yang ditampilkan scatterplot, menggunakan garis yang paling pas. Banyak jenis garis yang didukung, termasuk linier, polinomial, dan nonparametrik (loess). Secara default, batas kepercayaan 95% untuk garis-garis ini ditampilkan.
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "#cc7952") +
geom_smooth(method = "lm", color = "darkorchid2")+
theme_minimal() +
labs(x = "Tahun Sejak PhD",
y = "",
title = "Pengalaman vs. Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Scatterplot Linear
Jelas, gaji meningkat dengan pengalaman. Namun, tampaknya ada penurunan di ujung kanan - profesor dengan pengalaman signifikan, mendapatkan gaji lebih rendah. Garis lurus tidak menangkap efek non-linier ini. Garis dengan lengkungan akan lebih pas di sini.
Regresi polinomial memberikan garis fit dengan formula
\[\begin{equation} \label{eq:1} \hat{y}=\beta_0+\beta_1x+\beta_2x^2+\cdots+\beta_nx^2 \end{equation}\]
Biasanya garis kuadrat (satu tikungan), atau kubik (dua tikungan) digunakan. Sangat jarang perlu menggunakan urutan yang lebih tinggi $ (> 3) $ polynomial.Dengan menerapkan kesesuaian kuadrat ke dataset gaji menghasilkan hasil sebagai berikut.
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "#cc7952") +
geom_smooth(method = "lm",
formula = y ~ poly(x, 2),
color = "darkorange")+
theme_minimal() +
labs(x = "Tahun Sejak PhD",
y = "",
title = "Pengalaman vs. Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Scatterplot Quadratic
Akhirnya, garis kesesuaian nonparametrik yang diperhalus sering kali dapat memberikan gambaran yang baik tentang hubungan tersebut. Default di ggplot2 adalah garis loess yang berarti penghalusan scatterplot berbobot lokal.
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color="#cc7952",
size = 2,
alpha = 1) +
geom_smooth(size = 1,
color = "darkolivegreen4") +
scale_y_continuous(label = scales::dollar,
limits = c(50000, 250000)) +
scale_x_continuous(breaks = seq(0, 60, 10),
limits = c(0, 60)) +
theme_minimal() +
labs(x = "Tahun Sejak PhD",
y = "",
title = "Pengalaman vs. Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Scatterplot Smoothed Nonparametric
Ketika membuat plot hubungan antara variabel kategori dan variabel kuantitatif, terdapat angka besar pada tipe grafik. Ini termasuk:
Pada bagian sebelumnya, diagram batang digunakan untuk menampilkan angka pada kasus kategori untuk satu atau dua variabel. Kita juga bisa menggunakan diagram batang untuk menampilkan summary statistics (sebagai contoh, mean atau median) pada variabel kuantitatif disetiap level variabel kategori.
Sebagai contoh, Diagram berikut menampilkan rata-rata gaji untuk sampel pada universitas professors berdasarkan tingkat akademik mereka.
data(Salaries, package="carData")
# hitung rata-rata untuk setiap rank
plotdata <- Salaries %>%
group_by(rank) %>%
dplyr::summarize(mean_salary = mean(salary))
# buat plot rata-rata gaji dengan cara yang baru
mycols <- c("#ceadfe", "#d4f1ff", "#ffbef2")
ggplot(plotdata,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = mean_salary)) +
geom_bar(stat = "identity",
fill = mycols) +
geom_text(aes(label = dollar(mean_salary)),
vjust = -0.25) +
scale_y_continuous(breaks = seq(0, 130000, 20000),
label = dollar) +
theme_minimal() +
labs(title = "Rata-rata Gaji Berdasarkan Pangkat",
subtitle = "9 bulan gaji akademik untuk 2008-2009",
x = "",
y = "")Bar Chart (Summary statistics)
Seseorang dapat membandingkan grup pada variabel numerik dengan meletakkan plot kepadatan kernel dalam satu grafik. Mari kita plot distribusi gaji dengan peringkat menggunakan kernel density plot.
ggplot(Salaries,
aes(x = salary,
fill = rank)) +
geom_density(alpha = 0.4) +
theme_minimal() +
labs(title = "Distribusi Gaji Berdasarkan Pangkat",
x = "gaji",
y = "kepadatan")Grouped Kernel Density Plots
Opsi alpha membuat plot kepadatan transparan sebagian sehingga kita bisa melihat apa yang terjadi di bawah tumpang tindih. Nilai alfa berkisar dari 0 (transparan) hingga 1 (opak). Grafik tersebut menjelaskan bahwa, secara umum gaji naik sesuai pangkat. Namun, kisaran gaji untuk full profesor sangat luas.
Box plot menampilkan \(25^{th}\) persentil, median, dan \(75^{th}\) persentil dari distribusi. Whisker (garis vertikal) menangkap sekitar 99% dari distribusi normal dan observasi di luar kisaran ini diplot sebagai titik yang mewakili outlier (lihatlah pada gambar berikut)
Box Plots
Box plot sangat berguna untuk membandingkan kelompok (misalnya, level variabel kategori) pada variabel numerik. Mari kita plot distribusi gaji dengan peringkat menggunakan box plot. Box plot memberikan metode perkiraan untuk memvisualisasikan apakah kelompok berbeda. Meskipun bukan tes formal, jika takik dari dua box plot tidak melewati batas, maka ada bukti kuat (kepercayaan 95%) bahwa median dari kedua kelompok berbeda.
ggplot(Salaries, aes(x = rank,
y = salary)) +
geom_boxplot(notch = TRUE,
fill = c("#ceadfe", "#d4f1ff", "#ffbef2"),
alpha = .7) +
theme_minimal() +
labs(title = "Distribusi Gaji Berdasarkan Pangkat")Box Plots
Pada contoh diatas, tiga kelompok muncul pada posisi yang berbeda. Salah satu keuntungan dari box plot adalah lebar mereka tidak biasanya memiliki arti. Ini memperbolehkan kamu untuk membandingkan distribusi dari banyak kelompok pada satu grafik. Jika dilihat pada boxplot-nya profesor itu cukup lebar, artinya memungkinkan terdapat outlier didalamnya.
Violin plots hampir sama dengan plot kepadatan kernel tetapi perbedaanya itu ini dicerminkan dan diputar \(90^\circ\). Mari kita lakukan plot pada distribusi gaji dengan peringkat menggunakan violin plot.
ggplot(Salaries, aes(x = rank,
y = salary)) +
geom_violin(fill = "azure1") +
geom_boxplot(width = .2,
fill = c("#ceadfe", "#d4f1ff", "#ffbef2"),
outlier.color = "red",
outlier.size = 2) +
theme_minimal() +
labs(title = "Distribusi Gaji Berdasarkan Pangkat")Violin Plots
Ridgeline plot (biasa disebut joy plot) menampilkan distribusi variabel kuantitatif beberapa kelompok. Mereka mirip dengan plot kepadatan kernel dengan faceting yang vertikal, tetapi mengambil sedkit tempat/ruang. Ridgeline plot dibuat dengan package ggridges.
Dengan menggunakan dataset Fuel economy, mari kita buat distribusi dari jarak mengemudi ke kota per gallon dengan kelas mobil.
library(ggridges) # untuk menangani visualisasi yang bersamaan
ggplot(mpg,
aes(x = cty,
y = class,
fill = class)) +
geom_density_ridges(alpha = 0.7) +
theme_ridges() +
labs("Jarak Berkemudi dengan Kelas Otomatis") +
theme(legend.position = "none")Ridgeline Plots
Saya telah menyembunyikan legenda di sini karena itu berlebihan (distribusinya sudah diberi label pada sumbu y). Tidak mengherankan, truk pickup memiliki jarak tempuh yang paling rendah, sementara mobil subcompact dan compact cenderung mencapai peringkat. Namun, ada rentang nilai jarak tempuh yang sangat luas untuk mobil-mobil kecil ini.
Perhatikan kemungkinan bersamaannya distribusi adalah trade-off untuk grafik yang lebih kompak. Kamu bisa menambahkan transparansi jika tumpang tindihnya parah menggunakan geom_density_ridges (alpha = n), dengan n berkisar dari 0 (transparan) hingga 1 (buram). Lihat package vingnette untuk lebih jelasnya.
Metode populer untuk membandingkan kelompok pada variabel numerik adalah plot rata-rata dengan error bar. Error bar dapat mewakili standar deviasi, mean standar error, atau interval kepercayaan. Di bagian ini, kita akan membuat plot mean dan standar error. Kita dapat menggunakan teknik yang sama untuk membandingkan gaji berdasarkan pangkat dan jenis kelamin. (Secara teknis, ini bukan data bivariate karena kita merencanakan pangkat, jenis kelamin, dan gaji).
# hitung mean, standar deviasi, standar error, dan 95% interval kepercayaan dengan peringkat
plotdata <- Salaries %>%
group_by(rank, sex) %>%
dplyr::summarize(n = n(),
mean = mean(salary),
sd = sd(salary),
se = sd/sqrt(n),
ci = qt(0.975, df = n - 1) * sd / sqrt(n))
# plot mean/standar error yang diperbarui
pd <- position_dodge(0.2)
ggplot(plotdata,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = mean,
group=sex,
color=sex)) +
geom_point(position=pd,
size = 3) +
geom_line(position = pd,
size = 1) +
geom_errorbar(aes(ymin = mean - se,
ymax = mean + se),
width = .1,
position = pd,
size = 1) +
scale_y_continuous(label = scales::dollar) +
scale_color_brewer(palette="Set1") +
theme_minimal() +
labs(title = "Rata-rata Gaji terhadap Pangkat dan Jenis Kelamin",
subtitle = "(mean +/- standar error)",
x = "",
y = "",
color = "Jenis Kelamin")Line Plots
Hubungan antara variabel berkelompok dan variabel numerik bisa ditampilkan dengan scatterplot. Sebagai contoh, plot distribusi gaji berdasarkan peringkat menggunakan strip plot. Scatterplot satu dimensi ini disebut strip plot. Akan tetapi, pencetakan poin yang berlebihan membuat interpretasi semakin sulit. Hubungannya lebih mudah dilihat jika poinnya goyah. Pada dasarnya, random angka kecil ditambahkan ke setiap koordinat y. Dan akan lebih mudah untuk membandingkan kelompok jika kita menggunakan warna.
ggplot(Salaries,
aes(y = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
x = salary,
color = rank)) +
geom_jitter(alpha = 0.7,
size = 1.5) +
scale_x_continuous(label = dollar) +
labs(title = "Gaji Akademik Berdasarkan Pangkat",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Strip Plots
Opsi legend.position = "none" digunakan untuk menyembunyikan legend (yang mana tidak lagi dibutuhkan disini).
Mungkin akan lebih mudah memvisualisasikan distribusi jika kita menambahkan boxplot ke jitter plot. Jittered plot bekerja dengan baik jika jumlah poin tidak terlalu besar. Beberapa opsi telah ditambahkan untuk membuat jitter plot.
size = 1 untuk ketebalan garisoutlier.color = "black" membuat outlier berwarna hitamoutlier.shape = 2 Bentuk outlieroutlier.size = 3 menambah ukuran outlieralpha = 0.5 untuk kejelasan titik (transparan atau tidak)width = .2 menurunkan nilai jitter (.4 adalah nilai jitter default)Terakhir, sumbu \(x\) dan \(y\) kita putar posisi menggunakan fungsi coord_flip.
ggplot(Salaries,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = salary,
color = rank)) +
geom_boxplot(size=1,
outlier.shape = 2,
outlier.color = "black",
outlier.size = 3) +
geom_jitter(alpha = 0.5,
width=.2) +
scale_y_continuous(label = dollar) +
labs(title = "Gaji Akademik Berdasarkan Pangkat",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none") +
coord_flip()Combining Jitter and Boxplots 1
Sebelum ke bagian selanjutnya, sangat baik untuk terlebih dahulu mengetahui fungsi geom_boxjitter yang ada pada package ggpol. Itu membuat boxplot hibrid - boxplot setengah.
library(ggpol) # boxplot hibrid
ggplot(Salaries,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = salary,
fill=rank)) +
geom_boxjitter(color="black",
jitter.color = "darkgrey",
errorbar.draw = TRUE) +
scale_y_continuous(label = dollar) +
labs(title = "Gaji Akademik Berdasarkan Pangkat",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Combining Jitter and Boxplots 2
Beeswarm plot (juga disebut violin scatterplot) itu sama seperti jittered scatterplot, dimana plot ini menampilkan distribusi variabel kuantitatif dengan membuat titik-titiknya mengurangi kejadian tumpang tindih. Artinya, plot ini juga membantu menampilkan kepadatan data di setiap titik (caranya mirip dengan violin plot).
library(ggbeeswarm) # package yang diperlukan untuk plot ini
ggplot(Salaries,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = salary,
color = rank)) +
geom_quasirandom(alpha = 0.7,
size = 1.5) +
scale_y_continuous(label = dollar) +
labs(title = "Gaji Akademik Berdasarkan Pangkat",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Beeswarm Plots
Plot diatas dibuat menggunakan fungsi geom_quasirandom. Plot ini sangat mudah untuk dibaca dan lebih simpel daripada jittered strip plot. Untuk memahami lebih banyak mengenai plot ini, silakan klik link berikut Beeswarm-style plots.
Cleveland plot sangat berguna ketika kamu gunakan untuk membandingkan data statistik numerikal untuk kelompok data besar. Sebagai contoh, kamu ingin membandingkan harapan hidup tahun 2007 di Benua Asia menggunakan dataset pada gapminder.
library(gapminder) # package dataset `gapminder`
data(gapminder, package="gapminder") # memuat dataset `gapminder`
# subset negara di Asia tahun 2007
plotdata <- gapminder %>%
filter(continent == "Asia" &
year == 2007)
# Cleveland plot
ggplot(plotdata,
aes(x=lifeExp,
y=reorder(country, lifeExp))) +
geom_point(color="darkorchid4",
size = 2) +
geom_segment(aes(x = 40,
xend = lifeExp,
y = reorder(country, lifeExp),
yend = reorder(country, lifeExp)),
color = "#ceadfe") +
labs (x = "Harapan Hidup (tahun)",
y = "",
title = "Harapan Hidup Disetiap Negara Asia",
subtitle = "GapMinder data for Asia - 2007") +
theme_minimal() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())Beeswarm Plots
Sangat jelas, negara Jepang lah yang menduduki urutan paling atas, artinya memiliki harapan hidup yang tinggi, sedangkan Afganistan berada diurutan paling bawah. Plot ini juga disebut sebagai grafik lollipop.
Grafik data multivariat menampilkan hubungan antara tiga atau lebih variabel. Ada dua cara yang paling sering dijumpai untuk membahas variabel multipel: grouping and faceting.
Pada grouping, dua nilai pertama dari dua variabel dipetakan ke sumbu \(x\) dan \(y\). Lalu variabel lainnya dipetakan ke visual karakteristik seperti warna, bentuk, ukuran, garis, dan kejelasan. Grouping memperbolehkan kamu untuk membuat datamu di kelompokan menjadi satu grafik. Kita coba menggunakan dataset Salaries untuk menampilkan hubungan antara yrs.since.phd dan gaji.
library(carData) # untuk dataset
data(Salaries, package="carData")
ggplot(Salaries, aes(x = yrs.since.phd,
y = salary,
color=rank)) +
geom_point() +
theme_minimal() +
labs(title = "Gaji Akademik Berdasarkan Pangkat dan Tahun Sejak Gelar",
x = "Tahun Sejak Gelar",
y = "Gaji",
color = "Pangkat")Multivariate Grouping Plot 1
Selanjutnya, mari tambahkan jenis kelamin dari setiap profesor kedalam grafik, menggunakan shape of the points supaya membedakan titik setiap variabel. Kita coba tambahkan ukurannya dan ketransparannya untuk memberi perbedaan yang lebih jelas.
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary,
color = rank,
shape = sex)) +
geom_point(size = 3, alpha = .6) +
theme_minimal() +
labs(title = "Gaji Akademik Berdasarkan Pangkat, Jenis Kelamin, dan Tahun Sejak Gelar",
x = "Tahun Sejak Gelar",
y = "Gaji",
color = "Pangkat",
shape = "Jenis Kelamin")Multivariate Grouping Plot 2
Kita tidak bisa begitu saja menyebutkan ini merupakan grafik hebat. Ini terlalu ramai, akan sulit untuk membedakan pria dari profesor wanita (sangat tumpang tindih). Faceting (dibahas di bagian selanjutnya) akan menjadi pendekatan yang lebih baik.
Perhatikan perbedaan antara menetapkan nilai konstan (seperti size = 3) dan pemetaan variabel ke karakteristik visual (misalnya, color = rank). Pemetaan selalu ditempatkan di dalam fungsi aes, sedangkan penetapan nilai konstanta selalu muncul di luar fungsi aes.
Ini contoh yang lebih enak dilihat. Kita membuat grafik hubungan antara Tahun sejak Ph.D. dan gaji dimana ukuran setiap titik bergantung dengan lamanya melayani. Ini disebut dengan bubble plot.
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary,
color = rank,
size = yrs.service)) +
geom_point(alpha = .8) +
theme_minimal() +
labs(title = "Gaji Akademik Berdasarkan Pangkat, Tahun Pelayanan, Tahun Sejak Gelar",
x = "Tahun Sejak Gelar",
y = "Gaji",
color = "Pangkat",
size = "Tahun Pelayanan")Multivariate Grouping Plot 3
Jelas ada hubungan positif yang kuat antara tahun sejak Ph.D. dan tahun melayani. Asisten Profesor jatuh dalam 0-11 tahun sejak Ph.D. dan rentang layanan 0-10 tahun. Profesional yang jelas sangat berpengalaman tidak hanya berada di level Asisten Profesor (mereka mungkin dipromosikan atau keluar dari Universitas). Kami tidak menemukan batasan waktu yang sama antara Associate dan Full Professor. Bubble plot akan dijelaskan lebih detail di bab selanjutnya.
Sebagai contoh terakhir, mari gunakan variabel tahun sejak Ph.D. vs gaji dan tambahkan jenis kelamin menggunakan warna dan quadratic best fit lines.
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary,
color = sex)) +
geom_point(alpha = .4,
size = 3) +
geom_smooth(se=FALSE,
method = "lm",
formula = y~poly(x,2),
size = 1.5) +
labs(x = "Tahun Sejak Ph.D.",
title = "Gaji Akademik Berdasarkan Jenis Kelamin dan Tahun Pengalaman",
subtitle = " Gaji 9 bulan untuk 2008-2009",
y = "",
color = "Jenis Kelamin") +
scale_y_continuous(label = scales::dollar) +
scale_color_brewer(palette = "Set1") +
theme_minimal()Multivariate Grouping Plot 4
Pengelompokan memungkinkan kamu untuk membuat beberapa variabel dalam satu grafik, menggunakan karakteristik visual seperti warna, bentuk, dan ukuran. Dalam faceting, grafik terdiri dari beberapa plot terpisah atau kelipatan kecil, satu untuk setiap tingkat variabel ketiga atau kombinasi variabel. Untuk lebih memahami, kita akan menggunakan contoh.
ggplot(Salaries, aes(x = salary)) +
geom_histogram(fill = "#ceadfe",
color = "black") +
facet_wrap(~rank, ncol = 1) +
theme_minimal() +
labs(title = "Diagram dari Gaji Berdasarkan Pangkat",
x = "Gaji",
y = "")Multivariate Faceting 1
Fungsi facet_wrap membuat grafik terpisah untuk setiap level pangkat Opsi ncol mengatur angka pada kolom. Contoh selanjutnya, dua variabel digunakan untuk menjelaskan facets.
Disini, Fungsi menetapkan variabel jenis kelamin ke baris dan variabel pangkat ke kolom, membuat matriks dari 6 plot dalam satu grafik.
ggplot(Salaries, aes(x = salary / 1000)) +
geom_histogram(color = "black",
fill = "#ceadfe") +
facet_grid(sex ~ rank) +
theme_minimal() +
labs(title = "Diagram dari Gaji Berdasarkan Jenis Kelamin dan Pangkat",
x = "Gaji ($1000)",
y = "")Multivariate Faceting 2
Kita juga bisa menggabungkan grouping dan faceting. Mari kita gunakan plot Mean/SE dan faceting untuk membandingkan gaji profesor pria dan wanita, dalam pangkat dan kedisiplinan. Kita akan menggunakan warna untuk membedakan jenis kelamin dan faceting untuk membuat plot angkat berdasarkan kombinasi kedisiplinan.
# Hitung means and standar error jenis kelamin, peringkat, and kedisiplinan
plotdata <- Salaries %>%
group_by(sex, rank, discipline) %>%
dplyr::summarize(n = n(),
mean = mean(salary),
sd = sd(salary),
se = sd / sqrt(n))
# memberi label pada kedisiplinan
plotdata$discipline <- factor(plotdata$discipline,
labels = c("Theoretical",
"Applied"))
# membuat plot
ggplot(plotdata,
aes(x = sex,
y = mean,
color = sex)) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = mean - se,
ymax = mean + se),
width = .1) +
scale_y_continuous(breaks = seq(70000, 140000, 10000),
label = scales::dollar) +
facet_grid(. ~ rank + discipline) +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.y = element_blank()) +
labs(x="",
y="",
title="Gaji Akademik 9 Bulan Berdasarkan Jenis Kelamin,\nKedisiplinan, dan Pangkat",
subtitle = "(Means and standar error)") +
scale_color_brewer(palette="Set1")Multivariate Faceting 3
Pernyatan facet_grid(. ~ rank + discipline) ynag menentukan tidak ada variabel baris (.) dan kolom ditentukan oleh kombinasi pangkat dan kedisiplinan.
Fungsi theme() membuat tema hitam putih dan mengeliminasi garis kotak-kotak. Fungsi scale_color_brewer() mengubah skema warna setiap titik dan error bars.
Pada pandangan pertama, tampaknya ada perbedaan jenis kelamin dalam gaji untuk associate dan full profesor di bidang teoretis. Saya mengatakan “mungkin” karena kita belum melakukan pengujian hipotesis formal (ANOVA dalam kasus ini). Lihat bagian Customizing untuk mempelajari lebih lanjut tentang menyesuaikan tampilan grafik.
Sebagai contoh terakhir, kita akan beralih ke dataset berbeda dan buat plot perubahan harapan hidup setiap waktunya untuk negara di Asia. Datanya dari package gapminder. Setiap negara muncul sendiri-sendiri. Fungsi theme digunakan untuk pewarnaan background, putar teks sumbu \(x\), dan buat font lebih kecil.
data(gapminder, package = "gapminder")
# Pilih Data Asia
plotdata <- dplyr::filter(gapminder,
continent == "Asia")
# buat plot harapan hidup tiap tahun, untuk setiap negara
ggplot(plotdata, aes(x=year, y = lifeExp)) +
geom_line(color="#ceadfe") +
geom_point(color="darkorchid4") +
facet_wrap(~country) +
theme_minimal(base_size = 9) +
theme(axis.text.x = element_text(angle = 45,
hjust = 1)) +
labs(title = "Perubahan Harapan Hidup",
x = "Tahun",
y = "Harapan Hidup") Multivariate Faceting 4