Algoritma & Struktur Data
Visualisasi Data dengan R
| Kontak | : \(\downarrow\) |
| yeni.arwanti@student.matanauniversity.ac.id | |
| https://www.instagram.com/yeninawn/ | |
| RPubs | https://rpubs.com/yeninawn/ |
Pendahuluan
Visualisasi data merupakan tampilan grafis atau visual dari informasi dengan mengubah kumpulan data menjadi lebih sederhana untuk ditampilkan. Elemen visual yang digunakan akan mempermudah pembaca memahami tren, outliers, dan pola data. R dan python adalah platform luar biasa untuk analisis data, yang mampu membuat hampir semua jenis grafik. Namun, kali ini akan membahas ragam visualisasi yang paling populer dalam data science, dari plot paling sederhana sampai grafik yang siap dipublikasikan.Berfokus pada teknik visualisasi data Univariat, Bivariat, dan Multivariat.
Univariat (Satu Variabel)
Visualisasi data univariat digunakan melakukan distribusi data dari satu variabel. Variabel yang dimaksud dibagi menjadi dua bagian: a) Kategoris, seperti; jenis kelamin, ras, negara, kota, dll. b) Numerik, seperti; usia, berat badan, inflasi, suku bunga, dll.
Variabel Kategori
Distribusi suatu variabel kategori tunggal biasanya diplot dengan diagram batang, diagram lingkaran, atau diagram pohon.
Diagram Batang
Di bawah ini merupakan contoh frekuensi dataset Marriage. Distribusi peserta pernikahan berdasarkan zodiak akan menggunakan diagram batang.
library(ggplot2)
setwd("C:/Users/ASUS/OneDrive/Documents/ASD/ASD1")
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 = "light yellow",
color="azure4") +
theme_minimal() +
labs(x = "Zodiacs",
y= "Frekuency",
title = "Marriage Participants by Zodiacs") Diagram batang biru menggambarkan persentase dari jumlah. Kode aes(x=sign) merupakan jalan alternatif untuk aes(x=sign, y= ..count..) pada diagram batang zodiak, kemudian ..count.. merupakan variabel khusus yang menggambarkan frekuensi setiap kategori. Untuk dapat menghitung presentase, dapat menentukan variabel y dengan 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)Warna dapat ditentukan dengan nama (misalnya col=“red”) atau dengan triplet RGB Heksadesimal (seperti col = “#FFCC00”). Dapat juga menggunakan sistem warna lain, salah satunya dari package RcolorBrewer. Frekuensi dihitung secara eksplisit pada kode dibawah ini. Selanjutnya, fungsi reorder digunakan untuk mengurutkan kategori berdasarkan frekuensinya. Opsi stat = “identity” memberitahu fungsi plot untuk tidak menghitung jumlah, karena diberikan secara langsung.
library(dplyr)
library(ggplot2)
plotdata <- Marriage %>%
count(zodiacs)
ggplot(plotdata,
aes(x=reorder(zodiacs,n),
y = n)) +
geom_bar(stat="identity",
fill=rainbow(12),
color="azure4") +
theme_minimal() +
labs(x = "Zodiacs",
y="frekuensi",
title = "Sorting Categories") Berikut ini adalah kode untuk memberi label disetiap batang dengan nilai numeriknya:
library(dplyr)
library(ggplot2)
library(scales)
plotdata<-Marriage %>%
count(zodiacs) %>%
mutate(pct=n/sum(n),
pctlabel = paste0(round(pct*100),"%"))
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")Berikut ini memutar sumbu untuk menghindari label katogeri yang mungkin tumpang tindih:
library(ggplot2)
library(scales)
#memutar sumbu ,label batang dengan urutan yang 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) +
scale_y_continuous(labels = percent) +
theme_minimal() +
labs(x = "Zodiacs",
y = "PercentS",
title = "Overlapping Labels") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Mombolak-balikan sumbu x dan y :
library(ggplot2)
library(scales)
#plot batang dengan urutan yang menurun
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) +
theme_minimal() +
labs(x= "Zodiacs",
y = "Percents",
title = "Overlapping Labels") +
coord_flip()Diagram Pai
Diagram Pai memiliki fungsi membandingkan setiap kategori secara keseluruhan dan jumlah yang kategorinya sedikit. Dalam R, membuat diagram pai membutuhkan sedikit lebih banyak kode.
library(dplyr)
library(ggplot2)
library(scales)
#Menyiapkan 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("light yellow", "light pink", "light green", "light blue")
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 = "Marriage Participant By Race")Berikut ini merupakan diagram pai yang diberilubang ditengahnya yaitu diagram donat. Membuat lubang ditengah pada diagram pai adalah dengan menetapkan x=2 dan xlim = c(0.5, 2.5). Argumen width dalam fungsi geom_bar() tidak lagi diperlukan.
library(ggplot2) # Untuk Memvisualisasi Data
library(scales) # Menentukan jeda atau label secara otomatis
# Membuat lubang ditengah pada diagram pai (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 = "Marriage Participants By Race")Menambah label dan menghapus legend:
library(ggplot2)
library(scales)
# Menambahkan label percent
plotdata$percent <- paste0(plotdata$race, "\n",
round(plotdata$prop), "%")
# Persen pada 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 = percent), color = "black") +
scale_fill_manual(values = mycols) +
theme_void() +
xlim(0.5, 2.5) +
labs(title = "Marriage Participant by Percent")Peta Pohon
Peta pohon merupakan salah satu alternatif diagram pai, peta pohon juga dapat menyelesaikan variabel yang berkategori(memiliki banyak tingkatan).
#Memvisualisasikan
library(ggplot2)
library(treemapify)
#Menentukan jeda atau label secara otomatis
library(scales)
plotdata <- Marriage %>%
count(officialTitle)
ggplot(plotdata,
aes(fill = officialTitle,
area = n)) +
geom_treemap() +
labs(title = "Marriage Participants by Officiate")Berikut ini peta pohon 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
Variabel kontinu adalah variabel yang datanya dapat diperasikan secara amtematis. Variabel kuantitatif tunggal biasanya diplot dengan histogram, densitas kernel, atau plot titik.
library(ggplot2)
ggplot(Marriage,aes(x = age)) +
geom_histogram(fill = "Aquamarine",
color = "white",
bins = 20) +
theme_minimal() +
labs(title = "Marriage Participants by Age (Basic)", x = "Age")Pada Histogram diatas, kelompok usia 20-an mendominasi, kemudian disusul dengan kelompok 40-an, dan kelompok yang minoritas ada pada kelompok umur 60-an. Warna histogram dapat diubah dengan dua pilihan yaitu: a) fill = warna penuh untuk batang histogram b) color = warna batas pada batang histogram
Kemudian, di bawah ini lebar nampan diwakili batang, menggunakan bindwith
library(ggplot2)
library(scales)
ggplot(Marriage,
aes(x = age,
y = ..count.. / sum(..count..))) +
geom_histogram(fill = "Aquamarine",
color = "white",
binwith = 5) +
theme_minimal() +
labs(title = "Marriage Participants by Age (Alternative Bins and Bandwiths)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)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 = "Aquamarine",
color = "white",
binwith = 5) +
theme_minimal() +
labs(title = "Marriage Participants by Age (Percent)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)Plot Densitas Kernel
Kernel Density Plot merupakan cara lain untuk menampilkan histogram. Untuk memperkirakan fungsi densitas probabilitas dari variabel acak kontinu maka digunakan metode non parametrik. Umumnya memperhalus gambar histogram, dimana area di bawah kurva sama dengan satu.
library(ggplot2)
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "light blue") +
theme_minimal() +
labs(title ="Marriage Participants by Age") Sama seperti sebelumnya, kita dapat menggunakan fill & color untuk memberikan sentuhan warna pada isi dan batasnya.
Parameter Penghalusan
Parameter bandwith di sini merupakan parameter yang digunakan untuk menentukan tingkat kehalusan. Untuk menemukan nilai default pada variabel tertentu, maka gunakanlah fungsi bw.nrd0 . Nilai yang lebih besar akan menghasilkan penghalusan yang lebih banyak, sedangkan nilai yang lebih kecil akan menghasilkan penghalusan yang lebih sedikit.
library(ggplot2)
bw.nrd0(Marriage$age)## [1] 5.181946
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "bisque",
bw = 1) +
theme_minimal() +
labs(title = "Participants by Age",
subtitle = "bandwith = 1") Untuk melihat skor yang paling serin dan yang relatif jarang dapat dilihat di plot density kernel ini. Sulit untuk menjelaskan arti sumbu y kepada seorang non-ahli statistik.
Diagram Titik
Diagram titik merupakan salah satu alternatif lain untuk histogram. Variabel kuantitaif dibagi menjadi beberapa kelompok, kali ini tidak dalam bentuk batang, tetapi dalam bentuk titik-titik. Titik-titik ini lebar dan bertumpuk, setiap titik mewakili satu pengamatan. Terdapat opsi fill dan color dapat digunakan untuk menentukan warna isian dan batasan masing-masing titik.
library(ggplot2)
ggplot(Marriage, aes(x = age)) +
geom_dotplot(fill = "light blue",
color = "azure4",
binwidth = 2) +
theme_minimal() +
labs(title = "Participants by Age",
y = "Proportion",
x = "Age")Data Bivarat
Grafik bivarat terdapat hubungan dua variabel. Jenis grafik akan bergantung pada tingkat pengukuran dari variabel (kategorikan atau kuantitatif)
Kategorikal vs. Kategorikal
Diagram Batang Bertumpuk
Berikut ini merupakan plot hubungan antara kelas mobil dan jenis penggerak (roda depan, roda belakang, atau penggerak 4 roda) untuk mobil dalam dataset Fuel eceonomy.
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 kategorikedua secara berdampingan. Menggunakan opsi position = “single” untuk membuat plot batang yang dikelompokkan. Opsi tersebut hanya ada di versi pengembangan terbaru ggplot2, namun akan segera tersedia secara umum.
library(ggplot2)
ggplot(mpg, aes(x = class, fill = drv)) +
theme_minimal() + #Memakai tema minimal
geom_bar(position = position_dodge(preserve = "single"))Diagram batang Tersegmentasi
Diagram batang yang tersegmentasi merupakan plot batang yang bertumpuk di setiap batang mewakili 100%. Opsi position = “filled” dapat membuat diagram batang tersegmentasi. Plot ini berguna untuk membandingkan presentasi dari kategori dalam satu variabel di setiap tingkat variabel lain. Contohnya, proporsi mobil dengan penggerak roda depan (front-wheel) meningkat saat kita memindahkan dari mobil penumpang yang kecil, ke menengah, 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))
# 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)) +
theme_minimal() +
labs(y = "Percent",
fill = "Drive Train",
x = "Class",
title = "Automobile Drive by Class") +
theme_minimal()Dibawah ini merupakan opsi tambahan untuk meningkatkan warna dan pelabelan pada grafik: - factor : mengubah urutan dari kategori untuk variabel kelas dan urutan serta labels untuk variabel drive. - scale_y_continuous : mengubah label tanda centang pada sumbu y. - labs : menyediakan judul dan mengubah label untuk sumbu x dan y dan juga legend. - scale_fill_brewer : mengubah skema warna isian. - theme_minimal : menghapus latar belakang abu-abu dan mengubah warna kisi.
Plot Mosaik
Dalam diagram mosaik untuk mengkombinasikan level tertentu dapat menampilkan hubungan antara variabel kategorikal menggunakan persegi panjang yang luasnya mewakili proporsi kejadian. Warna ubin dapat menunjukkan tingkat hubungan antar variabel. Di sini package ggmosaic digunakan untuk membuat plot mosaik, direkomendasikan package vcd untuk gantinya.
# 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)
mosaic(tbl, main = "Titanic data")Ukuran lantai sama dengan presentase kasus dalam kombinasi tingkat itu. Lebih banyak penumpang yang tewas dibandingkan yang selamat. Penumpang yang tewas adalah penumpang laki-laki kelas 3 dan kru laki-laki(kelompok terbesar). Pada grafik di bawah ini, warna navy mewakilkan lebih banyak kasus dari yang diharapkan tidak terikat. Merah tua mewakili lebih sedikit kasus yang diharapkan jika berlaku tidak keterkaitan.
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 kita lihat lebih banyak kru laki-laki yang tewas, dan perempuan kelas 1, 2, dan 3 yang survived daripada yang diharapkan. Nmaun sebaliknya, bahkan lebih sedikit penumpang kelas 1 (laki-laki dan perempuan) meninggal daripada yang diperkirakan secara kebetulan.
Kontinu vs. Kontinu
Di sini ditampilka menggunakan plot sebaran dan grafik garis.
Plot Sebaran
Plot sebaran dibuat untuk mempelajari hubungan antara 2 variabel, sehingga disertai perhitungan yang berkoefisien dan korelasi. Pada umunya, plot sebaran dicoba untuk mengukur hubungan linear, namun jenis hubungan lain dapat diketahui menggunakan plot sebaran ini dan fungsinya terdiri dari menyesuaikan model, menjelaskan y dalam fungsi x.
library(ggplot2)
library(hrbrthemes)
library(dplyr)
# 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")Tampilan yang paling sederhana dari 2 variabel kuantitaif adalah plot sebaran, dengan setiap variabel diwakilkan oleh sumbu. Contohnya, menggunakan dataset salaries ,kita dapat memplot pengalaman ( yrs.since.phd) vs. gaji akademik (salary) dari 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 = "light blue",
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 = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary fir 2008-2009")Opsi geom_point dapat digunakan untuk mengubah - color = warna pink - size = ukuran titik - shape = bentuk titik - alpha = transparansi titik. Kisaran tranparansi dari 0 (transparan) hingga 1 (buram), dan merupakan parameter yang berguna saat beberapa titik mengalami tumpang tindih.
fungsi scale_x_continous dan scale_y_continous mengontrol penskalaan pada sumbu x dan y kita dapat menggunakan opsi dan fungsi ini untuk membuat plot sebaran yang lebih menarik.
Plot Sebaran Menggunakan Garis
Seringkali berguna untuk meringkas hubungan yang ditampilkan dalam plot sebaran, dengan menggunakan sebuah garis yang menyesuaikan. Banyak jenis garais yang didukung, termasuk linear polinomial, dan nonparametrik(loess). Garis-garis ini ditampilkan dengan batas kepercayaan 95%.
library(ggplot2)
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color = "light green") +
geom_smooth(method = "lm", color = "dark green") +
theme_minimal()+
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009") Gaji akan meningkat sesuai dengan pengalaman. Terdapat penurunan diujung kanan - profesor dengan pengalaman signifikankan, mendapatkan gaji lebih rendah. Garis lurus tidak dapat merangkap efek non-linear ini, Garis dengan lengkungan akan lebih pas di sini, Grais regresi polinomial memberika garis pas dengan bentuk
\[ \hat{y}=\beta_0+\beta_1x+\beta-2x^2+...+\beta_nx^2 \] Biasanya digunakan garis kuadrat (satu lengkungan), atau kubik (dua lengkungan). Penggunaan polinomial orde tinggi (>3) jarang diperlukan kesesuaian kuadrat ke data set gaji menghasilkan hasil sebagia berikut
library(ggplot2)
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color = "aquamarine") +
geom_smooth (method = "lm",
formula = y ~ poly(x,2),
color = "light yellow") +
theme_minimal() +
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009")Default di gggplot1 merupakan garis loess yang berarti penghalusan plot sebaran yang terimbang secara lokal.
library(ggplot2)
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color = "light green",
size = 2,
alpha = 1) +
geom_smooth(size = 1,
color = "light yellow") +
scale_y_continuous(label = scales::dollar,
limits = c(50000, 150000)) +
scale_x_continuous(breaks = seq(0,60,10),
limits = c(0,60)) +
theme_minimal() +
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009") +
theme_minimal()Kategorikal vs. Kontinu
Di sini terdapat banyak jenis grafik, termasuk diagram batang yang memakai ringkasan statistik, plot densitas kernel yang dikelompokkan, plot kotak berdampingan, plot biola berdampingan, plot mean/sem, plot garis punggungan, dan plot Cleveland.
Diagram Batang (Ringkasan Statistik)
Disini ini ditampilkan diagram batang yang menunjukkan ringkasan statistik lainnya (mean atau median) dalam variabel kuantitatif untuk setiap tingkatan dari variabel kategorikal. Di bawah ini terdapat grafik yang menampilkan gaji rata-rata untuk sampel profesor universitas berdasarkan jabatan akademiknya.
library(dplyr)
library(ggplot2)
library(scales)
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("light yellow", "light blue", "light green")
ggplot(plotdata,
aes(x = factor(rank,
labels = c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")),
y = mean_salary)) +
geom_bar(stat = "identity",
fill = mycols) +
scale_y_continuous(breaks = seq(0, 130000, 20000),
label = dollar) +
theme_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 dalam satu grafik dilapisi dengan membandingkan kelompok pada variabel numerik. Di bawah ini plot distribusi gaju berdasarkan jabatan menggunakan 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 membuat plot densitas menjadi sebagian transparan sehingga kita dapat melihat apa yang terjadi di bagian yang tumpang tindih. Nilai alpha berkisar 0 (transparan) hingga 1 (buram). Di atas menjelaskan bahwa gaji meningkat sesuai jabatan tetapi, jumlah gaji untuk full profesor sangat banyak.
Boxplot
Boxplot atau kotak plot memperlihatkan persentil ke-25, median, dan persentil ke-75 dari ditribusi. Garis vertikal menampilkan sekitar 99% dari distribusi normal, dan pengamatan di luar kisaran ini diplot sebagai titik yang mewakili perincian.
Boxplot yang berdampingan sangat berguna untuk membandingkan kelompok (tingkatan variabel kategori) dalam variabel numerik. Boxplot menampilkan metode perkiraan untuk visualisasi pada kelompok berbeda. Jika takik dari kedua kelompok tumpang tindihmaka ada bukti (kepercayaan 95%) bahwa median dari kedua kelompok berbeda.
mycols <- c("light pink", "light yellow", "light green")
ggplot(Salaries, aes(x = rank,
y = salary)) +
geom_boxplot(notch = TRUE,
fill = mycols,
alpha = .7) +
theme_minimal() +
labs(tile = "Salary Distribution by rank") Jika dilihat, ketiga kelompok di atas berbeda. Keuntungan dari boxplot yaitu lebar biasanya tidak berarti. Hal itu memungkinkan kita membandingkan distribusi dari banyak kelompok dalam satu grafik.
Plot Biola
Plot Biola mirip dengan plot densitas kernel tetapi dicerminkan dan diputar \[ 90^0 \]. Di bawah ini plot distribusi gaju 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 disebut juga plot kegembiraan. Plot garis punggung menampilkan distribusi variabel kuantitatif untuk beberapa kelompok. Sama dengan plot densitas kernel dari segi vertikal atau faceting. Nmaun memakan lebih sedikit ruang. Plot garis punggung dengan package ggridges.
Di bawah ini menggunakan data Fuel Economy, plot perjalanan kota per galon berdasarkan kelas mobil.
library(dplyr)
library(ggplot2)
library(ggridges)
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") Menyembunyikan legend di sini sebab itu berlebihan pada distribusi yang sudah diberi label pada sumbu y. Truk pikup memiliki jarak tempuh paling rendah, mobil subkompak dan kompak cenderung mencapai peringkat. Namun, ada rentang skor jarak tempuh yang sangat luas untuk mobil-mobil kecil ini. Dengan menggunakan geom_density_ridges(alpha = n) dapat menambahkan transparansi jika tumpang tindihnya parah. n berkisar dari 0 (transparan) hingga 1(buram).
Plot Garis
Plot rata-rata dengan batang kesalahan merupakan metode yang popular untuk membandingkan kelompok pada variabel numerik.
library(dplyr)
library(ggplot2)
library(ggridges)
# 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))
# 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 strip digunakan dalam plot distribusi gaji berdasarkan jabatan. Plot strip ini juga disebut plot sebar satu dimensi.
library(ggplot2)
library(scales)
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 (yang tidak diperlukan di sini).
Menggabungkan Jitter dan Plot Kotak
Mungkin lebih mudah untuk memvisualisasikan distribusi jika kita menambahkan plot kotak ke plot jitter. Beberapa pilihan ditambahkan utnuk membuat plot ini.
- Untuk plot kotak :
- size = 1 membuat garis menjadi lebih tebal
- outlier.color = “black” membuat pencilan berwarna hitam
- outlier.size =3 meningkatkan ukuran dari pencilan
- Untuk jitter
- alpha = 0.5 membuat titik-titik menjadi lebih transparan
- width = .2 mengurangi jumlah jitter (4 adalah default)
sumbu x dan y dibalik menggunakn funsgi coord_flip (yaitu grafik diputar pada sisinya)
library(ggplot2)
library(scales)
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()Di bawah ini membuat plot kotak hibrida-setengah plot kotak, setengah sebaran dengan memerhatikan fungsi geom_boxjitter dalam package ggpol.
library(ggplot2)
library(scales)
library(ggpol)
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 plot sebaran biola yang mirip dengan plot sebaran jitter. Plot ini menampilkan distribusi dari variabel kuantitatif dengan memplot titik-titik dengan cara mengurnagi tumpang tindih. Kemudian juga membantu menampilkan densitas dari data di setiap titik dengan cara irip seperti plot biola.
library(ggplot2)
library(scales)
library(ggbeeswarm)
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 dibuat menggunakan fungsi geom_quasirandom. Plot kawanan lebah lebih mudah dibaca dibandingkan plot strip jitter sederhana.
Diagram Titik Cleveland
Plot Cleveland berfungsi untuk membandingkan statistik numerik untuk sejumlah besar kelompok. Contohnya ketika ingin membandingkan angka harapan hidup tahun 2007 untuk negara Asia maka menggunakan data set gapminder .
library(dplyr)
library(ggplot2)
library(scales)
library(ggbeeswarm)
library(gapminder)
data(gapminder, packgace = "gapminder")
# subset negara-negara Asia tahun 2007
plotdata <- gapminder %>%
filter(continent == "Asia" &
year == 2007)
# Plot Cleveland yang menarik
ggplot(plotdata,
aes(x = lifeExp,
y = reorder(country, lifeExp))) +
geom_point(color = "light blue",
size = 2) +
geom_segment(aes(x = 40,
xend = lifeExp,
y = reorder(country, lifeExp),
yend = reorder(country, lifeExp)),
color = "azure3") +
labs(x = "Life Expentancy (years)",
y = "",
title = "Life Expentancy by Country",
subtitle = "GapMinder data for Asia - 2007") +
theme_minimal() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())Data Multivarat
Data multivarat merupakan teknik atau metode dalam analisis statistik yang banyak digunakan dalam penelitian kuantitaif yang melibatkan banyak variabel.
Pengelompokan
Di pengelompokan, nilai dari dua variabel dipeta menjadi sumbu x dan y selanjtnya, variabel tambahan dipetakan ke karakteristik visual lainnya seperti warna, bentuk, ukuran, jenis garis, dan transparansi. Hubungan antara yrs.since.phd dan salary dapat menggunakan data set Salaries .
library (carData)
library(ggplot2)
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, menambahkan jenis kelamin professor menggunakan bentuk titik untuk menunjukkan jenis kelamin. Lalu, meningkatkan ukuran titik dan menambahkn transparansi untuk memperjelas titik individual,
library(carData)
library(ggplot2)
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")Berikut ini merupakan contoh membuat grafik hubungan antar tahun sejak Ph.D dan gaju menggunakan ukuran dan titik untuk menunjukkan masa kerja (disebut plot gelembung)
library(carData)
library(ggplot2)
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") Adanya asisten profesor dalam jangkauan 0-11 tahun sejak ph.D dan 0-10 tahun layanan. Para profesional tentu berpengalaman tidak hanya di tingkat asisten profesor yang mana mereka mungkin juga dipromosikan atau keluar dari universitas. Di bawah ini merupakan contoh menambahkan jenis kelamin menggunakan warna dan garis kuadrat yang paling cocol dengan yrs.since.phd vs salary .
library(carData)
library(ggplot2)
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)
Faceting sendiri merupakan istilah dari ggplot1 untuk kelipatan kecil dari suatu visualisasi. Ide dari faceting adalah membagi plot menjadi beberapa bagian.
library(carData)
library(ggplot2)
ggplot(Salaries, aes(x = salary)) +
geom_histogram(fill = "light pink",
color = "white") +
facet_wrap(~rank, ncol =1) +
theme_minimal() +
labs(title = "Salary histogram by rank") Fungsi facet_wrap yaitu membuat grafik terpisah untuk setiap tingkat jabaran. Opsi ncol mengatur jumlah kolom. Contoh selanjutnya akan menggunakan dua variabel untuk mendefinisikan faset. Fungsi menetapkan jenis kelamin ke baris dan jabatan ke kolom, membuat matriks enam plot dalam satu grafik.
library(carData)
library(ggplot2)
ggplot(Salaries, aes(x = salary / 1000)) +
geom_histogram(color = "white",
fill = "light pink") +
facet_grid(sex~rank) +
theme_minimal() +
labs(title = "Salary histogram by sex and rank",
x = "Salary ($1000")Kemudian, menggunakan warna untuk membedakan jenis kelamin dan pembagian faset untuk membuat plot-plot jabatan berdasarkan kombinasi disiplin ilmu.
library(carData)
library(ggplot2)
library(dplyr)
# 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))
# 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+discipline) tidak menentikan variabel baris () dan kolom yang ditentukan oleh kombinasi jabatan dan disiplin ilmu.
- Fungsi theme() membuat tema hitam dan putih dan menghikangkan garis grid vertikal dan garis grid horizontal minor
- Fungsi scale_color_brewer() mengubah skema warna untuk titik dan batang-batang kesalahan
Berikut ini merupakan contoh dataset baru dan memplot perubahan dalam harapan hidup dari waktu ke waktu untuk negara Asia. Data itu asalanya dari dataset gapminder dalam package gapminder. setiap negara muncul dalam fasetnya sendiri. Fungsi tema digunakan untuk menyederhanakan warna latar belakang, memutar sumbu x dan memperkecil ukuran tulisan.
library(gapminder)
library(ggplot2)
library(dplyr)
# memplot harapan hidup berdasarkan tahun secara terpisah
# untuk setiap negara 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 = "light pink") +
facet_wrap(~country) +
theme_minimal(base_size = 9) +
theme(axis.text.x = element_text(angle = 45,
hjust = 1)) +
labs(title = "Changes in Life Expentancy",
x = "Year",
y = "Life Expentancy")