Algoritma & Struktur Data

visualisasi data


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

Biodata

Nama = Alicia Arifin

Prodi = Statistika Bisnis

NIM = 20214920001

Visualisasi Data

Visualisasi data adalah teknik mengambil informasi dari data ke dalam bentuk visual yang bisa dilihat oleh mata, seperti bagan, grafik, dan peta. Visualisasi data dibuat untuk memahami data yang besar atau kecil dengan mudah.

R dan Python merupakan platform yang hampir bisa menganalisis semua jenis grafik.

Univariat (Satu Variabel)

biasanya digunakan untuk melakukan distribusi data dari suatu variabel.

variabel tersebut dibagi menjadi 2= 1. Kategoris = tidak bisa dihitung 2. Numerik = bisa dihitung

Variabel Kategori

Variabel kategori biasanya divisualisasikan dalam bentuk diagram batang, lingkaran, arau pohon.

Diagram Batang

contoh dengan frekuensi dari dara set Marrige, dengan package mosaicData. distribusi berdasarkan Zodiak

library(ggplot2)
setwd("C:/Users/arifi/Documents/Kuliah/sems 1/algoritma dan struktur data/file")

Marrige <- read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv")

ggplot(Marrige, aes(x= zodiacs)) +
  geom_bar(fill = "cornflowerblue",
           color= "azure4") +         # mengganti warna
  theme_minimal()+                    # menggunakan tema minimal
  labs(x = "Zodiacs",                 # label x,y dan judul
       y = "Frequency",
       title = "Marrige Participants by Zodiacs")

kode aes(x=sign) biasanya merupakan jalan pintas untuk aes(x = sign, y = …count…), di mana ..count.. adlah variabel khusus yang menggambarkan frekuensi dari setiap kategori. x dalam situasi ini menggambarkan persentase dari jumlah, dengan menentukan variabel y secara eksplisit.

library(ggplot2)
ggplot(Marrige,
   aes(x = zodiacs,
       y = ..count.. / sum(..count..))) +
  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)    # menambahkan simbol % untuk label y

Catatan = dalam R warna dapat ditentukan dengan nama ( col = “red” ) atau dengan triplet RGB heksadesimal( col = “#FFCC00” ). Kita juga bisa menggunakan sistem warna lain, seperti diambil dari package RColorBrewer.

Mengurutkan batang berdasarkan frekuensi sering kali membantu. Pada kode di bawah ini, frekuensi dihitung secara eksplisit. Kemudian fungsi reorder digunakan untuk mengurutkan kategori berdasarkan frekuensi. Opsi stat=“identity” memberitahu fungsi plot untuk tidak menghitung jumlah, karena mereka diberikan secara langsung.

library(dplyr)
library(ggplot2)
plotdata <- Marrige %>%        # memuat dataset
  count(zodiacs)               

# menyusun plot batang secara meningkat
ggplot(plotdata,
       aes(x = reorder(zodiacs,n),
           y = n)) +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color= "azure4") +
  theme_minimal()+
  labs(x = "Zodiacs",
       y = "Frecuency",
   title = "Sorting Categories")

Jika Anda mungkin ingin memberi label untuk setiap batang dengan nilai numberiknyan ikut kode berikut =

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

plotdata <- Marrige %>%
  count(zodiacs) %>%
  mutate(pct = n / sum(n),
         pctlabel = paste0(round(pct*100), "%"))

# plot batang sebagai persentase, dalam urutan manurun dengan label batang
ggplot(plotdata,
       aes(x = reorder(zodiacs, -pct),
           y = pct))  +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color= "azure4") +
  geom_text(aes(label = pctlabel),
            vjust = -0.25) +
  theme_minimal() +                       # menggunakan tema minimal
  scale_y_continuous(labels = percent) +
  labs(x = "Zodiacs",
       y = "Percent",
       title = "Labeling Bars")

Terkadang label kategori mungkin tumpang tindih, ini sangat mengganggu bukan? Jadi, Anda dapat memutar label sumbu

library(ggplot2)
library(scales)

# memplot batang sebagai persentase, dalam urutan menurun dengan label batang
ggplot(plotdata,
       aes(x = reorder(zodiacs,-pct),
           y = pct)) +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color= "azure4") +
  geom_text(aes(label = pctlabel),
            vjust = -0.25) +
  scale_y_continuous(labels = percent) +
  theme_minimal()+
  labs(x = "Zodiacs",
       y = "Percent",
       title = "Overlapping Labels") +
  theme(axis.text.x = element_text(angle=45, hjust = 1))

Cara lainnya, kita dapat menangani situasi ini dengan membalik sumbu x dan y.

library(ggplot2)
library(scales)

# memplot batang sebagai persentase, dalam urutan menurun dengan label batang
ggplot(plotdata,
       aes(x = reorder(zodiacs,-pct),
           y = pct)) +
  geom_bar(stat = "identity",
           fill = rainbow(12),
           color= "azure4") +
  geom_text(aes(label = pctlabel),
            hjust = -0.10) +
  scale_y_continuous(labels = percent) +
  theme_minimal()+
  labs(x = "Zodiacs",
       y = "Percent",
       title = "Overlapping Labels") +
  coord_flip()

Diagram Pie

Diagram pie biasnaya digunakan untuk membandingkan frekuensi dari kategori secara keseluruhan.

Diperlukannya sedikit lebih banyak kode untuk membuat diagram pie lebih menarik di R.

contoh diagram pie sederhana dengan ggplot2

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

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

#buat diagram pie
mycols = c("#0073C2FF", "#EFC000FF", "#868686FF", "#CD534CFF")

ggplot(plotdata, aes(x="", y= prop, fill=race))+
  geom_bar(width=1, stat="identity", color="white") +
  coord_polar("y", start = 0) +
  geom_text(aes(y= lab.ypos,label =prop), color="white")+
  scale_fill_manual(values = mycols)+
  theme_void()+
  labs(title = "Marriage Participants by Race")

Diagram donat hanyalah diagram pie dengan libang di dalamnya. satu-satunya perbedaan dengan coding yang di atas adalah dengan x = 2 dan xlim = c(0.5, 2.5). selain itu, argumen width dalam fungsi geom_bar() tidak lagi perlukan.

library(ggplot2)
library(scales)

#buat diagram donut
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")

Ayuk kita berkreasi dan tambahkan label, sambil menghapus legend.

library(ggplot2)
library(scales)

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

# buat diagram donut dalam persen
# bedanya pada geom_text(label=percent) dari (label=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

alternatif dari diagram pie. peta pohon dapat menangani variabel kategorical yang memiliki banyak tingkatan.

library(ggplot2)
library(treemapify)
library(scales)

plotdata <- Marrige %>%
  count(officialTitle)

ggplot(plotdata,
       aes(fill = officialTitle,
           area = n)) +
  geom_treemap()+
  labs(title = "Marriage Participants by Officiate")

Berikut dengan versi yang lebih berguna dengan label

ggplot(plotdata,
       aes(fill = officialTitle,
           area = n,
           label= officialTitle)) +
  geom_treemap()+
  geom_treemap_text(color="white",
                    place="centre")+
  labs(title = "Marriage Participants by Officiate")+
  theme(legend.position = "none")

Variabel Kontinu

biasanya ada histogram, plot densitas kernel atau plot titik

Histogram

dari data marriage, kita visualisasikan usia dari usia pernikahan.

library(ggplot2)
ggplot(Marrige,aes(x= age))+
  geom_histogram(fill = "cornflowerblue",
                 color="white",
                 bins = 20)+
  theme_minimal()+
  labs(title = "Marriage participants by age(Basic)",
       x="Age")

Warna histogram bisa diganti menggunakan 2 opsi, fill (warna isi batang) dan color (warna batas di sekitar batang).

Ada cara lain dengan menggunakan banwidth, lebar nampan yang diwakili oleh batang.

library(ggplot2)
library(scales)

ggplot(Marrige,
       aes(x= age,
           y= ..count.. /sum(..count..)))+
  geom_histogram(fill = "cornflowerblue",
                 color="white",
                 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)
library(scales)

ggplot(Marrige,
       aes(x= age,
           y= ..count.. /sum(..count..)))+
  geom_histogram(fill = "cornflowerblue",
                 color="white",
                 binwidth =5)+
  theme_minimal()+
  labs(title = "Marriage participants by age(Percent)",
       x="Age",
       y= "Percent")+
  scale_y_continuous(labels = percent)

Plot Densitas Kernel

Histogram yang diperhalus.

library(ggplot2)
ggplot(Marrige,
       aes(x = age)) +
  geom_density(fill="indianred3")+
  theme_minimal()+
  labs(title = "Marriage Participants by age")

Grafik menunjukkan distribusi dari nilai. Sebagai contoh, perbandingan kasus antara 20 dan 40 tahun akan diwakili oleh area di bawah kurva antara 20 dan 40 pada sumbu x. Seperti diagram sebelumnya, kita juga dapat menggunakan fill dan color untuk menentukan warna isian dan batasannya.

Parameter Penghalusan (Smoothing)

Tingkat kehalusan-> bandwidth bw.

Menemukan nilai default untuk variabel tertentu, gunakan fungsi bw.nrd0. nilai lebih besar -> lebih halus

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

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

Diagram Titik

alternatif histogram -> diagram titik. Opsi fill dan color dapat digunakan untuk menentukan warna isian dan batasan masing-masing titik.

library(ggplot2)
ggplot(Marrige, aes(x = age)) +
  geom_dotplot(fill = "gold", 
               color = "azure4",
               binwidth = 2) +
  theme_minimal() +
  labs(title = "Participants by age",
       y = "Proportion",
       x = "Age")

Data Bivariat

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

Kategorikal vs. Kategorikal

membandingkan antara data kategorical dan kategorical (tidak bisa dihitung).

Diagram Batang Bertumpuk

Mari kita plot hubungan antara 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-wheel", "4-wheel"))

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

Diagram Batang yang Dikelompokkan

Tempat diagram batang yang dikelompokkan untuk variabel kategori kedua secara berdampingan.

Untuk membuat plot batang yang dikelompokkan -> position = “single”. (sekarang hanya tersedia di versi pengembangan terbaru ggplot2)

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

Diagram Batang Tersegmentasi

diagram batang tersegmentasi menggunakan opsi position = “filled”. Jenis plot ini sangat berguna jika tujuannya adalah untuk membandingkan persentasi dari kategori dalam satu variabel di setiap tingkat variabel lain. Sebagai contoh, proporsi mobil dengan penggerak roda depan (front-wheel) meningkat saat Anda 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, 0.2), 
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 3,
            position = position_stack(vjust = 0.5)) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +                                  # menggunakan tema minimal
  labs(y = "Percent",
       fill = "Drive Train",
       x = "Class",
       title = "Automobile Drive by Class") +
  theme_minimal()

Catatan = kita dapat menggunakan opsi tambahan untuk meningkatkan warna dan pelabelan.

1.factor mengubah urutan dari kategori untuk variabe kelas dan urutan serta labels untuk variabel drive. 2. scale_y_continuos mengubah label tanda centang sumbu y. 3. labs menyediakan judul dan menguabj label untuk sumbu x, y, dan legend. 4. scale_fill_brewer mengubah skema warna isian 5. 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.

Meskipun plot mosaik dapat dibuat dengan ggplot2 menggunakan package ggmasaic , tetpai direkomendasikan menggunakan package vcd sebagai gantinya. Meskipun tidak akan membuat grafik ggplot2, package tersebut memberikan pendekatan yang lebih komprehensif untuk memvisualisasikan data kategorikal.

kita bisa menggunakan data survival dari Kapal Titanic. Kita dapat memvisualisasikan hubungan antara ketiga variabel kategorikal menggunakan kode berikut.

# membuat tabe]
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")

Jika kita mengasumsikan bahwa ketiga variabel ini tidak bergantung,kita dapat memeriksa residual dari model dan memberi bayangan pada ubin agar sesuai. Pada grafik dibawah, 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,
        labelin_args = list(set_varnames = c(Sex = "Gender",
                                              Survived = "Survived",
                                              Class = "Passenger Class")),
        set.labels = list(Survived = c("No", "Yes"),
        Class = c("lst", "2nd", "3rd", "Crew"),
        main = "Titanic data"))

Kita dapat melihat jika class, gender dan survival adalah tidakterikat, kita melihat lebih banyak kru laki-laki yang tewas, dan peremupan kelas 1, 2, dan 3 bertahan hidup daripada yang diharapkan. Sebaliknya, jauh lebih sedikit penumpang kelas l (laki-laki danperempuan) yang meniggal daripada yang diperkirakan secara kebetulan. Dengan demikian asumsi tidak terikat ditolak.

Kontinu vs. Kontinu

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

Plot Sebaran / Scatter Plott

library(ggplot2)                              
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")

Tampilan yang paling sederhana dari 2 variabel kuantitatif 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)                            # 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() +                               
  labs(x = "Years Since PhD",
       y = "",
       title = "Experience vs. Salary",
       subtitle = "9-month salary for 2008-2009")

Catatan: opsi geom_point dapat digunakan untuk mengubah

color - warna, size - ukuran, shape - bentuk, alpha - transparansi titik. antara 0 (transparan) hingga 1 (buram), dan merupakan parameter yang berguna saat beberapa titik mengalami tumpang tindih.

Fungsi scale_x_continuous dan scale_y_continuous mengontrol penskalaan pada sumbu x dan y. Kita dapat menggunakan opsi dan fungsi ini untuk membuat plot sebaran yang lebih menarik.

Plot Sebaran Menyesuaikan Garis

Plot biasanya ada (linear, polinomial, dan nonparametrik (loess)) itu digunakan untuk menampilkan batas kepercayaan mencapai 95%

library(ggplot2)                                    
ggplot(Salaries,
       aes(x = yrs.since.phd, 
           y = salary)) +
  geom_point(color= "cornflowerblue") +
  geom_smooth(method = "lm", color = "brown1")+
  theme_minimal() +                                 
  labs(x = "Years Since PhD",
       y = "",
       title = "Experience vs. Salary",
       subtitle = "9-month salary for 2008-2009")

Benar 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 di sini.

Garis regresi polinomial memberikan garis pas dengan bentuk ŷ=β0+β1x+β−2x2+…+βnx2 Biasanya digunakan garis kuadrat (satu lengkungan), atau kubik (dua lengkungan).

Penggunaan polinomial orde tinggi (lebih dari pangkat tiga) 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= "cornflowerblue") +
  geom_smooth(method = "lm", 
              formula = y ~ poly(x, 2), 
              color = "yellow")+
  theme_minimal() +
  labs(x = "Years Since PhD",
       y = "",
       title = "Experience vs. Salary",
       subtitle = "9-month salary for 2008-2009")

Akhirnya, garis kesesuaian nonparametrik 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)                                     
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() + 
  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)

Diagram batang juga bisa dipakai untuk mencari ringkasan statistik.

Sebagai contoh, grafik berikut ini menampilkan gaji rata-rata untuk sampel profesor universitas berdasarkan jabatan akademik mereka.

library(dplyr)                               # untuk manipulasi data
library(ggplot2)      
library(scales)                              # menentukan jeda atau label secara otomatis
data(Salaries, package="carData")

# menghitung gaji rata-rata untuk setiap jabatan
plotdata <- Salaries %>%
  group_by(rank) %>%
  dplyr::summarize(mean_salary = mean(salary))

# plot gaji rata-rata dengan cara yang lebih menarik
mycols <- c("#CD534CFF", "#EFC000FF", "#0073C2FF")
ggplot(plotdata, 
       aes(x = factor(rank,
                      labels = c("Assistant\nProfessor",
                                 "Associate\nProfessor",
                                 "Full\nProfessor")), 
                      y = mean_salary)) +
  geom_bar(stat = "identity", 
           fill = mycols) +
  geom_text(aes(label = dollar(mean_salary)), 
            vjust = -0.25) +
  scale_y_continuous(breaks = seq(0, 130000, 20000), 
                     label = dollar) +
  theme_minimal() +                                  # menggunakan tema minimal
  labs(title = "Mean Salary by Rank", 
       subtitle = "9-month academic salary for 2008-2009",
       x = "",
       y = "")

Plot Densitas Kernel yang Dikelompokkan

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

Nilai alpha berkisar dari 0 (transparan) hingga 1 (buram). Grafik tersebut menjelaskan biasanya gaji akan meningkat sesuai jabatan. tetapi untuk hal gaji, sangat luas rentangnya antara professor yang satu dengan yang lainnya

Boxplot

Plot Kotak (Boxplot) menampilkan median, kuartil 1, rata-rata, kuartil 3, nilai minim, dan maksimal. Jika ada titik yang di luar box plot, maka itu disebut pencilan.

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

Plot Biola

Plot Biola mirip dengan plot densitas kernel tetapi dicerminkan dan diputar 90 derajat.contohnya kita di bawah ini.

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

Plot Garis Punggung

Plot garis punggung atau plot kegembiraan 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)                                 
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")

Perhatikan kemungkinan tumpang tindih distribusi adalah diputuskan lebih kepada grafik mobil kompak. Anda dapat menambahkan transparansi jika tumpang tindihnya parah, dengan menggunakan geom_density_ridges(alpha = n), dimana n berkisar dari 0 (transparan) hingga 1 (buram). Lihat package vignette untuk lebih jelasnya.

Plot Garis

Plot Garis ini menggabungkan anatara boxplot dan line chart. titik tengah dari boxplot adalah rata-rata dari variabel tersebut. nilai rata-rataa tersebut merupakan titik line chart. Titik tersebut akan dibikin garis dari titik yang satu ke yang lainnya.

library(dplyr)                # untuk manipulasi data
library(ggplot2)                                  
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 scatter plot yang dikemlompokkan.sayangnya plot strip ini agak susah dilihat jika titiknya goyah

# contoh 
library(ggplot2)                    # 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")

legend.position = “none” -> menyembunyikan legend (yang tidak diperlukan di sini). Plot jitter bekerja dengan baik ketika jumlah dari titik-titik tidak terlalu besar.

Menggabungkan Jitter dan Plot Kotak

Mungkin lebih mudah untuk memvisualisasikan distribusi jika kita menambahkan plot kotak ke plot jitter. Beberapa pilihan ditambahkan untuk membuat plot ini.

Plot kotak: 1. size = 1 membuat garis menjadi lebih tebal 2. outlier.color = “black” membuat pencilan berwarna hitam 3. outlier.shape = 1 menentukan lingkaran untuk pencilan 4. outlier.size = 3 meningkatkan ukuran dari pencilan

Jitter: 6. alpha = 0.5 membuat titik-titik menjadi lebih transparan 7. width = .2 mengurangi jumlah jitter (.4 adalah default)

Akhirnya, sumbu x dan y dibalik menggunakan fungsi coord_flip (yaitu, grafik diputar pada sisinya).

library(ggplot2)        # untuk visulisasi
library(scales)         # penskalaan infrastruktur

ggplot(Salaries, 
       aes(x = factor(rank,
                      labels = c("Assistant\nProfessor",
                                 "Associate\nProfessor",
                                 "Full\nProfessor")), 
           y = salary, 
           color = rank)) +
  geom_boxplot(size=1,
               outlier.shape = 1,
               outlier.color = "black",
               outlier.size  = 3) +
  geom_jitter(alpha = 0.5, 
              width=.2) + 
  scale_y_continuous(label = dollar) +
  labs(title = "Academic Salary by Rank", 
       subtitle = "9-month salary for 2008-2009",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "none") +
  coord_flip()

fungsi geom_boxjitter yang disediakan dalam package ggpol. Ini membuat plot kotak hibrida - setengah plot kotak, setengan plot sebaran.

library(ggplot2)                        
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 atau plot sebaran biola yang mirip dengan plot sebaran jitter, di mana plot tersebut menampilkan distribusi dari variabel kuantitatif dengan memplot titik-titik dengan cara mengurangi tumpang tindih. Plot kawanan lebah ini juga menunjukkan desnsitas dari setiap titik(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

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. Plot terakhir ini disebut juga dengan grafik lolipop.

library(dplyr)                                       # untuk manipulasi data
library(ggplot2)                                     # untuk visualisasi
library(scales)                                      # penskalaan infrastruktur
library(ggbeeswarm)                                  # mengurangi tumpang tindih
library(gapminder)                                   # untuk dataset gapminder 
data(gapminder, package="gapminder")                 # memuat dataset gapminder 
# subset negara-negara Asian tahun 2007
library(dplyr)
plotdata <- gapminder %>%
  filter(continent == "Asia" & 
         year == 2007)
# Plot Cleveland yang menarik
ggplot(plotdata, 
       aes(x=lifeExp, 
           y=reorder(country, lifeExp))) +
  geom_point(color="blue", 
             size = 2) +
  geom_segment(aes(x = 40, 
               xend = lifeExp, 
               y = reorder(country, lifeExp), 
               yend = reorder(country, lifeExp)),
               color = "azure3") +
  labs (x = "Life Expectancy (years)",
        y = "",
        title = "Life Expectancy by Country",
        subtitle = "GapMinder data for Asia - 2007") +
  theme_minimal() + 
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())

Dilihat dari grafik bisa disimpulkan life expectancy di Jepang tertinggi dan Afganistan terendah.

Data Multivariat

Grafik Multivariat memperlihatkan hubungan antara lebih dari dua variabel, seperti membandingkan grafik yang lebih dari dua. Pada Multivariat ini, terdapat dua metode umum yaitu pengelompokan dan faceting.

Pengelompokan

Nilai dari dua variabel pertama dipetakan ke sumbu x dan y. variabel tambahan juga digambarkan sesauai karakteristik visualnya, seperti warna, bentuk, ukuran, jenis garis, dan transparansi. Pengelompokan juga memplot lebih dari dua data ke dalam suatu grafik.

Contohnya adalah dengan kita ingin memplot data 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")

Selanjutnya, tambahkan jenis kelamin profesor, menggunakan bentuk titik untuk menunjukkan jenis kelamin. Kita akan meningkatkan ukuran titik dan menambahkan transparansi untuk memperjelas titik individual.

library(carData)                                     # untuk dataset
library(ggplot2)                                     # untuk visualisaSi
ggplot(Salaries, 
       aes(x = yrs.since.phd, 
           y = salary, 
           color = rank, 
           shape = sex)) +
  geom_point(size = 3, alpha = .6) +
  theme_minimal() +
  labs(title = "Academic salary by rank, sex, and years since degree")

Jika dilihat, grafik ini berantakan atau terlalu ramai. untuk membedakan profesor pria dari wanita, mungkin Faceting (dijelaskan di bagian berikutnya) akan bekerja lebih baik.

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

Berikut adalah contoh yang lebih jelas. Kita akan membuat grafik hubungan antar tahun sejak Ph.D. dan gaji menggunakan ukuran dari titik untuk menunjukkan masa kerja. Ini disebut plot gelembung.

library(carData)                                     # untuk dataset
library(ggplot2)                                     # untuk visualisasi
ggplot(Salaries, 
       aes(x = yrs.since.phd, 
           y = salary, 
           color = rank, 
           size = yrs.service)) +
  geom_point(alpha = .8) +
  theme_minimal() +
  labs(title = "Academic salary by rank, years of service, and years since degree")

Dari grafik di atas, itu menjelaskan bahwa jarak setelah menjabat Ph.D dan jabatan berkorelasi positif.

Sebagai contoh terakhir, mari kita lihat yrs.since.phd vs. salary dan tambahkan jenis kelamin menggunakan warna dan garis kuadrat yang paling cocok.

library(carData)                                     # untuk dataset
library(ggplot2)                                     # untuk visualisasi
ggplot(Salaries, 
       aes(x = yrs.since.phd, 
           y = salary, 
           color = sex)) +
  geom_point(alpha = .4, 
             size = 3) +
  geom_smooth(se=FALSE, 
              method = "lm", 
              formula = y~poly(x,2), 
              size = 1.5) +
  labs(x = "Years Since Ph.D.",
       title = "Academic Salary by Sex and Years Experience",
       subtitle = "9-month salary for 2008-2009",
       y = "",
       color = "Sex") +
  scale_y_continuous(label = scales::dollar) +
  scale_color_brewer(palette = "Set1") +
  theme_minimal()

Pembagian Faset (Faceting)

Jadi Faceting itu membandingkan grafik yang satu dengan yang lainnya dengan x dan y atau jangkauan x dan y yang sama. COntohnya seperti dibawah ini.

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

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

Dalam contoh berikutnya akan menggunakan dua variabel untuk mendefinisikan faset. Di sini, fungsi menetapkan jenis kelamin ke baris dan jabatan ke kolom, membuat matriks enam plot dalam satu grafik.

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

Kita juga dapat mengkombinasi pengelompokan dan pembagian faset.

Contohnya kita bisa menggunakan Plot Mean/SE dan pembagian faset untuk membandingkan gaji-gaji dari profesor pria dan wanita, dalam jabatan dan disiplin ilmu. Kita akan menggunakan warna untuk membedakan jenis kelamin dan pembagian faset untuk membuat plot-plot jabatan berdasarkan kombinasi disiplin ilmu.

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

# menghitung rata-rata dan kesalahan standar berdasarkan jenis kelamin, jabatan, dan disiplin ilmu
plotdata <- Salaries %>%
  group_by(sex, rank, discipline) %>%
  dplyr::summarize(n = n(),
            mean = mean(salary),
            sd = sd(salary),
            se = sd / sqrt(n))

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

Penjelasan dari coding di atas :

  1. facet_grid(.~rank+dicipline) tidak menentukan variabel baris (.) dan kolom yang ditentukan oleh kombinasi jabatan dan disiplin ilmu.

  2. theme() -> membuat tema hitam dan putih,menghilangkan garis grid vertikal, dan garis grid horizontal minor.

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

Kalau dilihat, adanya perbedaan antara gender dan gaji Associate dan Full Professors di bidang teoritis. ini bisa terjadi karena kita belom melihat secara langsung mengapa adanya perbedaan tersebut. Mungkin diperlukan percobaan secara langsung agar kita mengetahui mengapa hal tersebut terjadi.

Contoh terakhir, kita coba menggunakan dataset baru dan memplot perubahan dalam harapan hidup dari waktu ke waktu untuk negara-negara di “Asia”. Data tersebut berasal dari dataset gapminder dalam package gapminder. Setiap negara akan muncul dalam fasetnya sendiri.

Fungsi tema -> menyederhanakan warna latar belakang, memutar teks sumbu x, dan memperkecil ukuran tulisan.

library(gapminder)                                   # untuk dataset
library(ggplot2)                                     # untuk visualisasi
library(dplyr)                                       # manipulasi data
# memplot harapan hidup berdasarkan tahun secara terpisah
# untuk setiap negara di Asia
data(gapminder, package = "gapminder")
# Pilih data Asia
plotdata <- dplyr::filter(gapminder, 
                          continent == "Asia")
# memplot harapan hidup berdasarkan tahun, untuk setiap negara
ggplot(plotdata, aes(x=year, y = lifeExp)) +
  geom_line(color="grey") +
  geom_point(color="blue") +
  facet_wrap(~country) + 
  theme_minimal(base_size = 9) +
  theme(axis.text.x = element_text(angle = 45, 
                                   hjust = 1)) +
  labs(title = "Changes in Life Expectancy",
       x = "Year",
       y = "Life Expectancy")