Algoritma & Struktur Data
~ Visualisasi Data dengan R ~
| Kontak | : \(\downarrow\) |
| kent.zendrato@student.matanauniversity.ac.id | |
| RPubs | https://rpubs.com/kentzend03/ |
Visualisasi data adalah cara mengambil suatu informasi dari suatu data dalam bentuk visual, seperti bagan, grafik, dan peta. Visualisasi data dapat mempermudah suatu data mudah dimengerti oleh otak manusia, dan visualisasi juga membuatnya lebih andal untuk mendeteksi pola, tren, dan outlier dalam kelompok data.
Univariat (Satu Variabel)
Visualisasi data univariat biasanya digunakan untuk melakukan distribusi data dari satu variabel. Dalam hal ini, variabel yang dimaksud terbagi jadi dua bagian:
• Kategoris, seperti jenis kelamin, ras, negara, kota dll.
• Numerik, seperti usia, berat badan, inflasi, suku bunga, dll.
Variabel Kategori
Distribusi dalam suatu variabel kategori tunggal biasanya dalam bentuk diagram batang, diagram lingkaran, atau diagram pohon (Yang satu ini jarang sekali digunakan)
Diagram Batang
Berikut adalah contoh menunjukkan frekuensi dari dataset Marriage, yang didapat dengan menggunakan package mosaicData. Gunakan diagram batang untuk menampilkan distribusi pernikahan berdasarkan Zodiak
library(ggplot2) #Package untuk visualisasi
setwd("D:/Fisika Medis/Algoritma dan Struktur Data/Pertemuan 13") #Mengatur Working Directory
Marriage<- read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv") #Mengimpor Data dari web
ggplot(Marriage, aes(x = zodiacs)) + #Memplot distribusi dari Zodiacs
geom_bar(fill = "#C0C0C0", # Menerapkan warna
color = "#000000") +
theme_minimal() + #Menerapkan tema
labs(x = "Zodiacs", #Mengganti label dan judul
y = "Frequency",
title = "Marriage Participants by Zodiacs")Batangan di atas menunjukkan persentase dari jumlah. Dari diagram di atas, kode aes(x-sign) merupakan pintasan untuk aes(x = sign, y = ..count..), dimana …count… adalah variabel khusus yang menggambarkan frekuensi tiap kategori. Ini juga dapat menghitung persentase, dengan menentukan variabel y secara eksplisit.
library(ggplot2) # Untuk memvisualisasikan
ggplot(Marriage,
aes(x = zodiacs,
y = ..count.. / sum(..count..))) +
geom_bar(fill = rainbow(12), color= "aquamarine3") + # Menerapkan warna
theme_minimal() + # menerapkan tema minimalis
# Mengganti lebel dan judul
labs(x = "Zodiak",
y = "Persen",
title = "Peserta Pernikahan dalam Persen") +
scale_y_continuous(labels = scales::percent) # Menambah simbol persen (%)Catatan: Dalam R, warna ditentukan dengan nama (misal col = "Light Blue") atau dengan triplet RGB heksadesimal (seperti col = "#0000FF"). Anda juga dapat menggunakan sistem warna lain seperti salah satunya diambil dari package RColorBrewer
Mengurutkan batang berdasarkan frekuensi sangat membantu. Kode di bawah ini menghitung frekuensi secara eksplisit. Kemudian fungsi **Reorder** digunakan untuk mengurutkan kategori berdasarkan frekuensinya. Opsi **stat="identity"** memberitahu fungsi plot untuk tidak menghitung jumlah, karena mereka diberikan secara langsung.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
plotdata <- Marriage %>% # Memuat dataset
count(zodiacs) # menghitung julmah peserta setiap `zodiak`
# gambar diagram batang dengan urutan meningkat
ggplot(plotdata,
aes(x = reorder(zodiacs, n),
y = n)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color= "#FFFFCC") +
theme_minimal() + # Menerapkan tema minimalis
labs(x = "Zodiak",
y = "Frekuensi",
title = "Sorting Categories")Untuk memberi label numerik di setiap batang, gunakan kode berikut:
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
plotdata <- Marriage %>%
count(zodiacs) %>%
mutate(pct = n / sum(n),
pctlabel = paste0(round(pct*100), "%"))
# Diagram batang dengan menampilkan persentase dan diurutkan secara menurun
ggplot(plotdata,
aes(x = reorder(zodiacs, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color = "azure4") +
geom_text(aes(label = pctlabel),
vjust = -0.25) +
theme_minimal() + # Menerapkan tema minimal
scale_y_continuous(labels = percent) +
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Zodiak Peserta Pernikahan")Terkadang, label kategori tumpang tindih, solusinya adalah memutar label sumbu dengan kode berikut:
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
# Diagram batang dengan menampilkan persentase dan diurutkan secara menurun
ggplot(plotdata,
aes(x = reorder(zodiacs, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = "#00FF00",
color = "#FF0000") +
geom_text(aes(label = pctlabel),
vjust = -0.25) +
scale_y_continuous(labels = percent) +
theme_minimal() +
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Zodiak Peserta Pernikahan")+
theme(axis.text.x = element_text(angle = 50, hjust = 1)) # mengatur derajat label kategori variabel xCara lain adalah dengan menangani situasi ini dengan membalik sumbu x dan y
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
# Diagram batang Persentase Zodiak Peserta Pernikahan dengan memutar sumbu x dengan sumbu y
ggplot(plotdata,
aes(x = reorder(zodiacs, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = "yellow",
color = "black") +
geom_text(aes(label = pctlabel),
hjust = -0.10) +
scale_y_continuous(labels = percent) +
theme_minimal() +
labs(x = "Zodiak",
y = "Persen",
title = "Persentase Zodiak Peserta Pernikahan")+
coord_flip() # Memutar sumbu x dengan sumbu yDiagram Lingkaran/Pie
Diagram lingkaran/pie bersifat kontroversial di statistik. Jika bertujuan untuk membandingkan frekuensi dari kategori, lebih baik menggunakan diagram batang. tetapi, jika bertujuan untuk membandingkan tiap kategori secara keseluruhan (misal, berapa porsi…), dan jumlah kategorinya kecil, diagram pie mungkin cocok untuk dipakai. Untuk membuat diagram pie dibutuhkan lebih banyak kode.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
plotdata <- Marriage %>%
count(race) %>%
arrange(desc(race)) %>%
mutate(prop = round(n*100/sum(n), 1),
lab.ypos = cumsum(prop) - 0.5*prop)
# Membuat Diagram Pie
mycols <- c("#008000","#00FF00","#800000","#FF0000")
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 Pernikahan Berdasarkan Ras")Selain menggunakan diagram pie, juga dapat menggunakan diagram donat yang terdapat lubang di dalamnya. Untuk membuat lubang pada diagram donat menggunakan kode x=2 dan xlim=c(0.5,2.5). Selain itu, argumen width dalam fungsi geom_bar() tidak diperlukan.
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
# 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 Pernikahan Berdasarkan Ras")Menambahkan label dan menghapus legend
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
# 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 Pernikahan Berdasarkan Ras")+
theme(legend.position = "FALSE")Peta Pohon
Alternatif untuk diagram lingkaran/pie adalah peta pohon atu tree map.Tree map dapat menangani variabel kategorikal yang memiliki banyak tingkatan.
library(ggplot2) # Untuk visualisasi
library(treemapify) # Visualisasi treemap
library(scales) # menentukan jeda atau label secara otomatis
plotdata<-Marriage%>%
count(officialTitle)
ggplot(plotdata,
aes(fill=officialTitle,
area=n))+
geom_treemap()+
labs(title = "Marriage Participants by Officiate")Menambahkan label variabel pada treemap, kode yang digunakan sebagai berikut.
ggplot(plotdata,
aes(fill=officialTitle,
area=n,
label=officialTitle))+
geom_treemap()+
geom_treemap_text(colour="black",
place = "centre")+
labs(title = "Marriage Participants by Officiate")+
theme(legend.position = "none")Variabel Kontinu (Numerik/kuantitatif)
Distribusi pada variabel kontinu tunggal bisanya diplot dengan menggunakan histogram, densitas kernel, atau menggunakan diagram titik.
Histogram
Dengan menggunakan data set Marriage, akan dibuat histogram usia dari peserta pernikahan.
library(ggplot2) # Untuk visualisasi
ggplot(Marriage, aes(x=age))+
geom_histogram(fill="yellow",
color="red",bins=20)+
theme_minimal()+
labs(title = "Peserta Pernikahan Berdasarkan Usia (Basic,menggunakan bin)",
x="Usia",
y="Frekuensi")Sebagian besar peserta pernikahan berusia 20-an tahun. Kemudian berusia 40-an dan yang paling sedikit berusia 60-an tahun. Warna histogram dapat diubah dengan menggunakan 2 opsi :
fill : warna isi untuk batang
color : warna batas /garis batang
cara lainnya adalah dengan menggunakan binwidth, lebar batang akan disesuaikan dengan frekuensi/nilai dari binwidth. Seperti pada diagram batang, sumbu y mewakili frekuensi/ persenan.
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
ggplot(Marriage,
aes(x = age,
y= ..count.. / sum(..count..))) +
geom_histogram(fill = "white",
color = "black",
binwidth = 5) + #Menerapkan bindwidth
theme_minimal() +
labs(title="Peserta Pernikahan Berdasarkan Usia (Menggunakan binwidth)",
y = "Persen",
x = "Usia") +
scale_y_continuous(labels = percent)Plot Densitas Kernel
Alternatif lain untuk memunculkan histogram yaitu plot densitas kernel. Secara teknis, plot densitas kernel adalah metode non parametik untuk memperkirakan dungsi densitas probabilitas dari variabel acak kontinu. Pada dasarnya untuk membuat histogram yang diperhalus, area di bawah kurfa harus sama dengan 1.
library(ggplot2) # Untuk visualisasi
ggplot(Marriage, aes(x=age))+
geom_density(fill="cyan")+
theme_minimal()+
labs(title = "Peserta Pernikahan Berdasarkan Usia",
x="Usia",
y="Density")Grafik menunjukan distribusi dari nilai. Contoh, perbandingan kasusu antara usia 20 tahun dan 40 tahun akan diwakili oleh area di bawah kurfa antara 20 dan 4 pada sumbu x. Gunakan kode fill untuk menerapkan warna isi, dan color untuk warna batas.
Parameter Penghalusan (Smoothing)
Tingkat kehalusan grafik dapat diatur oleh parameter bandwidth bw. Untuk menemukan nilai default variabel tertentu, dapat menggunakan fungsi bw.nrd0. Nilai yang lebih besar akan menghasilkan tingkat kehalusan lebih besar pula, sedangkan yang lebih kecil menghasilkan tingkat penghalusan yang lebih kecil pula.
library(ggplot2) # Untuk visualisasi
bw.nrd0 (Marriage$age) # Default bandwidth untuk variabel usia## [1] 5.181946
ggplot(Marriage, aes(x=age))+
geom_density(fill="darkblue",
bw=1)+
theme_minimal()+
labs(title="Peserta Pernikahan Berdasarkan Usia",
x="Usia",
y="Density",
subtitle="bandwidth = 1")Grafik ini memungkinkan dengan mudah melihat kategori yang paling sering dan ralatif jarang. Namun sulit untuk menjelaskan arti/mendefinisikan sumbu y.
Diagram Titik
Selain dengan plot density kernel, diagram titik merupakan alternatif lain untuk histogram. Pada diagram ini, tiap hasil analisis ditentukan oleh sebuah titik. Secara deafult, lebar dari sebuah titik sama dengan lebar bin, dan titik-titik tersebut bertumpukan dengan tiap titik mewakili satu pengamatan. Diagram titik lebih baik digunakan pada pengamata dalam jumlah yang kecil (kurang dari 150). Gunakan kode fill untuk menerapkan warna isi, dan color untuk warna batas.
library(ggplot2) # Untuk visualisasi
ggplot(Marriage, aes(x=age))+
# Mebuat grafik titik(dotplot)
geom_dotplot(fill="grey", # Menerapkan warna
color="black",
binwidth = 2) +
theme_minimal()+
labs(title = "Peserta Pernikahan Berdasarkan Usia", # Menambahkan Judul
y="Proportion",
x="Usia")Data Bivariant
Grafik bivariant merupakan grafik yang menunjukan hubungan antara 2 variabel. Jenis grafik tergantung pada tingkat pengukuran dari variabel (kategoris atau numerik).
Kategorikal vs Kategorikal
Diagram Batang Bertumpuk
Berikut merupakan contoh grafik hubungan antara kelas mobil dan jenis penggerak (roda depan, roda belakang, atau 4 roda) untuk mobil dalam data set Fuel economy.
library(ggplot2) # Untuk visualisasi
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")Diagram Bayang yang Dikelompokkan
Diagram batang yang dikelompokkan untuk variabel kategori kedua secara berdampingan. Untuk membuat plot batang yang dikelompokkan, gunakankode position="single". Perlu diperhatikan bahwa opsi ini hanya tersedia pada versi pengembangan terbaru ggplot2 tetapi akan segera tersedia secara umum.
library(ggplot2) # Untuk visualisasi
ggplot(mpg, aes(x=class,
fill=drv))+
theme_minimal()+
geom_bar(position=position_dodge(preserve="single"))Diagram Batang Tersegmentasi
Diagram batang yang tersegmentasi merupakan diagram yang bertumpuk, di mana tiap batang mewakili 100%. Untuk membuat diagram ini, dpat menggunakan kode position="filled". Diagram batang tersegmentasi sangat berguna jika bertujuan untuk memnadingkan perentasi dari kategori dalam satu variabel di tiap tingkat variabel lainnya. Contohnya, proporsi mobil dengan penggerak roda depan meningkat ketika memindahkan dari mobil penumpang yang kecil ke menengah, ke minivan.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
# Membuat data ringkasan dari dataset
plotdata <- mpg %>%
group_by(class, drv) %>%
dplyr::summarize(n = n()) %>%
mutate(pct = n/sum(n),
lbl = scales::percent(pct))
# Membuat diagram batang yang tersegmentasi
# Memberikan label pada tiap 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(name="GrandBudapest") +
theme_minimal() +
labs(y = "Persen",
fill = "Drive Train",
x = "Kelas",
title = "Penggerak Mobil berdasarkan Kelas") +
theme_minimal()Catatan : Gunakan opsi tambahan di bawah ini untuk meningkatkan pewarnaan dan pelabelan pada diagram.
factor Mengubah/mengatur urutan kategori untuk kelas variabel serta labels untuk variabel drive
scale_y_continuous Mengubah label tanda centang pada sumbu y
labs Mengubah/menambahkan judul dan label pada sumbu x dan y serta legenda
scale_fill_brewer Mengubah skema warna isian
theme_minimal Menghapus latar belakang abu-abu dan mengubah warna kisi
Plot Mosaik
Diagram ini dapat menampilkan hubungan antara variable kategoris dengan menggunakan persegi panjang yang luasnya mewakili proporsi kejadian untuk kombinasi level tertentu. Warna pada ubin juga dapat menunjukkan tingkat hubungan antar variabel. Meskipun diagram mozaik dapat dibuat dengan fungsi ggplot2 dengan package ggmosaic, lebih baik menggunakan package vcd sebagai gantinya. Meski tidak akan membuat grafik, package tersebut akan memberikan pendekatan yang lebih komprehenif untuk memvisualisasikan data kategorikal. Berikut contoh memvisualisasikan hubungan anatara variabel kategorikal kelas dan jenis kelamin dalam survival dengan menggunakan diagram mozaik .
# Membuat tabel
tbl<-xtabs(Freq~Survived+Class+Sex,Titanic)
ftable(tbl)## 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
# Membuat diagram mozaik
library(vcd)
mosaic(tbl, main = "Titanic Data")Ukuran persegi sebanding dengan presentase khusus dalam kombinasi tingkat tersebut. Lebih banyak penumpang yang tewas daripada yang selamat. Berdasarkan grafik tersebut, penumpang laki-laki kelas 3 dan crew laki-laki yang paling banyak tidak selamat.
Jika kita mengasumsikan bahwa ketiga variabel ini tidak bergantung, kita dapat memeriksa residual dari model dan memberi bayangan pada ubin agar sesuai. Pada grafik di bawah, warna biru mewakilkan lebih banyak kasus dari yang diharapkan tidak terikat. Warna merah mewakili lebih sedikit asus dari yang diharapkan jika berlaku tidak terikat.
mosaic(tbl,
shade = TRUE,
legend=TRUE,
labeling_args = list(set_varnames = c(Sex = "Gender",
Survived = "Survived",
Class = "Passenger Class")),
set_labels = list(Survived=c("No","Yes"),
Class=c("1st","2nd","3rd","Crew"),
Sex=c("F","M")),
main="Titanic Data")Dapat dilihat bahwa jika class, gender, dan survival tidak terikat. Lebih banyak crew laki-laki yang tidak selamat, dan perempuan pada kelas 1,2, dan 3 lebih banyak yang selamat. Dan Penumpang kelas 1 yang tidak selamat jauh lebih sedikit.
Kontinu vs. Kontinu
Hubungan antar 2 variabel kuantitatif biasanya ditampilkan menggunakan plot sebaran dan grafik garis.
Plot sebaran (Scatterplot)
Plot sebaran ini dibuat untuk mempelajari hubungan antar 2 variabel dan sering disertai dengan perhitungan koefisien korelasi yang biasanya mencoba untuk mengukur hubungan linier. Namun jenis hubungan lain dapat dideteksi dengan menggunakan plot sebaran, dan yang perlu dilakukan adalah menyesuaikan model yang menjelaskan Y dalam fungsi X. Terlebih dahulu instal package hrbrthemes. Berikut ini contoh penggunaan plot sebaran.
library(ggplot2)
# Untuk visualisasi
library(hrbrthemes) # untuk `theme_ipsum()` dan legend
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="yellow", alpha=0.8) +
theme_ipsum() +
facet_wrap(~name, scale="free")Cara yang paling mudah untuk menampilkan 2 variabel kuantitatif adalah scatterplot atau plot sebaran dengan tiap variabel diwakilkanoleh sumbu . Sebagai contoh, dengan menggunakan dataset Gaji untuk membuat plot sebaran dengan menampilkan variabel pengalaman (yrs.since.phd) vs gaji akademik (salary) dari Profesor perguruan tinggi. Install package carData terlebih dahulu.
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
data(Salaries, package = "carData")
# Peningkatan plot sebaran
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color="#92C5DE",
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")Notes: opsi geom_point bisa digunakan untuk mengubah
color : Mengubah warna titik
size : Mengubah ukuran titik
shape : Membuat bentuk titik
alpha : Mengatur transparansi titik. Jarak transparansi mulai dari 0 (transparan) sampai 1 (buram) yang berguna ketika beberapa titik tumpang tindih.
Fungsi scale_x_continuous dan scale_y_continuous berfungsi untuk mengontrol penskalaan masing-masing pada sumbu x dan y. Kita dapat menggunakan opsi dan fungsi ini untuk membuat scatterplot yang lebih menarik.
Plot Sebaran Menyesuaikan Garis (Scatterplot Fit Lines)
Seringkali berguna untuk meringkas hubungan yang ditampilkan pada plot sebaran dengan menyesuaikan garis. Banyak jenis garis yang didukung misal, linear, polinomial, dan nonparametrik(loess). Secara deafult, garis ini ditampilkan dengan batas kepercayaan 95%.
library(ggplot2) # Untuk visualisasi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "red") + # Menerapkan warna titik
geom_smooth(method = "lm", color = "pink")+ # Menerapkan warna pada garis
theme_minimal() +
labs(x = "Years Since PhD",
y = "",
title = "Pengalaman vs Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Berdasarkan grafik di atas, gaji akan meningkat sesuai dengan pengalaman, namun ada penurunan di bagian ujung kanan-profesor dengan pengalaman signifikan, mendapatkan gaji yang lebih rendah. Garis lurus tidak menangkap efek non-linier ini, garis dengan lengkungan akan lebih pas
Garis regresi polinomial akan menampilkan garis yang pas dengan bentuknya. \[y=β_0+β_1x+β_2x^2+⋯+β_nx^2\]
Biasanya digunakan garis kuadrat (\(^2\)) (satu lengkungan), atau kubik (\(^3\)) (dua lengkungan). Penggunaan polinomial orde tinggi (\(>3\)) jarang diperlukan. Menerapkan kesesuaian kuadrat data ke data Gaji menghasilkan scatterplot sebagai berikut.
library(ggplot2) # Untuk visualisasi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "#cc3399") + # Menerapkan warna titik
geom_smooth(method = "lm",
formula = y ~ poly(x, 2),
color = "#ccffff")+ # Menerapkan warna pada garis
theme_minimal() +
labs(x = "Years Since PhD",
y = "",
title = "Pengalaman vs Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Setelah garis diperhalus scatterplot menampilkan gambar yang lebih jelas dan mudah dipahami. Default di ggplot2 adalah garis loess yang memperhalus scatterplot scara lokal.
library(ggplot2) # Untuk visualisasi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color="black",
size = 2,
alpha = 1) +
geom_smooth(size = 1,
color = "magenta") +
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 = "Years Since PhD",
y = "",
title = "Pengalaman vs Gaji",
subtitle = "Gaji 9 bulan untuk 2008-2009")Kategorikal vs Kontinu
Ketika memplot hubungan antar variabel kategorikal dengan kuantitatif , tersedia banyak jenis grafik yang dapat digunakan misal, diagram batang dengan summary statistik, plot densitas kernel, box plot, violin plot, mean/sem plot, ridgeline plot, dan cleveland plot.
Diagram Batang (Ringkasan Statistik)
Pada bagian-bagian sebelumnya, diagram batang digunakan untuk menampilkan jumlah variabel bardasarkan kategori untuk variabel tunggal atau 2 variabel. Diagram batang juga dapat digunakan untuk menampilkan ringkasan statistik seperti mean dan median pada variabel kuantitatif untuk tiap tingkatan dari variabel kategorikal.
Berikut merupakan contoh diagram batang yang menunjukan mean dari gaji profesor universitas berdasarkan jabatan akademik.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
data(Salaries, package="carData")
# hitung rata-rata untuk setiap Jabatan
plotdata <- Salaries %>%
group_by(rank) %>%
dplyr::summarize(mean_salary = mean(salary))
# Membuat plot mean gaji dengan cara yg lebih menarik
mycols <- c("#009999", "#0000FF", "#FDDBC7")
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 Jabatan",
subtitle = "9 bulan gaji akademik untuk 2008-2009",
x = "Jabatan",
y = "Gaji")Plot Densitas Kernel yang Dikelompokkan
Membandingkan data kelompok pada variabel numerik/kuantitatif dapat menggunakan plot densitas kernel dalam satu grafik. Berikut contoh distribusi gaji berdasarkan jabatan dengan plot densitas kernel.
ggplot(Salaries,
aes(x = salary,
fill = rank)) +
geom_density(alpha = 0.4) +
theme_minimal() +
labs(title = "Distribusi Gaji Berdasarkan Jabatan",
x = "Gaji",
y = "")Opsi alpha membuat plot/grafik menjadi sebagian transparan sehingga dapat dilihat dengan jelas bagian yang tumpang tindih. Pada grafik tersebut dijelaskan bahwa, secara umum grafik akan meningkat sesuai dengan jabatan. Namun, kisaran gaji full profesor sangat luas.
Boxplot
Boxplot mempilkan presentil ke-25, median, dan presentil ke-75 dari distribusi. Garis vertikal menangkap sekitar 99% dari distribusi normal, dan pengamatan di luar kisaran ini diplot sebagai titik yang mewakili outlier (Perhatikan gambar di bawah).
plot kotak sangat berguna untuk membandingkan suatu kelompok (tingkatan variabel kategori) pada variabel numerik. Plot kotak bertakik memberikan metode perkiraan untuk visualisasi apakah kelompok berbeda. Meskipun bukan sebuah tes formal, jika takik dari kedua plot kotak tidak tumpang tindih, 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("lightgreen", "cyan", "red"),
alpha = .7) +
theme_minimal() +
labs(title = "Distribusi Gaji Berdasarkan Jabatan",
x = "Jabatan",
y = "Gaji")Pada contoh di atas, 3 kelompok muncul pada posisi yang berbeda. Salah satu keuntungan dari boxpolt adalah lebar bentuk yang tidak biasanya memiliki arti. Hal ini dapat membandingkan distribusi dari banyak kelompok pada satu grafik. Jika dilihat pada boxplot bagian profesor memiliki ukuran yang cukup lebar, hal tersebut menujukan kemungkinan terdapat outlier di dalamnya.
Violin Plot
Violin plot mirip dengan plot densitas kernel tetapi pada violin plot, grafik dicerminkan dan diputar \(90^∘\). Berikut visualisasi violin plot dari distribusi gaji berdasarkan jabatan.
ggplot(Salaries, aes(x = rank,
y = salary)) +
geom_violin(fill = "azure1") +
geom_boxplot(width = .2,
fill = c("#F4A582", "#FDDBC7", "#D1E5F0"),
outlier.color = "skyblue",
outlier.size = 2) +
theme_minimal() +
labs(title = "Distribusi Gaji Berdasarkan Jabatan")Ridgeline Plot
Plot ini juga dikenal dengan joy plot yang manampilkan distribusi variabel kuantitatif untuk beberapa kelompok. Ridgeline mirip dengan polt densitas kernel dari segi faceting vertikal tetapi memakai lebih sedikit ruang. Untuk membuat ridgeline perlu untuk menginstall package ggridges. Berikut contoh ridgeline plot dengan menggunakan dataset fuel economy. Plot mil perjalanan kota pergalon dengan kelas mobil.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
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") Perhatikan kemungkinan tumpang tindih distribusi adalah lebih kepada grafik mobil compact. UNtuk mengubah transparansi grafik dapat menggunakan kod `geom_density_ridges (alpha=n), n berkisar 0-1.
Line Plot
Metode populer untuk membandingkan kelompok pada variabel numerik adalah plot rata-rata dengan error bar. Error bar dapat mewakilkan standar devasi, standar error dari mean, atau interval kepercayaan. Contoh pada bagian ini yaitu, memplot mean dan standar error. Dapat digunakan teknik yang sama untuk membandingkan gaji berdasarkan jabatan dan jenis kelamin.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
library(ggridges) # untuk menangani visualisasi yang bersamaan
# Menghitung mean, standar deviasi, standar error, dan 95% interval kepercayaan berdasarkn jabatan
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 Berdasarkan Jabatan dan Jenis Kelamin",
subtitle = "(mean +/- standar error)",
x = "",
y = "",
color = "Jenis Kelamin")Jitter Plot
Hubungan antara variabel kategorikal dan variabel numerik dapat ditampilkan dengan plot sebaran(scatterplot). Contoh, plot distribusi gaji berdasarkan jabatan dengan menggunakan jitter plot yaitu scatterplot satu dimensi. Sayangnya, pencetakan titik yang berlebihan membuat interpretasinya menjadi sulit. HUbungannya menjadi lebih mudah dilihat jika titik-titiknya goyah. Pada dasarnya, bilangan kecil acak ditambahkan ke setiap koordinat y. akan lebih mudah untuk membandingkan dengan menambahkan/menerapkan warna.
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
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 Jabatan",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "Gaji",
y = "Jabatan") +
theme_minimal() +
theme(legend.position = "none") Opsi
(legend.position = "none") digunakan untuk menyembunyikan legend ( hal yang tidak diperlukan. Jitter plot berkerja dengan baik jika jumlah dari titik-titik tidak terlalu besar).
Menggabungkan Jitter Plot dan Boxplot
Mungkin akan lebih mudah memvisualisasikan distribusi jika kita menambahkan boxplot ke jitter plot. Beberapa opsi telah ditambahkan untuk membuat jitter plot.
- Untuk boxplot:
size = 1 : untuk ketebalan garis
outlier.color = "black" : membuat outlier berwarna hitam
outlier.shape = 2 : Bentuk outlier
outlier.size = 3 : menambah ukuran outlier
- Untuk jitter plot:
alpha = 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 Jabtan",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none") +
coord_flip()Perhatikan fungsi geom_boxjitter yang tersedia dalam pacakage ggpol. Fungsi tersebut dapat membuat boxplot hibrida, boxplot setengah, dan scatterplot 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 = "#9966FF",
errorbar.draw = TRUE) +
scale_y_continuous(label = dollar) +
labs(title = "Gaji Akademik Berdasarkan Jabatan",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Beeswarm Plot (Plot Kawanan Lebah)
Plot ini juga disebut dengan violin plot dan mirip dengan jitter plot, di mana plot tersebut menampilkan distribusi dari variabel kuantitatif dengan memplot titik-titik dengan cara mengurangi tumpang tindih. Selain itu, membantu menampilkan densitas dari data di tiap titk dengan cara yang mirip dengan violin plot. Terlebih dahulu install package ggbeeswarm.
library(ggplot2) # Untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
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 Jabatan",
subtitle = "Gaji 9 bulan untuk 2008-2009",
x = "Jabatan",
y = "Gaji") +
theme_minimal() +
theme(legend.position = "none")Beeswarm Plot dibuat dengan fungsi geom_quasirandom. Beeswarm plot lebih mudah dipahami daripada jitter plot sederhana.
DIagram Titik Cleveland
DIagram ini berguna untuk membandingkan statistik numerik dalam kelompok besar. Misal membandingkan angka harapan hidup pada tahun 2007 di negara Asia dengan menggunakan data set gapminder. Instal package gapminder terlebih dahulu.
library(dplyr) # Untuk manipulasi data
library(ggplot2) # Untuk visualisasi
library(scales) # Menentukan jeda atau label secara otomatis
library(ggbeeswarm) # Mengurangi tumpang tindih pada grafik
library(gapminder) # Untuk dataset `gapminder`
data(gapminder, package="gapminder") # memuat dataset `gapminder`
# subset negara-negara di Asia 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 = "#9966ff") +
labs (x = "Harapan Hidup (tahun)",
y = "",
title = "Harapan Hidup Berdasarkan Negara",
subtitle = "GapMinder data for Asia - 2007") +
theme_minimal() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())Berdasarkan grafik di atas, Jepang memiliki angka harapan hidup yang paling tinggi, sedangkan Afghanistan memiliki angka harapan hidup paling rendah.
Data Multivariant
Grafik multivariant menampilkan hubungan antara tiga variabel atau lebih. Terdapat dua metode umum untuk menampung variabel, yaitu pengelompokan dan faceting.
Pengelompokan
Pada metode ini, nilai dua variabel pertama dipetakkan pada sumbu x dan y kemudian variabel tambahan dipetakkan pada karakteristik visual lainnya, seperti warna, bentuk, ukuran, garis, dan transparansi. Pengelompokan memungkinkan untuk memplot data beberapa grup dalam satu grafik. Dengan menggunakan data set Salaries, berikut hubungan antara yrs.since.phd dan salary.
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",
y = "Gaji",
color = "Jabatan") Kemudian, tambahkan jenis kelamin dengan menggunakan bentuk titik. Tingkatkan ukuran titik dan tambahkan tingkat transparansi untuk memperjelas grafik.
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 Jabatan, Jenis Kelamin, dan Tahun Sejak Gelar",
y = "Gaji",
color = "Jabatan",
shape = "Jenis Kelamin")Grafik di atas tampak sangat ribet dan mungkin sulit untuk membedakan jenis kelamin. Faceting mungkin menjadi solusi 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.
Berikut ini merupakan contoh yang lebih jelas. Contoh grafik yang menggambarkan hubungan antara Tahun sejak Ph.D. dan gaji dimana ukuran setiap titik bergantung dengan lamanya masa kerja. Ini disebut dengan bubble plot.
library(carData) # untuk dataset
library(ggplot2) # Untuk visualisasi
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 Jabatan, Tahun Pelayanan, Tahun Sejak Gelar",
y = "Gaji",
color = "Jabatan",
size = "Tahun Pelayanan") Sangat jelas bahwa ada hubungan positif yang kuat antara tahun-tahun sejak Ph.D dan tahun layanan. tidak ditemukan batasan waktu yang sama antara Associate dan Full Professor. Bubble plot akan dijelaskan lebih detail di bab selanjutnya.
Sebagai contoh terakhir, gunakan variabel yrs.since.phd vs salary 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 = "Set2") +
theme_minimal() ## Faceting
Pengelompokan memungkinkan 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. Berikut contoh faceting.
ggplot(Salaries, aes(x = salary)) +
geom_histogram(fill = "#caef66",
color = "black") +
facet_wrap(~rank, ncol = 1) +
theme_minimal() +
labs(title = "Gaji Berdasarkan Jabatan",
x = "Gaji",
y = "")Fungsi facet_wrap membuat grafik menjadi terpisah untuk tiap jabatan. Opsi ncol berfungsi untuk mengatur jumlah kolom. Contoh berikutnya menggunakan 2 variabel untuk mendefinisikan faset. Fungsi menetapkan jenis kelamin ke baris dan jabatan ke kolom, membuat matriks 6 plot dalam satu grafik.
ggplot(Salaries, aes(x = salary / 1000)) +
geom_histogram(color = "black",
fill = "#ff96ae") +
facet_grid(sex ~ rank) +
theme_minimal() +
labs(title = "Diagram dari Gaji Berdasarkan Jenis Kelamin dan Jabatan",
x = "Gaji ($1000)",
y = "")Juga dapat dibuat kombinasi pengelompokan dan faceting. Gunakan plot mean/SE dan faceting untuk membandingkan gaji profesor wanita dengan pria, dalam pangkat dan kedisiplinan. Terapkan warna untuk membedakan jenis kelamin dan faceting untuk membuat plot jabatan berdasarkan kombinasi kedisiplinan.
# Menghitung mean and standar error jenis kelamin, jabatan, and kedisiplinan
plotdata <- Salaries %>%
group_by(sex, rank, discipline) %>%
dplyr::summarize(n = n(),
mean = mean(salary),
sd = sd(salary),
se = sd / sqrt(n))
# Menambahkan 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,Kedisiplinan, dan Jabatan",
subtitle = "(Means and standar error)") +
scale_color_brewer(palette="Set3")Pernyatan facet_grid(. ~ rank + discipline)tidak menentukan variabel baris (.) dan kolom ditentukan oleh kombinasi jabatan 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.
Awalnya, 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).
Sebagai contoh terakhir, berikut contoh memplot data perubahan angka harapan hidup dari wkatu ke waktu di ngera Asia. Setiap negara muncul dalam facetnya sendiri. Fungsi theme dipakai untuk menyederhanakan warna latar belakang, memutar teks sumbu x, dan memperkecil ukuran tulisan.
#Memplot angka harapan hidup berdasarkan tahun secara terpisah, untuk tiap negara di Asia
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="#efdcaa") +
facet_wrap(~country) +
theme_minimal(base_size = 9) +
theme(axis.text.x = element_text(angle = 45,
hjust = 1)) +
labs(title = "Perubahan dalam Harapan Hidup",
x = "Tahun",
y = "Harapan Hidup")