Bab 6 Eksplorasi dan Visualisasi

//TODO: Membahas cara eksplorasi data secara numerik maupun visual menggunakan grafik dasar R dan package {ggplot2}.

Seperti yang sudah disinggung di awal bahwa R adalah sebuah bahasa pemrograman yang penggunaan utamanya untuk kebutuhan pengolahan data dan analisis statistik. Saat ini lebih terkenal dengan istilah analisis data dan data science. Kegiatan analisis data ini tentunya tidak akan terlepas dari eksplorasi data. Terutama ketika baru pertama kali mendapatkan data tersebut. Kegiatan eksplorasi ini bertujuan untuk mengenal lebih dalam data yang kita gunakan. Metode yang umumnya digunakan ketika melakukan eksplorasi data adalah secara numerik/tabulasi atau secara visual dengan memanfaatkan grafik. Kegiatan eksplorasi dan menyiapkan data untuk kebutuhan analisis data umumnya memerlukan waktu 60%-80% dari seluruh waktu yang dibutuhkan untuk analisis data.

Kita akan bekerja dari sebuah dataframe karena umumnya kegiatan analisis data bersumber dari data yang berbentuk tabular (baris sebagai observasi dan kolom sebagai variabel). Data iris sudah tersedia di R, namun kita akan mulai dari import data karena hampir semua data akan diimport terlebih dahulu, baik itu dari file data atau database. Data iris mempunyai dua tipe data, yaitu numeric dan character.

6.1 Eksplorasi Tabulasi

Kita import terlebih dahulu data yang akan digunakan dari file iris.csv di dalam folder data. Kita gunakan fungsi read_csv() dari package {readr} sebagai latihan menggunakan package.

## Rows: 150 Columns: 5
## ── Column specification ──────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Species
## dbl (4): Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Untuk mengetahui banyaknya baris data pada iris_csv kita dapat gunakan fungsi nrow(), sedangkan untuk mengetahui banyaknya kolom kita gunakan fungsi ncol().

nrow(iris_csv)
## [1] 150
ncol(iris_csv)
## [1] 5

Jadi ada 150 observasi (baris) dan 5 variabel (kolom) dari data yang sudah diimport. Hal ini perlu kita sesuaikan dengan banyaknya baris dan kolom dari data asli yang ada di file data tersebut. Jika sudah sama maka kita dapat lanjut ke tahapan lain. Jika masih ada yang tidak sesuai maka perlu diketahui dahulu letak kesalahannya dan perbaiki sehingga semuanya sudah sesuai. Setelah itu kita dapat mengetahui nama-nama variabel yang ada pada dataframe tersebut dengan menggunakan fungsi colnames() atau names().

colnames(iris_csv)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
names(iris_csv)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

Pada kasus ini kedua fungsi tersebut menghasilkan output yang sama, yaitu nama kolom dari dataframe. Atau kita juga dapat menggunakan fungsi str() untuk melihat informasi itu semua ditambah dengan preview beberapa baris pertama dataframe tersebut.

str(iris_csv)
## spc_tbl_ [150 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Sepal.Length = col_double(),
##   ..   Sepal.Width = col_double(),
##   ..   Petal.Length = col_double(),
##   ..   Petal.Width = col_double(),
##   ..   Species = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>

Sekarang mari kita eksplorasi masing-masing variabel.

Kita mulai dengan variabel pertama, yaitu Sepal.Length. Seperti yang sudah dibahas pada bagian 2.9 bahwa ada beberapa cara agar kita dapat mengakses nilai dari suatu variabel di dataframe. Salah satunya adalah dengan menggunakan tanda dollar $. Jika Anda menggunakan RStudio versi terbaru, Anda dapat mengetik iris_csv kemudian diikuti tanda $ maka akan muncul nama-nama variabel dari dataframe tersebut.

iris_csv$Sepal.Length
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
##  [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
##  [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 6.5 5.7 6.3
##  [58] 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6
##  [77] 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6
##  [96] 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7
## [115] 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4
## [134] 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
typeof(iris_csv$Sepal.Length)
## [1] "double"

Seperti yang kita lihat, variabel Sepal.Length bertipe numeric atau double. Pertama, kita akan lakukan eksplorasi untuk mengetahui nilai rata-rata dari variabel ini. Kita dapat gunakan fungsi mean() seperti berikut.

mean(iris_csv$Sepal.Length)
## [1] 5.843333

Kita dapatkan nilai rata-rata dari variabel Sepal.Length adalah sekitar 5.843333. Kenapa “sekitar”? Karena mungkin saja nilai yang ditampilkan hanyalah pembulatan dengan 6 (enam) digit setelah tanda desimal. Selanjutnya kita masukkan nilai-nilai dari variabel Sepal.Length ke dalam object bernama sepal_length yang berupa vector.

sepal_length <- iris_csv$Sepal.Length

Kita juga dapat menghitung nilai tengah atau median (Q2) dengan fungsi median(). Untuk mendapatkan nilai ragam (variance) dan simpangan baku (standard deviation)? Kita gunakan fungsi var() dan sd().

median(sepal_length)
## [1] 5.8
var(sepal_length)
## [1] 0.6856935
sd(sepal_length)
## [1] 0.8280661

Untuk mendapatkan nilai minimum dan maksimum kita gunakan fungsi min() dan max(). Untuk mendapatkan keduanya sekaligus kita gunakan fungsi range().

min(sepal_length)
## [1] 4.3
max(sepal_length)
## [1] 7.9
range(sepal_length)
## [1] 4.3 7.9

Kita juga dapat gunakan fungsi quantile() untuk mendapatkan nilai statistik Q1 (data pada urutan ke 25%) dan Q3 (data pada urutan ke 75%).

quantile(sepal_length, probs = c(0.25, 0.75))
## 25% 75% 
## 5.1 6.4

Untuk menampilkan statistik lima serangkai (Min, Q1, Q2, Q3, dan max) bersamaan kita dapat gunakan fungsi summary().

summary(sepal_length)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.300   5.100   5.800   5.843   6.400   7.900

Selain dapat digunakan untuk sebuah vector numeric, fungsi summary() juga dapat kita gunakan untuk beberapa variabel numeric sekaligus pada sebuah dataframe.

summary(iris_csv)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##    Species         
##  Length:150        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

Seperti kita lihat, nilai yang dihasilkan oleh fungsi summary() untuk variabel Species sangat berbeda dibandingkan variabel yang lain. Hal ini karena Species adalah variabel character, sehingga fungsi summary() hanya menampilkan banyaknya observasi (Length), Class dan Mode.

typeof(iris_csv$Species)
## [1] "character"

Untuk variabel tipe character umumnya eksplorasi yang dilakukan adalah dengan membuat tabulasi atau tabel frekuensi. kita dapat gunakan fungsi table() untuk menghitung banyaknya observasi masing-masing kategori pada variable tersebut.

table(iris_csv$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50

Kita bisa lihat bahwa masing-masing kategori pada variabel Species mempunyai jumlah yang sama. Tentu saja ketika kita menghitung proporsi atau persentase jumlah masing-masing kategori terhadap banyaknya observasi seluruh data (baris) maka nilainya akan sama untuk semua kategori. Untuk menghitung nilai proporsi kita gunakan fungsi prop.table() dengan inputnya adalah tabulasi hasil dari function table().

frekuensi <- table(iris_csv$Species)
prop.table(frekuensi)
## 
##     setosa versicolor  virginica 
##  0.3333333  0.3333333  0.3333333

Selanjutnya kita juga dapat menghitung nilai statistik dari suatu variabel numerik berdasarkan kategori suatu variabel bertipe character. Misalnya kita hitung nilai rata-rata dari variabel Sepal.Length berdasarkan kategori dari Species. Kita gunakan fungsi aggregate()

aggregate(Sepal.Length ~ Species, data = iris_csv, FUN = mean)
##      Species Sepal.Length
## 1     setosa        5.006
## 2 versicolor        5.936
## 3  virginica        6.588

Selanjutnya Anda dapat mencoba eksplorasi seperti di atas dengan menggunakan variabel lain.

6.2 Grafik Dasar di R

6.2.1 Barplot

Barplot atau diagram batang adalah salah satu jenis visualisasi yang digunakan untuk menampilkan informasi berupa frekuensi, persentase atau nilai statistik lain dari beberapa nilai kategorik dalam suatu variabel. Bentuk dari barplot sendiri berupa batang untuk masing-masing kategori dengan ketinggian berdasarkan nilai yang ingin ditampilkan. Barplot sangat cocok digunakan ketika ingin membandingkan nilai masing-masing kategori.

Contoh berikut ini adalah tampilan barplot untuk membandingkan banyaknya amatan untuk masing-masing kategori pada variabel Species di data iris_csv. Untuk mendapatkan frekuensi dari variabel ini kita gunakan fungsi table() dengan input berupa vector kategorik, yaitu variabel Species.

frekuensi <- table(iris_csv$Species)
barplot(frekuensi)
rataan <- aggregate(Sepal.Length ~ Species, data = iris_csv, FUN = mean)
barplot(Sepal.Length ~ Species, data = rataan)
barplot(Sepal.Length ~ Species, data = rataan, col = "skyblue")

6.2.2 Histogram & Fungsi Kepekatan

Histogram adalah sebuah visualisasi terkait sebaran data numerik. Histogram juga dapat digunakan untuk melihat pola kisaran nilai yang banyak muncul dari data numerik tersebut. Untuk membuat histogram menggunakan grafik dasar di R kita dapat gunakan fungsi hist() dengan argument datanya berupa vector numeric.

hist(sepal_length)

Kita dapat tentukan banyaknya batang pada histogram dengan menambahkan nilai pada argument breaks. Untuk membuat tampilan lebih menarik dan informasi yang ingin disampaikan lebih mudah diterima kita dapat menambahkan keterangan pada histogram judul (main), judul axis (xlab dan ylab). Untuk menambahkan warna pada batang histogram, kita dapat tambahkan pada argument col. Perhatikan contoh berikut ini.

hist(sepal_length, breaks = 15, 
     main = "Distribution of Sepal Length", 
     xlab = "Sepal Length", col = "skyblue")

Selanjutnya, untuk dapat menghasilkan dugaan peluang kepekatan (density) suatu data numeric kita dapat gunakan fungsi density(). Argument pertama dari fungsi ini adalah sebuah vector numeric. Keluaran (output) dari fungsi tersebut adalah sebuah object list yang terdiri dari nilai x, y, bw, n, call, data.name, has.na dan atribut class. Nilai x adalah titik data numeric yang digunakan untuk pendugaan kepekatan. Nilai y adalah nilai dugaan kepekatan (density), sedangkan bw adalah nilai bandwidth yang digunakan. Umumnya nilai dugaan kepekatan ini disajikan dalam bentuk visual grafik berupa kurva kepekatan peluang (density curve).

dens <- density(sepal_length)
dens
## 
## Call:
##  density.default(x = sepal_length)
## 
## Data: sepal_length (150 obs.);   Bandwidth 'bw' = 0.2736
## 
##        x               y           
##  Min.   :3.479   Min.   :0.000148  
##  1st Qu.:4.790   1st Qu.:0.034088  
##  Median :6.100   Median :0.153218  
##  Mean   :6.100   Mean   :0.190407  
##  3rd Qu.:7.410   3rd Qu.:0.378921  
##  Max.   :8.721   Max.   :0.396476
plot(dens)

Kita dapat mengatur warna yang ingin kita gunakan agar tampilan kurvanya lebih menarik dengan menggunakan fungsi polygon() setelah membuat kurva kepekatan. Perhatikan contoh dibawah ini.

plot(dens, main = "Density of Sepal Length")
polygon(dens, col = "skyblue")

6.2.3 Boxplot

Jenis visualisasi berikutnya untuk data numeric adalah diagram kotak-garis atau biasa disebut dengan boxplot. Visualisasi ini dapat memberikan kepada Anda bentuk sebaran dengan nilai minimum, Q1 (data ke-25% setelah diurutkan dari besar ke kecil), Q2 (data ke-50% atau median), Q3 (data ke-75%) dan nilai maksimum serta pencilan (outlier) jika ada. Data yang digunakan untuk membuat boxplot adalah data numerik.

boxplot(sepal_length) 

Anda juga dapat membagi data berdasarkan peubah kategorik. Contoh di bawah ini menunjukkan penggunaan dan hasil dari visualisasi sebaran peubah Sepal.Length berdasarkan peubah Species pada data iris_csv.

boxplot(Sepal.Length ~ Species, data = iris_csv)

Jika Anda ingin mengubah tampilan boxplot yang tadinya tegak lurus menjadi mendatar, Anda cukup menambahkan argumen horizontal = TRUE.

boxplot(Sepal.Length ~ Species, data = iris_csv, horizontal = TRUE)

6.2.4 Scatter plot

Scatter plot atau plot tebaran atau diagram pencar, merupakan jenis visualisasi untuk dua buah variable numerik yang ditampilkan berupa titik atau simbol lainnya. Untuk membuat scatter plot Anda dapat gunakan fungsi plot() dengan argumen x dan y berupa vector numerik yang mempunyai panjang yang sama.

x <- iris_csv$Sepal.Length
y <- iris_csv$Sepal.Width
plot(x, y)

Anda dapat mengganti jenis titik dengan menggunakan argumen pch dengan nilai antara 0 dan 25. Misalnya pada contoh di bawah ini menggunakan pch = 19 untuk titiknya berwarna hitam penuh.

plot(x, y, pch = 19)

Jika Anda ingin memberi warna untuk titik-titik tersebut, Anda dapat gunakan argumen col. Untuk nilai dari argumen ini Anda dapat tuliskan langsung nama warnanya dalam bahasa Inggris seperti red, blue, skyblue, dan seterusnya. Atau Anda juga dapat gunakan kode HEX.

plot(x, y, pch = 19, col = "skyblue")

6.2.5 Line chart

Line chart atau diagram garis umumnya digunakan untuk melihat trend yang terjadi pada suatu data. Variable yang ditempatkan pada sumbu-x (horizontal) biasanya adalah data waktu atau tanggal. Untuk membuat line chart menggunakan base R Anda juga dapat gunakan fungsi plot() dengan tambahan argumen type = "l". Artinya tipe plot yang akan dibuat adalah (l)ine atau garis.

set.seed(1001)
x <- 1:100
y <- rnorm(100, mean = 100, 12)
plot(x, y, type = "l")

6.3 Visualisasi {ggplot2}

Jika Anda belum pernah install package {ggplot2} maka Anda perlu install terlebih dahulu package tersebut dengan perintah berikut ini. Pastikan R yang Anda gunakan dapat mengakses internet.

install.packages("ggplot2")

Untuk mengaktifkan package {ggplot2} Anda perlu jalankan perintah berikut ini.

6.3.1 Dasar-dasar {ggplot2}

Package {ggplot2} adalah salah satu package yang sangat terkenal dan sering digunakan oleh pengguna R saat ini. Package ini menghasilkan visualisasi berupa grafik yang sangat bagus dengan cara yang cukup mudah. Dasar dari {ggplot2} adalah grammar of graphics yang juga menjadi singkatan untuk dua huruf g di nama package ini. Sumber bacaan utama dari bagian ini adalah https://ggplot2-book.org/index.html. Anda dapat mempelajari lebih detail tentang Grammar of Graphics di buku tersebut dan referensi yang digunakan.

Pembuatan grafik menggunakan {ggplot2} terdiri dari beberapa bagian. Pada dasarnya, ggplot2 bekerja dengan tiga komponen utama: data, aesthetic mapping, dan geometric objects. Data adalah informasi yang ingin divisualisasikan, aesthetic mapping menentukan bagaimana variabel dalam data dipetakan ke elemen visual seperti sumbu x, sumbu y, warna, atau ukuran, sedangkan geometric objects (geom) adalah bentuk visual yang digunakan untuk merepresentasikan data, seperti titik, garis, atau batang.

Bagian pertama selalu diawali dengan fungsi ggplot(). Fungsi ini akan menyiapkan layer dasar untuk grafik yang akan dibuat. Ketika Anda ketik ggplot() dan jalankan di console, maka di bagian tab Plots di RStudio akan muncul kanvas berwarna abu-abu. Pada fungsi ini Anda dapat menggunakan data yang Anda miliki dengan menyebutkannya pada argumen data =. Data yang digunakan umumnya berupa dataframe atau yang semacamnya (tibble, data.table, dst). Argumen mapping = aes()untuk memberitahukan kepada ggplot2 variabel apa saja yang akan menjadi aesthetic dengan menyebutkan masing-masing dalam fungsi aes() tersebut.

Setelah fungsi ggplot() pasti akan diikuti oleh tanda + sebagai tanda untuk menambahkan layer berikutnya dan minimal satu geometrik atau geom. Misalnya geom_point() untuk membuat scatterplot, geom_histogram() untuk membuat histogram, geom_density() untuk membuat plot kepekatan peluang, geom_bar() atau geom_col() untuk membuat barchart, dan lain-lain. Jika Anda menggunakan RStudio, Anda dapat ketik geom_ kemudian akan muncul pilihan geometrik-geometrik yang sudah disiapkan oleh {ggplot2}. Jika tidak muncul pilihannya, Anda dapat tekan tombol Tab di keyboard Anda.

Bentuk minimal untuk membuat grafik menggunakan {ggplot2} adalah sebagai berikut.

ggplot(data = <dataframe>, mapping = aes(x = <var-x>, <y = <var-y>>) + 
  geom_<name>()

Ada beberapa cara yang umum digunakan ketika menggunakan {ggplot2}. Data yang digunakan hanya satu dan semua variabel yang dibutuhkan untuk aesthetic pada bagian geom sama.

Package {ggplot2} juga menyediakan beberapa dataframe yang dapat digunakan untuk latihan ataupun kebutuhan mengajarkan {ggplot2}. Tentu saja Anda juga dapat menggunakan dataframe Anda sendiri jika diinginkan. Salah satu dataframe yang disediakan adalah diamonds, yaitu data tentang harga dan karakter dari 53.940 berlian. Anda dapat membaca keterangan tentang data ini lebih lanjut dengan mengetik ?diamonds dan akan muncul halaman help dari data tersebut.

diamonds
## # A tibble: 53,940 × 10
##    carat cut       color clarity depth table price     x     y     z
##    <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
##  1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
##  2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
##  3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
##  4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
##  5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
##  6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
##  7  0.24 Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
##  8  0.26 Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
##  9  0.22 Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
## 10  0.23 Very Good H     VS1      59.4    61   338  4     4.05  2.39
## # ℹ 53,930 more rows

6.3.2 Barplot

Untuk membuat bar plot/bar chart/diagram batang menggunakan ggplot2 Anda dapat gunakan geom_bar(). Misalnya kita ingin melihat sebaran dari data kategorik ordinal kualitas potongan berlian (cut).

ggplot(data = diamonds, mapping = aes(x = cut)) + 
  geom_bar()

Jika data yang kita miliki sudah dalam bentuk ringkasan, misalnya sebuah tabel frekuensi, maka kita dapat buat barplot menggunakan tambahan argumen pada geom_bar() seperti berikut ini. Pertama kita buat dulu contoh data berupa tabel frekuensi dari variabel cut pada dataframe diamonds. Kita simpan hasilnya sebagai dataframe freqtab.

freqtab <- as.data.frame(table(diamonds$cut))
freqtab
##        Var1  Freq
## 1      Fair  1610
## 2      Good  4906
## 3 Very Good 12082
## 4   Premium 13791
## 5     Ideal 21551

Argumen data pada ggplot() merujuk pada tabel frekuensi yang sudah kita buat sebelumnya. Karena ada dua informasi yang kita butuhkan, yaitu kategori dan frekuensinya, maka kita pasangkan kategori yaitu Var1 sebagai argumen x dan variabel nilai frekuensinya yaitu Freq sebagai argumen y. Secara default, geom_bar() menggunakan stat = "count", yang berarti ia akan menghitung jumlah observasi (frekuensi) untuk setiap kategori dari variabel yang disebutkan pada sumbu x dan menampilkannya sebagai tinggi batang. Namun, ketika Anda menggunakan stat = "identity", Anda memberitahu ggplot2 untuk menggunakan nilai yang sudah ada di data sebagai tinggi batang, bukan menghitung frekuensi.

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_bar(stat = "identity")

Cara lain yang dapat digunakan untuk membuat diagram batang ketika data yang kita miliki sudah dalam bentuk tabel frekuensi adalah dengan geom_col().

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col()

Perbedaan antara geom_bar() dan geom_col():

geom_bar():

  • Secara default menggunakan stat = "count", yang menghitung frekuensi observasi untuk setiap kategori pada sumbu x.
  • Cocok digunakan ketika Anda hanya memiliki variabel kategorikal dan ingin melihat distribusi frekuensinya.
  • Jika ingin menggunakan nilai numerik sebagai tinggi batang, Anda harus menambahkan stat = "identity".

geom_col():

  • Secara default menggunakan stat = "identity", yang berarti Anda harus menyediakan variabel kategori pada sumbu x dan nilai numerik untuk sumbu y sebagai tinggi batang.
  • Cocok digunakan ketika Anda sudah memiliki nilai numerik yang ingin ditampilkan sebagai tinggi batang.
  • Lebih ringkas dan langsung daripada geom_bar(stat = "identity").

Kita juga dapat mengubah warna dari batang dengan menambahkan argumen fill. Hal ini dapat dilakukan pada geom_bar() atau geom_col(). Kita dapat menggunakan beberapa cara untuk memberi warna pada ggplot.

  1. Menggunakan nama kode warna seperti "red", "white", "black", "firebrick", "skyblue", "green", dan sebagainya untuk warna statis.
  2. Menggunakan kode warna seperti kode HEX, "#ffffff" untuk warna putih, "#000000" untuk warna hitam, "#0000fa" untuk warna biru, dan sebagainya.
  3. Menggunakan nilai dari variabel dengan cara menuliskan argumen fill di dalam aes() dan nilainya adalah nama variabel.
ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col(fill = "coral")

Kita dapat mengontrol tingkat transparansi (opacity) dari elemen visual seperti titik, garis, batang, atau area. Untuk mengatur tingkat transparansi ini kita dapat menggunakan argumen alpha. Nilai alpha berkisar antara 0 (sepenuhnya transparan/tidak terlihat) hingga 1 (sepenuhnya padat/tidak transparan). Dengan mengatur alpha, kita dapat membuat visualisasi yang lebih estetik atau informatif, terutama ketika ada tumpang tindih (overlap) antara elemen-elemen plot.

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col(fill = "coral", alpha = 0.7)

Dalam ggplot2, kita dapat menambahkan judul plot, label sumbu x, dan label sumbu y menggunakan fungsi labs() atau ggtitle(), xlab(), dan ylab(). Fungsi-fungsi ini memungkinkan kita untuk memberikan konteks dan informasi tambahan pada visualisasi, sehingga plot menjadi lebih mudah dipahami. Fungsi labs() adalah cara yang paling fleksibel dan umum digunakan untuk menambahkan judul plot, label sumbu x, dan label sumbu y. Anda juga dapat menambahkan subtitle, caption, dan label untuk legend menggunakan fungsi ini.

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi")

Menambahkan teks sebagai label data pada bar plot adalah cara yang efektif untuk menampilkan nilai numerik secara langsung di atas atau di dalam batang. Cara ini dapat membantu pembaca memahami data dengan lebih cepat tanpa harus merujuk ke sumbu y. Di ggplot2, Anda dapat menggunakan fungsi geom_text() atau geom_label() untuk menambahkan teks sebagai label data.

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  geom_text(aes(label = Freq), vjust = -0.25)

Argumen vjust = -0.25 digunakan untuk mengatur posisi teks sedikit di atas batang (vjust negatif untuk posisi di atas, positif untuk di bawah). Untuk mengatur ukuran teks dapat menggunakan size. Perbedaan geom_label() dan geom_text() adalah menambahkan latar belakang (background) di belakang teks, sehingga teks lebih mudah dibaca.

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  geom_label(aes(label = Freq), vjust = -0.25, size = 4)

Terkadang nilai yang ingin ditampilan di atas batang adalah persentase masing-masing kategori terhadap seluruh data yang ada. Pertama, kita perlu menghitung persentase per kategori. Kita dapat melakukannya dengan membuat variabel baru hasil dari variabel Freq yang sudah ada sebelumnya dibagi dengan jumlah variabel Freq. Misalnya kita buat variabel baru tersebut dengan nama persen. Untuk memudahkan tampilan nilai persentase di atas batang, kita gunakan function percent() dari package scales dengan accuracy = 0.01 artinya tampilkan hingga dua angka di belakang tanda desimal.

library(scales)

freqtab$persen <- freqtab$Freq/sum(freqtab$Freq)

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4)

Kita dapat mengatur urutan dari geom, scale, labs, themes, dan lainnya agar lebih rapi. Kita bisa gunakan argumen labels pada scale_*_continuous() untuk meberikan format pada nilai sumbu yang kita pilih, dan kita gunakan function comma untuk format pemisah ribuan menggunakan tanda koma.

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4) + 
  scale_y_continuous(labels = comma) + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  theme(legend.position = "none")

6.3.3 Histogram & Density

Untuk membuat histogram menggunakan package {ggplot2} Anda dapat gunakan geom_histogram(). Variable yang digunakan adalah sebuah variable numerik. Misalnya kita gunakan variable price pada data diamonds.

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Secara defaut, geom_histogram() menggunakan 30 bins (batang). Oleh karena itu geom_histogram() akan memberikan message (bukan warning atau error) yang memberitahukan bahwa nilai bins yang digunakan adalah 30. Anda dapat mengganti nilai bins tersebut dengan menambahkan argumen bins = 50 jika Anda ingin histogram yang dibuat mempunyai 50 bin.

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_histogram(bins = 50)

Berikutnya Anda dapat memberikan warna pemisah antar batang. Misalnya untuk memberikan pemisah dengan warna putih Anda dapat tambahkan argumen color = "white".

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_histogram(bins = 30, color = "white")

Argumen color digunakan untuk warna garis pemisah, sedangkan untuk mengubah warna batang Anda dapat gunakan argumen fill.

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_histogram(bins = 30, color = "white", fill = "coral")

Kita juga dapat mengubah format penulisan nilai pada sumbu x dan y. Karena keduanya merupakan nilai numerik, kita dapat gunakan function scale_x_continuous() untuk sumbu x dan scale_y_continuous() untuk sumbu y. Misalnya kita ingin membuat format penulisan nilai di kedua sumbu tersebut sebagai numerik yang dipisahkan dengan tanda koma (,) sebagai pemisah ribuan. Setelah itu kita tambahkan judul untuk masing-masing sumbu menggunakan function labs().

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_histogram(bins = 30, color = "white", fill = "coral") + 
  scale_x_continuous(labels = comma) + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Price", 
       y = "Frekuensi")

Untuk membuat density plot menggunakan ggplot2 kita cukup menggunakan function geom_density(). Sama halnya dengan geom_histogram(), setelah menuliskan data yang akan digunakan untuk analisis pembuatan density plot dan menuliskan variabel yang akan digunakan di bagian mapping aesthetic, kita dapat menambahan kan geom_density() setelah tanda +.

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_density()

Untuk mengatur warna, transaparansi, dan properti lainnya dari geom_density() dapat dilakukan seperti pada geom_histogram(). Perbedaan antara geom_density() dan geom_histogram() adalah kita tidak menggunakan argumen bins atau binwidth di geom_density() .

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_density(fill = "coral", alpha = 0.7) + 
  scale_x_continuous(labels = comma) + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Price")

Kita juga dapat membandingkan sebaran menggunakan density plot berdasarkan kategori.

ggplot(data = diamonds, mapping = aes(x = price, fill = cut, color = cut)) + 
  geom_density(alpha = 0.7) + 
  scale_x_continuous(labels = comma) + 
  scale_y_continuous(labels = comma) + 
  labs(x = "Price")

6.3.4 Boxplot

Sekarang mari kita buat boxplot untuk melihat bentuk sebaran data numerik berdasarkan nilai kuartilnya. Untuk membuat boxplot di ggplot2 kita dapat gunakan function geom_boxplot().

ggplot(data = diamonds, mapping = aes(x = price)) + 
  geom_boxplot()

Berikutnya kita dapat membuat boxplot dari data numerik dan membandingkan sebarannya berdasarkan kategori dari sebuah variabel kategorik. Misalnya kita ingin membandingkan sebaran harga berlian (price) berdasarkan tingkat warna (color).

ggplot(data = diamonds, mapping = aes(x = price, y = color)) + 
  geom_boxplot()

Jika ingin memberi warna berbeda untuk setiap kotak berdasarkan kategorinya kita dapat menambahkan argumen fill dengan nilai berupa nama variabel dari kategori yang ingin kita gunkan untuk perbandingan boxplot. Misalnya kita ingin membandingkan sebaran dari variabel harga berlian (price) berdasarkan warnanya (color) menggunakan boxplot dan menyesuaikan warnanya berdasarkan kategori dari color. Untuk menghilangkan legend dari color kita dapat tambahkan theme(legend.position = "none").

ggplot(data = diamonds, mapping = aes(x = carat, y = color, fill = color)) + 
  geom_boxplot() + 
  theme(legend.position = "none")

6.3.5 Scatter plot

Untuk membuat scatter plot menggunakan ggplot2 kita dapat menggunakan geom_point(). Variabel yang digunakan pada bagian aes() adalah dua buah variabel numerik untuk x dan y. Misalnya kita ingin melihat pola tebaran antara carat dan price.

ggplot(data = diamonds, mapping = aes(x = carat, y = price)) + 
  geom_point()

Kita juga dapat memberikan warna untuk setiap titik. Misalnya warna masing-masing titik menyesuaikan dengan kategori pada bvariabel cut.

ggplot(data = diamonds, mapping = aes(x = carat, y = price, color = cut)) + 
  geom_point()

6.3.6 Line chart

Pada bagian pertama, kita membuat line chart menggunakan dataset linedata yang terdiri dari 100 observasi. Kita perlu membuat data ini terlebih dahulu karena data diamonds tidak memiliki variabel yang dapat digunakan sebagai indeks pada line chart. Variabel x mewakili indeks dari 1 hingga 100, sedangkan variabel y dihasilkan secara acak dengan distribusi normal yang memiliki mean 100 dan standar deviasi 12. Variabel y yang nantinya ditempatkan di sumbu y.

set.seed(1001)
linedata <- data.frame(x = 1:100,
                       y = rnorm(100, mean = 100, 12))
head(linedata)
##   x         y
## 1 1 126.26378
## 2 2  97.86943
## 3 3  97.77670
## 4 4  69.92157
## 5 5  93.31226
## 6 6  98.27729

Grafik pertama menampilkan garis yang menghubungkan titik-titik data dengan geom_line(), sementara grafik kedua menambahkan garis smoothing (geom_smooth()) untuk melihat tren atau pola umum dari data. Garis smoothing ini membantu mengidentifikasi apakah ada kecenderungan tertentu dalam data, seperti peningkatan atau penurunan seiring waktu.

ggplot(data = linedata, mapping = aes(x = x, y = y)) + 
  geom_line()
ggplot(data = linedata, mapping = aes(x = x, y = y)) + 
  geom_line() + 
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

6.3.7 Faceting

Selanjutnya, kita menggunakan dataset diamonds untuk membuat visualisasi dengan teknik faceting. Faceting memungkinkan kita membagi data menjadi beberapa subplot berdasarkan kategori tertentu. Pada contoh pertama, kita membuat bar chart yang menunjukkan sebaran clarity (tingkat kejernihan berlian) untuk setiap kategori cut (potongan berlian). Ini membantu membandingkan distribusi kejernihan berlian di antara berbagai jenis potongan.

ggplot(diamonds, aes(x = clarity)) + 
  geom_bar() + 
  facet_wrap(~cut)

Pada contoh kedua, kita membuat histogram untuk variabel price (harga) yang juga difacet berdasarkan cut. Hal ini memungkinkan kita melihat sebaran harga berlian untuk setiap kategori potongan.

ggplot(diamonds, aes(x = price)) + 
  geom_histogram() + 
  facet_wrap(~cut)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Selanjutnya, kita membuat scatter plot yang menunjukkan hubungan antara carat (berat berlian) dan price (harga), dengan warna titik yang berbeda berdasarkan cut. Faceting digunakan untuk memisahkan scatter plot ini berdasarkan kategori cut, sehingga kita dapat melihat pola hubungan antara berat dan harga untuk setiap jenis potongan.

ggplot(data = diamonds, mapping = aes(x = carat, y = price, color = cut)) + 
  geom_point() + 
  facet_wrap(~cut) + 
  theme(legend.position = "none")

6.3.8 Annotation dan Theme

Pada bagian terakhir ini, kita fokus pada annotation dan theme untuk meningkatkan tampilan visualisasi. Kita akan membuat bar chart yang menampilkan frekuensi dari setiap level cut pada dataframe diamonds. Grafik yang kita buat ini dilengkapi dengan teks yang menunjukkan persentase frekuensi di atas setiap bar dengan geom_text(), sehingga informasi menjadi lebih jelas. Selain itu, kita mencoba berbagai tema seperti theme_grey(), theme_classic(), theme_dark(), theme_minimal(), dan theme_stata() dari package ggthemes. Setiap tema memberikan tampilan yang berbeda, mulai dari yang sederhana hingga yang lebih modern, sehingga kita dapat memilih tema yang paling sesuai dengan kebutuhan visualisasi. Penghapusan legenda dengan theme(legend.position = "none") juga dilakukan untuk menyederhanakan tampilan grafik.

library(ggplot2)
library(scales)

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4) + 
  scale_y_continuous(labels = comma) + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  theme_grey() 
ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4) + 
  scale_y_continuous(labels = comma) + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  theme_classic() 
ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4) + 
  scale_y_continuous(labels = comma) + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  theme_dark() 
ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4) + 
  scale_y_continuous(labels = comma) + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  theme_minimal() 
library(ggthemes)

ggplot(data = freqtab, mapping = aes(x = Var1, y = Freq)) + 
  geom_col() + 
  geom_text(
    aes(label = percent(persen, accuracy = 0.01)), 
    vjust = -0.25, size = 4) + 
  scale_y_continuous(labels = comma) + 
  labs(title = "Frekuensi berdasarkan 'cut'", 
       x = "Cut Level", 
       y = "Frekuensi") + 
  ggthemes::theme_stata()