Visualisasi Data dengan ggplot2

A. Pendahuluan

A.1 Package

  • Library yang digunakan adalah
library(tidyverse)
library(ggridges)
library(GGally)
library(plotly)  # digunakan untuk membuat plot interaktif
library(grid)  # Digunakan untuk fungsi 'arrange'
library(DT)

A.2 Data

  • Data yang digunakan pada praktikum kali ini adalah data House Price Prediction yang memiliki 36 kolom.

  • Berikut adalah informasi singkat mengenai data

The real estate markets, like those in Sydney and Melbourne, present an interesting opportunity for data analysts to analyze and predict where property prices are moving towards. Prediction of property prices is becoming increasingly important and beneficial. Property prices are a good indicator of both the overall market condition and the economic health of a country. Considering the data provided, we are wrangling a large set of property sales records stored in an unknown format and with unknown data quality issues"

  • Data bisa diakses melalui link berikut : data_house

  • Anda bisa mengunduhnya dan disimpan di Komputer/Laptop Anda, atau Anda bisa mengaksesnya secara langsung.

data_house<-read.csv("https://raw.githubusercontent.com/gerrydito/Sains-Data-S2/master/Praktikum/Visualisasi%20Data/house_price.csv", header = TRUE, sep=",")

Opsi : + header = TRUE digunakan untuk menjadikan header / baris pertama sebagai nama variabel + sep="," digunakan untuk memisahkan data dengan separator koma (,), perlu diperhatikan, ada beberapa format .csv yang menggunakan titik koma (;), sebagai separator.

A.3 Tambahan

  • Untuk mempermudah visualisasi beberapa bagian dalam Praktikum ini, digunakan fungsi arrange yang dibuat oleh Stephen Turner
  • Fungsi ini akan digunakan pada ggplot2 menyandingkan gambar-gambar yang tampil pada ggplot2 dimana gamaba-gambar tersebut dapat disandingkan bersama dengan sejajar kanan-kiri atau atas-bawah

Berikut adalah syntax dari arrange sthepen turner

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
    }
  }
}

B. ggplot2 overview

  • Secara umum pembuatan grafik pada package ggplot2 dapat dilakukan dengan menggunakan dua cara yaitu
  1. qplot(x,y,geom="xxx") atau
  2. ggplot()+geom_xxx(aes(x,y)).

B.1 Scatter Plot

set.seed(581)
vectorx<-rnorm(10, mean=5, sd=1)
vectory<-rnorm(10, mean=5, sd=1)
a1<-qplot(x=vectorx,
          y=vectory,
          geom = "point")

a2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory))

arrange(a1,a2)

B.2 Memberi Plot Title

b1<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          main="qplot")

b2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory))+
  labs(title="ggplot2")

arrange(b1,b2)

Mengubah axis label

c1<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

c2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory))+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(c1,c2)

## B.4 Mengubah axis limits

d1<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y",
          xlim=c(-5,20),
          ylim=c(-10,30))

d2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory))+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  xlim(-5,20)+
  ylim(-10,30)

arrange(d1,d2)

B.5 Memberi Warna Titik

  • Perlu berhati-hati dalam menaruh colour="", dalam ggplot2, karena bisa terjadi grafik yang tempil adalah untuk titik menggunakan warna default dari qplot atau ggplot2 seperti berikut ini :
e1<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          colour="blue",
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

e2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory,
                 colour="blue"))+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(e1,e2)

+ colour="blue", dibaca sebagai pewarna kategori, sedangkan warnanya diambil warna default kategori, jika ingin mewarnai titik, maka sytax-nya seperti berikut:

e3<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          colour="isiapapunlah",
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")+
  scale_colour_manual(values = c("blue"))+
  theme(legend.position="none") # legend.posistion buat hapus legend seperti yang tampil padda grafik sebelumnya

e4<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory),
             colour="blue")+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(e3,e4)

+ Anda bisa juga memberi warna dengan metode lain, namun Anda perlu membuat vectorx dan vectory dalam suatu data frame

data_sim <- cbind.data.frame(vectorx, vectory)
data_sim
##     vectorx  vectory
## 1  4.172756 5.071968
## 2  2.802263 5.523200
## 3  5.386153 5.704373
## 4  5.646030 4.456073
## 5  5.321750 5.313083
## 6  4.535588 4.135764
## 7  4.686430 5.789444
## 8  5.506174 5.159337
## 9  5.440771 4.517872
## 10 6.043646 6.208675
e5<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          data=data_sim,
          colour=factor(vectorx),
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

e6<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory,
                 colour=factor(vectorx)),
             data=data_sim)+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(e5,e6)

+ Jika Variasi Warna Anda rasa terlalu banyak, Anda bisa memanfaatkan fungsi round.

e7<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          data=data_sim,
          colour=factor(round(vectorx)),
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

e8<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory,
                 colour=factor(round(vectorx))),
             data=data_sim)+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(e7,e8)

## B.6 Mengubah Bentuk Titik

f1<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          data=data_sim,
          colour=factor(round(vectorx)),
          shape =factor(vectorx),
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

f2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory,
                 colour=factor(round(vectorx)),
                 shape =factor(vectorx)),
             data=data_sim)+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(f1,f2)
## Warning: The shape palette can deal with a maximum of 6 discrete values because
## more than 6 becomes difficult to discriminate; you have 10. Consider
## specifying shapes manually if you must have them.
## Warning: Removed 4 rows containing missing values (geom_point).
## Warning: The shape palette can deal with a maximum of 6 discrete values because
## more than 6 becomes difficult to discriminate; you have 10. Consider
## specifying shapes manually if you must have them.
## Warning: Removed 4 rows containing missing values (geom_point).

+ Dapat dilihat, bahwa pada pembuatan grafik mempunyai batasan mengenai banyaknya bentuk titik yang ditampilkan.

f3<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          data=data_sim,
          colour=factor(round(vectorx)),
          shape =factor(round(vectorx)),
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

f4<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory,
                 colour=factor(round(vectorx)),
                 shape =factor(round(vectorx))),
             data=data_sim)+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(f3,f4)

B.7 Mengubah Ukuran Titik

g1<-qplot(x=vectorx,
          y=vectory,
          geom = "point",
          data=data_sim,
          size =vectorx,
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

g2<-ggplot()+
  geom_point(aes(x=vectorx,
                 y=vectory,
                 size = vectorx),
             data=data_sim)+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(g1,g2)

B.8 Menggabungkan lebih dari Satu Geom

  • ggplot2 memiliki banyak geom yang bisa digunakan sesuai dengan keperluan, diantaranya adalah

geom + Berikut ini, akan digabungkan geom_poin dan geom_line

h1<-qplot(x=vectorx,
          y=vectory,
          geom = c("point", "line"),
          data=data_sim,
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

h2<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_line()+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(h1,h2)

+ Selanjutnya penggabungan grafik antara geom_point dan geom_smooth

h3<-qplot(x=vectorx,
          y=vectory,
          geom = c("point", "smooth"),
          data=data_sim,
          main="qplot",
          xlab = "Label Axis X",
          ylab="Label Axis Y")

h4<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth()+
  labs(title="ggplot2")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

arrange(h3,h4)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

+ terlihat pada syntax diatas ada pesan error mengenai penggunaan method dalam membuat grafik dan formula antara y dan x yang seperti apa yang mau dibuat grafiknya. * method * formula

Berikut adalah contoh grafik dengan opsi yang lain

h5<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="loess", formula=y~x)+
  labs(title="loess : y~x")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

h6<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="loess", formula=y~log(x))+
  labs(title="loess : y~log(x)")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

h7<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~x)+
  labs(title="lm : y~x")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")

h8<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="lm : y~log(x)")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")
arrange(h5,h6, h7, h8)

## B.9 Menggunakan Theme

i1<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="theme_bw()")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  theme_bw()

i2<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="theme_dark()")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  theme_dark()

i3<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="theme_classic()")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  theme_classic()

i4<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="theme_minimal()")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  theme_minimal()

i5<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="theme_light()")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  theme_light()

i6<-ggplot(aes(x=vectorx,
                 y=vectory),
             data=data_sim)+
  geom_point()+
  geom_smooth(method="lm", formula=y~log(x))+
  labs(title="theme_linedraw()")+
  xlab("Label Axis X")+
  ylab("Label Axis Y")+
  theme_linedraw()

arrange(i1,i2, i3, i4, i5, i6)

Jika, Anda ingin mempelajari lebih lanjut mengenai Visualisasi Grafik, bisa dipelajari di link-link berikut :

C. Visualisasi Distribusi

Pada Subbagian Data, sudah kita import data dari github dengan nama data_house

datatable(head(data_house))

Selanjutnya, misalkan saja kita ingin melihat bagaimana distribusi atau sebaran dari harga rumah yang disini ada ki kolom price. Grafik yang sering digunakan adalah histogram

# bindwith untuk mengatur lebar kotak histogram
# col untuk mewarnai garis kotak warna darked sedangkan 
# fill untuk mewarnai dalam kotak histogram dengan darked
# theme(plot.title) untuk mengatur posisi judul dimana hjust=0.5 agar judul ada di tengah-2
ggplot(data_house) +
  geom_histogram(aes(x = price),fill="darkred",col="darkred",binwidth = 5000) +
  ggtitle("Histogram Harga Rumah") +
  ylab("Jumlah Rumah") +
  xlab("Harga Rumah") + 
  theme(plot.title = element_text(hjust = 0.5))

Argumen fill digunakan untuk memberi warna pada histogram, sedangkan argumen binwidth digunakan untuk mengatur ukuran bin/kotak pada boxplot. Fungsi ggtitle digunakan untuk memberi judul pada grafik, sedangkan fungsi ylab dan xlab untuk memberikan nama pada sumbu y dan sumbu x. Terakhir fungsi argumen `plot.title`` digunakan untuk mengatur bagaimana tampilan dari tulisan judul pada plot, seperti posisi, ukuran font dan jenis font.

Berdasarkan histogram tersebut bisa diperoleh informasi bahwa terdapat harga rumah yang sangat mahal dibandingkan dengan harga rumah mayoritas.

C.2 Boxplot

Jika kita ingin melihat bagaimana perbandingan distribusi pada beberapa peubah, maka boxplot adalah salah plot yang paling umum digunakan. Pada ilustrasi ini kita akan membandingkan distribusi harga rumah dari 10 kota. Oleh karena itu, langkah pertama yang kita lakukan adalah menyaring ke-10 kota tersebut menggunakan fungsi filter.

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("Harga Rumah") +
  xlab("Kota") + 
  theme(plot.title = element_text(hjust = 0.5))+
  theme_bw()

Hal yang perlu diperhatikan untuk membuat boxplot beberapa peubah atau kelompok adalah nama-nama peubah atau kelompok itu harus ada dalam satu kolom yang bertipe character atau factor. Kemudian argumen x di dalam fungsi aes disi adengan nama kolom yang isinya nama-nama peubah atau kelompok tersebut. Jika ingin memberikan warna yang beda-beda pada boxplot maka argumen fill harus diletakan dalam fungsi aes dan diisi dengan nama kolom yang isinya nama-nama peubah atau kelompok tersebut. Namun, Rumah dengan harga yang paling tinggi diantara 10 kota tersebut berada di kota Seattle.

Berdasarkan boxplot tersebut bahwa harga rumah di kota Medina secara umum lebih tinggi dibandingkan dengan sembilan kota lainnya.

C.3 Ridge Line

Plot alternative lain untuk membandingkan distribusi data adalah plot Ridgeline, yang mirip seperti histogram. Plot ridgeline bisa dijalankan dalam R dengan menggunakan fungsi geom_density_ridges dari package ggridges. Isi argumenya mirip seperti pada saat pembuatan plot boxplot.

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("Kota") +
  xlab("Harga Rumah") + 
  theme(plot.title = element_text(hjust = 0.5))+
  theme_bw()
## Picking joint bandwidth of 133000

Berdasarkan plot ridgeline ini semakin jelas bahwa Kota Medina memiliki harga rumah yang secara umum lebih mahal dibandingkan kota-kota lainnya. Namun informasi harga rumah termahal yang ada di kota Seatle tidak tertangkap disini.

D. Visualisasi Jumlah

Bar Plot

Plot yang paling sering digunakan memandingkan jumlah dari beberapa kategori adalah bar plot atau bar chart atau diagram batang. Dalam package ggplot2 bar plot ini bisa ditampilkan menggunakan geom_bar atau geom_col. Perbedaan mendasar dari kedua fungsi itu adalah data yang perlu disediakan. Fungsi geom_bar hanya membutuhkan satu kolom saja (dengan tipe data character atau factor), sedangkan geom_col membutuhkan dua kolom data yaitu nama kategori dan jumlah setiap kategori.

data_house%>%count(city)%>%
  ggplot()+
  geom_col(aes(x=fct_reorder(as.factor(city),n),y=n), fill="steelblue", 
           width=0.4) +
    scale_y_continuous(expand = c(0,0))+
    coord_flip() +
    ggtitle("Jumlah Rumah Setiap Kota") +
    xlab("") +
    ylab("Jumlah Rumah") +
    theme(plot.title = element_text(hjust = 0.5))+
    theme_classic()

fungsi fct_reorder digunakan untuk mengurutkan kategori berdasarkan nilai tertentu. Kemudian, sintaks scale_y_continuous(expand = c(0,0)) digunakan agar barplot dimulai dari nol. Fungsi coord_flip digunakan untuk menukar sumbu x dan sumbu y.

D.2 Lolipop Chart

Plot alternative dari bar chart adalah lolipop chart. Seperti namanya plot ini terinspirasi dari permen lolipop. Untuk membuat plot ini dibutuhkan dua fungsi yaitu geom_segment dan juga geom_point.

Fungsi geom_segment digunakan untuk menggambarkan garis sedangkan fungsi geom_point digunakan untuk menggambarkan titik.

data_house%>%count(city)%>%
  mutate(city=fct_reorder(as.factor(city),desc(n)))%>%
  ggplot()+
  geom_segment(aes(x=city,xend=city, y=0, yend=n), color="skyblue")+
  geom_point(aes(x=city,y=n),color="steelblue", size=2)+ 
    scale_y_continuous(expand = c(0,0))+
    coord_flip() +
    ggtitle("Jumlah Rumah Setiap Kota") +
    xlab("") +
    ylab("Jumlah Rumah") +
    theme(plot.title = element_text(hjust = 0.5))

E. Visualisasi Korelasi

E.1 Diagram Pencar

Korelasi atau hubungan dari dua peubah bisa kita visualisasikan menggunakan scatterplot. Jika scatterplot membentuk pola garis maka bisa dikatakan bahwa kedua peubah tersebut memiliki korelasi yang kuat.

ggplot(data_house) +
  geom_point(aes(x = sqft_living,y = price),color="steelblue",size=2) +
  ggtitle("Scatter Plot Harga Rumah vs Luas Rumah") +
  ylab("Luas Rumah") +
  xlab("Harga Rumah") + 
  theme(plot.title = element_text(hjust = 0.5))

E.2 Correlogram

Penggunaan scatterplot memiliki keterbatasan jika korelasi peubah yang ingin dilihat ada banyak. Coreelogram bisa digunakan untuk mengatasi hal tersebut. Correlogram ini membuat grafik berdasarkan nilai koefisien korelasi yang dikonversikan dalam bentuk warna.

GGally::ggcorr(data_house, method = c("everything","pearson"),geom = "tile") 
## 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

E.2 Plot Interaktif

Bagian terakhir ini kita akan membuat plot interaktif dari grafik ggplot yang sudah dibuat. Untuk membuat plot interaktif dari ggplot2 kita bisa menggunakan fungsi ggplotly yang berasal dari package plotly.

p1 <- ggplot(data_house) +
  geom_point(aes(x = sqft_living,y = price),color="steelblue",size=2) +
  ggtitle("Scatter Plot Harga Rumah vs Luas Rumah") +
  ylab("Luas Rumah") +
  xlab("Harga Rumah") + 
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(p1)