Introduction-ggplot2

Package ggplot2 merupakan salah satu package untuk visualisasi yang sudah diakui oleh sebagian besar pengguna R sebagai package terbaik untuk pembuatan visualisasi statis. Tahap awal yang harus dilakukan untuk melakukan visualisasi adalah dengan mengaktifkan package, atau melakukan instalasi package jika Anda belum menginstall package.

install.packages('ggplot2')
library(ggplot2)

Tiga hal yang harus dimiliki untuk melakukan visualisasi menggunakan ggplot2.

  1. Data

  2. Fungsi ggplot() dan mendefinisikan aesthetic mapping (menentukan peubah yang akan digunakan)

  3. Bentuk geometri pada package ggplot2 yang disingkat dengan geom

Salah satu data yang digunakan pada praktikum yaitu data house_price.

data_house=read.csv("https://raw.githubusercontent.com/gerrydito/Sains-Data-S2/master/Praktikum/Visualisasi%20Data/house_price.csv", header = TRUE, sep=",")
library(grid)
vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)
arrange <- function(..., nrow=NULL, ncol=NULL, as.table=FALSE) {
  dots <- list(...)
  n <- length(dots)
  if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)}
  if(is.null(nrow)) { nrow = ceiling(n/ncol)}
  if(is.null(ncol)) { ncol = ceiling(n/nrow)}
  ## NOTE see n2mfrow in grDevices for possible alternative
  grid.newpage()
  pushViewport(viewport(layout=grid.layout(nrow,ncol) ) )
  ii.p <- 1
  for(ii.row in seq(1, nrow)){
    ii.table.row <- ii.row
    if(as.table) {ii.table.row <- nrow - ii.table.row + 1}
    for(ii.col in seq(1, ncol)){
      ii.table <- ii.p
      if(ii.p > n) break
      print(dots[[ii.table]], vp=vp.layout(ii.table.row, ii.col))
      ii.p <- ii.p + 1
    }
  }
}

sketsa1 = ggplot(data= data_house)
sketsa2 = ggplot(data= data_house, aes(x= bedrooms, y = price))
arrange(sketsa1,sketsa2)

Hasil tampilan abu-abu polos grafik sebelah kiri diperoleh karena kita belum menentuka peubah yang akan digunakan. Sementara itu, grafik sebelah kanan adalah hasil saat kita telah mendefinisikan peubah yang akan digunakan.

Notes: fungsi arrange digunakan untuk mengatur layout. Fungsi tersebut dibuat oleh Stephen Turner.

Langkah selanjutnya adalah menentukan jenis visualisasi yang akan digunakan. Misalkan kita ingin membuat visualisasi menggunakan scatter plot, maka kita dapat menggunakan fungsi geom_point(). Pada ggplot, jika kita ingin menambahkan fungsi geom atau layer lainnya, kita cukup menggunakan tanda “+”. Sehingga, akan diperoleh hasil sebagai berikut.

grafik1 = ggplot(data= data_house, aes(x= bedrooms, y = price))+geom_point()
grafik2 = ggplot(data= data_house)+geom_point(aes(x= bedrooms, y = price))
arrange(grafik1,grafik2)

Untuk mempercantik tampilan grafik, kita dapat menambahkan opsi color didalam aes, baik pada ggplot ataupun geom_point(). Selanjutnya, opsi size dapat ditambahkan untuk mengatur ukuran titik. Selain itu, jika kita juga dapat menambahkan fungsi labs() untuk menambahkan judul dan mengubah judul pada sumbu x dan sumbu y. Fungsi theme_light() digunakan untuk mengubah tampilan visualisai. Berikut adalah hasilnya.

ggplot(data= data_house)+geom_point(aes(x= bedrooms, y = price,  color = as.character(condition)))+ labs(title = 'Scatter Plot Price vs Bedrooms', x = 'Bedrooms', y = 'Price', color = "Condition")+
  theme_light()

Beberapa fungsi geometri yang ada pada ggplot:

  • geom_point(), plot tebaran

  • geom_bar(), diagram batang dari data mentah individu

  • geom_col(), diagram batang dari data agregate

  • geom_histogram(), histogram

  • geom_density, kurva kepekatan peluang

  • geom_boxplot, diagram kotak garis

  • geom_violin, diagram violin

  • geom_line(), diagram garis

Berikut adalah beberapa fungsi yang dapat digunakan untuk modifikasi tampilan visualisasi dengan ggplot2

  • theme(), mengatur tema sesuai yang diinginkan

  • theme_light(), mengganti background menjadi warna putih

  • element_text(), menambahkan text pada bagian tertentu

  • scale_fill_manual(), mengubah warna bagian dalam geom secara manual

  • scale_fill_gradient(), mengubah warna gradasi secara manual

Visualisasi Nilai Data

Bar Chart

Misalkan kita ingin menampilkan jumlah rumah berdasarkan kondisi.

ggplot(data= data_house, aes(x = condition)) + geom_bar(stat = 'count',fill = 'skyblue') + labs(x = 'Kondisi Rumah', y = 'Jumlah Rumah', title = 'Jumlah Rumah di Setiap Kondisi')

Needle Chart

Misalkan kita henda menampilkan rata-rata harga rumah di setiap kota. Hal pertama yang akan dilakukan yaitu mempersiapkan data. Berikut adalah syntax R nya

data_price = aggregate(data_house$price, by = list(data_house$city), FUN = mean)
head(data_price)
##              Group.1        x
## 1             Algona 207288.0
## 2             Auburn 299340.4
## 3 Beaux Arts Village 745000.0
## 4           Bellevue 847180.7
## 5      Black Diamond 339605.6
## 6            Bothell 481441.9
ggplot(data= data_price, aes(x = reorder(Group.1, x), y = x))+ geom_point(color = "navyblue", size = 4, alpha = 0.6) + geom_segment(aes(x = reorder(Group.1, x),xend = reorder(Group.1, x), y = 0, yend = x))+labs(x = "City", y = "Price Average") +coord_flip() 

Visualisasi Sebaran Data

Histogram

Selanjutnya, misalkan saja kita ingin melihat sebaran dari harga rumah

ggplot(data_house) +
  geom_histogram(aes(x = price),col="navyblue",binwidth = 5000) +
  ggtitle("Histogram Harga Rumah") +
  labs(x= "Price") + 
  theme(plot.title = element_text(hjust = 0.5)) + theme_light()

Boxplot

Misalkan kita ingin melihat perbandingan sebaran harga rumah dari beberapa kota.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked _by_ '.GlobalEnv':
## 
##     arrange
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data_house%>%
  filter(city %in% c("Shoreline","Seattle"
                     ,"Auburn","Duvall","Burien",
                     "Tukwila","Vashon","Yarrow Point",
                     "SeaTac","Medina")
         )%>%
  ggplot() +
  geom_boxplot(aes(x = city,y = price,fill=city),show.legend = F) +
  ggtitle("Sebaran Harga Rumah Setiap Kota") +
  ylab("Price") +
  xlab("City") + 
  theme(plot.title = element_text(hjust = 0.5))+
  theme_light() + coord_flip()

Berdasarkan boxplot diatas, terlihat bahwa kota Medina adalah kota dengan harga rumah yang lebih mahal dibandingkan kota lainnnya.

Density Plot

Sama seperti pada kasus sebelumnya, misalkan kita ingin melihat perbandingan sebaran harga rumah dari beberapa kota. Density plot akan menampilkan kurva dugaan dari dugaan fungsi kepekatan peluang dari peubah yang dianalisis.

library(ggridges)
data_house%>%
  filter(city %in% c("Shoreline","Seattle"
                     ,"Auburn","Duvall","Burien",
                     "Tukwila","Vashon","Yarrow Point",
                     "SeaTac","Medina")
         )%>%
  ggplot() +
  geom_density_ridges(aes(y = city,x = price,fill=city), show.legend = F) +
  ggtitle("Sebaran Harga Rumah Setiap Kota") +
  ylab("City") +
  xlab("Price") + 
  theme(plot.title = element_text(hjust = 0.5))+
  theme_bw()
## Picking joint bandwidth of 133000

Berdasarkan boxplot diatas, terlihat bahwa kota Medina adalah kota dengan harga rumah yang lebih mahal dibandingkan kota lainnnya.

Visualisasi Hubungan Antar Peubah Numerik

Pada subbab ini data yang akan digunakan adalah data mpg yang merupakan data bawaan dari R

data(mpg)
car_data = mpg
names(car_data)
##  [1] "manufacturer" "model"        "displ"        "year"         "cyl"         
##  [6] "trans"        "drv"          "cty"          "hwy"          "fl"          
## [11] "class"

Scatter Plot

Scatter plot digunakan untuk melihat pola hubungan antara dua peubah numerik. Misalkan saja kita ingin melihat pola hubungan antara peubah cty dan displ.

ggplot(data= car_data)+geom_point(aes(x= displ, y = cty),  color = "navyblue", size  =4)+ labs(x = 'displ', y = 'cty')+ ggtitle("Scatter Plot Price vs Bedrooms")+
  theme_light()

Selanjutnya, misal ingin dilihat pola hubungan antara peubah cty dan displ berdasarkan peubah fl (fuel type), maka dapat dibuat program sebagai berikut:

ggplot(data= car_data)+geom_point(aes(x= displ, y = cty,color = fl ), size  =4)+ labs(x = 'displ', y = 'cty')+ ggtitle("Scatter Plot Price vs Bedrooms")+
  theme_light()

Correlogram

Correlogram merupakan teknik visualisasi yang membuat grafik berdasarkan nilai koefisien korelasi yang dikonversikan dalam bentuk warna. Visualisasi ini biasa digunakan jika kita hendak melihat korelasi dari beberapa peubah numerik.

Misalkan dalam kasus ini, kita ingin melihat korelasi antara peubah numerik pada data mobil (car_data) dana data rumah (data_house), maka kita dapat menggunakan syntax sebagai berikut.

korelasi_car = GGally::ggcorr(car_data, method = c("everything","pearson"),geom = "tile")  + ggtitle("Korelasi Antar Peubah Numerik Data Mobil")
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Warning in GGally::ggcorr(car_data, method = c("everything", "pearson"), : data
## in column(s) 'manufacturer', 'model', 'trans', 'drv', 'fl', 'class' are not
## numeric and were ignored
korelasi_rumah = GGally::ggcorr(data_house, method = c("everything","pearson"),geom = "tile") + ggtitle("Korelasi Antar Peubah Numerik Data Rumah")
## Warning in GGally::ggcorr(data_house, method = c("everything", "pearson"), :
## data in column(s) 'date', 'street', 'city', 'statezip', 'country' are not
## numeric and were ignored
arrange(korelasi_car, korelasi_rumah)

Visualisasi Data Time Series

Time Series Plot

Time series plot digunakan untuk menampilkan grafik pergerakan suatu peubah dari waktu ke waktu. Pada subbab ini, kita akan menggunakan data buatan untuk mengilustrasikan pembuatan time series plot, baik pada data deret waktu tunggal ataupun jamak. Berikut adalah program R nya.

df1 <- data.frame(date = as.Date("2021-01-01") - 0:99,
                 sales = rnorm(100, 1100, 30), city = "Jakarta")

df2 <- data.frame(date = as.Date("2021-01-01") - 0:99,
                 sales = rnorm(100, 1000, 20), city= "Bogor")

head(df1)
##         date    sales    city
## 1 2021-01-01 1120.030 Jakarta
## 2 2020-12-31 1067.724 Jakarta
## 3 2020-12-30 1097.771 Jakarta
## 4 2020-12-29 1096.651 Jakarta
## 5 2020-12-28 1127.667 Jakarta
## 6 2020-12-27 1105.582 Jakarta
head(df2)
##         date     sales  city
## 1 2021-01-01 1023.5541 Bogor
## 2 2020-12-31 1041.3989 Bogor
## 3 2020-12-30  982.7239 Bogor
## 4 2020-12-29  988.7830 Bogor
## 5 2020-12-28 1005.8038 Bogor
## 6 2020-12-27  990.1469 Bogor
#Menampilkan time series plot df1
ggplot(df1, aes(x=date, y=sales)) +
       geom_line() + geom_point()

#Menampilkan time series plot df1 df2
data_gab = rbind(df1,df2)
ggplot(data_gab, aes(x=date, y=sales, color = city)) +
       geom_line() + geom_point()

References