Algoritma & Struktur Data
~ Visualisasi Data dengan R ~
| Kontak | : \(\downarrow\) |
| noviaalbl02@gmail.com | |
| https://www.instagram.com/novia_labola/ | |
| RPubs | https://rpubs.com/noviaanita/ |
Pendahuluan
Visualisasi data merupakan sebuah teknik untuk mengambil informasi dari sebuah data ke dalam konteks visual, contohnya seperti bagan, grafik, dan peta. Visualisasi data dapat membuat sebuah data besar dan data kecil lebih mudah dipahami oleh otak manusia, visualisasi dapat lebih diandalkaan untuk mendeteksi pola, tren, dan outlier dalam kelompok data.
R adalah suatu software yang kaya fitur akan proses membaca, melakukan kalkulasi, melakukan analisa dan visualisasi data. Sebagai contoh, kita bisa membaca data Excel, menggabungkan dengan data dari file tipe lain dan membuat visualisasi dalam bentuk histogram. Pada materi kali ini akan dibahas mengenai ragam visualisasi data yang paling populer dalam data science, dari yang paling sederhana hingga grafik siap untuk publikasi. Tetapi secara spesifik akan fokus pada teknik visualisasi data Univariat, Bivariat, dan Multivariat.
Univariat (Satu Variabel)
Visualisasi data univariat dapat digunakan untuk melakukan distrubusi suatu data dalam satu variabel. Variabel tersebut di bagi menjadi dua bagian yaitu :
• Kategoris, contohnya seperti : jenis kelamin, ras, negara, kota, dll.
• Numerik, contohnya seperti : usia, berat badan, inflasi, suku bunga, dll.
Variabel Kategori
Distribusi dalam variabel kategori tunggal biasanya diplot dengan diagram batang, diagram lingkaran, atau diagram pohon (akan tetapi hal ini sangat jarang sekali).
Diagram Batang
Berikut ini merupakan contoh yang memperlihatkan frekuensi dari dataset Marriage, ini terdapat di package mosaicData. Kita menggunakan diagram batang untuk menampilkan distribusi peserta pernikahan berdasarkan zodiak.
library(ggplot2)
#setwd("c:/Users/Algoritma/Desktop/")
Marriage<- read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv")
ggplot(Marriage, aes(x = zodiacs)) +
geom_bar(fill = "cornflowerblue",
color= "azure4") +
theme_minimal() +
labs(x = "zodiacs",
y = "frequency",
title = "Marriage Participants by Zodiacs") Batang pada diagram diatas menggambarkan persentase dari jumlah. Untuk diagram batang (zodiak), kode aes(x=sign) ini ialah jaan pintas untuk aes(x = sign, y = ..count..), dimana ..count.. merupakan variabel khusus yang dapat menggambarkan frekuensi dari berbagai kategori. Dibawah ini dapat anda gunakan untuk menghitung persentase dengan menentukan variabel y secara eksplisit.
library(ggplot2)
ggplot(Marriage,
aes(x = zodiacs,
y = ..count../ sum(..count..))) +
geom_bar(fill = rainbow(12), color = "azure4") +
theme_minimal() +
labs(x = "Zodiacs",
y = "Percent",
title = "Marriage Participants in Percent") +
scale_y_continuous(labels = scales::percent)Diagram batang biasanya di urutkan berdasarkan frekuensi dan hal ini sering kali membantu. Pada kode di bawah ini frekuensi dihitung secara eksplisit. Fungsi reoder biasanya dipakai untuk mengurutkan kategori berdasarkan frekuensinya. Opsi stat="identity digunakan untuk memberitahukan fungsi plot agar tidak menghitung jumlah, dikarenakan mereka diberikan secara langsung.
library(dplyr)##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
plotdata <- Marriage %>%
count(zodiacs)
# menyusun plot diagram batang secara meningkat
ggplot(plotdata,
aes(x = reorder(zodiacs, n),
y = n)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color= "azure4") +
theme_minimal() +
labs(x = "Zodiacs",
y = "Frequency",
title = "Sorting Categories")Kode berikut ini digunakan jika ingin memberi label pada setiap diagram batang.
library(dplyr)
library(ggplot2)
library(scales)
plotdata <- Marriage %>%
count(zodiacs) %>%
mutate(pct = n / sum(n),
pctlabel = paste0(round(pct*100), "%"))
# plot diagram batang sebagai persentase dalam urutan menurun dengan label batang
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() +
scale_y_continuous(labels = percent) +
labs(x = "Zodiacs",
y = "Percent",
title = "Labeling Bars")Jika label kategori kemungkinan tumpang tindih, hal ini tentu saja sangat mengganggu. Jadi, kita dapat memutar label sumbu.
library(ggplot2)
library(scales)
# plot diagram batang sebagai persentase dalam urutan menurun dengan label batang
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() +
scale_y_continuous(labels = percent) +
labs(x = "Zodiacs",
y = "Percent",
title = "Overlapping Labels") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Cara selanjutnya, kita dapat menangani situasi ini dengan membalik sumbu x dan y.
library(ggplot2)
library(scales)
# plot diagram batang sebagai persentase dalam urutan menurun dengan label batang
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() +
scale_y_continuous(labels = percent) +
labs(x = "Zodiacs",
y = "Percent",
title = "Overlapping Labels") +
coord_flip()Diagram Pai
Diagram lingkaran atau pie charts adalah representasi nilai sebagai irisan lingkaran dengan warna berbeda. Irisan diberi label dan nomor yang sesuai dengan setiap irisan juga ditunjukkan dalam bagan. Singkatnya, pie charts adalah tampilan grafik yang berbentuk lingkaran dari data Dibawah ini merupakan contoh membuat diagram pai yang sederhana dengan ggplot2.
library(dplyr)
library(ggplot2)
library(scales)
# Persiapan data
plotdata <- Marriage %>%
count(race) %>%
arrange(desc(race)) %>%
mutate(prop = round(n*100/sum(n), 1),
lab.ypos = cumsum(prop) - 0.5*prop)
# Membuat diagram pai
mycols <- c("#0073C2FF", "#EFC000FF", "#868686FF", "#CD534CFF")
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 = "white") +
scale_fill_manual(values = mycols) +
theme_void() +
labs(title = "Marriage Participants by Race")Diagram donat ialah diagram pai sederhana yang terdapat lubang di tengahnya. Perbedaan yang terdapat antara kode diagram pai ialah menetapkan : x = 2 dan xlim = c(0.5, 2.5 untuk membuat lubang dalam diagram pai. Selain hal itu, argumen width dalam fungsi geom_bar() tidak diperlukan lagi.
library(ggplot2)
library(scales)
# 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 = "white") +
scale_fill_manual(values = mycols) +
theme_void() +
xlim(0.5, 2.5) +
labs(title = "Marriage Participants by Race")Sekarang mari berkreasi serta menambahkan label, sementara menghapus legend.
library(ggplot2)
library(scales)
# Menambahkan label persen
plotdata$percent <- paste0(plotdata$race, "\n",
round(plotdata$prop), "%")
# Membuat diagram donat dalam bentuk 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 = "white") +
scale_fill_manual(values = mycols) +
theme_void() +
xlim(0.5, 2.5) +
labs(title = "Marriage Participants by Race")Peta Pohon
Ini merupakan sebuah alternatif untuk diagram pai adalah peta pohon. Berbeda hal dengan diagram pai, peta pohon mampu menangani variabel kategori yang memiliki banyak tingkatan.
library(ggplot2)
library(treemapify)
library(scales)
plotdata <- Marriage %>%
count(officialTitle)
ggplot(plotdata,
aes(fill = officialTitle,
area = n)) +
geom_treemap() +
labs(title = "Marriage Participants by Officiate")Selanjutnya, ini merupakan versi yang lebih berguna dengan label.
ggplot(plotdata,
aes(fill = officialTitle,
area = n,
label = officialTitle)) +
geom_treemap() +
geom_treemap_text(color = "white",
place = "centre") +
labs(title = "Marriage Participants by Officiate") +
theme(legend.position = "none")Variabel Kontinu
Distribusi pada variabel kuantitatif tunggal hal ini biasanya diplot dengan histogram, plot densitas kernel atau plot titik.
Histogram
Menggunakan dataset Marriage, contohnya anda bisa mencoba memplot usia dari peserta pernikahan berikut ini :
library(ggplot2)
ggplot(Marriage, aes(x = age)) +
geom_histogram(fill = "cornflowerblue",
color = "white",bins = 20) +
theme_minimal() +
labs(title = "Marriage Participants by age (Basic)",
x = "Age")Peserta terlihat ada yang berusia 20-an tahun dengan kelompok lain berusia 40-an tahun, serta kelompok yag lebih kecil berusia 60-an dan 70-an. Hal ini akan menjadi distribusi multimodal. Warna histogram tersebut dapat diganti dengan dua opsi :
• fill – warna isi untuk batang
• color – warna batas di sekitar batang
Selain cara diatas anda dapat menggunakan binwidth, lebar nampan yang diwakili oleh batang.
Seperti halnya diagram batang, sumbu y dapat mewakili jumlah atau persen dari total.
library(ggplot2)
library(scales)
ggplot(Marriage,
aes(x = age,
y = ..count.. / sum(..count..))) +
geom_histogram(fill = "cornflowerblue",
color = "white",
binwidth = 5) +
theme_minimal() +
labs(title = "Marriage Participants by age (Alternative Bins and bandwidths)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)Plot Densitas Kernel
Ini merupakan alternatif dalam histogram ialah plot densitas kernel. Akan tetapi, perkiraan densitas kernel secara teknis ialah metode non-parametrik untuk memperkirakan fungsi densitas probabilitas dari variabel acak kontinu.
library(ggplot2)
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "indianred3") +
theme_minimal() +
labs(title = "Marriage Participants by age")Grafik tersebut menunjukkan distribusi dari nilai. Sebagai contoh, pada perbandingan kasus antara 20 dan 40 tahun akan diwakili oleh area dibawah kurva antara 20 dan 40 pada sumbu x. Sama seperti diagram sebelumnya, fill dan color juga dapat digunakan untuk menentukan warna isian dan batasannya.
Parameter Penghalusan (Smoothing)
Tingkat kehalusan dikontrol oleh parameter bandwith bw. Untuk mendapatkan nilai default pada variabel tertentu, dapat mennggunakan fungsi bw.nrd0. Dalam hal ini, nilai yang lebih besar dapat menghasilkan penghalusan yang lebih banyak, sementara itu nilai yang lebih kecil akan menghasilkan penghalusan yang kebih sedikit.
library(ggplot2)
bw.nrd0(Marriage$age)## [1] 5.181946
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "deepskyblue",
bw = 1) +
theme_minimal() +
labs(title = "Participants by age",
subtitle = "bandwith = 1")Pada plot densitas kernel hal tersebut menungkinkan kita untuk dengan mudah melihat skor mana yang paling sering dan mana yang relatif jarang. Akan tetapi, sulit untuk menjelaskan arti sumbu y kepada seorang non-ahli statistik.
Diagram Titik
Alternatif lain untuk histogram ialah diagram titik. Variabel kuantitatif dibagi menjadi beberapa kelompok, namun tidak berbentuk batang, setiap pengamatan ditentukan oleh sebuah titik. Secara default, lebar dari sebuah titik sama dengan lebar bin, dan titik-titik bertumpuk, dengan setiap titik mewakili satu pengamatan. Hal ini akan bekerja dengan baik jika jumlah pengamatan kecil(kurang dari 150). Opsi fill dan color bisa digunakan untuk menentukan warna isian dan batasan masing-masing titik.
library(ggplot2)
ggplot(Marriage, aes(x = age)) +
geom_dotplot(fill = "gold",
color = "azure4",
binwidth = 2) +
theme_minimal() +
labs(title = "Participants by age",
y = "Proportion",
x = "Age")Data Bivariat
Analisis bivariat merupakan analisis yang dilakukan untuk mengetahui hubungan antara 2 variabel. Untuk jenis grafiknya nanti akan tergantung pada tingkat pengukuran dari variabel (kategorikan atau kuantitatif).
Kategorikal vs. Kategorikal
Diagram Batang Bertumpuk
Plot hubungan antara kelas mobil dan jenis penggerak (roda depan, roda belakang, atau penggerak 4 roda) untuk mobil dalam dataset Fuel economy.
library(ggplot2)
mpg$drv <- factor(mpg$drv,
levels = c("f", "r", "4"),
labels = c("front-wheel", "rear-wheel", "4-wheel"))
# Diagram batang bertumpuk
ggplot(mpg,
aes(x = class,
fill = drv)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(y = "Proportion")Diagram Batang yang Dikelompokkan
Tempat diagram batang yang dikelompokkan untuk variabel kategori kedua secara berdampingan. Opsi position = “single” digunakan untuk membuat plot batang yang dikelompokkan. Opsi ini hanya tersedia pada versi pengembangan terbaru ggplot2, akan tetapi akan segera tersedia secara umum.
library(ggplot2)
ggplot(mpg, aes(x = class, fill = drv)) +
theme_minimal() +
geom_bar(position = position_dodge(preserve = "single"))Diagram Batang Tersegmentasi
Plot batang yang tersegmentasi adalah plot batang yang bertumpuk dimana setiap batang dapat mewakili 100%. Diagram batang tersegmentasi dapat dibuat menggunakan opsi position = “filled”. Plot semacam ini sangat berharga dengan asumsi bahwa tujuannya adalah untuk melihat tingkat klasifikasi dalam satu variabel di setiap tingkat variabel lain. Misalnya, sebuah mobil dengan penggerak roda depan (front-wheel) meningkat saat akan memindahkan dari mobil penumpang yang kecil, ke menengah, dan ke minivan.
library(dplyr)
library(ggplot2)
library(scales)
# Membuat ringkasan dataset (manipulasi data)
plotdata <- mpg %>%
group_by(class, drv) %>%
dplyr::summarize(n = n()) %>%
mutate(pct = n/sum(n),
lbl = scales::percent(pct))## `summarise()` has grouped output by 'class'. You can override using the `.groups` argument.
# Membuat diagram batang tersegmentasi
# Menambahkan label untuk 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 = "Percent",
fill = "Drive Train",
x = "Class",
title = "Automobile Drive by Class") +
theme_minimal()Catatan : gunakan opsi tambahan untuk meningkatkan warna dan pelabelan. Dalam grafik dibawah ini :
• factor mengubah urutan dari kategori untuk variabel kelas dan urutan serta labels untuk variabel drive.
• scale_y_continuous mengubah label tanda centang sumbu y.
• labs menyediakan judul dan mengubah label untuk sumbu x dan y serta legend.
• scale_fill_brewer mengubah skema warna isian.
• theme_minimal menghapus latar belakang abu-abu dan mengubah warna kisi.
Plot Mosaik
Diagram mosaik dapat memperlihatkan suatu hubungan antara variabel kategorikal dengan menggunakan persegi panjang yang luasnya mewakili proporsi kejadian untuk kombinasi level tertentu. Warna ubinnya dapat menunjukkan tingkat hubungan antar variabel.
Walaupun plot mosaik dapat dibuat dengan ggplot2 menggunakan ggmosaic, anda juga dapat menggunakan package vcd sebagi gantinya. Maskipun tidak akan membuat grafik ggplot2, package tersebut dapat memberikan pendekatan yang lebih komprehensif untuk memvisualisasikan suatu data kategorikal.
# 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 plot mosaik dari tabel
library(vcd)## Loading required package: grid
mosaic(tbl, main = "Titanic data")Perbandingan ukuran ubin dengan persentase kasus dalam kombinasi tingkat tersebut. Maka, jelas lebih banyak penumpang yang meniggal daripada yang selamat. Dan mereka yang meniggal merupakan penumpang laki-laki kelas 3 dan kru laki-laki(kelompok yang terbesar).
Dapat kita asumsikan bahwa ketiga variabel ini tidak bergantung, jadi kita bisa memeriksa residual dari model dan memberi sebuah bayangan pada ubin agar sesuai. Nah, pada grafik dibawah ini, biru gelap mewakilkan lebih banyak kasus dari yang diharapkan tidka terikat sedangkan merah tua mewakili lebih sedikit kasus dari yang dihrapkan 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")Bisa kita lihat bahwa class, gender, dan survival adalah tidak terikat, kita melihat lebih banyak kru laki-laki yang meninggal, dan perempuan kelas 1,2, dan 3 mampu bertahan hidup daripada yang diharapkan. Sebaliknya, jauh lebih sedikit penumpang kelas 1 (laki-laki dan perempuan) yang meninggal daripada yang diperkirakan secara kebetulan. Dengan demikian asumsi tidak terikat ditolak.
Kontinu vs. Kontinu
Biasanya hubungan antara dua variabel kuantitatif dapat ditampilkan menggunakan plot sebaran dan grafik garis.
Plot sebaran
Biasanya plot sebaran dibuat untuk mempelajari suatu hubungan antara 2 variabel.
library(ggplot2) # visualisasi data
library(hrbrthemes) # untuk tema `theme_ipsum()` dan legend## Warning: package 'hrbrthemes' was built under R version 4.1.2
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
## Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
## if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
# 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")## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
2 variabel kuantitatif merupakan plot sebaran yang memiliki tampilan sederhana dengan variabel diwakilkan olleh sumbu. Seperti contoh berikut ini, dengan menggunakan dataset Salaries, kita dapat memplot pengalaman ( yrs.since.phd ) vs. gaji akademik ( salary ) dari seorang Profesor perguruan tinggi.
library(ggplot2)
library(scales)
data(Salaries, package="carData")
# plot sebaran yang ditingkatkan
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color="cornflowerblue",
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() +
# menggunakan tema minimal
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009") Catatan: Opsi geom_point bisa digunakan untuk mengubah
• color - warna titik
• size - ukuran titik
• shape - bentuk titik
• alpha - transparan titik. Kisaran transparansi dari 0 (transparan) hingga 1 (buram), dan merupakan parameter yang berguna saat beberapa titik mengalami tumpang tindih
Scale_x_continuous dan scale_y_continuous berfungsi untuk mengontrol penskalaan pada sumbu x dan y.
Plot Sebaran Menyesuaikan Garis
Ini berguna untuk meringkas hubungan yang ditampilkan dalam plot sebaran dengan menggunakan sebuah garis yang dapat menyesuaikan. Terdapat banyak jenis garis yang didukung, termasuk linear, polinomial, dan nonparametrik (loess). Garis- garis ini dapat ditampilkan dengan batas kepercayaan 95%.
library(ggplot2) # untuk visualisasi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "cornflowerblue") +
geom_smooth(method = "lm", color = "brown1")+
theme_minimal() + # menggunakan tema minimal
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009")## `geom_smooth()` using formula 'y ~ x'
Sudah pasti bahwa gaji akan meningkat sesuai dengan pengalama. Akan tetapi, tampaknya ada sebuah penurunan diujung kanan - profesor dengan pengalaman singnifikan, mendapatkan gaji lebih rendah. Sedangkan garis lurus tidak mampu merangkap efek non-linear ini. Garis dengan lengkungan akan lebih pas disini.
Garis regresi polinomial memberikan garis pas dengan bentuk.
y ̂= β_0+β_1 x+β-〖2x〗^2+⋯+β_n x^2
Menggunakan garis kuadrat (satu lengkungan), atau kubik(dua lengkungan). Penggunaan polinomial orde tinggi (>3) kadang-kadang diperlukan. Menerapkan kesesuaian kuadrat ke data set gaji menghasilkan hasil sebagai berikut :
library(ggplot2) # untuk visualisasi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "cornflowerblue") +
geom_smooth(method = "lm",
formula = y ~ poly(x, 2),
color = "yellow")+
theme_minimal() + # menggunakan tema minimal
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009")Setelah garis kesesuaian nonparametrik diperhalus terkadang dapat memberikan gambaran yang baik tentang hubungan tersebut. Default di ggplot2 merupakan sebuah garis loess yang memiliki arti penghalusan plot sebaran yang tertimbang secara lokal.
library(ggplot2) # untuk visualisasi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color="cornflowerblue",
size = 2,
alpha = 1) +
geom_smooth(size = 1,
color = "green") +
scale_y_continuous(label = scales::dollar,
limits = c(50000, 250000)) +
scale_x_continuous(breaks = seq(0, 60, 10),
limits = c(0, 60)) +
theme_minimal() + # menggunakan tema minimal
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009") +
theme_minimal()## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Kategorikal vs. Kontinu
Saat memplot hubungan antara variabel kategori dan variabel kuantitatif, ada banyak jenis grafik. Ini termasuk diagram batang menggunakan statistik ringkasan, plot kepadatan kernel yang dikelompokkan, plot kotak berdampingan, plot biola berdampingan, plot rata-rata/sem, plot ridgeline, dan plot Cleveland.
Diagram Bantang (Ringkasan Statistik)
Pada bagian sebelumnya, diagram batang dipakai untuk memperlihatkan jumlah kejadian yang berdasarkan kategori untuk variabel tunggal atau dua variabel. Diagram batang dapat digunakan untuk menampilkan ringkasan statistik lainnya (seperti mean atau median) yang ada di variabel kuantitatif untuk setiap tingkatan dari variabel kategorikal.
Dibawah ini merupakan contoh gaji rata-rata untuk sampel profesor universitas yang berdasarkan jabatan akademik.
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
data(Salaries, package="carData")
# menghitung gaji rata-rata untuk setiap jabatan
plotdata <- Salaries %>%
group_by(rank) %>%
dplyr::summarize(mean_salary = mean(salary))
# plot gaji rata-rata dengan cara yang lebih menarik
mycols <- c("#CD534CFF", "#EFC000FF", "#0073C2FF")
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() + # menggunakan tema minimal
labs(title = "Mean Salary by Rank",
subtitle = "9-month academic salary for 2008-2009",
x = "",
y = "")Plot Densitas Kernel yang Dikelompokkan
Kita bisa membandingkan kelompok pada variabel numerik dengan melapiskan plot densitas kernel dalam satu grafik. Berikut ini merupakan plot distribusi gaji berdasarkan jabatan dengan plot densitas kernel.
ggplot(Salaries,
aes(x = salary,
fill = rank)) +
geom_density(alpha = 0.4) +
theme_minimal() +
labs(title = "Salary distribution by rank")Opsi alpha dapat membuat plot densitas kernel menjadi sebagian transparan. Jadi kita bisa melihat apa yang terjadi pada bagian yang tumpang tindih. Nilai alpha berkisar dari 0 (transparan) hingga 1 (buram). Grafik diatas menunjukkan bahwa secara umum gaji akan meningkat sesuai jabatan. Tetapi, kisaran gaji untuk full profesor sangat luas.
Boxplot
Plot kotak (Boxplot) memperlihatkan persentil ke-25, median, dan persentil ke-75 dari distribusi. Garis kumis (garis vertikal) mampu menangkap sekitar 99% dari distribusi normal, dan pengamatan diluar kisaran ini diplot sebagai titik yang mewakili pencilan.
Plot kotak yang bersebelahan sangat berguna untuk membandingkan kelompok (tingkatan variabel kategori) pada variabel numerik. Mari kita plot distribusi gaji berdasarkan jabatan menggunakan plot kotak. Plot kotak bertakik dapat memberikan metode perkiraan untuk visualisasi apakah kelompok berbeda. Biarpun ini bukan tes yang formal, bila takik dari kedua plot kotak tidak tumpang tindih. Maka ada bukti kuat (kepercayaan 95%) bahwa median dari kedua kelompok berbeda.
mycols <- c("#CD534CFF", "#EFC000FF", "#0073C2FF")
ggplot(Salaries, aes(x = rank,
y = salary)) +
geom_boxplot(notch = TRUE,
fill = mycols,
alpha = .7) +
theme_minimal() +
labs(title = "Salary Distribution by rank")Dari contoh diatas, ketiga kelompok itu terlihat berbeda. Suatu keuntungan dari plot kotak ialah lebarnya kadang tidak berarti. Ini memungkinkan anda untuk membandingkan distribusi dari banyak kelompok dalam satu grafik.
Plot Biola
Plot Biola dapat dikatakan mirip dengan plot densitas kernel. Akan tetapi ini dicerminkan dan diputar 90^0. Mari kita plot distribusi gaji berdasarkan jabatan menggunakan plot biola.
ggplot(Salaries,
aes(x = rank,
y = salary)) +
geom_violin(fill = "azure1") +
geom_boxplot(width = .2,
fill = mycols,
outlier.color = "red",
outlier.size = 2) +
theme_minimal() +
labs(title = "Salary distribution by rank")Plot Garis Punggung
Plot garis punggung atau plot kegembiraan memperlihatkan distribusi variabel kuantitatif untuk beberapa kelompok. Plot ini hampir sama dengan plot densitas kernel dari segi (faceting) vertikal, tapi menggunakan lebih sedikit ruang. Plot garis punggung dibuat dengan package ggridges
Gunakan data set Fuel economy, kita plot mil perjalanan kota per galon menurut kelas mobil.
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visulisasi
library(ggridges) # untuk mengendalikan visualisasi yang tumpang tindih
ggplot(mpg,
aes(x = cty,
y = class,
fill = class)) +
geom_density_ridges(alpha = 0.7) +
theme_ridges() +
labs("Highway mileage by auto class") +
theme(legend.position = "none")## Picking joint bandwidth of 0.929
Distribusinya sudah diberi label pada sumbu y. Sehingga tidak mengherankan, jika truk pickup memiliki jarak tempuh yang paling rendah, sedangkan mobil sub kompak dan kompak cenderung mencapai peringkat. Tapi ada rentang skor jarak tempuh yang sangat luas untuk mobil-mobil kecil ini.
Dapat kita perhatikan, kemungkinan tumpang tindih disribusi ialah diputuskan lebih kepada grafik mobil kompak. Kita juga dapat menambahkan transparansi jika tindihnya parah dengan menggunakan geom_density_ridges(alpha = n), n berkisar dari 0 (transparansi) hingga 1 (buram).
Plot Garis
Metode populer yang digunakan untuk membandingkan variabel numerik merupakan plot rata-rata dengan batang kesalahan. Batang kesalahan bisa mewakili deviasi standar, kesalahan standar dari rata-rata atau interval kepercayaan. Bagian ini, kita hendak memplot rata-rata dan kesalahan standar. Kita bisa menggunakan teknik yang sama untuk membandingkan gaji pada jabatan dan jenis kelamin.
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visualisasi
library(ggridges) # untuk menangani visualisasi yang tumpang tindih
# menghitung rata-rata, deviasi standar,
# kesalahan standar, dan 95% interval kepercayaan
# berdasarkan 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))## `summarise()` has grouped output by 'rank'. You can override using the `.groups` argument.
# meningkatkan plot rata-rata kesalahan atau standar kesalahan
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 = "Mean salary by rank and sex",
subtitle = "(mean +/- standard error)",
x = "",
y = "",
color = "Gender")Plot Strip
Hubungan antara variabel pengelompokkan dan variabel numerik dapat diperlihatkan dengan plot sebaran. Contoh, plot distribusi gaji berdasarkan jabatan menggunakan plot strip. Plot sebar satu dimensi ini disebut sebagai plot strip.
library(ggplot2) # untuk visulisasi
library(scales) # penskalaan infrastruktur
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 = "Academic Salary by Rank",
subtitle = "9-month salary for 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Opsi legend.position = “none” digunakan untuk menyembunyikan legend. Plot jitter bekerja dengan baik ketika jumlah dari titik-titik tidak terlalu besar.
Menggabungkan Jitter dan Plot Kotak
Beberapa pilihan ditambahkan untuk membuat plot ini.
• Untuk plot kotak:
o size = 1 membuat garis menjadi lebih tebal
o outlier.color = “black” membuat pencilan berwarna hitam
o outlier.shape = 1 menentukan lingkaran untuk pencilan
o outlier.size = 3 meningkatkan ukuran dari pencilan
• Untuk jitter:
o alpha = 0.5 membuat titik-titik menjadi lebih transparan
o width = .2 mengurangi jumlah jitter (.4 adalah default)
Akhirnya, sumbu x dan y dibalik menggunakan fungsi coord_flip (yaitu, grafik diputar pada sisinya).
library(ggplot2) # untuk visulisasi
library(scales) # penskalaan infrastruktur
ggplot(Salaries,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = salary,
color = rank)) +
geom_boxplot(size=1,
outlier.shape = 1,
outlier.color = "black",
outlier.size = 3) +
geom_jitter(alpha = 0.5,
width=.2) +
scale_y_continuous(label = dollar) +
labs(title = "Academic Salary by Rank",
subtitle = "9-month salary for 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none") +
coord_flip()Perhatikan fungsi geom_boxjitter yang ada di package ggpol. Ini untuk membuat plot kotak - setengah plot kotak, setengah plot sebaran.
library(ggplot2) # untuk visulisasi
library(scales) # penskalaan infrastruktur
library(ggpol) # plot kotak hibrida - setengah plot sebaran## Warning: package 'ggpol' was built under R version 4.1.2
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 = "Academic Salary by Rank",
subtitle = "9-month salary for 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Plot Kawanan Lebah
Plot kawanan lebah atau plot sebaran biola hampir sama dengan plot sebaran jitter. Plot tersebut memperlihatkan distribusi dari variabel kuantitatif dengan memplot titik-titik agar mengurangi tumpang tindih. Plot tersebut juga dapat membantu menampilkan densitas dari data di setiap titik ( cara yang hampir sama dengan plot biola). Lanjutan contoh sebelumnya.
library(ggplot2) # untuk visualisasi
library(scales) # penskalaan infrastruktur
library(ggbeeswarm) # mengurangi tumpang tindih## Warning: package 'ggbeeswarm' was built under R version 4.1.2
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 = "Academic Salary by Rank",
subtitle = "9-month salary for 2008-2009",
x = "",
y = "") +
theme_minimal() +
theme(legend.position = "none")Plot tersebut dibuat dengan menggunakan fungsi geom_quasirandom. Plot ini bisa lebih mudah dibaca daripada plot strip jitter sederhana.
Diagram Titik Cleveland
Plot Cleveland berfungsi ketika ingin membandingkan statistik numerik untuk sejumlah besar kelompok. Contohnya, kita ingin menbandingkan sebuah harapan hidup pada 2007 di negara Asia dengan data set gapminder.
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visualisasi
library(scales) # penskalaan infrastruktur
library(ggbeeswarm) # mengurangi tumpang tindih
library(gapminder) # untuk dataset `gapminder` ## Warning: package 'gapminder' was built under R version 4.1.2
data(gapminder, package="gapminder") # memuat dataset `gapminder`
# subset negara-negara Asian tahun 2007
library(dplyr)
plotdata <- gapminder %>%
filter(continent == "Asia" &
year == 2007)
# Plot Cleveland yang menarik
ggplot(plotdata,
aes(x=lifeExp,
y=reorder(country, lifeExp))) +
geom_point(color="blue",
size = 2) +
geom_segment(aes(x = 40,
xend = lifeExp,
y = reorder(country, lifeExp),
yend = reorder(country, lifeExp)),
color = "azure3") +
labs (x = "Life Expectancy (years)",
y = "",
title = "Life Expectancy by Country",
subtitle = "GapMinder data for Asia - 2007") +
theme_minimal() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())Jepang memiliki harapan hidup yang paling tinggi, sedangkan Afghanistan yang paling rendah. Plot terakhir disebut dengan grafik lolipop.
Data Multivariat
Grafik Multivariat dapat menampilkan hubungan antara tiga variabel atau bisa lebih. Ada dua metode yang umum untuk menampung variabel : pengelompokkan dan faceting.
Pengelompokkan
Dalam pengelompokkan, nilai dari dua variabel pertama dipetakan ke sumbu x dan y. Sedangkan variabel tambahan dipetakan ke karakteristik visual lainnya seperti warna, bentuk, ukuran, jenis garis, dan transparansi. Pengelompokkan memungkinkan kita memplot data untuk beberapa grup dalam satu grafik. Gunakan data set Salaries, kita menampilkan hubungan antara yrs.since.phd dan salary.
library(carData) # untuk dataset
library(ggplot2) # untuk visualisasi
data(Salaries, package="carData")
ggplot(Salaries, aes(x = yrs.since.phd,
y = salary,
color=rank)) +
geom_point() +
theme_minimal() +
labs(title = "Academic salary by rank and years since degree")Kemudian, tambahkan jenis kelamin profesor dengan menggunakan bentuk titik untuk menunjukkan jenis kelamin. Kita hendak meningkatkan ukuran titik dan menambahkan transparansi untuk memperjelas titik individual.
library(carData) # untuk dataset
library(ggplot2) # untuk visualisaSi
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary,
color = rank,
shape = sex)) +
geom_point(size = 3, alpha = .6) +
theme_minimal() +
labs(title = "Academic salary by rank, sex, and years since degree")Bisa dikatakan grafik diatas adalah grafik yang bagus. Akan tetapi, kemungkinan sulit untuk membedakan profesor pria dan wanita.
Coba perhatikan perbedaan antara menentukan nilai konstan (seperti size = 3) dan pemetaan variabel untuk karakteristik visual (contoh : color = rank). Biasanya pemetaan selalu ditempatkan dalam fungsi aes, sementara itu, penetapan nilai konstanta selalu muncul di luar fungsi aes.
Dibawah ini akan diberikan contoh yang jelas. Kita akan membuat grafik hubungan anat tahun sejak Ph.D. dan gaji menggunakan ukuran dari titik untuk menunjukkan masa kerja. Ini disebut plot gelembung.
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 = "Academic salary by rank, years of service, and years since degree")Dapat dilihat dengan jelas bahwa hubungan positif yang kuat antara tahun-tahun sejak Ph.D. dan tahun layanan. Asisten Profesor berada dalam jangkauan 0-11 tahun sejak Ph.D. dan 0-10 tahun layanan. Orang profesional pasti sangat berpengalaman tidak hanya berada di tingkat Asisten Profesor (bisa saja mereka dipromosikan atau keluar dari Universitas). Tidak ditemukan batasan waktu yang sama antara Associate dan Full Professors.
Untuk contoh yang terakhir, mari kita lihat yrs.since.phd vs. salary serta tambahkan jenis kelamin dengan menggunakan warna dan garis kuadrat yang paling cocok.
library(carData) # untuk dataset
library(ggplot2) # untuk visualisasi
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 = "Years Since Ph.D.",
title = "Academic Salary by Sex and Years Experience",
subtitle = "9-month salary for 2008-2009",
y = "",
color = "Sex") +
scale_y_continuous(label = scales::dollar) +
scale_color_brewer(palette = "Set1") +
theme_minimal()Pembagian Faset (Faceting)
Pengelompokkan memungkinkan kita untuk memplot beberapa variabel dalam satu grafik, dengan menggunkan karakteristik visual seperti warna, bentuk, dan ukuran. Dalam pembangian Faset, grafik terdiri dari beberapa plot terpisah atau kelipatan kecil, satu untuk setiap tingkatan dari variabel ketiga atau kombinasi variabel.
library(carData) # untuk dataset
library(ggplot2) # untuk visualisasi
ggplot(Salaries, aes(x = salary)) +
geom_histogram(fill = "cornflowerblue",
color = "white") +
facet_wrap(~rank, ncol = 1) +
theme_minimal() +
labs(title = "Salary histograms by rank")## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Fungsi facet_wrap untuk membuat sebuah grafik terpisah setiap tingkat jabaran. Opsi ncol mengatur jumlah kolom. Contoh berikutnya akan mengggunakan dua variabel untuk mendefinisikan faset. Fungsi disini untuk menetapkan jenis kelamin ke baris dan jabatan ke kolom, membuat matriks enam plot dalam satu grafik.
library(carData) # untuk dataset
library(ggplot2) # untuk visualisasi
ggplot(Salaries, aes(x = salary / 1000)) +
geom_histogram(color = "white",
fill = "cornflowerblue") +
facet_grid(sex ~ rank) +
theme_minimal() +
labs(title = "Salary histograms by sex and rank",
x = "Salary ($1000)")## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Pengelompokkan dan pembagian faset dapat dikombinasikan. Menggunakan plot Mean/SE dan pembagian faset untuk membandingkan gaji dari profesor pria dan wanita dalam jabatan disiplin ilmu. Disini warna digunakan untuk membedakan jenis kelamin dan pembagian faset dalam membuat plot jabatan berdasarkan kombinasi disiplin ilmu.
library(carData) # untuk dataset
library(ggplot2) # untuk visualisasi
library(dplyr) # manipulasi data
# menghitung rata-rata dan kesalahan standar berdasarkan
# jenis kelamin, jabatan, dan disiplin ilmu
plotdata <- Salaries %>%
group_by(sex, rank, discipline) %>%
dplyr::summarize(n = n(),
mean = mean(salary),
sd = sd(salary),
se = sd / sqrt(n))## `summarise()` has grouped output by 'sex', 'rank'. You can override using the `.groups` argument.
# membuat label yang lebih baik untuk disiplin ilmu
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="Nine month academic salaries by gender, discipline, and rank",
subtitle = "(Means and standard errors)") +
scale_color_brewer(palette="Set1")Pernyataan facet_grid(.~rank+dicipline) tidak bisa menentukan baris (.) dan kolom yang ditentukan oleh kombinasi jabatan dan disiplin ilmu.
theme() berfungsi untuk membuat tema hitam dan putih serta menghilangkan garis grid vertikal dan garis grid horizontal minor. Sedangkan scale_color_brewer() berfungsi untuk mengubah skema warna titik dan batang kesalahan.
Saat melihat sekilas pasti tampaknya ada perbedaan gender dalam gaji untuk Associate dan Full Professors di bidang teoritis.
Untuk contoh terakhir, kita akan beralih ke dataset baru dan memplot perubahan dalam harapan hidup dari waktu ke waktu di negara “Asia”. Data itu berasal dari dataset gapminder di package gapminder. Di setiap negara akan muncul fasetnya sendiri. Disini fungsi tema digunakan untuk menyederhanakan warna latar belakang, memutar teks sumbu x, dan memperkecil ukuran tulisan.
library(gapminder) # untuk dataset
library(ggplot2) # untuk visualisasi
library(dplyr) # manipulasi data
# memplot harapan hidup berdasarkan tahun secara terpisah
# untuk setiap negara di Asia
data(gapminder, package = "gapminder")
# Pilih data Asia
plotdata <- dplyr::filter(gapminder,
continent == "Asia")
# memplot harapan hidup berdasarkan tahun, untuk setiap negara
ggplot(plotdata, aes(x=year, y = lifeExp)) +
geom_line(color="grey") +
geom_point(color="blue") +
facet_wrap(~country) +
theme_minimal(base_size = 9) +
theme(axis.text.x = element_text(angle = 45,
hjust = 1)) +
labs(title = "Changes in Life Expectancy",
x = "Year",
y = "Life Expectancy")