~ Visualisasi Data dengan R ~

Tugas 6 ~ Algoritma & Struktur Data


Kontak : \(\downarrow\)
Email
Instagram yyosia
RPubs https://rpubs.com/yosia/

Visualisasi data adalah teknik mengambil informasi dari data ke dalam dengan elemen visual seperti bagan, grafik, dan peta. Alat visualisasi data menyediakan cara yang dapat diakses untuk melihat dan mudah dipahami oleh otak manusia, alat visualisai datanya untuk mendeteksi tren, outlier, dan pola dalam data.

Univariat (Satu Variable)

Visualisasi data univariat biasanya digunakan untuk melakukan distribusi data dari satu variable. Dalam hal ini, variable yang dimaksud dipartisi menjadi dua bagian, yaitu:

  • Kategoris, seperti; jenis kelamin, ras, negara, kota, dll
  • Numerik,seperti; usia, berat badan, inflasi, suku bunga, dll

Variable Kategori

Distribusi pada suatu variable kategori tunggal biasanya di deskripsikan dalam bentuk presentase seperti diplot dengan diagram batang, diagrm lingkaran, atau diagram pohon (tetapi ini sangat jarang sekali)

Diagram Batang

Berikut ini adalah contoh yang menunjukan frekuensi dari data set Marriage, kita mendapatkannya dari package mosaicData. Kita gunakan diagram batang untuk menampilkan distribusi peserta pernikahan berdasarkan Zodiak.

library(ggplot2)                                              # untuk visualisasi
setwd("C:/Users/House Of Grace/OneDrive/Documents/data")
Marriage <- read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv")
ggplot(Marriage, aes(x= zodiacs)) +                           # memplot distribusi dari `Zodiacs`
  geom_bar(fill = "cornflowerblue",                           
           color= "azure4") +                                 # untuk mengganti warna
  theme_minimal() +                                           # menggunakan tema minimal
  labs(x = "Zodiacs",
       y = "Frequency",
       title = "Marriage Participants by Zodiac")

Batang pada diagram batang dapat menggambarkan persentase dari jumlah. Untuk diagram batang (zodiak), kode aes(x=sign) biasanya merupakan jalan pintas untuk aes(x = sign, y = ..count..), di mana..count.. adalah variabel khusus yang menggambarkan frekuensi dari setiap kategori. Anda dapat menggunakan ini untuk menghitung persentase, dengan menentukan variabel y secara eksplisit.

library(ggplot2)
ggplot(Marriage,
       aes(x = zodiacs,
           y = ..count.. / sum(..count..))) +
  geom_bar(fill = rainbow(12), color= "azure4") +
  theme_minimal() +
  labs(x = "Zodiacs",
       y = "Percent",
       title = "Marriage Participants in Percent")+
  scale_y_continuous(labels = scales::percent)

Catatan: Dalam R, warna dapat ditentukan dengan nama (misalnya col = "red") atau dengan triplet RGB heksadesimal (seperi col = "#FFCC00"). atau mengambil dari package RColowBrewer.

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

library(dplyr)
library(ggplot2)
plotdata <- Marriage %>%
  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 = "Frequency",
       title = "Sorting Categories")

Jika Anda mungkin ingin memberi label untuk setiap batang dengan nilai numeriknya, ikuti kode berikut:

library(dplyr)
library(ggplot2)
library(scales)
plotdata <- Marriage %>%
  count(zodiacs) %>%
  mutate(pct = n/sum(n),
         pctlabel = paste0(round(pct*100), "%"))
#plot batang sebagai presentase, dalam urutan menurun dengan label batang
ggplot(plotdata, 
       aes(x = reorder(zodiacs, -pct),
           y = pct )) +
  geom_bar(stat = "identity", fill = rainbow(12),
           color = "azure4") +
  geom_text(aes(label = pctlabel),
            vjust = -0.25) +
  theme_minimal() +
    labs(x = "Zodiacs",
       y = "percent",
       title = "Labeling Bars")

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

library(ggplot2)
library(scales)
#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) +
  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, Anda dapat menangani situasi ini dengan membalik sumbu x dan y.

library(ggplot2)
library(scales)
#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.10) +
  scale_y_continuous(labels = percent) +
  theme_minimal() +
    labs(x = "Zodiacs",
       y = "Percent",
       title = "Overlapping Labels") +
  coord_flip()

Diagram Pai

Diagram pai bersifat kontroversial di statistik. Jika ingin membandingkan frekuensi dari kategori gunakan diagram batang. jika ingin membandingkan secara keseluruhan dan jumlahan kategorinya kecil, maka gunakanlah diagram pai. Agak lebih sedikit membutuhkan banyak kode dalam R.

Ini adalah contoh untuk membuat diagram pai sederhana dengan ggplot2:

library(dplyr)
library(ggplot2)
library(scales)
#Persiapan data
plotdata <- Marriage %>%
  count(race) %>%
  arrange(desc(race)) %>%
  mutate(prop = round(n*100/sum(n), 1),
        lab.ypos = cumsum(prop) - 0.5*prop)
# Membuat diagram Pai
mycols <- c("#0073C2FF", "#EFC000FF", "#868686FF", "#CD534CFF") 
ggplot (plotdata, aes (x = "", y = prop, fill = race)) + 
  geom_bar (width = 1, stat = "identity", color = "white") + 
  coord_polar ("y", start = 0) +
  geom_text (aes (y = lab.ypos, label = prop), color = "white") +
  scale_fill_manual(values = mycols) +
  theme_void()+
  labs (title = "Marriage Participants by Race")

Diagram donat hanyalah diagram pai sederhana dengan lubang di dalamnya. Satu-satunya perbedaan antara kode diagram pai adalah kita menetapkan: x = 2 dan xlim = c(0.5, 2.5) untuk membuat lubang di dalam diagram pai. Selain itu, argumen width dalam fungsi geom_bar() tidak lagi diperlukan.

library(ggplot2)
library (scales)
# membuat diagram donat
ggplot (plotdata, aes (x = 2, y = prop, fill = race)) + 
  geom_bar(stat = "identity", color = "white") +
  coord_polar (theta = "y", start = 0) +
  geom_text (aes (y = lab.ypos, label = prop), color = "white") +
  scale_fill_manual(values = mycols) +
  theme_void() +
  xlim (0.5, 2.5) +
  labs (title = "Marriage Participants by Race")

Sekarang mari berkreasi dan menambahkan label sambil menghapus legend.

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

# membuat diagram donat dalam persen
ggplot (plotdata, aes (x = 2, y = prop, fill = race)) + 
  geom_bar (stat = "identity", color = "white") + 
  scale_fill_manual(values = mycols) +
  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

Sebuah alternatif untuk diagram pai adalah peta phon. Tidak seperti diagram pai, peta pohon dapat menangani variabel kategorikal yang memiliki banyak tingkatan.

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

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

Dibawah ini adalah versi yang lebih lengkap dengan label.

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

Variabel Kontinu

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

Histogram

Menggunakan dataset Marriage, mari kita plot usia dari peserta pernikahan.

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

Sebagian besar peserta tampaknya berusia 20-an tahun dengan kelompok lain berusia 40-an tahun, dan kelompok yang lebih kecil berusia 60-an dan 70-an tahun. Ini akan menjadi distribusi multimodal. Warna histogram dapat diganti menggunakan dua opsi:

  • fill-warna isi untuk batang.
  • color-warna batas di sekitar batang.

Cara lainnya adalah Anda dapat menggunakan binwidth, lebar nampan yang diwakili oleh batang.

library(ggplot2) 
library (scales) 
ggplot (Marriage,
        aes (x = age,
             y=..count.. / sum(..count..))) +
  geom_histogram (fill = "cornflowerblue",
                  color="white",
                  binwidth= 5) +
  theme_minimal() +
  labs (title="Marriage Participants by age (Alternative Bins and bandwidths)",
        y = "Percent",
        x = "Age") +
  scale_y_continuous (labels = percent)

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

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

Plot Densitas Kernel

Alternatif untuk histogram adalah plot sensitas kernel. Density Plot memvisualisasikan distribusi data selama interval atau periode waktu yang berkelanjutan. Bagan ini adalah variasi dari Histogram yang menggunakan penghalusan kernel untuk memplot nilai, memungkinkan distribusi yang lebih halus dengan menghaluskan noise. Puncak dari Density Plot membantu menampilkan di mana nilai terkonsentrasi selama interval.

library(ggplot2) 
ggplot (Marriage, 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 menentukan warna isian dan batasannya.

Parameter Penghalusan (Smoothing)

Menggantikan setiap titik sampel dengan Kernel berbentuk Gaussian , kemudian memperoleh estimasi yang dihasilkan untuk densitas dengan menjumlahkan Gaussian ini.

Untuk menerapkan metode ini, bandwidth bw, w bw.nrd0, untuk setiap Kernel Gaussian harus dipilih – bandwidth yang lebih besar menghasilkan rata-rata yang lebih besar dan kurva yang lebih halus, tetapi juga dapat secara artifisial meningkatkan varians nyata dalam ketidakpastian keseluruhan Anda.

library(ggplot2)
bw.nrd0 (Marriage$age)
ggplot (Marriage, 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. Namun sulit untuk menjelaskan arti. sumbu y kepada seorang non-ahli statistik. (Tapi itu akan membuatmu terlihat sangat pintar!)

Diagram Titik

Plot titik menyediakan metode untuk memplot sejumlah besar nilai berlabel pada skala horizontal sederhana. jadi setiap pengamatan ditentukan oleh sebuah titik. Plot titik dikelompokkan, diurutkan, dan diwarnai, Plot titik biasanya menjadi paling menarik ketika diurutkan dan faktor pengelompokannya dibedakan berdasarkan simbol dan warna.

library(ggplot2)
ggplot (Marriage, 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

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

Di kategori ke dua ini, diagram batang akan di kelompokkan dari drv nya. menggunakan opsi position = "single". Perhatikan bahwa opsi ini hanya tersedia di versi pengembangan terbaru ggplot2, tetapi akan segera tersedia secara umum.

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

Diagram Batang Tersegmentasi

Plot batang yang tersegmentasi merupakan plot batang yang bertumpuk di mana setiap batang mewakili 100 persen. dibandingkan dengan diagram batang bertumpuk kita tidak bisa hanya melihat panjang batang, tetapi perlu melihat area kotak, jadi kita harus melihat berapa presentasenya. Anda dapat membuat diagram batang tersegmentasi menggunakan opsi position = "filled". 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, .2),
                      label = percent) +
  geom_text (aes (label = lbl),
             size = 3,
             position = position_stack(vjust= 0.5)) + 
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  labs(y= "Percent",
       fill= "Drive Train",
       x = "Class",
       title="Automobile Drive by Class") +
  theme_minimal()

Catatan: Anda dapat menggunakan opsi tambahan untuk meningkatkat warna dan pelabelan. Dalam grafik di bawah ini:

  • 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 menyediakan judul dan mengubah label untuk sumbu x dan y dan juga legend
  • scale_fill_brewer mengubah skema warna isian.
  • theme_minimal menghapus latar belakang abu-abu dan mengubah wama kisi..

Plot Mosaik

Pada pandangan pertama, plot mosaik terlihat mirip dengan plot batang bertumpuk. Namun, tidak seperti di petak batang bertumpuk, di petak mosaik tinggi dan lebar masing-masing area yang diarsir bervariasi. Setiap variabel kategori yang ditampilkan harus mencakup semua pengamatan dalam kumpulan data.

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

Orang-orang terpesona dengan Titanic (atau terpesona dengan Leo?). Dalam bencana Titanic, peran apa yang dimainkan oleh sex dan class dalam survival? Kita dapat memvisualisasikan hubungan antara ketiga variabel kategorikal menggunakan kode berikut.

# membuat tabel
tbl <- xtabs (Freq ~ Survived + Class + Sex, Titanic) 
ftable(tbl)
# membuat plot mosaik dari tabel 
library (vcd) 
mosaic (tbl, main = "Titanic data")

Ukuran ubin sebanding dengan persentase kasus dalam kombinasi tingkat tersebut. Jelas lebih 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 jika class, gender, dan survival adalah tidak terikat, 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 1 (laki-laki dan perempuan) 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

Plot Sebaran dibuat untuk mempelajari hubungan antara 2 variabel. Sehingga 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.

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)
library (hrbrthemes)
# 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)
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 titik
  • size - ukuran titik
  • shape - bentuk titik
  • alpha - transparansi titik. Kisaran transparansi dari 0 (transpar) 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

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%.bisa dikatakan Regresi, di gunakan untuk memprediksi nilai pada peubah tak bebas.

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

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

Garis regresi polinomial memberikan garis pas dengan bentuk

\((_y^^) = β_0+β_0 x+β-2x^2+⋯+β_n x^2\)

Biasanya digunakan garis kuadrat (satu lengkungan), atau kubik (dua lengkungan). Penggunaan polinomial orde tinggi (>3) 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)

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 untuk setiap tingkatan dari variabel kategorikal.

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

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_minimal() +
  labs (title="Mean Salary by Rank", 
        subtitle = "9-month academic salary for 2008-2009",
        x = "",
        y = "")

Plot Densitas Kernel yang Dikelompokkan

Seseorang dapat membandingkan kelompok pada variabel numerik dengan melapiskan plot densitas kernel dalam satu grafik. 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")

Pilihan alpha membuat plot kepadatan transparan sebagian sehingga kita dapat melihat apa yang terjadi di bawah tumpang tindih. Nilai alfa berkisar dari 0 (transparan) hingga 1 (buram). Grafik tersebut menjelaskan bahwa, secara umum, gaji naik sesuai pangkat. Namun, kisaran gaji untuk profesor penuh sangat luas.

Boxplot

box-plot menampilkan persentil ke-25, median, dan persentil ke-27 dari sebuah distribusi. Garis Kumis (garis vertikal) menangkap sekitar 99% dari distribusi normal, dan pengamatan di luar rentang ini diplot sebagai titik yang mewakili pencilan (lihat gambar di bawah)

Plot kotak berdampingan sangat berguna untuk membandingkan kelompok (yaitu, level variabel kategori) pada variabel numerik. Mari kita plot distribusi gaji dengan peringkat menggunakan plot kotak. Plot kotak bertakik memberikan metode perkiraan untuk memvisualisasikan apakah kelompok berbeda. Meskipun bukan tes formal, jika takik dari dua petak kotak tidak tumpang tindih, ada bukti kuat (kepercayaan 95%) bahwa median dari kedua kelompok berbeda.

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

Dalam contoh di atas, ketiga kelompok tersebut tampak berbeda. Salah satu keuntungan dari plot kotak adalah lebarnya biasanya tidak berarti. Ini memungkinkan kamu membandingkan distribusi banyak grup dalam satu grafik.

Plot Biola

Plot biola hamppir sama dengan plot kernel density tetapi dicerminkan dan diputar \(90^{\circ}\). Mari kita plot distribusi gaji dengan peringkat menggunakan plot biola

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

Plot Ridgeline

Plot ridgeline (juga disebut plot kegembiraan) menampilkan distribusi variabel kuantitatif untuk beberapa kelompok. Mereka mirip dengan plot kernel density dengan vertikal faceting, tetapi mengambil lebih sedikit ruang. Plot ridgeline dibuat dengan package ggridges

Menggunakan data Fuel economy , mari kita plot distribusi mil mengemudi kota per galon dengan kelas mobil.

library(dplyr)                                       # manipulasi
library(ggplot2)                                     # visualisasi
library(ggridges)                                    # untuk menangani visulisasi 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")

Saya telah menyembunyikan legend di sini karena itu berlebihan (distribusinya sudah diberi label pada sumbu y). Tidak mengherankan, truk pikap memiliki jarak tempuh yang paling rendah, sementara subkompak dan mobil kompak cenderung mencapai peringkat. Namun, ada rentang skor jarak tempuh yang sangat luas untuk mobil-mobil kecil ini.

Perhatikan kemungkinan tumpang tindih distribusi adalah trade-off untuk grafik yang lebih kompak. Anda dapat menambahkan transparansi jika tumpang tindih parah menggunakan geom_density_ridges(alpha = n), dengan n berkisar dari 0 (transparan) hingga 1 (buram). lihat package vingnette untuk lebih detail.

Plot garis

Metode populer untuk membandingkan grup pada variabel numerik adalah plot rata-rata dengan bilah kesalahan. Error bar dapat mewakili deviasi standar, error standar mean, atau interval kepercayaan. Di bagian ini, kami akan memplot cara dan kesalahan standar. Kita dapat menggunakan teknik yang sama untuk membandingkan gaji berdasarkan pangkat dan jenis kelamin. (Secara teknis, ini bukan bivariat karena kami merencanakan pangkat, jenis kelamin, dan gaji, tetapi tampaknya cocok di sini).

library(dplyr)                                       # manipulasi
library(ggplot2)                                     # visualisasi
library(ggridges)                                    # untuk menangani visulisasi yang tumpang tindih
# menghitung rata-rata, standar deviasi,
# standar error, kepercayaan 95% 
# kelas berdasarkan pangkat
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))
# memperbaiki rataan/standar error plot
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

Hubungan antara variabel pengelompokan dan variabel numerik dapat ditampilkan dengan plot sebaran. Misalnya, plot distribusi gaji menurut peringkat/dimensi menggunakan plot strip. Plot sebar satu dimensi ini disebut plot strip. Sayangnya, pencetakan titik yang berlebihan membuat interpretasi menjadi sulit. Hubungannya lebih mudah dilihat jika titik-titiknya goyah. Pada dasarnya nomor acak kecil ditambahkan ke setiap koordinat y. Juga lebih mudah untuk membandingkan kelompok jika kita menggunakan warna.

library(ggplot2)                                     # untuk visualisasi
library(scales)                                      # infrastruktur penskalaan
ggplot(Salaries, 
       aes(y = factor(rank,
                      labels = c("Assistant\nProfessor",
                                 "Associate\nProfessor",
                                 "Full\nProfessor")), 
           x = salary, 
           color = rank)) +
  geom_jitter(alpha = 0.7,
              size = 1.5) + 
  scale_x_continuous(label = dollar) +
  labs(title = "Academic Salary by Rank", 
       subtitle = "9-month salary for 2008-2009",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "none")

Opsi legend.position = "none" digunakan untuk menyembunyikan legend (yang tidak diperlukan di sini). Plot jittered bekerja dengan baik jika jumlah dari titik tidak terlalu besar.

Menggabungkan Jitter and Boxplots

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

  • Untuk boxplot:

\(\odot\) size = 1 membuat garis lebih tebal

\(\odot\) outlier.color = “black” membuat pencilan berwarna hitam

\(\odot\) outlier.shape = 1 menentukan lingkaran untuk pencilan

\(\odot\) outlier.size = 3 menaikkan ukuran dari pencilan

  • Untuk jitter:

\(\odot\) alpha = 0.5 membuat titik menjadi lebih transparan

\(\odot\) width = .2 mengurangi jumlah jitter (.4 adalah default)

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

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

Sebelum melanjutkan, ada baiknya memperhatikan fungsi geom_boxjitter disediakan di package ggpol. Ini membuat plot kotak hibrida - setengah plot kotak, setengah plot sebar.

library(ggplot2)                                     
library(scales)                                      
library(ggpol)                                       
ggplot(Salaries, 
       aes(x = factor(rank,
                      labels = c("Assistant\nProfessor",
                                 "Associate\nProfessor",
                                 "Full\nProfessor")), 
           y = salary, 
           fill=rank)) +
  geom_boxjitter(color="black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE) +
  scale_y_continuous(label = dollar) +
  labs(title = "Academic Salary by Rank", 
       subtitle = "9-month salary for 2008-2009",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "none")

Plot Kawanan Lebah

Plot Kawanan lebah di sisi lain memplot semua poin Anda dalam satu ruang. Ini memplot data pada satu sumbu dan kemudian mengimbangi ke arah lain untuk menunjukkan volume atau jumlah. Ini seperti stripchart tetapi mencoba untuk menghindari titik-titik yang 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 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 tentang plot ini, lihat Beeswarm-style plots dengan ggplot2.

Diagram Titik Cleveland

Plot Cleveland berguna saat Anda ingin membandingkan statistik numerik untuk sejumlah kelompok. Misalnya, Anda ingin membandingkan harapan hidup tahun 2007 untuk negara Asia dengan menggunakan data set gapminder.

library(dplyr)                                    
library(ggplot2)                                    
library(scales)                                     
library(ggbeeswarm)                                  
library(gapminder)                                    
data(gapminder, package="gapminder")                 
# subset negara asia 2007
library(dplyr)
plotdata <- gapminder %>%
  filter(continent == "Asia" & 
         year == 2007)
# plot cleveland yang lebih 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())

Jepang jelas mempunyai harapan hidup paling tinggi, sementara Afghanistan paling rendah sejauh ini. plot terakhir ini dinamakan plot lolipop.

Data Multivariat

Grafik Multivariat menampilkan hubungan antara tiga variabel ataupun lebih. 2 metode umum dalam menampung Variabel adalah Pengelompokkan dan Faceting.

Pengelompokkan

Nilai dari 2 Variabel dipetakan pada sumbu x dan y lalu variabel tambaha dipetakan ke karakteristik visual (warna,bentuk,ukuran,jenis,garis,dan transparansi). Kita dapat menampilkan hubungan antara yrs.since.phd dan salary, dengan menggunakan data set Salaries

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

Menambahkan Jenis Kelamin Profesor menggunakan bentuk titik dalam menunjukkan jenis kelamin, dimana akna meningkatkan ukuran titik dan menambahkan transparasi 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")

Perbedaan antara menentukan nilai konstan (size=3) dan pemetaan variabel dalam karakteristik visual (color=rank). Pemetaan ditempatkan dalam fungsi aes, sedangkan penetapan nilai konstanta selalu muncul diluar fungsi aes.

Membuat Grafik Hubungan Antar tahun sejak Ph.D. dan gaju menggunakan ukuran dari titik dalam menunjukkan masa kerja yang 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")

Terdapat Hubungan yang baik dan kuat antara Tahun-Tahun sejak Ph.D. dan Tahun layanan. Tidak ditemukan batasan waktu yang sama antara Associate dan Full Professors.

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

Faceting ( Pembagian Faset)

Dengan Pengelompokkan, akan memplot beberapa variabel dalam satu grafik. Dimana semua itu menggunakan karakteristik visual(warna, bentuk, dan ukuran). Grafik terdiri dari beberapa plot-plot yang terpisah ataupun kelipatan kecil, satu untuk setiap tingkatan dari variabel ketiga ataupun kombinasi variabel dimana semua itu termasuk pembagian faset.

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

Dalam membuat grafik terpisah pada setiap tingkat jabatan dapat menggunakan Fungsi facet_wrap. Jika mengatur jumlah kolom dapat menggunakan fungsi ncol.

Kita akan menggunakan 2 variabel dalam mendefinisikan faset, dimana 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)")

Selain itu, dalam membandingkan gaji-gaji dari profesor pria dan wanita dalam jabatan dan disiplin ilmu, kita dapat menggunakan Plot Mean/SE dan Pembagian Faset.

Untuk membedakan Jenis kelamin dan pembagian faset dalam membuat plot jabatan berdasarkan kombinasi displin ilmu, kita dapatmenggunakan warna.

library(carData)                                     # Untuk dataset
library(ggplot2)                                     # Untuk Visualisasi
library(dplyr)                                       #Untuk Manipulasi Data

# Menghitung Rata2 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 baik untuk disiplin ilmu
plotdata$discipline <- factor(plotdata$discipline,
                              labels = c("Theoretical",
                                         "Applied"))

# membuat Plot
ggplot(plotdata, 
       aes(x = sex, 
           y = mean,
           color = sex)) +
  geom_point(size = 3) +
  geom_errorbar(aes(ymin = mean - se, 
                    ymax = mean + se),
                width = .1) +
  scale_y_continuous(breaks = seq(70000, 140000, 10000),
                     label = scales::dollar) +
  facet_grid(. ~ rank + discipline) +
  theme_bw() +
  theme(legend.position = "none",
        panel.grid.major.x = element_blank(),
        panel.grid.minor.y = element_blank()) +
  labs(x="", 
       y="", 
       title="Nine month academic salaries by gender, discipline, and rank",
       subtitle = "(Means and standard errors)") +
  scale_color_brewer(palette="Set1")

Fungsi Theme() membuat tema hitam dan putih serta menghilangkan garis grid vertikal maupun garis grid horizontal minor Fungsi scale_color_brewer() dapat mengubah skema warna untuk titik dan batang-batang kesalahan.

Selanjutnya, menggunakan dataset baru dan memplot perubahan dalam harapan hidup dari waktu ke waktu di negara-negara “ASIA”. Dimana data-data tersebut berasal dari gapminder yang terletak dalam package gapminder. Dalam menyederhanakan warna latar belakang, memutar teks sumbu x, dan memperkecil ukuran tulisan, kita dapat menggunakan fungsi tema.

library(carData)                                     # Untuk dataset
library(ggplot2)                                     # Untuk Visualisasi
library(dplyr)                                       #Untuk Manipulasi Data

# Membuat Plot harapan hidup berdasarkan tahun secara terpisah dalam setiap negara di Asia
data(gapminder, package = "gapminder")

# Memilih data ASIA
plotdata <- dplyr::filter(gapminder, 
                          continent == "Asia")

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