Algoritma & Struktur Data

Tugas Algoritma dan Struktur Data ke-6


Kontak : \(\downarrow\)
Email
Instagram https://www.instagram.com/dsciencelabs/
RPubs https://rpubs.com/dsciencelabs/

Visualisasi Data

pengertian visualisasi data
Visualisasi data merupakan teknik dalam suatu proses pengambilan informasi dari data dalam konteks visual(bagan, grafik, dan peta) serta dapat membuat data besar dan kecil lebih mudah dipahami dan membuatnya lebih andal untuk mendeteksi pola, tren dan outlier dalam kelompok data seperti pada platform software R dan Phyton untuk menganalisis data, yang mampu membuat hampir jenis grafi dengan mudah.

Univariat (Satu Variabel)

Visualisasi data univariat biasanya digunakan untuk melakukan distribusi data dari satu variabel, seperti :
- Kategoris : jenis kelamin, ras, negara, kota, dll.
- Numerik : usia, berat badan, inflasi, suku bunga, dll.

Variabel Kategori

Digunakan untuk melakukan distribusi data kemudian di plot menggunakan diagram batang, diagram lingkaran (pie) dan diagram pohon.

Diagram Batang

Berikut contoh yang menunjukkan frekuensi dari dataset ‘Marriage’ dan menggunakan diagram batang untuk menampilkan distribusi peserta pernikahan berdasarkan ‘zodiak’

library(ggplot2)
setwd("C:\\Users\\HP\\OneDrive\\Documents\\tugas algo 6\\input")
menikah <- read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv")
ggplot(menikah, aes(x= zodiacs)) +
  geom_bar(fill = "cornflowerblue",
           color= "azure4") +
  theme_linedraw()+
  labs(x= "zodiacs",
       y= "frequency",
       title= "marriage participants bt zodiacs")

Dari diagram batang di atas dapat menggambarkan persentase dari jumlah frekuensi dari tiap zodiak.
- kode ‘aes(x=sign)’ = jalan pintas untuk ’aes(x=sign, y= ..count..)
- ..count.. = variabel khusus yang menggambarkan frekuensi dari setiap kategori.

Dapat juga menggunakan ini untuk menghitung persentase dengan menentukan variabel y secara eksplisit.

library(ggplot2)     
ggplot(menikah,
  aes(x = zodiacs,
        y = ..count.. / sum(..count..))) +
  geom_bar(fill = rainbow(12), color= "azure4") +
  theme_linedraw() +                                    #menggunakan theme linebraw
  labs(x = "zodiacs",
       y = "percent",
       title = "marriage participants in percent") +
  scale_y_continuous(labels = scales::percent)

Catatan: Dalam R, warna dapat ditentukan dengan nama (misal col= "black") atau dengan tiplet RGB heksadesimal (misal col= #F0D09828) dan dapat menggunakan sistem warna lain seperti RcolorBrewer.

Terkadang, untuk melihat data yang memiliki persentase/ frekuensi yang kecil sering kali membantu untuk memudahkan mencari data.Fungsi ‘reorder’ digunakan untuk mengurutkan kategori berdasarkan frekuensinya.

library(dplyr)     # untuk manipulasi data
library(ggplot2)   # untuk visualisasi

plotdata <- menikah %>%
  count(zodiacs)
ggplot(plotdata,
       aes(x = reorder(zodiacs,n),
           y = n)) +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color = "black") +         # menggunakan color black di tepi doagram batang
  theme_linedraw() +                  # menggunakan theme linebraw
  labs(x = "zodiacs",
       y = "frequenzy",
       title = "sorting categories")

Jika ingin membrikan label pada setiap batang dapat menggunakan :

library(dplyr)     # untuk manipulasi data
library(ggplot2)   # untuk visualisasi
library(scales)    # menentukan jeda atau label secara otomatis

plotdata <- menikah %>%
  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 = "black") +
  geom_text(aes(label =  pctlabel),
            vjust = -0.25) +
  theme_gray() +                          # menggunakan theme gray
  scale_y_continuous(labels = percent) +
  labs(x = "zodiacs",
       y = "percent",
       title = "labeling bars")

Dari doagram diatas, label kategori mungkin tumpang tindih, jadi dapat memutar label sumbu seperti :

library(ggplot2)   # untuk visualisasi
library(scales)    # menentukan jeda atau label secara otomatis

ggplot(plotdata,
       aes(x = reorder(zodiacs, - pct),
           y = pct)) +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color = "black") +
  geom_text(aes(label = pctlabel),
            vjust = -0.25) +
  scale_y_continuous(labels = percent) +
  theme_gray() +
  labs(x = "zodiacs",
       y = "percent",
       title = "overlapping labels") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

cara lainnya untuk mengatasi situasi dengan membalik sumbu x dan y.

library(ggplot2)   # untuk visualisasi
library(scales)    # menentukan jeda atau label secara otomatis

ggplot(plotdata,
       aes(x = reorder(zodiacs, - pct),
           y = pct)) +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color = "black") +
  geom_text(aes(label = pctlabel),
            hjust = -0.10) +
  scale_y_continuous(labels = percent) +
  theme_gray() +
  labs(x = "zodiacs",
       y = "percent",
       title = "overlapping labels") +
  coord_flip()

Diagram Pai

Diagram pai atau diagram lingkaran digunakan untuk membandingkan frekuensi dengan jumlah yang kategorinya kecil. Diagram pai juga dogunakan untuk membandingkan setiap kategori secara keseluruhan.

Dalam diagram pai, digunakan sedikit lebih banyak kode untuk membuat digram pai lebih menarik di R.
Berikut contoh :

library(dplyr)    
library(ggplot2)   
library(scales)    

plotdata <- menikah %>% 
  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("#509BE4", "#E35BE5", "#FFF600", "#B5C891")
ggplot(plotdata, aes(x = "", y = prop, fill = race)) +
  geom_bar(width = 2, stat = "identity", color = "black") +
  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 participants by race")

Diagram diatas merupakan bentuk diagram paling sederhana. satu-satunya perbedaan antara kode diagram pai adalah dengan menetapkan x = 2 dan xlim = c(0.5, 2.5) untuk membuat lubang di dalam diagram pai dan juga argumen width dalam fungsi geom_bar tidak lagi diperlukan.

library(ggplot2)   # untuk visualisasi
library(scales)    # menentukan jeda atau label secara otomatis

# membuat diagram donat

ggplot(plotdata, aes(x = 2, y = prop, fill = race)) +
  geom_bar(stat = "identity", color = "black") +
  coord_polar("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")

Dapat juga menambahkan label dengan cara :

library(ggplot2)   # untuk visualisasi
library(scales)    # menentukan jeda atau label secara otomatis

# menambahkan 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 = "black") +
  coord_polar("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 participants by race")

Peta Pohon

Peta pohon merupakan bentuk alternatif dari diagram pai. Peta pohon dapat menangani variabel kategotikal yang memiliki banyak tingkatan.

library(ggplot2)      # untuk visualisasi
library(treemapify)   # untuk visualisasi
library(scales)       # menentukan jeda atau label secara otomatis

plotdata <- menikah %>%
  count(officialTitle)
ggplot(plotdata,
       aes(fill =  officialTitle,
           area = n)) +
  geom_treemap() +
  labs(title = "marriage participant by Officiate")

Dapat juga menambahkan label seperti :

ggplot(plotdata,
       aes(fill = officialTitle,
           area = n,
           label = officialTitle)) +
  geom_treemap() +
  geom_treemap_text(colour = "black",
                    place= "centre") +
  labs(title = "marriage participants by Officeate") +
  theme(legend.position = "none")

Variabel Kontinu

Distribusi variabel kuantitatif tunggal biasanya diplot dengan histogram, plot densitas kernel atau plot titik.

Histogram

dari data menikah dapat diplot data usia dari peserta pernikahan.

library(ggplot2)                                       # untuk visualisasi
ggplot(menikah,aes(x = age)) +
  geom_histogram(fill = "cornflowerblue",
                 color = "black",                      # batas batang memakai warna hitam
                 bins = 20) + 
  theme_gray() +
  labs(title = "marriage participants by age(Basic)",
       x="age")

Dari data di atas, dapat disimpulkan bahwa usia peserta paling banyak berusia 20-an tahun dan usia peserta paling sedikit berusia 60-70 an tahun.

Warna histogram dapat diganti dengan menggunakan dua opsi :
- fill : warna isi untuk batang
- color : warna batas disekitar batang
Ada cara lain dengan menggunakan ‘bandwidth’, lebar nampan yang diwakili oleh batang.

library(ggplot2)
library(scales)

ggplot(menikah,
       aes(x = age,
           y = ..count.. / sum(..count..))) +
  geom_histogram(fill = "cornflowerblue",
                 color = "black",
                 binwidth = 5) +
  theme_minimal() +
  labs(title = "marriage participants by age(alternative binds and bandwifths)",
       x = "age",
       y = "percent") +
  scale_y_continuous(labels = percent)

Seperti diagram batang, sumbu y dapat mewakili jumlah atau persen dari total.

library(ggplot2)      # untuk visualisasi
library(scales)       # menentukan jeda atau label secara otomatis

ggplot(menikah,
       aes(x = age,
           y = ..count.. / sum(..count..))) +
  geom_histogram(fill = "cornflowerblue",
                 color = "black",
                 binwidth = 5) +
  theme_gray() +                                # menggunakan tema gray
  labs(title = "marriage participants by age(percent)",
       y = "percent",
       x = "age") +
  scale_y_continuous(labels = percent)

Plot Densitas Kernel

Plot densitas kernel merupakan sebuah bentuk alternatif dari histogram. Menggambar histogram yang diperhalus dimana area di bawah kurva sama dengan satu.

library(ggplot2)                                   # untuk visualisasi
ggplot(menikah, aes(x = age)) +
  geom_density(fill = "yellow",
               color = "black") +                  # menambahkan color black sebagai batasan
  theme_bw() +                                     # menggunakan tema bw
  labs(title = "marriage participants by age")

Grafik menunjukkan distribusi dari nilai. Seperti diagram sebelumnya, kita dapat menggunakam ‘fill’ dan ‘color’ untuk menentukan warna isian dan batasannya.

Parameter Penghalusan (smooting)

Tingkat kehalusan dikontrol oleh parameter bandwitdh ‘bw’
Fungsi ‘bw.nrd0’ digunakan untuk menemukan nilai default untuk variabel tertentu.

nilai yang lebih besar > pengalusan lebih banyak ,br> nilai yang lebih kecil < penghalusan lebih sedikit.

library(ggplot2)             # untuk vosualisasi
bw.nrd0(menikah$age)
## [1] 5.181946
ggplot(menikah, aes(x = age)) +
  geom_density(fill = "deepskyblue",
               bw = 1) +
  theme_minimal() +
  labs(title = "participants by age",
       subtitle = "bandwidth = 1")

Plot densitas kernel memungkinkan anda dengan mudah melihat skor mana yang paling sering dan mana yang relatif jarang.

Diagram Titik

Diagram titik merupakan alternatif lain untuk histogram.Opsi ‘fill’ dan ‘color’ dapat digunakan untuk menentukan warna isian dan batasan masing-masing titik.

library(ggplot2)
ggplot(menikah, aes(x = age)) +
  geom_dotplot(fill = "#FC5046",
               color = "black",
               binwidth = 2) +
  theme_classic() +
  labs(title = "participants by age",
       y = "propotion",
       x = "age")

Data Bivariat

Grafik bivariat menunjukkan hubungan antar dua variabel. Jenis grafik akan tergantung pada tingkat pengukuran dari variabel (kategorikan atau kuantitatif).

Kategorikal v.s Kategorikal

Diagram Batang Bertumpuk

Berikut contoh hubungan antar kelas mobil dan jenis penggerak (roda depan, roda belakang, atau penggerak 4 roda) untuk mobil dalam dataset fuel economy.

library(ggplot2)                # untuk visualisasi
mpg$drv <- factor(mpg$drv,
                  levels = c("f", "r", "4"),
                  labels = c("front-wheel", "rear-wheal", "4-wheal"))

# membuat diagram batang bertumpuk
ggplot(mpg,
       aes(x = class,
           fill = drv)) +
  geom_bar(position = "fill") +
  theme_light() +
  labs(y = "propotion")

Diagram Batang yang dikelompokkan

Diagram batang yang dikelompokkan untuk variabel kategori kedua secara berdampingan.
Fungsi ‘position = “single”’ digunakan untuk membuat plot batang yang dikelompokkan.

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

Diagram Batang Tersegmentasi

Plot batang yang tersegmentasi merupakan plot yang bertumpuk di mana setiap batang mewakili 100 persen.
Fungsi ‘position = “filled”’ digunakan untuk membuat diagram batang tersegmentasi. Fungsi ini sangat berguna karena untuk membandingkan persentasi dari kategori dalam satu variabel di setiap tingkat variabel lain.

library(dplyr)
library(ggplot2)
library(scales)

# membuat ringkasan dataset
plotdata <- mpg %>%
  group_by(class, drv) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))

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.55)) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  labs(y = "percent",
       fill = "drive train",
       x = "class",
       title = "automobile drive by class") +
  theme_minimal()

Catatan: dapat menggunakan opsi tambahan untuk meningkatkan warna dan pelabelan.
Keterangan:
- factor : mengubah urutan dari kategori untuk variabel kelas dan urutan serta ‘labels’ untuk variabel drive
- scale_y_continuous : mengubah label tanda centang sumbu y
- labs : menhyediakan 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

Diagram mosaik dapat menampilkan hubungan antara variabel kategorikal menggunakan pesergi panjang yang luasnya mewakili proporsi kejadian untuk kombinasi level tertentu. berikut contoh dari hubungan antar ketiga variabel kategorikal (sex, class, survival) pada Titanic data.

tabel <- xtabs(Freq ~ Survived + Class + Sex, Titanic)
ftable(tabel)
##                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(tabel, main = "Titanic Data")

Bisa dilihat dari plot di atas, lebih banyak penumpang yang tewas (laki-laki kelas 3 dan kru laki-laki) daripada yang selamat.
Jika diasumsikan bahwa ketiga variabel ini tidak bergantung, maka dapat diperiksa residual dari model dan memberi bayangan pada ubin agar sesuai.

mosaic(tabel,
       shade = TRUE,
       legend = TRUE,
       labelin_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"),
                         main = "Titanis data"))

Keterangan:
- Biru gelap mewakilkan lebih banyak kasus dari yang diharapkan tidak terikat.
- Merah tua mewakilkan lebih sedikit kasus dari yang diharapkan jika berlaku tidak terikat.
- Class, gender dan survival adalah tidak terikat

Kontinu v.s Kontinu

Hubungan antar dua variabel kuantitatif biasanya ditampilkan menggunakan plot sebaran dan grafik garis.

Plot Sebaran

Plot sebaran dibuat untuk hubungan antar dua variabel sehingga sering disertai dengan perhitungan koefisien korelasi. Berikut beberapa pola yang dapat dilakukan plot sebaran.

library(ggplot2)
library(hrbrthemes)

# membuat data

data1 <- data.frame(x = seq(1,100),
                    y = rnorm(100),
                    name = "no trend")

data2 <- data1 %>%
  mutate(y = x*10 + rnorm(100, sd=60)) %>%
  mutate(name = "linear relationship")

data3 <- data1 %>%
  mutate(y = x^2 + rnorm(100, sd=140)) %>%
  mutate(name="square")

data4 <- 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(data1, data2, data3, data4))

# membuat plot
don%>%
  ggplot(aes(x=x, y=y)) +
  geom_point(color = "blue", alpha=0.8) +
  theme_ipsum() +
  facet_wrap(~name, scale= "free")

Tampilan yang paling sederhana dari dua variabel kuantitatif adalah plot sebaran, dengan setiap variabel diwakilkan oleh sumbu. Contohnya, menggunakan dataset salaries, kita dapat memplot pengalaman (yrs.since.phd) v.s 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 = "darkblue",
             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 v.s salary",
        subtitle = "9-month salary for 2008-2009")

Catatan: geom_point digunakan untuk mengubah
- color : warna titik
- size : ukuran titik
- shape : bentuk titik
- alpha : transparansi titik.

Fungsi scale_x_continuous dan scale_y_continuous mengontrol perskalaan pada sumbu x dan y.

Plot Sebaran Menyesuaikan Garis

Banyak jenis garis yang bisa digunakan pada plot sebaran seperti linear, polinomial dan non-parametrik(loess), Secara default, garis-garis ini ditampilkan dengan batas kepercayaan 95%.

library(ggplot2)
ggplot(Salaries,
       aes(x = yrs.since.phd,
           y = salary)) +
  geom_point(color = "darkblue") +
  geom_smooth(method = "lm", color = "brown1") +
  theme_light() +
  labs(x = "years since phD",
       y = "",
       title = "experience v.s salary",
       subtitle = "9-month salary 2008-2009")

Dilihat dari plot di atas, jelas bahwa gaji akan meningkat sesuai dengan pengalaman. Namun, tampaknya ada penurunan diujung kanan - profesor dengan pengalaman signifikan, mendapatkan gaji lebih rendah. Garis lurus tidak dapat merangkap efek non-linear ini. Garis dengan lengkungan akan lebih pas disini.

Garis regresi polinomial membrirkan garis pas dengan bentuk \[ŷ=β_0+β_1x+β-2x^2+…+β_nx^2\] Digunakan garis kuadrat(satu lemgkungan), atau kublik (dua lengkungan). Penggunaan polinomial orde tinggi jarang diperlukan. menerapkan kesesuaian kuadrat ke data set gaji menghasilkan hasil sebagai berikut.

library(ggplot2)
ggplot(Salaries,
       aes(x = yrs.since.phd,
           y = salary)) +
  geom_point(color = "darkblue") +
  geom_smooth(method = "lm",
              formula = y ~ poly(x, 2),
              color = "yellow") +
  theme_light() +
  labs(x = "years since phD",
       y = "",
       title = "experience v.s salary",
       subtitle = "9-month salary for 2008-2009")

Garis kesesuaian non-parametrik yang diperhalus seting kali memberikan gambaran yang baik tentang hubungan tersebut. Default di ggplot2 adalah garis loess yang berarti penghalusan plot sebaran yang tertimbang secara lokal.

library(ggplot2)
ggplot(Salaries,
       aes(x = yrs.since.phd,
           y = salary)) +
  geom_point(color = "yellow",
             size = 2,
             alpha = 1) +
  geom_smooth(size = 1,
              color = "red") +
  scale_y_continuous(label = scales::dollar,
                     limits = c(50000, 250000)) +
  scale_x_continuous(breaks = seq(0,60,10),
                     limits = c(0,60)) +
  theme_light() +
  labs(x = "years since phD",
       y = "",
       title = "experience v.s salary",
       subtitle = "9-month salary for 2008-2009") +
  theme_light()

Kategorikal v.s Kontinu

termasuk diagram batang yang menggunakan ringkasan sgtatsitik, plot identitas kernel yang dikelompokkan, plot kotak berdampingan, plot biola berdampingan, plot mean/sem, plot garis penggungan dan plot cleveland.

Diagram Batang(ringkasan statistik)

Selain digunakan untuk menampilkan jumlah kejadian berdasarkan kategori untuk variabel tunggal atau untuk dua variabel, diagram batang juga dapat digunakan untuk menampilkan ringkasan satatistik lainnya (seperti mean atau median) pada variabel kuantitatif untuk setiap tingkatan dari variabel ketegorikal.

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("#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_light() +
  labs(title = "emean salary by rank",
       subtitle = "9-month academic salary for 2008-2009",
       x = "",
       y = "")

Plot Densitas kernel yang Dikelompokkan

berikut plot distribusi gaji 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")

Boxplot

Boxplot menampilkan persentil ke-25, median, dan persentil ke-75 dari distribusi. Garis vertikal menangkap sekitar 99% dari distribusi normal, dan pengamatan di luar kisaran ini diplot sebagai titik yang mewakili pencilan.

mycols <- c("#CD534CFF", "#EFC000FF", "#0073C2FF")
ggplot(Salaries, aes(x = rank,
                     y = salary)) +
  geom_boxplot(notch = TRUE,
               fill = mycols,
               alpha = 0.7) +
  theme_minimal() +
  labs(title = "salary distribution by rank")

Plot Biola

Plot Biola mirip dengan plot densitas kernel, tetapi dicerminkan dan diputar \[90\]. Berikut contoh distribusi gaji berdasarkan jabatan menggunakan plot biola.

library(ggplot2)
ggplot(Salaries,
       aes(x = rank,
           y = salary)) +
  geom_violin(fill = "azure1") +
  geom_boxplot(width = .2,
               fill = mycols,
               outliner.color = "red",
               outlier.size = 2) +
  theme_minimal() +
  labs(title = "salary distribution by rank")

Plot Garis Punggung

Plot garis punggung bisa juga disebut sebagai plot kegembiraan yang menampilkan distribusi variabel kuantitatif untuk beberapa kelompok.
Plot garis punggung mirip dengan plot desintas kernel dari segi faceting/vertikal.
Plot garis punggung dibuat dengan package ggridges

Berikut contoh dari plot mil perjalanan kogta per galon menurut 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")

dari plot di atas, kemungkinan tumpang tindih distribusi adalah dipustuskan lebih kepada grafik mobil kompak.
Fungsi geom_density_ridges(aplha = n) digunakan untuk transparansi jika terjadi tumpang tindingnya parah.

Plot Garis

Pada plot garis akan memplot rata-rata dan kesalahan standar. Berikut contoh untuk membandingkan gaji terhadap jabatan dan jenis kelamin.

library(dplyr)
library(ggplot2)
library(ggridges)

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") +
  labs(title = "mean salary by rank and sex",
       subtitle = "(mean +/- standard error)",
       x = "",
       y = "",
       color = "gender")

Plot Strip

Hubungan antara variabel pengelompokkan dan variabel numerik dapagt ditampilkan dengan plot sebaran. Sayangnya, pencetakan titik yang berlebihan membuat interpretasinya menjadi sulit. Hubungannya lebih mudah dilihat jika titik-titiknya goyah. Berikut contoh plot distribusi gaji berdasarkan jabatan menggunakan plot strip.

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 2008-2009",
       x = "",
       u = "") +
  theme_minimal() +
  theme(legend.position = "none")

Opsi legend>position = "none" digunakan untuk menyembunyikan legend.
Plot jitter bekerja dengan baik ketika jumlah dan titik-titik tidak terlalu besar.

Menggabungkan Jitter dan Plot Kotak

Untuk memvisualisasikan distribusi dengan mudah, dapat menambahkan plot kotak ke plot jitter.

- Untuk plot kotak :
* size = 1 -> membuat garis menjadi lebih tebal
* outlier.color = “black” -> membuat pencilan berwarna hitam
* outlier.shape = 1 -> menentukan lingkaran untuk penvilan
* outlier.size = 3 -> meningkatkan ukuran dari pencilan

- untuk jitter :
* alpha = 0.5 -> membuat titik-tiik mennjadi lebih transparan
* witdh = .2 -> mengurangi jumlah jitter (.4 adalah default)


sumbu x dan y dibalik menggunakan fungsi coord_flip

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 2008-2009",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "none") +
  coord_flip()

Supaya tampilan lebih baik, menggunakan fungsi geom_boxjitter yang disediakan dalam package ggpol. Ini membuat plot kotak hibrida - setengah plot kotak, setengah plot sebaran.

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",
                 error.draw = TRUE) +
  scale_y_continuous(label = dollar) +
  labs(title = "academic salary by rank",
       subtitle = "9-month salary 2008-2009",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "none")

Plot kawanan Lebah

Plot kawanan lebah mirip dengan plot sebaran jitter, dimana plot tersebut menampilkan distribusi dari variabel kuantitatif dengan memplot titik-titik dengan cara mengurangi tumpang tindih.

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 2008-2009",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "none")

plot di atas dibuat menggunakan fungsi geom_quasirandom dan lebih mudah dibaca daripada plot strip jitter sederhana.

Diagram Titik Cleveland

diagram titik cleveland digunakan untuk membandingkan statistik numerik untuk sejumlah besar kelompok. Berikut contoh membandingkan harapan hidup tahun 2007 untuk negara Asia menggunakan data set gapminder.

library(dplyr)
library(ggplot2)
library(scales)
library(ggbeeswarm)
library(gapminder)
data(gapminder, package = "gapminder")

# subset negara-negara Asian tahun 2007

library(dplyr)
plotdata <- gapminder %>%
  filter(continent == "Asia" &
           year == 2007)

# plot cleveland
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 Expentacy (years)",
       y = "",
       title = "life expentacy 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. Pada multivariat, terdapat dua metode umum yaitu pengelompokkan dan faceting.

Pengelompokkan

Pengelompokkan memungkinkan untuk memplot data untuk beberapa grup dalam satu grafik dimana nilai dari dua variabel pertama dipertakan ke sumbu x dan y.

Dengan menggunakan data set Salaries bisa menghubungkan dantara yrs.since.phd dan salary.

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

Selanjutnya, tambaahkan jenis kelamin profesor menggunakan bentuk titik untuk menunjukkan jenis kelamin.Meningkatkan ukuran titik dan menambahkan 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")

Ada perbedaan antara menentukan nilai konstan (seperti size = 3) dan pemetaan variabel untuk karakterikstik visual. Pemetaan selalu ditempatkan di dalam fungsi aes, sedangkan penetapan nilai konstanta selalu muncul di luar fungsi aes.

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

Ada hubungan positif yang kuat anatra tahun-tahun sejak ph.D dan tahun layanan dimana asisten professor ada dalam jangkauan 0-11 tahun sejak Ph.D dan 0-10 tahun layanan.

Contoh terakhir untuk melihat yrs.since.phd v.s salaey dan tambahan jenis kelamin menggunakan warna dan bgaris kuadrat yang paling cocok.

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

Dalam pembagian faset, sebuah grafik terdiri dari beberapa plot-plot terpisah atau kelipatan kecil, satu untuk setiap tingkatan dari variabel ketiga, atau kombinasi variabel.

library(carData)
library(ggplot2)
ggplot(Salaries, aes(x = salary)) +
  geom_histogram(fill = "cornflowerblue",
                 color = "white") +
  facet_wrap(~rank, ncol = 1) +
  theme_minimal() +
  labs(title = "salary histograms by rank")

Fungsi facet_wrap membuat grafik terpisah untuk setiap tingkat jabaran.
Opsi ncol mengatur jumlah kolom.

Contoh berikut akan menggunakan dua variabel untuk mendefinisikan faset.

library(carData)
library(ggplot2)
ggplot(Salaries, aes(x = salary / 1000)) +
  geom_histogram(color = "white",
                 fill = "cornflowerblue") +
  facet_grid(sex ~ rank) +
  theme_minimal() +
  labs(title = "salary histograms by rank",
       x = "salary($1000)")

Dapat juga mengkombinasi pengelompokkan dan pembagian faset dengan menggunakan Plot Mean/SE dan pembagian faset untuk membandingkan gaji-gaji dari profesor pria dan wanita dalam jabatan dan disiplin ilmu.

library(carData)
library(ggplot2)
library(dplyr)

# menghitung rata-rata dan kesalagan 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 untuk disipilin 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 standart errors)") +
  scale_color_brewer(palette = "Set1")

Pernyataan facet_grid(. ~ rank+discipline) ridak menentukan variabel baris(.) dan kolom yang ditentukan oleh kombinasi jabatan dan disiplin ilmu.

Fungsi theme() membuat tema hitam dan putih dan menhilangkan garis gris vertikal dan garis grid hotizontal minor.

Fungsi scale_color_brewer() mengubah skema warna untuk titik dan batang-batang kesalahan.


Contoh terakhir dataset baru dan memplot perubahan dalam harapan hidu[ dari waktu ke waktu untuk negara-negara di Asia. Data tersebut dari dataset gapminder dalam package gapminder.

library(gapminder)
library(ggplot2)
library(dplyr)

# 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 haraoan hidup berdasarkan tahun, untuk setiap negara

ggplot(plotdata, aes(x = year, y = lifeExp)) +
  geom_line(color = "grey") +
  geom_point(colot = "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 expentancy")