Algoritma dan Struktur Data
~ Visualisasi Data dengan R ~
| Kontak | : \(\downarrow\) |
| naftaligunawan@gmail.com | |
| https://www.instagram.com/nbrigittag/ | |
| RPubs | https://rpubs.com/naftalibrigitta/ |
Visualisasi Data adalah tampilan data dan informasi dalam bentuk grafis atau visual. Contoh bentuk grafis atau visual seperti peta, bagan dan grafik. Salah satu kegunaan visualisasi data adalah untuk menghadirkan mempermudah komunikasi antar-stakeholder (contoh stakeholder adalah karyawan, konsumen, distributor hingga pemegang saham dan pemerintah). Visualisasi data memberikan informasi yang sangat berguna untuk kepentingan bisnis.
R dan Phyton adalah platform untuk analisis data yang mampu membuat hampir semua jenis grafik visual. Pada kesempatan ini, kita akan membahas ragam visualisasi data yang populer dalam data science, kita akan fokus pada teknik visualisasi data Univariat, Bivariat dan Multivariat
Catatan : Pada tugas kali ini, kita fokus pada visualisasi data menggunakan R.
Univariat (Satu Variabel)
Visualisasi Data Univariat biasanya digunakan untuk melakukan distribusi data dari satu variabel. Dalam hal ini, variabel yang dimaksud dipartisi menjadi dua bagian :
* Kategoris, seperti : Jenis Kelamin, Ras, Kota, Negara, dll.
* Numerik, seperti : Usia, Berat Badan, Inflasi, Suku Bunga, dll.
Variabel Kategori
Distribusi variabel data tunggal biasanya di plot menggunakan Diagram Batang, Diagram Pie dan Peta Pohon (tetapi jarang sekali dipakai)
Diagram Batang
Dibawah ini adalah contoh yang menunjukkan frekuensi dari dataset Marriage, kita harus memanggil packages mosaicData. Kita akan menggunakan diagram batang untuk menampilkan distribusi pernikahan berdasarkan Zodiak.
library(ggplot2) # untuk visualisasi data
setwd("C:/Users/Naftali Brigitta/Documents/TUGAS 7 ASD") # untuk men-setting working directory
Marriage <- read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv") # Memuat data dari PC anda
ggplot(Marriage, aes(x = zodiacs)) +
geom_bar(fill = "cornflowerblue",
color = "azure4") +
theme_minimal() + # menggunakan tema minimal
labs(x = "Zodiacs",
y = "Frequency",
title = "Marriage Participants by Zodiacs")
Batang pada diagram batang dapat menggambarkan persentase dari jumlah. Untuk diagram batang (zodiak), kode aes(x=sign) biasanya merupakan jalan pintas untuk aes(x = sign, y =..count..), di mana ..count.. adalah variabel khusus yang menggambarkan frekuensi dari setiap kategori. Anda dapat menggunakan ini untuk menghitung persentase, dengan menentukan variabel y secara eksplisit.
library(ggplot2) # untuk visualisasi data
ggplot(Marriage,
aes(x = zodiacs,
y = ..count.. / sum(..count..))) +
geom_bar(fill = rainbow(12), color = "azure4") +
theme_minimal() + # menggunakan tema minimal
labs(x = "Zodiacs",
y = "Frequency",
title = "Marriage Participants by Zodiacs") +
scale_y_continuous(labels = scales::percent) # menambahkan simbol % pada sumbu y
Catatan: Dalam R, warna bisa kita tentukan dengan memanggil nama (misalnya col= "red" ) atau dengan triplet RGB heksadesimal (seperti col = "AFFCC00" ). Kita juga dapat memanggil warna lain nya seperti salah satunya diambil dari package RColorBrewer.
Mengurutkan batang berdasarkan frekuensi sering kali membantu. Kode di bawah ini, frekuensi dihitung secara eksplisit. Kemudian fungsi reorder berdasarkan frekuensinya. Opsi stat="identity" memberitahu fungsi plot untuk tidak menghitung digunakan untuk mengurutkan kategori jumlah, karena mereka diberikan secara langsung.
library(dplyr) # untuk manipulasi data##
## 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) # untuk visualisasi data
plotdata <- Marriage %>% # memuat dataset
count(zodiacs)
# menyusun plot batang secara meningkat
ggplot(plotdata,
aes(x = reorder(zodiacs, n),
y = n)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color = "azure4") +
theme_minimal() + # menggunakan tema minimal
labs(x = "Zodiacs",
y = "Frequency",
title = "Sorting Categories")
Mari kita berikan label setiap batang dengan nilai numerik nya, dengan mengikuti kode di bawah ini :
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visualisasi data
library(scales) # menentukan jeda atau label secara otomatis
plotdata <- Marriage %>% # memuat dataset
count(zodiacs) %>%
mutate(pct = n / sum (n),
pctlabel = paste0(round(pct*100), "%"))
# plot batang sebagai presentase, 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() + # menggunakan tema minimal
scale_y_continuous(labels = percent) + # menambahkan simbol % pada sumbu y
labs(x = "Zodiacs",
y = "Frequency",
title = "Labeling Bars")
Terkadang label kategori (seperti tulisan nama-nama zodiak) saling menumpuk, itu terkadang menyusahkan untuk membacanya. Maka dari itu, ayo kita miringkan tulisan yang tertulis pada label sumbu x !
library(ggplot2) # untuk visualisasi data
library(scales) # menentukan jeda atau label secara otomatis
# memplot batang sebagai presentase, 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) +
scale_y_continuous(labels = percent) + # menambahkan simbol % pada sumbu y
theme_minimal() + # menggunakan tema minimal
labs(x = "Zodiacs",
y = "Frequency",
title = "Overlapping Labels") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Cara lainnya, kita dapat membalik sumbu x dan sumbu y.
library(ggplot2) # untuk visualisasi data
library(scales) # menentukan jeda atau label secara otomatis
# memplot batang sebagai presentase, 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),
hjust = -0.10) +
scale_y_continuous(labels = percent) + # menambahkan simbol % pada sumbu y
theme_minimal() + # menggunakan tema minimal
labs(x = "Zodiacs",
y = "Frequency",
title = "Overlapping Labels") +
coord_flip()Diagram Pie
Diagram pai bersifat kontroversial di statistik. Jika tujuan Anda adalah untuk membandingkan frekuensi dari kategori, lebih baik Anda menggunakan diagram batang (orang-orang lebih baik dalam menilai panjang batang dari pada volume irisan lingkaran). Karena dibutuhkan lebih banyak kode untuk membuat diagram pai agar lebih menarik dalam R.
Dibawah ini adalah contoh untuk membuat diagram pai sederhana dengan menggunakan library 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 termasuk bagian Diagram Pai dengan bentuk yang sederhana dengan lubang di tengahnya. Perbedaan antara kode diagram pai adalah dengan menetapkan : x = 2 dan xlim = c(0.5, 2.5) untuk membuat lubang di tengah diagram pai. Argumen widht dalam fungsi geom_bar tidak diperlukan dalam membuat diagram donat.
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 kita kreasikan diagram pie ini dengan menambahkan label, sambil menghapus legend.
library(ggplot2) # Untuk visualisasi
library(scales) # Untuk menentukan jeda atau label secara otomatis
# Tambahkan 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 = prop), color = "white")+
scale_fill_manual(values = mycols) +
theme_void()+
xlim(0.5, 2.5)+
labs(title = "Marriage participants by Race")Peta Pohon
Peta Pohon tidak seperti Diagram Pai ataupun Diagram Donat, karena Peta Pohon dapat menangani variabel 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")
Dibawah ini adalah versi yang lebih lengkap dengan label.
ggplot(plotdata,
aes(fill = officialTitle,
area = n,
label = officialTitle)) +
geom_treemap() +
geom_treemap_text(colour = "white",
place = "centre") +
labs(title = "Marriage Participants by Officiate") +
theme(legend.position = "none")Variabel Kontinu
Distribusi variabel data kuantitatif tunggal biasanya dibuat menggunakan plot dengan histogram, plot densitas kernel, atau plot titik.
Histogram
Dengan menggunakan dataset Marriage, mari kita plot usia dari orang yang sebagai peserta pernikahan.
library(ggplot2) # Untuk visualisasi
ggplot(Marriage, aes(x = age)) +
geom_histogram(fill = "cornflowerblue",
color = "white", bins = 20) +
theme_minimal() + # Menggunakan tema minimal
labs(title = "Marriage Participants by Age (Basic)",
x = "Age")
Sebagian besar orang yang menikah berada di range usia 20-an tahun, selanjutnya di range usia 40-an tahun, dan yang terkecil di range usia 60-an dan 70-an tahun. Warna histogram dapat diganti warna dengan dua opsi, antara lain :
* fill = untuk mewarnai isi batang.
* color = untuk mewarnai batas sekitar batang.
Cara lain yang terakhir adalah menggunakan binwidth, lebar nampan yang diwakili oleh batang.
library(ggplot2) # Untuk visualisasi
library(scales) # Untuk menentukan jeda atau label secara otomatis
ggplot(Marriage,
aes(x = age,
y = ..count.. / sum(..count..))) +
geom_histogram(fill = "cornflowerblue",
color = "white",
binwidth = 5) +
theme_minimal() + # Menggunakan tema minimal
labs(title = "Marriage Participants by Age (Alternative)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)
Seperti Diagram Batang (yang diawal), sumbu y itu adalah perwakilan jumlah atau persen dari total.
library(ggplot2) # Untuk visualisasi
library(scales) # Untuk menentukan jeda atau label secara otomatis
ggplot(Marriage,
aes(x = age,
y = ..count.. / sum(..count..))) +
geom_histogram(fill = "cornflowerblue",
color = "white",
binwidth = 5) +
theme_minimal() + # Menggunakan tema minimal
labs(title = "Marriage Participants by Age (Percent)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)Plot Densitas Kernel
Histogram memiliki alternatif yaitu plot densitas kernel. Plot densitas kernel ini hanya menggambar histogram yang diperhalus, dimana area dibawah kurva sama dengan satu.
library(ggplot2) # Untuk visualisasi
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "indianred3") +
theme_minimal() + # Menggunakan tema minimal
labs(title = "Marriage Participants by Age") Kita dapat menggunakan
fill dan color untuk menentukan warna isian dan warna pinggiran batasannya.
Parameter Penghalusan (Smoothing)
Tingkat kehalusan di kontrol oleh parameter bandwidth atau bw. Kita dapat menggunakan fungsi bw.nrd0 untuk menemukan nilai default dari variabel tertentu. Nilai yang kecil akan menghasilkan penghalusan yang sedikit, sedangkan nilai yang besar akan menghasilkan penghalusan yang lebih banyak.
library(ggplot2) # Untuk visualisasi
bw.nrd0(Marriage$age) # Default bandwidth untuk variabel usia ## [1] 5.181946
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "deepskyblue",
bw = 1) +
theme_minimal() + # Menggunakan tema minimal
labs(title = "Participants by Age",
subtitle = "bandwidth = 1") Meskipun plot densitas kernel mudah untuk dilihat, tapi sulit untuk melihat atau menjelaskan arti dari sumbu y pada orang awam.
Diagram Titik
Histogram memiliki alternatif lain yaitu diagram titik. Lebar dari sebuah titik sama dengan lebar bin, dan titik-titik bertumpuk, dengan setiap titik mewakili satu pengamatan. Option fill dan color digunakan untuk menentukan warna isian dan pinggir batasan masing-masing titik.
library(ggplot2) # Untuk visualisasi
ggplot(Marriage, aes(x = age)) +
geom_dotplot(fill = "gold",
color = "azure4",
binwidth = 2) +
theme_minimal() + # Menggunakan tema minimal
labs(title = "Participants by Age",
y = "Proportion",
x = "Age") Ada lebih banyak pilihan yang tersedia. Klik di sini untuk detail dan contoh.
Data Bivariat
Grafik Bivariat berguna untuk menunjukkan hubungan antara dua variabel. Jenis grafik yang akan dipakai juga tergantung dengan tingkat pengukuran dari variabel (Kategorikan atau Kuantitatif).
Kategorikal vs. Kategorikal
Diagram Batang Bertumpuk
Sekarang kita akan memplot hubungan antara kelas mobil dan jenis penggerak (antara lain roda depan, roda belakang, atau si penggerak 4 roda) untuk mobil dengan menggunakan dataset 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 Bertumpuk
ggplot(mpg,
aes(x = class,
fill = drv)) +
geom_bar(position = "fill") +
theme_minimal() + # Menggunakan Tema Minimal
labs(y = "Proportion")Diagram Batang yang Dikelompokkan
Untuk membuat plot batang yang dikelompokkan, kita dapat menggunakan opsi position = "single". Perlu diperhatikan, bahwa opsi ini hanya tersedia di versi pengembangan ggplot2 versi terbaru.
library(ggplot2) # Untuk visualisasi
ggplot(mpg, aes(x = class, fill = drv)) +
theme_minimal() + # Menggunakan Tema Minimal
geom_bar(position = position_dodge(preserve = "single"))Diagram Batang Tersegmentasi
Plot batang segmentasi adalah plot batang bertumpuk yang dimana setiap batangnya bertuliskan 100 persen, dan kita menggunakan opsi position = "filled". Tujuan plot ini untuk membandingkan persentasi dari kategori dalam satu variabel setiap tingkat dengan variabel lain.
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
# 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() + # menggunakan tema minimal
labs(y = "Percent",
fill = "Drive Train",
x = "Class",
title = "Automobile Drive by Class") +
theme_minimal()
Catatan : Dibawah ini adalah nama dan fungsi dari setiap opsi yang digunakan dalam pewarnaan dan pelabelan :
* factor = untuk mengubah urutan dari kategori dalam variabel kelas dan urutan serta labels untuk variabel drive.
* scale_y_continuous = untuk mengubah label tanda ventang sumbu y.
* labs = untuk menyediakan judul dan mengubah label untuk sumbu x dan sumbu y dan juga untuk legend.
* scale_fill_brewer = untuk mengubah skema warna isian.
* theme_minimal = untuk menghapus latar belakang warna abu-abu dan mengubah warna kisi.
Plot Mosaik
Desain plot diagram mosaik dapat memunculkan hubungan antara variabel kategorikal dengan memakai persegi panjang yang luasnya yang mewakili kejadian kombinasi.
Kita akan menggunakan package ggmosaic tetapi lebih bagus menggunakan package vcd. Karena package vcd dapat memberikan pendekatan yang lebih komprehensif untuk memvisualisasikan 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")
Pada grafik dibawah ini, warna biru gelap mewakili lebih banyak kasus dari yang diharapkan tidak terikat, sedangkan warna merah tua mewakili lebih sedikit kasus 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")
Jika class, gender dan survival adalah tidak terikat, maka kita melihat lebih banyak kru laki-laki yang tewas, dan yang perempuan kelas 1, 2, dan 3 bertahan hidup dari yang diharapkan. Sebaliknya, lebih sedikit penumpang kelas 1 (laki-laki dan perempuan) yang meninggal daripada yang telat diperkirakan. Maka kesimpulannya adalah asumsi tidak terikat ditolak.
Kontinu vs. Kontinu
Hubungan dua garis variabel kuantitatif biasanya di tunjukkan menggunakan plot sebaran dan grafik garis.
Plot Sebaran
Plot Sebaran berguna untuk mempelajari hubungan antara 2 variabel, disertai dengan perhitungan koefisien korelasi yang biasanya digunakan untuk mengukur hubungan linear.
Dibawah ini ada beberapa pola yang dapat kita gunakan untuk melakukan plot sebaran.
library(ggplot2) # Visualisasi Data
library(hrbrthemes) # untuk tema `theme_ipsum()` dan legend## 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
Tampilan sederhana dari 2 variabel kuantitatif adalah plot sebaran, karena setipa variabel diwakilkan oleh sumbu, kita dapat menggunakan dataset Salaries.
Sekarang kita memplot pengalaman (yrs.since.phd) vs. gaji akademik ( salary ) dari Professor Perguruan Tinggi.
library(ggplot2) # untuk visualisasi
library(scales) # menentukan jeda atau label secara otomatis
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 berfungsi untuk mengubah, antara lain :
* color = untuk mengubah warna titik
* size = untuk mengubah ukuran titik
* shape = untuk mengubah bentuk titik
* alpha = untuk mengubah transparasi titik. Transparasi titik dari angka 0 (transparan) sampai angka 1 (buram)
Fungsi scale_x_continuous dan fungsi scale_x_continuous adalah untuk mengontrol skala sumbu x dan y.
Plot Sebaran Menyesuaikan Garis
Plot Sebaran yang Menyesuaikan Garis berguna untuk meringkas hubungan yang ditampilkan dalam plot sebaran. Jenis garis yang didukung adalah linear, polinomial, dan nonparametrik (loess).
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'
Dapat kita lihat dari grafik diatas, bahwa gaji akan naik jika kita bekerja sesuai pengalaman. Namun ada penurunan di ujung kanan, professor yang berpengalaman mendapatkan gaji yang lebih rendah.
Biasanya akan menggunakan garis kuadrat (satu lengkungan), atau kubik (dua lengkungan). Penggunaan polinomial orde tinggi (diatas 3) jarang diperlukan. Sekarang, dibawah ini kita akan menerapkan penyesuaian kuadrat ke data set gaji.
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")
Garis nonparametrik yang diperhalus dapat memberikan gambaran yang baik tentang hubungan tersebut. ggplot 2 adalah garis loess yang berari 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
Kali ini kita akan memplot hubungan antara variabel kategorikal dan variabel kuantitatif. Jenis grafik yang digunakan beragam, antara lain menggunakan ringkasan statistik, plot dentitas kernel yang dikelompokkan, plot kotak berdampingan, plot biola berdampingan, plot mean/sem, plot garis punggungan, dan yang terakhir adalah plot Cleveland.
Diagram Batang (Ringkasan Statistik)
Diagram batang digunakan untuk menampiljan jumlah kejadian berdasarkan kategori baik untuk variabel tunggal ataupun dua variabel. Selain itu, diagram batang juga digunakan untuk menampilkan rungkasan statistik (contohnya mean dan median) pada variabel kuantitatif dalam setiap tingkatan dari variabel kategorikal.
Dibawah ini adalah contoh grafik yang menampilkan gaji rata-rata untuk sampel Professor Universitas berdasarkan jabatan akademik mereka.
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
Plot Densitas Kernel dilapiskan untuk membandingkan kelompok pada variabel numerik. Dibawah ini, kita akan memplot distribusi gaji berdasarkan jabatan.
ggplot(Salaries,
aes(x = salary,
fill = rank)) +
geom_density(alpha = 0.4) +
theme_minimal() +
labs(title = "Salary Distribution by Rank")
Opsi alpha dalam plot densitas menjadi sebagian transparan sehingga kita dapat melihat bagian yang bertumpukkan. Dari grafik diatas, dapat dijelaskan bahwa gaji akan meningkat sesuai jabatan.
Boxplot
Plot Kotak atau Boxplot berguna untuk membandingkan kelompok (tingkatan variabel kategori) pada variabel numerik. Jika plot kotak bertakik berarti itu memberikan metode perkiraan untuk visualisasi kelompok berbeda, jika takik bertumpukkan, berarti itu median dari dua kelompok berbeda.
Sekarang, ayo kita plot distribusi gaji berdasarkan jabatan!
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, bentuk dari ketiga kelompok itu berbeda yang berarti memudahkan kita membandingkan distribusi dari banyak kelompok dalam satu grafik.
Plot Biola
Plot Biola mirip dengan Plot Densitas Kernel, tetapi diputar 90 derajat. Sekarang, ayo kita plot distribusi gaji berdasarkan jabatan.
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 biasa disebut juga dengan Plot Kegembiraan. Plot ini menunjukkan distribusi variabel kuantitatif untuk beberapa kelompok. Plot Garis Punggung dibuat dengan package ggridges.
Dengan menggunakan dataset Fuel Economy, ayo 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
Untuk menghindari distribusi bertumpukkan, kita dapat menambahkan transparasi jika tumpukkan nya parah, kita dapat menggunakan geom_density_ridges(alpha = n), dimana n berkisar dari 0 (transparan) sampai 1 (buram).
Plot Garis
Variabel numerik adalah plot rata-rata dengan batang kesalahan (Metode populer untuk membandingkan kelompok).
Dibawah ini, kita akan memplot rata-rata dan kesalahan standar. Kita dapat menggunakan teknik yang sama untuk membandingkan gaji terhadap 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
Plot distribusi gaji berdasarkan jabatan menggunakan plot strip. Plot sebar satu dimensi ini disebut juga dengan plot strip. Akan lebih memudahkan untuk membandingkan kelompok jika kita menggunakan warna.
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 menyembunyikkan legend. Plot Jitter ini bekerja dengan baik ketika jumlah titik-titik tidak terlalu besar.
Menggabungkan Jitter dan Plot Kotak
Untuk mengvisualisasikan distribusi lebih mudah jika kita menambahkan plot kotak ke plot jitter. Dibawah ini adalah pilihan yang dapat ditambahkan untuk membuat plot ini, antara lain :
- Untuk Plot Kotak :
**size = 1adalah untuk membuat garis menjadi lebih tebal.
**outlier.colot = "black"adalah untuk membuat pencilan berwarna hitam.
**outlier.shape = 1adalah untuk menentukan lingkaran untuk pencilan.
**outlier.size = 3adalah untuk meningkatkan ukuran dari pencilan.
- Untuk Jitter :
**alpha = 0.5adalah untuk membuat titik-titik menjadi lebih transparan.
**width = .2adalah untuk mengurangi jumlah jitter (.4 adalah yang default).
Sumbu X dan Y dapat dibalik dengan menggunakan fungsi coord_flip (fungsinya untuk memutar grafik 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()
Sekarang kita melihat fungsi geom_boxjitter yang disediakan oleh package ggpol. Ini yang membuat plot kotak hibrida-setengah plot kotak, dan setengah plot sebaran.
library(ggplot2) # untuk visulisasi
library(scales) # penskalaan infrastruktur
library(ggpol) # plot kotak hibrida - setengah plot sebaran
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 disebut juga dengan Plot Sebaran Biola dan mirip juga dengan Plot Sebaran Jitter, dimana plot tersebut menunjukkan distribusi dari variabel kuantitatif dengan memplot titik-titik dengan mengurangi bertumpukkan.
library(ggplot2) # untuk visualisasi
library(scales) # penskalaan infrastruktur
library(ggbeeswarm) # mengurangi tumpang tindih
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 diatas dibuat menggunakan fungsi geom_quasirandom. Karena plot ini lebih mudah dibaca dibandingkan dengan plot strip jitter sederhana.
Diagram Titik Cleveland
Plot Cleveland berguna dalam membandingkan statistik numerik yang besar dalam kelompok. Contoh dibawah ini, kita akan membandingkan angka harapan hidup tahun 2007 dalam negara-negara di Asia dengan menggunakan datase gapminder.
library(dplyr) # untuk manipulasi data
library(ggplot2) # untuk visualisasi
library(scales) # penskalaan infrastruktur
library(ggbeeswarm) # mengurangi tumpang tindih
library(gapminder) # untuk dataset `gapminder`
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())
Dapat kita lihat, negara Jepang memiliki angka harapan hidup yang paling tinggi, sedangkan negara Afghanistan yang paling rendah angka harapan hidupnya. Plot terakhir ini disebut dengan grafik lolipop.
Data Multivariat
Guna dari grafik multivariat adalah menampilkan hubungan antara tiga variabel atau lebih. Untuk menampung variabel, grafik data multivariat dibagi menjadi dua, yaitu : pengelompokan dan faceting.
Pengelompokan
Guna pengelompokan adalah untuk memplot data untuk beberapa grup dalam satu grafik. Kita akan menggunakan data set Salaries dan kita akan melihat 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")
Selanjutnya kita akan melihat jenis kelamin dari profressor, menggunakan bentuk titik untuk menentukan jenis kelamin (jika professor ini perempuan, maka bentuk titik nya lingkaran. Sedangkan professor laki-laki, maka bentuk titiknya adalah segitiga).
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")
Dibawah ini adalah grafik hubungan antar tahun sejak mendapat gelar Ph.D dan gaji menggunakan ukuran dari tiitk untuk menunjukkan masa kerja, dan ini yang disebut dengan 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")
Sebagai contoh terakhir, mari kita lihat yrs.since.phd vs. salary dan tambahkan warna dan garis kuadrat yang paling cocok pada jenis kelamin.
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",
y = "",
color = "Sex") +
scale_y_continuous(label = scales::dollar) +
scale_color_brewer(palette = "Set1") +
theme_minimal()Pembagian Faset (Faceting)
Guna dari grafik faceting adalah membagi faset, sebuah grafik terdiri dari beberapa plot-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 dari facet_wrap untuk membuat grafik terpisah dalam setiap tingkatan jabaran nya. Fungsi dari ncol adalah untuk mengatur jumlah kolom. Dibawah ini adalah cara menggunakan dua variabel untuk mendefinisikan faset.
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`.
Sekarang kita akan menggunakan plot Mean/SE dan membagi faset untuk membandingkan gaji-gaji dari professor pria dan wanita, dalam jabatan dan disiplin ilmu. Kita akan membedakan jenis kelamin dan pembagian faset dengan membedakan warna untuk membuat plot-plot jabatan berdasarkan kombinasi disiplin ilmu.
Dibawah ini adalah contoh terakhir, kita akan menggunakan dataset gapminder dalam package gapminder. Fungsi tema digunakan untuk menyederhanakan warna latar belakang, memutar teks sumbu x, dan memperkecil ukuran tulisan.
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")
Fungsi facet_grid(.~rank+dicipline) tidak menentukan variabel baris (.). Fungsi theme() untuk membuat tea hitam dan putih dan menghilangkan garis grid vertikal dan horizontal minor. Fungsi scale_color_brewer untuk mengubah skema warna untuk titik dan batang-batang kesalahan.
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")Referensi
- https://rpubs.com/dsiencelabs/asd13
- https://bookdown.org/BaktiSiregar/data-science-for-beginners/Visualization.html
- https://glints.com/id/lowongan/data-visualization-adalah/#.YZXbMGBBy5c
- https://www.geeksforgeeks.org/seaborn-sort-bars-in-barplot/
- https://pandas.pydata.org/
- https://matplotlib.org/
- https://seaborn.pydata.org/