Package
library(tidyverse)## -- Attaching packages ---------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.3 v dplyr 1.0.0
## v tidyr 1.1.0 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.5.0
## -- Conflicts ------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(ggridges)
library(GGally)## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(plotly)##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
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 ini bisa diperoleh di link berikut ini https://github.com/gerrydito/Sains-Data-S2/tree/master/Praktikum/Visualisasi%20Data
Outline
Outline dari praktikum kali ini adalah sebagai berikut:
ggplot2overview- Mevisulisasikan Distribusi
- Mevisualisasikan Jumlah
- Mevisualisasikan Korelasi
ggplot2 overview
Secara umum pembuatan grafik pada package ggplot2 dapat dilakukan dengan menggunakan dua cara yaitu qplot(x,y,geom="xxx") atau ggplot()+geom_xxx(aes(x,y)).
Contoh:
set.seed(12)
qplot(x=rnorm(10),y=rnorm(10),geom = "point")ggplot()+geom_point(aes(x=rnorm(10),y=rnorm(10)))Sintaks ggplot()+geom_xxx() sebaiknya digunakan saat ingin membuat beberapa jenis grafik (misal scatter plot+line plot) dan saat ingin mengganti parameter-parameter dari plot (misal bentuk titik atau warna titik).
Penggantian warna background dapat dilakukan dengan menggunakan fungsi theme_xxx. Contoh:
set.seed(12)
qplot(x=rnorm(10),y=rnorm(10),geom = "point")+theme_bw()ggplot()+geom_point(aes(x=rnorm(10),y=rnorm(10)))+theme_dark()qplot(x=rnorm(10),y=rnorm(10),geom = "point")+theme_classic()ggplot()+geom_point(aes(x=rnorm(10),y=rnorm(10)))+theme_minimal()qplot(x=rnorm(10),y=rnorm(10),geom = "point")+theme_light()ggplot()+geom_point(aes(x=rnorm(10),y=rnorm(10)))+theme_linedraw()ggplot()+geom_point(aes(x=rnorm(10),y=rnorm(10)))+theme_gray()Selanjutnya, Tanda + sangat berperan penting dalam ggplot2. Tanda ini digunakan untuk menambahkan beberapa jenis plot yang berbeda dalam satu gambar. Selain itu tanda ini juga digunakan untuk mengakses fungsi dalam package ggplot2 yang dapat mengubah parameter grafik.
Contoh:
set.seed(12)
ggplot()+geom_line(aes(x=1:10,y=rnorm(10)))+
#manambah plot titik
geom_point(aes(x=1:10,y=rnorm(10)))+
#mengubah nama sumbu x
xlab("Waktu")+
#menambahkan nama grafik
ggtitle("Grafik Percobaan")+
#mengubah tema
theme_dark()Fungsi aes merupakan fungsi yang digunakan untuk mengatur bagaimana variabel-variabel dalam data dipetakan dalam plot. Misalnya saja, pada scatterplot variable apa yang menjadi sumbu x dan sumbu y, memberi warna scatterplot berdasarkan kategori tertentu. Berikut contohnya
set.seed(12)
ggplot()+geom_point(aes(x=rnorm(2),y=rnorm(2),col=c('gen1','gen2'))) Gambar diatas menunjukkan argumen
col berperan sebagai pewarna titik berdasarkan kategori. Disisi lain argumen col diluar aes digunakan untuk memberi warna pada titik saja.
Contoh:
set.seed(12)
ggplot()+geom_point(aes(x=rnorm(20),y=rnorm(20)),col="green") Kalau kita menuliskan argumen
col="green' didalam aes maka kata green akan diaggap sebagai variabel kategori dari data.
set.seed(12)
ggplot()+geom_point(aes(x=rnorm(20),y=rnorm(20),col="green")) Hal ini seperti ini juga akan berperilaku sama untuk argumne
shape (mengubah bentuk titik), linetype (bentuk garis), dan size (ukuran garis/titik/text)
Jika tertarik belajar lebih lanjut tentang ggplot2 bisa mengakses link-link berikut:
Mevisulaisasikan Distribusi
Pada bagian ini kita akan mencoba melihat bagaimana distribusi suatu data. Pertama-tama kita import data terlebih dahulu ke R. ### import data
data_house <- read_csv("house_price.csv",)## Parsed with column specification:
## cols(
## date = col_datetime(format = ""),
## price = col_double(),
## bedrooms = col_double(),
## bathrooms = col_double(),
## sqft_living = col_double(),
## sqft_lot = col_double(),
## floors = col_double(),
## waterfront = col_double(),
## view = col_double(),
## condition = col_double(),
## sqft_above = col_double(),
## sqft_basement = col_double(),
## yr_built = col_double(),
## yr_renovated = col_double(),
## street = col_character(),
## city = col_character(),
## statezip = col_character(),
## country = col_character()
## )
head(data_house)## # A tibble: 6 x 18
## date price bedrooms bathrooms sqft_living sqft_lot floors
## <dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2014-05-02 00:00:00 3.13e5 3 1.5 1340 7912 1.5
## 2 2014-05-02 00:00:00 2.38e6 5 2.5 3650 9050 2
## 3 2014-05-02 00:00:00 3.42e5 3 2 1930 11947 1
## 4 2014-05-02 00:00:00 4.20e5 3 2.25 2000 8030 1
## 5 2014-05-02 00:00:00 5.50e5 4 2.5 1940 10500 1
## 6 2014-05-02 00:00:00 4.90e5 2 1 880 6380 1
## # ... with 11 more variables: waterfront <dbl>, view <dbl>, condition <dbl>,
## # sqft_above <dbl>, sqft_basement <dbl>, yr_built <dbl>, yr_renovated <dbl>,
## # street <chr>, city <chr>, statezip <chr>, country <chr>
Histogram
Selanjutnya, misalkan saja kita ingin melihat bagaimana distribusi atau sebaran dari harga rumah yang disini ada di kolom price. Grafik yang sering digunakan adalah histogram.
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 ylabdan 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.
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 tersbut menggukan 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.
Ridgeline
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.
Mevisualisasikan 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 untu menukar sumbu x dan sumbu y.
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))Mevisualisasikan Korelasi
Scatter plot
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))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 dikonverssikan dalam bentuk warna
ggcorr(data_house, method = c("everything","pearson"),geom = "tile") ## Warning in ggcorr(data_house, method = c("everything", "pearson"), geom =
## "tile"): data in column(s) 'date', 'street', 'city', 'statezip', 'country' are
## not numeric and were ignored
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. ### Scatter plot
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)