Algoritma & Struktur Data

Visualisasi Data dengan R


Kontak : \(\downarrow\)
Email :
Instagram : https://www.instagram.com/dhelaasf/
RPubs : https://rpubs.com/dhelaasafiani/
NIM : 20214920009
Prodi : Statistika Bisnis 2021

Visualisasi data adalah memroses suatu informasi atau data dan mejadikannya ke dalam bentuk data berbentuk visual. Dengan kita melakukan visualisasi data, data akan lebiih terlihat rapih dan terstruktur. Contoh bentuk visual data yaitu seperti dalam bentuk bagan, grafik, dan peta. Manfaat dari visualisasi adalah supaya lebih mudah mengetahui dan mengerti serta mencerna suatu data informasi. Visualisai data juga merupakan cara untuk menjelaskan suatu data informasi dengan menarik dan praktis. Data berbentuk visual juga tidak membuat kita bosan ketika membacanya.

R dan Pyhton adalah suatu platform yang sangat luar biasa dalam pendataan. Akan tetapi, kali ini kita akan lebih fokus pada visualisasi data dengan R. Kita akan lebih fokus pada teknik visualisasi data Univariat, BIvariat, dan Multivariat.

Univariat (Satu Variabel)

Visualisasi data univariat adalah proses visualisasi distribusi data terhadap 1 variabel yang memiliki tujuan untuk mengetahui karakteristik dari variabel tersebut.

Variabel tersebut dibagi menjadi 2 bagian, yaitu:

  • Kategoris : Jenis kelamin, ras, kota, negara, golongan darah, dan lain-lain.
  • Numerik : Usia, anak keberapa, pendapatan, angka kelahiran, dan lain-lain.

Variabel kategori

Dalam melakukan visualisasi data berbentuk tunggal, biasanya dibuat dalam bentuk diagram batang, diagram lingkaran, serta diagram pohon.

Diagram Batang

Disini saya akan menjelaskan bagaimana cara membuat diagram batang menggunakan packages ggplot2. ggplot digunakan untuk membuat data berbentuk visual untuk mempresentasikan data numerik ataupun kategorik yang terkadang disertai warna, simbol, dan ukuran. Pada contoh kali ini, kita ambil contoh dari dataset Marriage untuk menampilkan distribusi perserta pernikahan berdasarkan zodiacs.

library(ggplot2)                                           # panggil ggplot2 untuk visualisasi data
setwd("C:/Users/hp/Desktop/")                              # 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)) +                       # menggunakann aes untuk memplot distribusi dari variabel x = zodiacs
  geom_bar(fill = "cornflowerblue", 
           color = "azure4") +                             # mengganti warna
  theme_minimal() +                                        # menggunakan tema minimal
  labs(x = "Zodiacs",                                      # mengganti nama label dan judul
       y = "Freq", 
       title = "Marriage Participants by Zodiacs")

aes digunakan untuk mengatur variabel-variabel dalam data yang ingin dipetakan dalam plot. Kode aes adalah jalan pintas dari aes(x = sign, y = ...count...) dimana ...count... variabel khusus yang menggambarkan frekuensi pada setiap kategori.

library(ggplot2)                                           # untuk visualisasi data
ggplot(Marriage, aes(x = zodiacs)) +
  geom_bar(fill = rainbow(12), 
           color = "azure4") +
  theme_minimal() +                                        # menggunakan tema minimal
  labs(x = "Zodiacs", 
       y = "Percent", 
       title = "Marriage Participants in Percent") +
  scale_y_continuous(labels = scales::percent)             # menambah simbol % pada label

Pada R, kita bisa memakai warna pada grafik visual yang kita buat dengan menggunakan col = "purple" atau dengan triplet RGB heksadesimal seperti col = "FFCC00". Kita juga bisa menggunakan RColorBrewer Palette dan juga bisa menggunakan wesanderson palettes.


Pada contoh kali ini, kita akan membuat diagaram batang yang datanya terurut. Reorder digunakan untuk mengurutkan data berdasarkan frekuensi nya. Sedangkan fungsi stat = "identity" digunakan untuk memberitahu fungsi plot untuk tidak menghitung jumlah, karena mereka diberikan secara langsung.

library(dplyr)                                             # memanggil dplyr untuk memanipulasi data
library(ggplot2)
plotdata <- Marriage %>%                                   # memuat dataset
  count(zodiacs)                                           # jumlah peserta disetiap '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 = "Freq", 
   title = "Sorting Categories")

JIka kita ingin menambahkan label pada batang berdasarkan numeriknya, kita bisa menggunakan cara sebagai berikut:

library(scales)                                           # menentukan jeda atau label secara otomatis
plotdata <- Marriage %>%
  count(zodiacs) %>%
  mutate(pct = n / sum(n),
         pctlabel = paste0(round(pct*100), "%"))          # menggunakan fungsi mutate
# 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
  labs(x = "Zodiacs", 
       y = "Percent", 
       title = "Labelling Bars") +
  scale_y_continuous(labels = percent)

Ketika kita membuat suatu grafik data dan terjadi tumpang tindih pada setiap label kategori nya, kita dapat menggunakan cara sebagai berikut dengan memutar label sumbu menggunakan angle.

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), "%"))

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() +                                        # menggunakan tema minimal
  labs(x = "Zodiacs", 
       y = "Percent", 
       title = "Overlapping Labels") +
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) # angle digunakan untuk memutar label sumbu pada label kategori

Cara lainnya, kita dapat membalik sumbu x dan sumbu y. cara ini menggunakan fungsi coord_flip

library(ggplot2)                              # untuk visualisasi data
library(scales)   

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() +                          # menggunakan tema minimal
   labs(x = "Zodiacs", 
        y = "Percent", 
        title = "Overlapping Labels") +
   coord_flip()

Diagram Pai

Diagram Pie atau bisa disebut juga diagram lingkaran bersifat kontroversial pada statistik. Jika kita ingin melihat dan membandingkan frekuensi pada data statistik, lebih baik kita menggunakan diagram batang. Akan tetapi, jika kita ingin membandingkan kategori secara keseluruhan dan jumlah kategori nya kecil, lebih baik kita menggunakan diagram pai. Berikut adalah cara untuk membuat diagram pie

plotdata <- Marriage %>%
  count(race) %>%
  arrange(desc(race)) %>%
  mutate(prop = round(n*100/sum(n),1),
         lab.ypos = cumsum(prop) - 0.5*prop)

mycols <- colors()[c(28, 367, 47, 34)]
ggplot(plotdata,
       aes(x = "",
           y = prop,
           fill = race)) +
  geom_bar(width = 1, stat = "identity", color = "black") +
  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 width dalam fungsi geom_bar tidak diperlukan dalam 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")

Jika ingin lebih tampak bagus lagi dengan menambahkan label, dapat menggunakan code seperti berikut

plotdata$percent <- paste0(plotdata$race, "\n",
                           round(plotdata$prop), "%")

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

Berbeda dengan diagram pie, Peta Pohon dapat digunakan untuk menangani variabel yang memiliki banyak tingkatan.

library(treemapify)                                   # panggil packages treemapify untuk membuat peta pohon
plotdata <- Marriage %>%
  count(officialTitle)
ggplot(plotdata,
       aes(fill = officialTitle,
           area = n)) +
  geom_treemap() +
  labs(title = "Marriage Participants by Officiate")

Ketika kita ingin menambahkan label pada peta pohon, dapat melakukan cara berikut

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

Dalam contoh kali ini, kita akan melakukan plot Age/Usia peserta pada dataset Marriage.

ggplot(Marriage, aes(x = age)) +
  geom_histogram(fill = "springgreen3",
                 color = "black", bins = 20) +
  theme_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 : mewarnai isi batang.
  • color : mewarnai garis sekitar batang.

Cara lain yang terakhir adalah menggunakan binwidth, lebar nampan yang diwakili oleh batang.

ggplot(Marriage,
       aes(x = age,
           y = ..count.. / sum(..count..))) +
  geom_histogram(fill = "springgreen3",
                 color = "black",
                 binwidth = 5) +
  theme_minimal() +
  labs(title = "Marriage Participants by Age (Alternative Bins and BinWidths)",
       x = "Age",
       y = "Percent") +
  scale_y_continuous(labels = percent)

Plot Densitas Kernel

Metode kernel ini dikembangkan dari kelemahan histogram yaitu pendugaan yang terbentuk tidak halus, tergantung pada ukuran lebar pita dan tergantung pada titik awal interval. Plot densitas kernel ini hanya menggambar histogram yang diperhalus, dimana area dibawah kurva sama dengan satu.

ggplot(Marriage, aes(x = age)) +
  geom_density(fill = "cadetblue2",
               color = "white") +
  theme_minimal() +
  labs(title = "Marriage Participants by Age")

Grafik menunjukkan distribusi pada nilai. Dari contoh ini, perbandingan antara kasus 20 dan 40 tahun akan diwakili oleh area di bawah kurva antara 20 dan 40 pada sumbu x.

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 = "gold1",
               color = "white",
               bw = 1) +
  theme_minimal() +
  labs(title = "Participants by Age",
       subtitle = "bandwidth = 1")

Plot ini dapat memudahkan kita dalam menjelaskan skor mana yang paling sering dan skor mana yang paling jarang.

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.

ggplot(Marriage, aes(x = age)) +
  geom_dotplot(fill = "firebrick2",
               color = "black",
               binwidth = 2) +
  theme_minimal() +
  labs(title = "Participants by Age",
       y = "Proportion",
       x = "Age")

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

Mari kita gambarkan hubungan antara kelas mobil dan tipe penggerak (penggerak roda depan, roda belakang, atau roda 4) untuk mobil dalam dataset Fuel Economy

mpg$drv <- factor(mpg$drv,
                  levels = c("f", "r", "4"),
                  labels = c("front-wheel", "rear-wheel", "4-wheel"))

ggplot(mpg,
       aes(x = class,
           fill = drv))+
  geom_bar(position = "fill") +
  theme_minimal() +
  labs(y = "Proportion")

Diagram Batang Yang Dikelompokkan

Dalam membuat diagram batang yang dikelompokkan, dapat menggunakan opsi position = single.

library(ggplot2)
ggplot(mpg,
       aes(x = class,
           fill = drv))+
  geom_bar(position = position_dodge(preserve = "single")) +
  theme_minimal()

Diagram Batang Tersegmentasi

Plot batang yang tersegmentasi merupakan plot batang yang bertumpuk di mana setiap batang mewakili 100 persen. Kita dapat membuat diagram batang tersegmentasi dengan opsi - “filled”. Jenis plot ini sangat berguna jika tujuannya adalah untuk membandingkan persentasi dari kategori dalam satu variabel di setiap tingkat 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))
# 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 = "Set3") +
  theme_minimal() +                                  # menggunakan tema minimal
  labs(y = "Percent",
       fill = "Drive Train",
       x = "Class",
       title = "Automobile Drive by Class") +
  theme_minimal()

Note : Berikut opsi tambahan di bawah ini untuk meningkatkan pewarnaan dan pelabelan pada diagram.

  • factor Mengubah urutan kategori untuk kelas variabel serta urutan labels untuk variabel drive
  • scale_y_continuous Mengubah label tanda centang pada sumbu y
  • labs Mengubah judul dan label pada sumbu x dan y dan juga legenda
  • scale_fill_brewer Mengubah skema warna isian
  • theme_minimal Menghapus latar belakang abu-abu dan mengubah warna kisi

Plot Mosaik

Diagram mosaik dapat menampilkan hubungan antara variabel kategorikal menggunakan persegi panjang yang luasnya mewakili proporsi kejadian untuk kombinasi level tertentu. Warna ubin juga dapat menunjukkan tingkat hubungan antar variabel. Kali ini kita akan menggunakan packages vcd

# 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 ubin sebanding dengan persentase kasus dalam kombinasi tingkat tersebut. Dalam hal ini banyak penumpang yang tewas daripada yang selamat. Mereka yang tewas adalah penumpang laki- laki kelas 3 dan kru laki-laki (kelompok yang terbesar). Jika kita mengasumsikan bahwa ketiga variabel ini tidak bergantung, kita dapat memeriksa residual dari model dan memberi bayangan pada ubin agar sesuai. Pada grafik di bawah, biru gelap mewakilkan lebih banyak kasus dari yang diharapkan tidak terikat. Merah tua mewakili lebih sedikit kasus dari yang diharapkan jika berlaku tidak terikat.

mosaic(tbl, 
       shade = TRUE,
       legend = TRUE,
       labeling_args = list(set_varnames = c(Sex = "Gender",
                                             Survived = "Survived",
                                             Class = "Passenger Class")),
       set_labels = list(Survived = c("No", "Yes"),
                         Class = c("1st", "2nd", "3rd", "Crew"),
                         Sex = c("F", "M")),
       main = "Titanic data")

Kita dapat melihat bahwa Class, Gender dan Survival tidak terikat.

Kontinu Vs. Kontinu

Biasanya ditampilkan dalam bentuk plot sebaran dan grafik garis.

Plot Sebaran

Dibuat untuk mempelajari hubungan antara 2 variabel. Sering disertai dengan perhitungan koefisien korelasi, yang biasanya mencoba untuk mengukur hubungan linear. Namun jenis hubungan lain dapat dideteksi menggunakan plot sebaran, dan tugas umum terdiri dari menyesuaikan model yang menjelaskan Y dalam fungsi X. Berikut adalah beberapa pola yang dapat Anda deteksi dengan melakukan plot sebaran.

library(ggplot2)                                   # visualisasi data
library(hrbrthemes)                                # untuk tema `theme_ipsum()` dan legend
# Membuat data
d1 <- data.frame(x=seq(1,100), 
                 y=rnorm(100), 
                 name="No trend")
d2 <- d1 %>% 
mutate(y=x*10 + rnorm(100,sd=60)) %>%
mutate(name="Linear relationship")
d3 <- d1 %>%
mutate(y=x^2 + rnorm(100,sd=140)) %>%
mutate(name="Square")
d4 <- data.frame( x=seq(1,10,0.1), 
                  y=sin(seq(1,10,0.1)) + 
                    rnorm(91,sd=0.6)) %>% 
mutate(name="Sin")
don <- do.call(rbind, list(d1, d2, d3, d4))
# Plot
don %>%
  ggplot(aes(x=x, y=y)) +
    geom_point(color="#69b3a2", alpha=0.8) +
    theme_ipsum() +
    facet_wrap(~name, scale="free")

Contoh : dengan menggunakan dataset Salaries untuk membuat plot sebaran dengan menampilkan variabel pengalaman (yrs.since.phd) vs gaji akademik (salary) dari Profesor 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")


Plot Sebaran Menyesuaikan Garis

Seringkali berguna untuk meringkas hubungan yang ditampilkan dalam plot sebaran, dengan menggunakan sebuah garis yang menyesuaikan. Banyak jenis garis yang didukung, termasuk linear, polinomial, dan nonparametrik (loess). Secara default, garis-garis ini ditamplikan 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")

Berdasarkan grafik di atas, gaji akan meningkat sesuai dengan pengalaman. Namun, terdapat penurunan pada sebelah kanan.

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 kesesuaian nonparametik yang diperhalus sering kali dapat memberikan gambaran yang baik tentang hubungan tersebut. default di ggplot2 adalah garis loess yang berarti 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()

Kategorikal Vs. Kontinu

Ketika memplot hubungan antara variabel kategorikal dan variabel kuantitatif, tersedia banyak jenis grafik. ini termasuk diagram batang yang menggunakan 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)

Di bagian sebelumnya, diagram batang digunakan untuk menampilkan jumlah kejadian berdasarkan kategori untuk variabel tunggal atau untuk dua variabel. Anda juga dapat menggunakan diagram batang untuk menampilkan ringkasan statistik lainnya (seperti mean atau median) pada variabel kuantitatif untsetiap tingkatan dari variabel kategorikal.

Sebagai contoh, grafik berikut ini menampilkan gaji rata-rata untuk sampel profesor universitas tas berdasarkan jabatan akademk 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 Karnel yang Dikelompokkan

Seseorang dapat membandingkan kelompok data pada variabel numerik dengan melapiskan plot densitas karnel dalam satu grafik.

ggplot(Salaries, 
       aes(x = salary, 
           fill = rank)) +
  geom_density(alpha = 0.4) +
  theme_minimal() +
  labs(title = "Salary distribution by rank")

Boxplot

Dalam statistika deskriptif, diagram kotak garis atau boxplot adalah metode grafis untuk menggambarkan kumpulan data numerik berdasarkan nilai kuartilnya.

Dalam contoh kali ini, mari kita plot distribusi gaji berdasarkan jabatan menggunakan plot kotak.

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 di atas, kita akan mudah membandingkan ketiga boxplot. Keuntungan dari boxplot adalah lebar dari kotak tidak mempengaruhi. Hal ini akan memudahkan kita dalam membandingkan distribusi dan banyak kelompok yang ada

Plot Biola

Plot biola hanyalah histogram (atau lebih sering varian yang dihaluskan seperti kepadatan kernel) diputar di sisinya dan dicerminkan.

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 (juga disebut plot kegembiraan) menampilkan distribusi variabel kuantitatif untuk beberapa kelompok. Mereka mirip dengan plot densitas kernel dari segi (faceting) vertikal, tetapi memakan lebih sedikit ruang. Plot garis punggung dibuat dengan package ggridges

Menggunakan data set Fuel economy, mari 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")

Plot Garis

Di bagian ini, kita akan plot rata-rata dan kesalahan standar. Secara teknis, ini bukan bivariat karena kita memplot jabatan, jenis kelamin, dan gaji, tetapi itu terlihat cocok disini.

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))
# 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 adalah plot sebar sumbu tunggal yang digunakan untuk memvisualisasikan distribusi banyak nilai satu dimensi individu. Sayangnya, pencetakan titik yang berlebihan membuat interpretasinya menjadi sulit. Akan lebih mudah ketika kita membandingkan kelompok dengan 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 menyembunyikan legend.

MEnggabungkan Jitter dan Plot Kotak

Mungkin akan lebih mudah memvisualisasikan distribusi jika kita menambahkan boxplot ke jitter plot.

  • Untuk boxplot / plot kotak:
    • size = 1 : untuk menebalkan garis
    • outlier.color = "black" : membuat pencilan berwarna hitam
    • outlier.shape = 2 : menentukan lingkaran untuk pencilan
    • outlier.size = 3 : menambah ukuran outlier
  • Untuk jitter plot:
    • alpha = 0.5 : membuat titik-titik menjadi lebih transparan
    • width = .2 : menurunkan jitter (.4 adalah nilai jitter default)

Sumbu x dan y kita putar posisi menggunakan fungsi coord_flip pada langkah akhir.

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()

Fungsi geom_boxjitter pada packages ggpol digunakan untuk membuat plot kotak/boxplot hibrida - setengah plot kotak, stengah 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 menampilkan distribusi variabel kuantitatif dengan memplot titik dengan cara mengurangi tumpang tindih. Selain itu, mereka juga membantu menampilkan kepadatan data di setiap titik (dengan cara yang mirip dengan plot biola).

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 dibuat menggunakan fungsi geom_quasirandom Plot ini dapat lebih mudah dibaca daripada plot strip jitter sederhana. Untuk mempelajari lebih lanjut mengenai plot ini, lihat Plot bergaya kawanan lebah dengan ggplot2.

Diagram Titik Cleveland

Diagram Titik Cleveland Plot Cleveland berguna ketika Anda ingin membandingkan statistik numerik untuk sejumlah besar kelompok. Misalnya, Anda ingin membandingkan harapan hidup tahun 2007 untuk negara Asia menggunakan 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` 
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 = "#D55E00") +
  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())

Data Multivariat

Grafik Multivariat menampilkan hubungan antara tiga variabel atau lebih. Ada dua metode umum untuk menampung variabel pengelompokan dan faceting.

Pengelompokkan

Dalam pengelompokan, nilai dari dua variabel pertama dipetakan ke sumbu x dan y. Kemudian variabel tambahan dipetakan ke karakteristik visual lainnya seperti warna, bentuk, ukuran, jenis garis, dan transparansi. Pengelompokan memungkinkan Anda untuk memplot data untuk beberapa grup dalam satu grafik. Dengan menggunakan data set Salaries, mari kita tampilkan 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")

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 = "Paired") +
   theme_minimal()

Pembagian Faset (Facetting)

Pengelompokan memungkinkan Anda untuk memplot beberapa variabel dalam satu grafik, menggunakan karakteristik visual seperti, warna, bentuk, dan ukuran. Dalam pembagian faset, sebuah grafik terdiri dari beberapa plot-plot terpisah atau kelipatan kecil, satu untuk setiap tingkatan dari variabel ketiga, atau kombinasi variabel. Ini akan lebih mudah dipahami dengan sebuah contoh.

library(carData)              # Untuk Dataset
library(ggplot2)              # Untuk Visualisasi
ggplot(Salaries, aes(x = salary)) +
   geom_histogram(fill = "#afa100", 
                  color = "black") +
   facet_wrap(~rank, ncol = 1) +
   theme_minimal() +
   labs(title = "Salary Histograms by Rank")


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 = "black", 
                  fill = "tomato1") +
   facet_grid(sex ~ rank) +
   theme_minimal() +
   labs(title = "Salary Histograms by Sex and Rank", 
        x = "Salary ($1000)")


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))

# 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 = "Dark2")


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="black") + 
   geom_point (color="red") +
   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")