Email: ronaldokefas@gmail.com
RPubs: https://rpubs.com/kefasronaldo/
Visualisasi Data adalah teknik mengambil informasi dari data ke dalam konteks visual, seperti bagan, grafik, dan peta. Visualisasi data dimungkinkan untuk menangani data kecil maupun besar menjadi lebih mudah dipahami oleh otak manusia, dan visualisasi juga membuatnya lebih dapat diandalkan untuk mendeteksi pola, tren, dan outlier dalam kelompok data.
R adalah platform luar biasa untuk analisis data, yang mampu menciptakan hampir semua jenis grafik. Buku ini membantu Anda membuat visualisasi paling populer - dari plot cepat dan kotor hingga grafik siap publikasi. Di sini kita akan belajar cara memvisualisasikan data dari univariat, bivariat, dan mulitivariate. Dari yang sangat mendasar hingga uang muka, silakan ikuti instruksi berikut selangkah demi selangkah.
Plot univariat biasanya digunakan untuk melakukan distribusi data dari satu variabel. Variabel dapat dikategorikan (e.g., gender, race, country, city, etc) atau kuantitatif (e.g., age, weight, inflation, rate, etc).
Distribusi variabel kategoris tunggal biasanya diplot dengan bar-chart, pie-chart, or (less commonly) a treemap.
Berikut adalah contoh yang memperlihatkan frekuensi Marriage set data, saya kumpulkan dari paket mosaicData. Kami menggunakan bagan batang untuk menampilkan distribusi peserta pernikahan dengan Zodiac.
library(ggplot2)
#setwd("/cloud/project/week13")
Marriage<- read.csv("/cloud/project/week13/Marriage.csv")
ggplot(Marriage, aes(x = zodiacs)) +
geom_bar(fill = "cornflowerblue",color= "azure4")+
theme_minimal() +
labs(x = "Zodiacs",
y = "Frequency",
title = "Marriage Participants by Zodiacs") Categorical Bar Chart 1
Bar dapat mewakili persen daripada hitungan. Untuk bagan batang (zodiak), kode aes(x=sign) sebenarnya adalah pintasan untuk aes(x = sign, y = ..count..), di mana menghitung adalah variabel khusus yang mewakili frekuensi dalam setiap kategori. Anda dapat menggunakan ini untuk menghitung persentase, dengan menentukan variabel y secara eksplisit.
Dalam R, warna dapat ditentukan baik dengan nama (e.g col = “red”) seperti yang bisa Anda lihat di gambar berikut.
atau Anda dapat menetapkan warna dengan menggunakan triplet RGB heksadesimal (such as col = “#FFCC00”) More. Selain itu, Anda juga dapat menggunakan sistem warna lain seperti sistem warna yang diambil dari RColorBrewer paket More and the package grDevices (Anda mungkin sudah memuat ini) berisi sejumlah palet, ketik ini ?rainbow di Rconsole Anda. Mari kita pertimbangkan grafik berikut:
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) Categorical Bar Chart 2
Seringkali membantu untuk mengurutkan bar berdasarkan frekuensi. Dalam kode di bawah ini, frekuensi dihitung secara eksplisit. Kemudian fungsi reorder digunakan untuk mengurutkan kategori menurut frekuensi. Opsi stat="identity" memberitahu fungsi plotting untuk tidak menghitung hitungan, karena mereka disediakan secara langsung.
library(dplyr) # for data manipulation
library(ggplot2) # for visualization
plotdata <- Marriage %>% # load dataset
count(zodiacs) # count of participants in each `zodiacs`
# plot bar dalam urutan naik
ggplot(plotdata,
aes(x = reorder(zodiacs, n),
y = n)) +
geom_bar(stat = "identity",
fill = rainbow(12),
color= "azure4") +
theme_minimal() + # use a minimal theme
labs(x = "Zodiacs",
y = "Frequency",
title = "Sorting Categories")Categorical Bar Chart 3
Jika Anda mungkin ingin memberi label setiap batang dengan nilai numeriknya, periksa kode berikut:
library(dplyr) # for data manipulation
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
plotdata <- Marriage %>%
count(zodiacs) %>%
mutate(pct = n / sum(n),
pctlabel = paste0(round(pct*100), "%"))
# plot bar sebagai persentase, dalam urutan pengiriman 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() + # use a minimal theme
scale_y_continuous(labels = percent) +
labs(x = "Zodiacs",
y = "Percent",
title = "Labeling Bars")Categorical Bar Chart 4
Kadang-kadang label kategori mungkin tumpang tindih, itu sangat menjengkelkan kan? Jadi, Anda dapat memutar label sumbu.
library(ggplot2) # untuk visualisasi
library(scales) # secara otomatis menentukan jeda/label
# plot bar 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))Categorical Bar Chart 5
Atau, Anda dapat menangani situasi ini dengan membalik sumbu ‘x’ dan ‘y’.
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
# plot the bars as percentages,
# in decending order with bar labels
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() + # use a minimal theme
labs(x = "Zodiacs",
y = "Percent",
title = "Overlapping Labels")+
coord_flip()Categorical Bar Chart 6
Diagram pai kontroversial dalam statistik. Jika tujuan Anda adalah membandingkan frekuensi kategori, Anda lebih baik dengan bagan batang (manusia lebih baik menilai panjang batang daripada volume irisan pai). Jika tujuan Anda adalah membandingkan setiap kategori dengan keseluruhan (misalnya, bagian peserta apa yang hispanik dibandingkan dengan semua peserta), dan jumlah kategori kecil, maka bagan pai dapat berfungsi untuk Anda. Dibutuhkan sedikit lebih banyak kode untuk membuat bagan pai yang menarik di R.
Ini adalah contoh untuk membuat diagram pai ggplot2 dasar:
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")Categorical Pie Chart
Bagan donat hanyalah bagan pai sederhana dengan lubang di dalamnya. Satu-satunya perbedaan antara kode bagan pai adalah yang kami tetapkan: x = 2 andxlim = c(0.5, 2.5) untuk membuat lubang di dalam bagan 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")Categorical Donut Chart 1
Sekarang mari kita buat mewah dan menambahkan label, sambil menghapus legenda.
library(ggplot2)
library(scales)
# add percent label
plotdata$percent <- paste0(plotdata$race, "\n",
round(plotdata$prop), "%")
# create Donut chart in percent
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")Categorical Donut Chart 2
Alternatif untuk bagan pai adalah peta pohon. Tidak seperti bagan pai, ia dapat menangani variabel kategoris yang memiliki banyak tingkatan.
library(ggplot2) # for visualization
library(treemapify) # for visualization
library(scales) # automatically determining breaks/labels
plotdata <- Marriage %>%
count(officialTitle)
ggplot(plotdata,
aes(fill = officialTitle,
area = n)) +
geom_treemap() +
labs(title = "Marriage Participants by Officiate")Categorical Tree Map 1
Berikut adalah versi yang lebih berguna 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")Categorical Tree Map 2
Distribusi variabel kuantitatif tunggal biasanya diplot dengan histogram, kernel density plot, atau titik plot
Dengan menggunakan kumpulan data Pernikahan, mari kita plot usia peserta pernikahan.
library(ggplot2) # for visualization
ggplot(Marriage, aes(x = age)) +
geom_histogram(fill = "cornflowerblue",
color = "white",bins = 20) +
theme_minimal() + # use a minimal theme
labs(title="Marriage Participants by age (Basic)",
x = "Age")Quantitative Histogram
Sebagian besar peserta tampaknya berusia awal 20-an dengan kelompok lain di usia 40-an, dan kelompok yang jauh lebih kecil di usia enam puluhan dan awal tahun tujuh puluhan. Ini akan menjadi distribusi multimodal. Warna histogram dapat dimodifikasi menggunakan dua opsi:
Atau, Anda dapat menentukan binwidth, lebar tempat sampah yang diwakili oleh bar.
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
ggplot(Marriage,
aes(x = age,
y= ..count.. / sum(..count..))) +
geom_histogram(fill = "cornflowerblue",
color = "white",
binwidth = 5) +
theme_minimal() + # use a minimal theme
labs(title="Marriage Participants by age (Alternative Bins and bandwidths)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)Quantitative Histogram 2
Seperti halnya bagan batang, sumbu y dapat mewakili hitungan atau persen dari total.
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
ggplot(Marriage,
aes(x = age,
y= ..count.. / sum(..count..))) +
geom_histogram(fill = "cornflowerblue",
color = "white",
binwidth = 5) +
theme_minimal() + # use a minimal theme
labs(title="Marriage Participants by age (Percent)",
y = "Percent",
x = "Age") +
scale_y_continuous(labels = percent)Quantitative Histogram 3
Alternatif untuk histogram adalah plot kepadatan kernel. Secara teknis, estimasi kepadatan kernel adalah metode non-parametrik untuk memperkirakan fungsi kerapatan probabilitas dari variabel acak berkelanjutan. (Apa??) Pada dasarnya, kami mencoba menggambar histogram yang dihaluskan, di mana area di bawah kurva sama dengan satu.
library(ggplot2) # for visualization
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "indianred3") +
theme_minimal() + # use a minimal theme
labs(title = "Marriage Participants by age")Quantitative Kenel Density Plot
Grafik menunjukkan distribusi skor. Misalnya, proporsi kasus antara 20 dan 40 tahun akan diwakili oleh area di bawah kurva antara 20 dan 40 pada sumbu x. Seperti halnya bagan sebelumnya, kita juga bisa menggunakan isian dan warna untuk menentukan warna isian dan batas.
Tingkat kehalusan dikendalikan oleh parameter bandwidth bw. Untuk menemukan nilai default untuk variabel tertentu, gunakan bw.nrd0 fungsi. Nilai yang lebih besar akan menghasilkan lebih banyak kehalusan, sementara nilai yang lebih kecil akan menghasilkan lebih sedikit smoothing.
## [1] 5.181946
ggplot(Marriage, aes(x = age)) +
geom_density(fill = "deepskyblue",
bw = 1) +
theme_minimal() + # use a minimal theme
labs(title = "Participants by age",
subtitle = "bandwidth = 1")Smoothing Parameter Plot
Plot kepadatan kernel memungkinkan Anda untuk dengan mudah melihat skor mana yang paling sering dan yang relatif jarang. Namun mungkin sulit untuk menjelaskan arti sumbu y kepada non-ahli statistik. (Tapi itu akan membuat Anda terlihat benar-benar cerdas!)
Alternatif lain untuk histogram adalah bagan titik. Sekali lagi, variabel kuantitatif dibagi menjadi tempat sampah, tetapi daripada bilah ringkasan, setiap pengamatan diwakili oleh titik. Secara default, lebar titik sesuai dengan lebar biner, dan titik-titik ditumpuk, dengan setiap titik mewakili satu pengamatan. Ini bekerja paling baik ketika jumlah pengamatan kecil (katakanlah, kurang dari 150). Opsi isian dan warna dapat digunakan untuk menentukan warna isian dan batas masing-masing titik
library(ggplot2) # for visualization
ggplot(Marriage, aes(x = age)) +
geom_dotplot(fill = "gold",
color = "azure4",
binwidth = 2) +
theme_minimal() + # use a minimal theme
labs(title = "Participants by age",
y = "Proportion",
x = "Age")Dot Chart
Ada lebih banyak opsi yang tersedia. Klik here untuk detail dan contoh.
Grafik bivariat menampilkan hubungan antara dua variabel. Jenis grafik akan tergantung pada tingkat pengukuran variabel (kategoris atau kuantitatif)
Mari kita plot hubungan antara kelas mobil dan jenis penggerak (roda depan, roda belakang, atau penggerak 4 roda) untuk mobil di Fuel economy dataset.
library(ggplot2) # for visualization
mpg$drv<-factor(mpg$drv,
levels = c("f", "r", "4"),
labels = c("front-wheel", "rear-wheel", "4-wheel"))
# stacked bar chart
ggplot(mpg,
aes(x = class,
fill = drv)) +
geom_bar(position = "fill") +
theme_minimal() + # use a minimal theme
labs(y = "Proportion")Stacked Bar Chart
Bagan batang yang dikelompokkan menempatkan bilah untuk variabel kategoris kedua berdampingan. Untuk membuat plot bilah yang dikelompokkan, gunakan position = "single" pilihan. Perhatikan bahwa opsi ini hanya tersedia dalam versi pengembangan terbaru ggplot2, tetapi harus tersedia secara umum segera.
library(ggplot2) # for visualization
ggplot(mpg, aes(x = class, fill = drv)) +
theme_minimal() + # use a minimal theme
geom_bar(position = position_dodge(preserve = "single"))Grouped Bar Chart
Plot bar tersegmentasi adalah plot bar tumpuk di mana setiap batang mewakili 100 persen. Anda dapat membuat bagan batang tersegmentasi menggunakan opsi posisi = “terisi”. Jenis plot ini sangat berguna jika tujuannya adalah untuk membandingkan persentase kategori dalam satu variabel di setiap tingkat variabel lain. Misalnya, proporsi mobil berkenda roda depan naik saat Anda bergerak dari ringkas, ke ukuran sedang, ke minivan.
library(dplyr) # for data manipulation
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
# create a summary dataset (data manipulation)
plotdata <- mpg %>%
group_by(class, drv) %>%
dplyr::summarize(n = n()) %>%
mutate(pct = n/sum(n),
lbl = scales::percent(pct))
# create segmented bar chart
# adding labels to each 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() + # use a minimal theme
labs(y = "Percent",
fill = "Drive Train",
x = "Class",
title = "Automobile Drive by Class") +
theme_minimal()Segmented Bar Chart
catatan: Anda dapat menggunakan opsi tambahan untuk meningkatkan warna dan pelabelan. Dalam grafik di bawah ini
factor memodifikasi urutan kategori untuk variabel kelas dan * labels for the drive variablescale_y_continuous memodifikasi label tanda centang sumbu ylabs menyediakan judul dan mengubah label untuk sumbu x dan y dan legendascale_fill_brewer mengubah skema warna isiantheme_minimal menghapus latar belakang abu-abu dan mengubah warna kisiFungsi lainnya dibahas lebih lengkap di bagian tentang Visualisasi Data Bab Lanjutan.
Bagan mosaik dapat menampilkan hubungan antara variabel kategoris menggunakan persegi panjang yang areanya mewakili proporsi kasus untuk kombinasi tingkat tertentu. Warna ubin juga dapat menunjukkan hubungan derajat di antara variabel.
Meskipun bagan mosaik dapat dibuat dengan ggplot2 menggunakan ggmosaic paket, saya sarankan menggunakan paket vcd sebagai gantinya. Meskipun tidak akan membuat grafik ggplot2, paket ini menyediakan pendekatan yang lebih komprehensif untuk memvisualisasikan data kategoris.
Orang-orang terpesona dengan Titanic (atau dengan Leo?). Dalam Titanic bencana, apa peran seks dan kelas bermain dalam bertahan hidup? Kita dapat memvisualisasikan hubungan antara ketiga variabel kategoris ini menggunakan kode di bawah ini.
## 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
## Loading required package: grid
Basic mosaic plot
Ukuran ubin sebanding dengan persentase kasus dalam kombinasi tingkat tersebut. Jelas lebih banyak penumpang tewas, daripada selamat. Mereka yang tewas terutama penumpang pria kelas 3 dan kru pria (kelompok terbesar).
Jika kita berasumsi bahwa ketiga variabel ini independen, kita dapat memeriksa residu dari model dan menaungi ubin agar sesuai. Dalam grafik di bawah ini, biru tua mewakili lebih banyak kasus daripada yang diharapkan diberikan kemerdekaan. Merah gelap mewakili lebih sedikit kasus dari yang diharapkan jika kemerdekaan memegang.
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")Mosaic plot with shading
Kita dapat melihat bahwa jika kelas, jenis kelamin, dan kelangsungan hidup mandiri, kita melihat lebih banyak kru pria binasa, dan perempuan kelas 1, 2 dan 3 yang bertahan hidup dari yang diharapkan. Sebaliknya, jauh lebih sedikit penumpang kelas 1 (baik pria maupun wanita) meninggal daripada yang diharapkan secara kebetulan. Dengan demikian asumsi kemerdekaan ditolak. (Peringatan spoiler: Leo tidak berhasil.)
Hubungan antara dua variabel kuantitatif biasanya ditampilkan menggunakan sebar dan grafik garis.
Sebaran dibuat untuk mempelajari hubungan antara 2 variabel. Dengan demikian sering disertai dengan perhitungan koefisien korelasi, yang biasanya mencoba mengukur hubungan linier. Namun jenis hubungan lain dapat dideteksi menggunakan sebar, dan tugas umum terdiri dari pas dengan model yang menjelaskan Y dalam fungsi X. Berikut adalah beberapa pola yang dapat Anda deteksi melakukan scatterplot.
library(ggplot2) # data visualization
library(hrbrthemes) # for the `theme_ipsum()` and legend
# Create 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")relationship scatterplots
Tampilan paling sederhana dari dua variabel kuantitatif adalah sebar, dengan setiap variabel diwakili pada sumbu. Misalnya, menggunakan dataset Gaji, kita dapat merencanakan pengalaman (tyrs.since.phd) vs. gaji akademik (gaji) untuk college Professors.
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
data(Salaries, package="carData")
# enhanced scatter plot
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() + # use a minimal theme
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009")Scatterplot 1
Catatan: geom_point dapat digunakan untuk mengubah
color - warna titiksize - ukuran titikshape - bentuk titikalpha - transparansi titik. Transparansi berkisar dari 0 (transparan) hingga 1 (buram), dan merupakan parameter yang berguna ketika titik tumpang tindih.Fungsi scale_x_continuous dan scale_y_continuous mengontrol penskalaan pada sumbu x dan y masing-masing. Kita dapat menggunakan opsi dan fungsi ini untuk membuat plot sebar yang lebih menarik.
Seringkali berguna untuk meringkas hubungan yang ditampilkan dalam scatterplot, menggunakan garis paling pas. Banyak jenis garis yang didukung, termasuk linear, polinomial, dan nonparametric (loess). Secara default, batas kepercayaan 95% untuk garis-garis ini ditampilkan.
library(ggplot2) # for visualization
ggplot(Salaries,
aes(x = yrs.since.phd,
y = salary)) +
geom_point(color= "cornflowerblue") +
geom_smooth(method = "lm", color = "brown1")+
theme_minimal() + # use a minimal theme
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009")Scatterplot Linear
Yang jelas, gaji meningkat dengan pengalaman. Namun, tampaknya ada penurunan di ujung yang tepat - profesor dengan pengalaman yang signifikan, mendapatkan gaji yang lebih rendah. Garis lurus tidak menangkap efek non-linear ini. Sebuah garis dengan tikungan akan lebih cocok di sini.
Garis regresi polinomial menyediakan garis pas dari formulir
\[\begin{equation} \label{eq:1} \hat{y}=\beta_0+\beta_1x+\beta_2x^2+\cdots+\beta_nx^2 \end{equation}\]
Biasanya garis kuadrat (satu tikungan), atau kubik (dua tikungan) digunakan. Jarang perlu menggunakan urutan yang lebih tinggi \(( >3 )\) polinomial. Menerapkan pas kuadrat ke kumpulan data gaji menghasilkan hasil berikut.
library(ggplot2) # for visualization
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() + # use a minimal theme
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009")Scatterplot Quadratic
Akhirnya, garis fit nonparametric yang dihaluskan sering dapat memberikan gambaran yang baik tentang hubungan. Default dalam ggplot2 adalah loess garis yang merupakan singkatan dari pemhalusan sebabar tertimbang lokal.
library(ggplot2) # for visualization
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() + # use a minimal theme
labs(x = "Years Since PhD",
y = "",
title = "Experience vs. Salary",
subtitle = "9-month salary for 2008-2009") +
theme_minimal()Scatterplot Smoothed Nonparametric
Saat merencanakan hubungan antara variabel kategoris dan variabel kuantitatif, sejumlah besar jenis grafik tersedia. Ini termasuk bagan batang menggunakan statistik ringkasan, plot kepadatan kernel yang dikelompokkan, plot kotak berdampingan, plot biola berdampingan, plot rata-rata / sem, plot punggung bukit, dan plot Cleveland.
Di bagian sebelumnya, bagan batang digunakan untuk menampilkan jumlah kasus menurut kategori untuk satu variabel atau untuk dua variabel. Anda juga dapat menggunakan bagan batang untuk menampilkan statistik ringkasan lainnya (misalnya, sarana atau median) pada variabel kuantitatif untuk setiap tingkat variabel kategoris.
Misalnya, grafik berikut menampilkan gaji rata-rata untuk sampel profesor universitas berdasarkan peringkat akademik mereka.
library(dplyr) # for data manipulation
library(ggplot2) # for visualization
library(scales) # automatically determining breaks/labels
data(Salaries, package="carData")
# calculate mean salary for each rank
plotdata <- Salaries %>%
group_by(rank) %>%
dplyr::summarize(mean_salary = mean(salary))
# plot mean salaries in a more attractive fashion
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() + # use a minimal theme
labs(title = "Mean Salary by Rank",
subtitle = "9-month academic salary for 2008-2009",
x = "",
y = "")Bar Chart (Summary statistics)
Seseorang dapat membandingkan grup pada variabel numerik dengan mengganti kernel density plot dalam satu grafik. Mari kita plot distribusi gaji berdasarkan peringkat menggunakan plot kepadatan kernel.
ggplot(Salaries,
aes(x = salary,
fill = rank)) +
geom_density(alpha = 0.4) +
theme_minimal() +
labs(title = "Salary distribution by rank")Grouped Kernel Density Plots
Sebuah alpha membuat plot kepadatan sebagian transparan sehingga kita dapat melihat apa yang terjadi di bawah tumpang tindih. Nilai alfa berkisar dari 0 (transparan) hingga 1 (buram). Grafik menjelaskan bahwa, secara umum, gaji naik dengan pangkat. Namun, kisaran gaji untuk profesor penuh sangat luas.
Plot kotak menampilkan \(25^{th}\) persentil, median, dan \(75^{th}\) persentil distribusi. Kumis (garis vertikal) menangkap sekitar 99% dari distribusi normal, dan pengamatan di luar rentang ini diplot sebagai titik yang mewakili outlier (lihat gambar di bawah)
Box Plots
Plot kotak berdampingan sangat berguna untuk membandingkan grup (yaitu, tingkat variabel kategoris) pada variabel numerik. Mari kita plot distribusi gaji berdasarkan peringkat menggunakan box-plot. Plot kotak berang-berang memberikan metode perkiraan untuk memvisualisasikan apakah grup berbeda. Meskipun bukan tes formal, jika takik dua plot kotak tidak tumpang tindih, ada bukti kuat (kepercayaan 95%) bahwa median dari dua 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")Box Plots
Dalam contoh di atas, ketiga grup tampak berbeda. Salah satu keunggulan boxplot adalah lebarnya biasanya tidak berarti. Ini memungkinkan Anda untuk membandingkan distribusi banyak grup dalam satu grafik.
Plot biola mirip dengan kernel density plot tetapi dicerminkan dan diputar \(90^0\). Mari kita plot distribusi gaji berdasarkan 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")Violin Plots
Plot punggung bukit (juga disebut plot sukacita) menampilkan distribusi variabel kuantitatif untuk beberapa kelompok. Mereka mirip dengan kernel density plot dengan vertikal faceting, tapi mengambil lebih sedikit ruang. Plot ridgeline dibuat dengan ggridges paket.
Gunakan Fuel economy dataset, Mari kita plot distribusi kota mengemudi mil per galon oleh kelas mobil.
library(dplyr) # for data manipulation
library(ggplot2) # for visulization
library(ggridges) # to handle overlapping visulization
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")Ridgeline Plots
Saya telah menekan legenda di sini karena berlebihan (distribusi sudah dilabeli pada sumbu y). Tidak mengherankan, truk pickup memiliki jarak tempuh termiskin, sementara subkomputer dan mobil kompak cenderung mencapai peringkat. Namun, ada berbagai skor jarak tempuh gas untuk mobil-mobil kecil ini.
Perhatikan kemungkinan tumpang tindih distribusi adalah trade-off untuk grafik yang lebih ringkas. Anda dapat menambahkan transparansi jika tumpang tindih parah menggunakan geom_density_ridges(alfa = n), di mana n berkisar antara 0 (transparan) hingga 1 (buram). Lihat package vingnette for more details.
Metode populer untuk membandingkan grup pada variabel numerik adalah plot rata-rata dengan bilah kesalahan. Bilah kesalahan dapat mewakili simpangan baku, kesalahan standar rata-rata, atau interval kepercayaan diri. Di bagian ini, kami akan merencanakan sarana dan kesalahan standar. Kita dapat menggunakan teknik yang sama untuk membandingkan gaji di seluruh pangkat dan jenis kelamin. (Secara teknis, ini tidak dua bahasa karena kami merencanakan peringkat, jenis kelamin, dan gaji, tetapi tampaknya cocok di sini).
library(dplyr) # for data manipulation
library(ggplot2) # for visulization
library(ggridges) # to handle overlapping visulization
# calculate means, standard deviations,
# standard errors, and 95% confidence
# intervals by rank
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))
# improved means/standard 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")Line Plots
Hubungan antara variabel pengelompokan dan variabel numerik dapat ditampilkan dengan plot sebar. Misalnya, plot pembagian gaji berdasarkan peringkat menggunakan plot strip. Plot sebar satu dimensi ini disebut plot strip. Sayangnya, kelebihan cetak poin membuat interpretasi menjadi sulit. Hubungan lebih mudah untuk melihat apakah poinnya gelisah. Pada dasarnya angka acak kecil ditambahkan ke setiap koordinat y. Juga lebih mudah untuk membandingkan kelompok jika kita menggunakan warna.
library(ggplot2) # for visulization
library(scales) # scaling infrastructure
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")Strip Plots
Opsi legend.position = "none" digunakan untuk menekan legenda (yang tidak diperlukan di sini). Plot jittered bekerja dengan baik ketika jumlah poin tidak terlalu besar.
Mungkin lebih mudah untuk memvisualisasikan distribusi jika kita menambahkan boxplot ke plot jitter. Beberapa opsi ditambahkan untuk membuat plot ini.
size = 1 makes the lines thickeroutlier.color = "black" membuat outlier hitamoutlier.shape = 1 menentukan lingkaran untuk outlieroutlier.size = 3 meningkatkan ukuran outlieralpha = 0.5 membuat poin lebih transparanwidth = .2 mengurangi jumlah jitter (.4 adalah default)Akhirnya, \(x\) and \(y\) sumbu dipuja menggunakan coord_flip fungsi (i.e., grafik dihidupkan di sisinya).
library(ggplot2) # for visulization
library(scales) # scaling infrastructure
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()Combining Jitter and Boxplots 1
Before moving on, it is worth mentioning the geom_boxjitter function provided in the ggpol package. It creates a hybrid boxplot - half boxplot, half scatterplot.
library(ggplot2) # for visulization
library(scales) # scaling infrastructure
library(ggpol) # hybrid boxplot -half scatterplot
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")Combining Jitter and Boxplots 2
Plot beeswarm (juga disebut plot sebaran biola) mirip dengan sebaran yang gelisah, karena mereka menampilkan distribusi variabel kuantitatif dengan merencanakan titik dengan cara yang mengurangi tumpang tindih. Selain itu, mereka juga membantu menampilkan kepadatan data di setiap titik (dengan cara yang mirip dengan violin plot). Melanjutkan contoh sebelumnya
library(ggplot2) # for visulization
library(scales) # scaling infrastructure
library(ggbeeswarm) # reduces overlap
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")Beeswarm Plots
Plot dibuat menggunakan fungsi geom_quasirandom sama. Plot ini dapat lebih mudah dibaca daripada plot strip sederhana yang gelisah. Untuk mempelajari selengkapnya tentang plot ini, lihat Beeswarm-style plots dengan ggplot2.
Plot Cleveland berguna ketika Anda ingin membandingkan statistik numerik untuk sejumlah besar kelompok. Misalnya, Anda ingin membandingkan harapan hidup 2007 untuk negara Asia menggunakan gapminder dataset.
library(dplyr) # for data manipulation
library(ggplot2) # for visulization
library(scales) # scaling infrastructure
library(ggbeeswarm) # reduces overlap
library(gapminder) # for dataset `gapminder`
data(gapminder, package="gapminder") # load dataset `gapminder`
# subset Asian countries in 2007
library(dplyr)
plotdata <- gapminder %>%
filter(continent == "Asia" &
year == 2007)
# Fancy Cleveland plot
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())Beeswarm Plots
Jepang jelas memiliki harapan hidup tertinggi, sementara Afghanistan memiliki yang terendah sejauh ini. Plot terakhir ini juga disebut grafik lolipop.
Grafik multivariat menampilkan hubungan di antara tiga variabel atau lebih. Ada dua metode umum untuk mengakomodasi beberapa variabel: pengelompokan dan faceting.
Dalam pengelompokan, nilai dari dua variabel pertama dipetakan ke sumbu x dan y. Kemudian variabel tambahan dipetakan ke karakteristik visual lainnya seperti warna, bentuk, ukuran, tipe garis, dan transparansi. Pengelompokan memungkinkan Anda merencanakan data untuk beberapa grup dalam satu grafik. Menggunakan Salaries data set, mari kita tampilkan hubungan antara yrs.since.phd dan gaji.
library(carData) # for dataset
library(ggplot2) # for visulization
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")Multivariate Grouping Plot 1
Selanjutnya, mari kita tambahkan jenis kelamin profesor, menggunakan bentuk poin untuk menunjukkan seks. Kami akan meningkatkan ukuran poin dan menambahkan transparansi untuk membuat poin individu lebih jelas.
library(carData) # for dataset
library(ggplot2) # for visulization
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")Multivariate Grouping Plot 2
Kita tidak bisa mengatakan bahwa ini adalah grafis yang bagus. Ini sangat sibuk, dan mungkin sulit untuk membedakan laki-laki dari profesor perempuan. Faceting (dijelaskan di bagian berikutnya) mungkin akan menjadi pendekatan yang lebih baik.
Perhatikan perbedaan antara menentukan nilai konstanta (such as size = 3) dan pemetaan variabel ke karakteristik visual (e.g., color = rank). Pemetaan selalu ditempatkan dalam fungsi lebah, sementara penetapan nilai konstanta selalu muncul di luar fungsi lebah.
Berikut adalah contoh yang lebih bersih. Kami akan membuat grafik hubungan antara tahun sejak Ph.D. dan gaji menggunakan ukuran poin untuk menunjukkan tahun layanan. Ini disebut plot gelembung.
library(carData) # for dataset
library(ggplot2) # for visulization
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")Multivariate Grouping Plot 3
Jelas ada hubungan positif yang kuat antara tahun sejak Ph.D. dan tahun pelayanan. Asisten Profesor jatuh dalam 0-11 tahun sejak Ph.D. dan 0-10 tahun jangkauan layanan. Jelas profesional yang sangat berpengalaman tidak tinggal di tingkat Asisten Profesor (mereka mungkin dipromosikan atau meninggalkan Universitas). Kami tidak menemukan demarkasi waktu yang sama antara Associate dan Full Professors. Bubble plots dijelaskan secara lebih rinci di bab selanjutnya.
Sebagai contoh akhir, mari kita lihat yrs.since.phd vs gaji dan tambahkan seks menggunakan warna dan quadratic best fit lines.
library(carData) # for dataset
library(ggplot2) # for visulization
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()Multivariate Grouping Plot 4
Pengelompokan memungkinkan Anda merencanakan beberapa variabel dalam satu grafik, menggunakan karakteristik visual seperti warna, bentuk, dan ukuran. Dalam faceting, grafik terdiri dari beberapa plot terpisah atau kelipatan kecil, satu untuk setiap tingkat variabel ketiga, atau kombinasi variabel. Paling mudah untuk memahami ini dengan contoh.
library(carData) # for dataset
library(ggplot2) # for visulization
ggplot(Salaries, aes(x = salary)) +
geom_histogram(fill = "cornflowerblue",
color = "white") +
facet_wrap(~rank, ncol = 1) +
theme_minimal() +
labs(title = "Salary histograms by rank")Multivariate Faceting 1
Sebuah facet_wrap membuat grafik terpisah untuk setiap tingkat peringkat. Sebuah ncol mengontrol jumlah kolom. Dalam contoh berikutnya, dua variabel digunakan untuk menentukan aspek.
Di sini, fungsi menetapkan seks ke baris dan peringkat ke kolom, membuat matriks 6 plot dalam satu grafik.
library(carData) # for dataset
library(ggplot2) # for visulization
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)")Multivariate Faceting 2
Kita juga dapat menggabungkan pengelompokan dan faceting. Mari kita gunakan plot Mean /SE dan faceting untuk membandingkan gaji profesor pria dan wanita, dalam pangkat dan disiplin. Kita akan menggunakan warna untuk membedakan seks dan menghadapi untuk membuat plot untuk peringkat berdasarkan kombinasi disiplin.
library(carData) # for dataset
library(ggplot2) # for visulization
library(dplyr) # data manipulation
# calculate means and standard erroes by sex,
# rank and discipline
plotdata <- Salaries %>%
group_by(sex, rank, discipline) %>%
dplyr::summarize(n = n(),
mean = mean(salary),
sd = sd(salary),
se = sd / sqrt(n))
# create better labels for discipline
plotdata$discipline <- factor(plotdata$discipline,
labels = c("Theoretical",
"Applied"))
# create 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")Multivariate Faceting 3
Pernyataan facet_grid(. ~ rank + discipline) tidak menspesifikasikan variabel baris (.) dan kolom yang ditentukan oleh kombinasi peringkat dan disiplin.
Sebuah fungsi theme() membuat tema hitam dan putih dan menghilangkan garis kisi vertikal dan garis kisi horizontal kecil. The scale_color_brewer() mengubah skema warna untuk titik dan bilah kesalahan.
Pada pandangan pertama, tampaknya mungkin ada perbedaan gender dalam gaji untuk rekan dan profesor penuh di bidang teoritis. Saya mengatakan “mungkin” karena kita belum melakukan pengujian hipotesis formal belum (ANCOVA dalam hal ini). Lihat Customizing untuk mempelajari selengkapnya tentang mengkustomisasi tampilan grafik.
Sebagai contoh akhir, kami akan beralih ke set data baru dan merencanakan perubahan harapan hidup dari waktu ke waktu untuk negara-negara di “Asia”. Data berasal dari gapminder set data di paket gapminder . Setiap negara muncul dalam aspeknya sendiri. Fungsi tema digunakan untuk menyederhanakan warna latar belakang, memutar teks sumbu x, dan membuat ukuran font lebih kecil.
library(gapminder) # for dataset
library(ggplot2) # for visulization
library(dplyr) # data manipulation
# plot life expectancy by year separately
# for each country in the Americas
data(gapminder, package = "gapminder")
# Select the Americas data
plotdata <- dplyr::filter(gapminder,
continent == "Asia")
# plot life expectancy by year, for each country
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") Multivariate Faceting 4