Introduction

Tidyverse adalah sekumpulan package R yang didesain khusus untuk data science. Tidyverse membantu dalam manajemen data terutama pada impor dan ekspor data, serta pemodelan dan visualisasi data. Dalam package ini memungkinkan penggunaan operator pipes (%>%) untuk memudahkan dalam memahami script, karena ia menunjukkan urutan fungsi yang digunakan.

Mengukur kecepatan sebuah proses dengan package tictoc

#install.packages("tictoc")
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6     ✔ purrr   0.3.4
## ✔ tibble  3.1.8     ✔ dplyr   1.0.9
## ✔ tidyr   1.2.0     ✔ stringr 1.4.1
## ✔ readr   2.1.2     ✔ forcats 0.5.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(tictoc)

tic()
cars1 <- read.csv("https://raw.githubusercontent.com/tidyverse/readr/main/inst/extdata/mtcars.csv")
toc()
## 0.804 sec elapsed
tic()
cars2 <- read_csv("https://raw.githubusercontent.com/tidyverse/readr/main/inst/extdata/mtcars.csv")
## Rows: 32 Columns: 11
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (11): mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb
## 
## ℹ 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.
toc()
## 2.215 sec elapsed

Lebih cepat import dengan package readr.

Penggunaan Pipes (%>%) Operator

  • Pipes operator memungkinkan penggunaan beberapa fungsi secara sistematis tanpa harus menyimpan value ke dalam variabel satu-satu mengikuti fungsi yang dipakai
  • Fungsi ini awalnya dikembangkan pada package magrittr yang merpakan bagian dari dplyr

Misalkan ingin diterapkan fungsi log > fungsi eksponen > diakar > ditambah 2 > dibagi 10 dibulatkan 2

tryPipes <- c(203, 493, 283, 485, 901, 381, 492, 472, 697, 382, 294, 372, 481)
tryPipes2 <- c(203, 493, 283, 485, 901, 381, 492, 472, 697, 382, 294, 372, 481)

# dengan fungsi biasa
tryPipes <- sqrt(exp(log(tryPipes)))
tryPipes <- round(tryPipes + 2, 2)
tryPipes
##  [1] 16.25 24.20 18.82 24.02 32.02 21.52 24.18 23.73 28.40 21.54 19.15 21.29
## [13] 23.93
tryPipes2 %>% log() %>% exp %>% sqrt() %>% +2 %>% round(2)
##  [1] 16.25 24.20 18.82 24.02 32.02 21.52 24.18 23.73 28.40 21.54 19.15 21.29
## [13] 23.93
# belum nemu cara mengaplikasikan pembagian/perkalian di pipes operator

Installation

Instal dan persiapan penggunaan package ini dapat dilakukan dengan sintaks:

#install.packages("tidyverse")
library(tidyverse)

Packages

Terdapat beberapa package yang tergabung dalam tidyverse, antara lain:

Package readr

  • Tujuan package ini adalah untuk menyediakan cara yang cepat dan mudah bagi scientist untuk membaca data dalam berbagai format baik excel, txt file, csv, dan lain-lain.
  • Jika dalam pengoperasian data biasanya di R menggunakan dataframe, maka di tidyverse ini menggunakan istilah ‘tibble’. Artinya, jika data berformat .csv diimport dengan read.csv() maka di R dia disimpan sebagai dataframe, tetapi jika diimport dengan read_csv() milik readr maka ia disimpan sebagai tibble.
  • Install dan memanggil library package ini adalah dengan:
#install.packages("readr")
library(readr)

Beberapa fungsi yang terdapat pada package ini antara lain: 1. read_csv() - untuk membaca file ekstensi .csv (comma-separated values) 2. read_tsv() - untuk membaca file ekstensi .tsv (tab-separated values) 3. read_delim() - untuk membaca file delimited lainnya (selain .csv dan .tsv) 4. read_fwf() - untuk membaca file fixed-width 5. read_table() - untuk membaca file whitespace-separated 6. read_log() - untuk membaca file log web

Contoh penggunaan read_csv() adalah sebagai berikut:

getwd()
## [1] "/Users/User/Documents/RFiles"
dataCars <- cars1
head(dataCars)
##    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Package tidyr

  • Digunakan untuk merapikan data sebagaimana namanya “tidy”
  • Menangani data yang hilang atau tidak lengkap sehingga data menjadi rapi dan siap di analisis
  • Data yang rapi adalah data yang:
    1. Setiap kolom merupakan sebuah variabel
    2. Setiap baris adalah sebuah observasi
    3. Setiap sel (irisan kolom dan baris) adalah nilai tunggal
  • Install dan pemanggilan library package ini adalah dengan:
#install.packages("tidyr")
library(tidyr)

Data

tidyrDF <- data.frame(
              No = c(1:5),
              Total.1 = c(203, 349, 201, 33, 103),
              Total.2 = c(92, 394, 203, 68, 70),
              Total.3 = c(738, 84, 503, 492, 58))
tidyrDF
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58

Fungsi-fungsi

gather()

  • Mengambil beberapa kolom dan mengumpulkannya menjadi pasangan key-value.
  • Dibentuk dengan: gather(data, key = “key”, value = “value”, …, na.rm = FALSE, convert = FALSE, factor_key = FALSE)
gath <- tidyrDF %>% gather(Total, Freq, Total.1:Total.3)
gath
##    No   Total Freq
## 1   1 Total.1  203
## 2   2 Total.1  349
## 3   3 Total.1  201
## 4   4 Total.1   33
## 5   5 Total.1  103
## 6   1 Total.2   92
## 7   2 Total.2  394
## 8   3 Total.2  203
## 9   4 Total.2   68
## 10  5 Total.2   70
## 11  1 Total.3  738
## 12  2 Total.3   84
## 13  3 Total.3  503
## 14  4 Total.3  492
## 15  5 Total.3   58

separate()

  • Mengonversi data panjang ke format yang lebar
  • Mengubah kolom 1 menjadi beberapa kolom
  • Dibentuk dengan: separate(data, col, into, sep = ” “, remove = TRUE, convert = FALSE)
sepr <- gath %>% separate(Total, c("Main", "Child"))
sepr
##    No  Main Child Freq
## 1   1 Total     1  203
## 2   2 Total     1  349
## 3   3 Total     1  201
## 4   4 Total     1   33
## 5   5 Total     1  103
## 6   1 Total     2   92
## 7   2 Total     2  394
## 8   3 Total     2  203
## 9   4 Total     2   68
## 10  5 Total     2   70
## 11  1 Total     3  738
## 12  2 Total     3   84
## 13  3 Total     3  503
## 14  4 Total     3  492
## 15  5 Total     3   58

unite()

  • Paste beberapa variabel menjadi satu value
  • Ibarat mengembalikan fungsi separate() ke bentuk semula sebelum dieksekusi
  • Dibentuk dengan: unite(data, col, …, sep = “_”, remove = TRUE)
unites <- sepr %>% unite(Total, Main, Child, sep = ".")
unites
##    No   Total Freq
## 1   1 Total.1  203
## 2   2 Total.1  349
## 3   3 Total.1  201
## 4   4 Total.1   33
## 5   5 Total.1  103
## 6   1 Total.2   92
## 7   2 Total.2  394
## 8   3 Total.2  203
## 9   4 Total.2   68
## 10  5 Total.2   70
## 11  1 Total.3  738
## 12  2 Total.3   84
## 13  3 Total.3  503
## 14  4 Total.3  492
## 15  5 Total.3   58

spread()

  • Membantu mengganti bentuk format yang panjang ke format lebar.
  • Ibarat membatalkan perintah gather()
  • Dibentuk dengan: spread(data, key, value, fill = NA, convert = FALSE)
sprd <- unites %>% spread(Total, Freq)
sprd
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58

fill()

Digunakan untuk mengisi NA/missing values dengan entry sebelumnya

# Menambah baris mengandung NA
library(tidyverse)
tidyrDF <- tidyrDF %>% add_row(No = 6, Total.1 = NA, Total.2 = 738, Total.3 = 902)
tidyrDF
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58
## 6  6      NA     738     902
# Mengganti NA
tidyrDF <- tidyrDF %>% fill(Total.1)
tidyrDF
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58
## 6  6     103     738     902
#harus disimpan dalam variabel jika ingin kondisinya tetap terisi

drop_na()

Digunakan untuk membuang observasi yang memiliki missing value.

tidyrDF <- tidyrDF %>% add_row(No = 7, Total.1 = 829, Total.2 = NA, Total.3 = 92)
tidyrDF
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58
## 6  6     103     738     902
## 7  7     829      NA      92
tidyrDF %>% drop_na(Total.2)
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58
## 6  6     103     738     902

replace_na()

Digunakan untuk mengganti observasi NA dengan nilai tertentu.

tidyrDF <- tidyrDF %>% add_row(No = 7, Total.1 = 829, Total.2 = NA, Total.3 = 92)
tidyrDF
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58
## 6  6     103     738     902
## 7  7     829      NA      92
## 8  7     829      NA      92
tidyrDF %>% replace_na(list(Total.2=832))
##   No Total.1 Total.2 Total.3
## 1  1     203      92     738
## 2  2     349     394      84
## 3  3     201     203     503
## 4  4      33      68     492
## 5  5     103      70      58
## 6  6     103     738     902
## 7  7     829     832      92
## 8  7     829     832      92

Package dplyr

  • Package ini dibuat oleh Roman Francois yang berisi kumpulan fungsi untuk manipulasi data
  • Memiliki beberapa kelebihan, antara lain dapat meminimalisir waktu pengolahn data, kode sederhana, dan lebih rapi karena fungsi yang digunakan lebih sistematis.
  • Package dplyr harus sudah terinstall dan dipanggil library-nya terlebih dahulu sebelum dipakai
#install.packages("dplyr")
library(dplyr)

Data

heartRate = data.frame(
  Class = c(rep(1:3, each=4)),
  Name = c(LETTERS[12:23]),
  Date = c(sample(1:30, 12)),
  Month = c(sample(month.name[1:12], 12)),
  Year = c(sample(1990:2015, 12)),
  HeartRate = c(sample(90:140, 12))
)
heartRate
##    Class Name Date     Month Year HeartRate
## 1      1    L   19      June 2006       106
## 2      1    M    5  November 2013       111
## 3      1    N   28  February 2015       109
## 4      1    O   21  December 1991       112
## 5      2    P    8       May 1997       134
## 6      2    Q    4      July 1996       108
## 7      2    R   15     April 2008       124
## 8      2    S   26   January 2009       120
## 9      3    T   30    August 1993       136
## 10     3    U   22   October 2014       126
## 11     3    V   27     March 1998       127
## 12     3    W   23 September 2001        90

groupby() dan summarise()

Digunakan untuk mengumpulkan data dan meringkas data.

summarise(heartRate, minYear = min(heartRate$Year), maxYear = max(heartRate$Year), meanHR = mean(heartRate$HeartRate), medHR = median(heartRate$HeartRate))
##   minYear maxYear   meanHR medHR
## 1    1991    2015 116.9167   116
heartRate %>% group_by(Class) %>% summarise(rataRataHR = mean(HeartRate), .groups = 'drop')
## # A tibble: 3 × 2
##   Class rataRataHR
##   <int>      <dbl>
## 1     1       110.
## 2     2       122.
## 3     3       120.

Note: tanpa .groups = ‘drop’, apalagi .groups = ‘keep’ sama saja hasilnya, apa bedanya?

filter()

Digunakan untuk memilih data berdasarkan 1 atau lebih kriteria tertentu.

heartRate %>% filter(Year > 2000, HeartRate < 100)
##   Class Name Date     Month Year HeartRate
## 1     3    W   23 September 2001        90

arrange()

Untuk mengurutkan data

heartRate %>% arrange(HeartRate)
##    Class Name Date     Month Year HeartRate
## 1      3    W   23 September 2001        90
## 2      1    L   19      June 2006       106
## 3      2    Q    4      July 1996       108
## 4      1    N   28  February 2015       109
## 5      1    M    5  November 2013       111
## 6      1    O   21  December 1991       112
## 7      2    S   26   January 2009       120
## 8      2    R   15     April 2008       124
## 9      3    U   22   October 2014       126
## 10     3    V   27     March 1998       127
## 11     2    P    8       May 1997       134
## 12     3    T   30    August 1993       136

select()

Untuk menyeleksi data berdasarkan vkolom/ariabel tertentu

heartRate %>% select(Name, Year, HeartRate)
##    Name Year HeartRate
## 1     L 2006       106
## 2     M 2013       111
## 3     N 2015       109
## 4     O 1991       112
## 5     P 1997       134
## 6     Q 1996       108
## 7     R 2008       124
## 8     S 2009       120
## 9     T 1993       136
## 10    U 2014       126
## 11    V 1998       127
## 12    W 2001        90

mutate()

Untuk membentuk variabel baru berdasarkan variabel yang telah terbentuk

heartRate %>% mutate(Status = "")
##    Class Name Date     Month Year HeartRate Status
## 1      1    L   19      June 2006       106       
## 2      1    M    5  November 2013       111       
## 3      1    N   28  February 2015       109       
## 4      1    O   21  December 1991       112       
## 5      2    P    8       May 1997       134       
## 6      2    Q    4      July 1996       108       
## 7      2    R   15     April 2008       124       
## 8      2    S   26   January 2009       120       
## 9      3    T   30    August 1993       136       
## 10     3    U   22   October 2014       126       
## 11     3    V   27     March 1998       127       
## 12     3    W   23 September 2001        90
for (i in nrow(heartRate)){
  if (heartRate[i,]$HeartRate >= 135){
    heartRate[i,]$Status = 'High'
  } else if (heartRate$HeartRate[i] <= 100){
    heartRate[i,]$Status = 'Low'
  } else {
    heartRate[i,]$Status = 'Normal'
  }
}
## Warning in `[<-.data.frame`(`*tmp*`, i, , value = structure(list(Class = 3L, :
## provided 7 variables to replace 6 variables
heartRate
##    Class Name Date     Month Year HeartRate
## 1      1    L   19      June 2006       106
## 2      1    M    5  November 2013       111
## 3      1    N   28  February 2015       109
## 4      1    O   21  December 1991       112
## 5      2    P    8       May 1997       134
## 6      2    Q    4      July 1996       108
## 7      2    R   15     April 2008       124
## 8      2    S   26   January 2009       120
## 9      3    T   30    August 1993       136
## 10     3    U   22   October 2014       126
## 11     3    V   27     March 1998       127
## 12     3    W   23 September 2001        90

transmute()

Untuk membentuk variabel bar berdasarkan variabel yang telah terbentuk, bedanya hanya menampilkan variabel baru.

sample(), sample_n() dan sample_frac()

Untuk mengambil nilai random dari data

sample(heartRate, 2)
##    Name     Month
## 1     L      June
## 2     M  November
## 3     N  February
## 4     O  December
## 5     P       May
## 6     Q      July
## 7     R     April
## 8     S   January
## 9     T    August
## 10    U   October
## 11    V     March
## 12    W September
sample_n(heartRate, 5)
##   Class Name Date    Month Year HeartRate
## 1     3    U   22  October 2014       126
## 2     2    S   26  January 2009       120
## 3     1    O   21 December 1991       112
## 4     3    V   27    March 1998       127
## 5     3    T   30   August 1993       136
sample_frac(heartRate, 0.3)
##   Class Name Date Month Year HeartRate
## 1     2    Q    4  July 1996       108
## 2     2    R   15 April 2008       124
## 3     1    L   19  June 2006       106
## 4     2    P    8   May 1997       134

Package ggplot2

  • Digunakan untuk visualisasi data
  • Penggunaannya mudah dan fleksibel
  • Instalasi dan pemanggilan library dengan:
#install.packages("ggplot2")
library(ggplot2)

Beberapa komponen yang ada pada ggplot2 antara lain: 1. Data : elemen data itu sendiri 2. Aesthetics : data dipetakan ke dalam beberapa atribut Aesthetics seperti x-axis (sumbu x), y-axis (sumbu y), color, size, labels, alpha, shape, line width, line type, dan lain-lain. 3. Facets : menampilkan bagian/subset data dengan kolom-kolom atau baris-baris 4. Statistics : menggolongkan, smoothing, deskriptif, dan intermediate 5. Coordinates : area display data menggunakan Cartesian, fixed, polar, limit 6. Themes : komponen lain yang tidak berhubungan langsung dengan data

Fungsi yang dipakai adalah ggplot().

Beberapa contoh dengan menggunakan data motorola cars dari R

library(datasets)
head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10
summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Building graph with ggplot2

  1. Masukkan data
ggplot(data = cars)

  1. Tambahkan unsur-unsur dalam aesthetics (aes)
ggplot(data = cars, 
       aes(x = speed, y = dist))

  1. Menambahkan point yang mewakili nilai data
ggplot(data = cars,
       aes(x = speed, y = dist)) + geom_point()

#  + harus diletakkan 1 line
  1. Menambahkan warna dan mengubah shape Default color adalah black dengan shape-nya circle
ggplot(data = cars,
       aes(x = speed, y = dist)) + geom_point(col = "red", shape = "square")

  1. Membuat histogram
  • Semakin kecil binwidth, semakin detail
  • Hanya menampung x
ggplot(data = cars,
       aes(x = speed)) + geom_histogram(binwidth = 1)

ggplot(data = cars,
       aes(x = dist)) + geom_histogram(binwidth = 5)