Ekplorasi Data Menggunakan Packages Tidyverse di R (Part 1)

SRI ARISTA PANGGOLA
8 min readJan 6, 2020

--

pada pembahasan kali ni, akan dibahas tentang cara mengeksplorasi data menggunakan packages tidyverse di R.

Install Packages

langkah pertama adalah, kita perlu menginstall package tidyverse dan packages lainnya yang mendukung tidyverse. Gunakan perintah berikut untuk menginstall package yang dibutuhkan.

install.packages(c("readr", "tidyr", "dplyr", "ggplot2"))
# atau
install.packages("tidyverse")

kemudian, panggil package-package tersebut menggunakan fungsi library() sperti berikut.

# Panggil package yang sudah terisntall
library(readr)
library(tidyr)
library(dplyr)
library(ggplot2)

# atau cukup memanggil
# library(tidyverse)

Package reader, tidyr, dplyr dan ggplot2 (dan beberapa package lain yang tidak digunakan di tutorial ini) termasuk dalam bagian package tidyverse. tidyverse adalah kumpulan package yang dibuat oleh Hadley Wickham dkk untuk kebutuhan data science menggunakan R.

  • RMySQL digunakan untuk membuat koneksi antara R dan database MySQL. Beberapa fungsi yang akan digunakan pada tutorial ini antara lain dbConnect() yang berasal dari package DBI untuk membuat koneksi, dbReadTable() untuk import data dari database ke R dan fungsi dbDisconnect() untuk memutuskan koneksi yang sudah tidak digunakan.
  • readr berguna untuk import data dari tabular data file (csv, text file, dll).
  • tidyr memiliki fungi-fungsi untuk “merapihkan” data. Terutama yang sering digunakan adalah fungsi gather() dan spread().
  • dplyr adalah package yang sangat berguna untuk melakukan manipulasi/transformasi data menggunakan R.
  • ggplot2 adalah salah satu package yang sangat banyak digunakan oleh pengguna R untuk kebutuhan visualisasi.

Selanjutnya, kita akan menggunakan dataset bawaan dari R yaitu data penerbangan yang terdiri dari 336,776 penerbangan dari New York City (NYC) selama tahun 2013 yang terdapat dalam packages nycflights13 . Untuk menggunakan dataset, kita perlu menginstall package dan memanggil package untuk menggunakan dataset seperti berikut.

install.packages("nycflights13")
library(nycflights13)

Dalam package nycflights13terdapat beberapa sheet atau dataset didalamnya. diantaranya:

  • flights: semua penerbangan yang berangkat dari NYC di tahun 2013.
  • weather: data meteorologi per jam untuk masing-masing bandara (airports).
  • planes: information tentang konstruksi masing-masing pesawat.
  • airports: nama dan lokasi bandara.
  • airlines: translasi antara dua huruf kode carrier dan namanya.
  • prices: daftar harga tiket (ticket) dan biaya (cost) per penumpang untuk masing-masing penerbangan.
  • specialdays: daftar hari “istimewa” di Amerika.

Untuk melihat masing-masing data tersebut, gunakan perintah berikut.

nycflights13::nama_data    ###untuk melihat dataset##contoh: melihat data flights
nycflights13::flights

tidyverse menggunakan tibble sebagai pengganti data.frame. kelebihan dari tibble dibandingkan dengan data.framessalahsatunya adalah ketika menampilkan data, tibble tidak akan menampilkan semua data seperti pada data.frame melainkan hanya menampilkan beberapa data dan beberapa variabel sesuai dengan ukuran console R kita.

Eksplorasi Data Menggunakan fungsi dalam package dplyr.

Beberapa fungsi yang dapat digunakan dalam package dplyr yaitu seperti select(), fliter(), dan arrange(). biasanya ketika mengeksplorasi data, fungsi-fungsi ini digunakan secara berurutan.

Sekarang kita akan membuat eksplorasi data dari dataset flights seperti berikut.

###melihat dimensi data (banyak baris dan kolom)
dim(flights)
###melihat tipe data
glimpse(flights)
##atau
str(flights)

dim() menampilkan banyaknya baris dan kolomdari suatu data frame.

glimpse() memiliki fungsi yang sama dengan str() yang bertujuan untuk menampilkan tipe dan struktur data. Fungsi ini juga menampilkan nama variabel, tipe variabel, dan beberapa baris pertama dari data.

Kemudian untuk melihat data, kita dapat menggunakan fungsi head() atau View(). perbedaannya adalah head() hanya menampilkan beberapa data teratas (secara default di R menampilkan 6 data teratas). Sedangkan View() akan menampilkan keseluruhan data namun tidak dalam console R melainkan pada jendela lain. Selain itu juga untuk melihat data terbawah dapat menggunakan tail() . Biasanya saat kita menggunakan data baik untuk analisis lainnya atau untuk eksplorasi, kita terlebih dahulu akan melihat deskripsi data berupa ukuran pemusatan data seperti nilai rata-rata, minimum, maksimum, dan lain-lain. pada R dapat digunakan fungsi summary() untuk menggambarkan deskripsi data tesebut.

#menampilkan data teratas
head(flights)
#menampilkan data terbawah
tail(flights)
#menamipkan keseluruhan data
View(flights)
#menamiplkan deskripsi data
summary(flights)

Mengambil nilai unik (tidak duplikasi) dari sebuah variable dengan distinct()

untuk mengambil nilai unik dari sebuah variabel dapat menggunakan funsgi distinct(nama_data, nama_variabel) atau jika ingin mengambil nilai unik dari semua baris bedsarkan sebuah variabel, tambahkan atribut .keep_all=TRUE ke dalam fungsi distinct() seperti berikut.

#mengambil nilai unik sebuah satu variabel
distinct(flights,year)
#mengambil nilai unik seluruh baris variabel
distinct(flights, dest, .keep_all = TRUE)

Memilih atau membuang beberapa variable yang akan/tidak digunakan dengan select()

Untuk membuat data frame dari hasil select() kita dapat menuliskan namadataframe <- select(...). Argumen pertama dari select() adalah data frame yang ingin kita subset variabel tertentu saja. Selanjutnya tuliskan nama variable yang ingin di buat data frame baru. untuk mengisi arh=gumennya , kita dapat menuliskan nama masing-masing variabel atau dapat juga dengan menuliskan urutan (indeks) variabel.

##menggunakan nama variabel
select(flights, month, day, dep_time, dep_delay, arr_time, arr_delay, origin, dest)
##menggunakan indeks variabel
select(flights, c(2:4, 6:7, 9, 13:14))

Jika kita ingin membuang satu variabel, dapat menuliskan nama variabel dengan menambahkan tanda negatif (-) di depan nama atau indeks masing-masing variabel.

##mengahapus menggunakan nama
select(flights, -year)
##menghapus menggunakan indeks
select(flights, -1)

Memilih baris data berdasarkan indeks baris atau nilai pada variabel tertentu dengan slice() dan filter()

Ketika kita ingin memilih sebagian baris saja dari data frame, dapat menggunakan fungsi slice() atau filter().

slice() berfungsi untuk mensubset baris data berdasarkan indeks barisnya. Misalkan, slice(flights, 1:1000) berarti kita memilih data pada posisi baris ke-1 s/d ke-1000. Posisi baris 1:1000 adalah vector numerik integer yang ingin dipilih. Jika ingin memilih baris tertentu saja, maka dapat menggunakan vector numerik integer dengan menuliskan indeks variabel yang ingin diambil.

# memilih baris ke-1 s/d 1000
slice(flights, 1:1000)
# memilih baris ke-1,3,5,6, dan 10
slice(flights, c(1,3,5,6,10))

filter() berfungsi untuk memilih sebagian data berdasarkan nilai dari satu atau lebih variabel.

filter(flights, dep_delay >= 10)filter(flights, dep_delay >= 10 & origin == "JFK")filter(flights, month == 1 & day == 1 & origin == "JFK" & dest == "ATL")filter(flights, is.na(dep_time))

Mengurutkan data dengan arrange()

untuk mengurutkan data, dapat menggunakan fungsi arrange() data akan secara otomatis diurutkan dari nilai yang terbesar.

# Urutkan data frame flights berdasarkan variabel `origin`
arrange(flights, origin)
# Urutkan data frame flights berdasarkan variabel `origin` dan `dest`
arrange(flights, origin, dest)

selain itu juga, kita dapat mengurutkan data variabel origin dari yang terbesar (aescending) dan data variabel dest dari yang terkecil (descending) seperti berikut. untuk mengurutkan data dari yang terkecil, digunakan fungsi desc() di dalam fungsi arrange() seperti berikut.

# Urutkan data frame flights berdasarkan variabel `origin` dan `dest` secara descending
arrange(flights, origin, desc(dest))

Penanganan missing values

Untuk kebutuhan ilustrasi pada bagian ini dengan fungsi na_if(), kita akan mengganti nilai NA (missing value) menjadi sebuah nilai tertentu, misalnya jika air_time missing akan diganti menjadi nilai -900.

# Banyaknya NA
sum(is.na(flights["air_time"]))
flights_na900 <- flights
# Merubah NA dengan -900
flights_na900$air_time <- if_else(is.na(flights$air_time), -900, flights$air_time)

# Banyaknya NA
sum(is.na(flights_na900["air_time"]))

Selanjutanya, misalkan dari data dengan nilai -900 tadi akan diganti diganti menjadi NA maka dapat menggunakan perintah berikut.

# Ganti nilai NA menjadi -900
flights_na900$air_time <- na_if(flights_na900$air_time, -900)

# Banyaknya -900
filter(flights_na900, air_time == -900)

setalah data berhasil diganti menjadi NA . Maka jika kita ingin membuang data NA tersebut, dapat menggunakan perintah drop_na() seperti berikut.

# Membuang semua baris yang mengandung NA
flights_dropNA <- drop_na(flights)

# Mengganti NA pada masing-masing variabel dengan nilai tertentu
replace_na(flights, list(dep_time = 0, dep_delay = 0, arr_time = mean(flights$arr_time, na.rm = TRUE), arr_delay = median(flights$arr_delay, na.rm = TRUE)))

Fungsi replace_na() menggunakan argumen sebuah list untuk menentukan nilai pengganti NA pada sebuah variabel. Dari contoh di atas, NA pada dep_time dan dep_delay diganti menjadi 0 (nol), NA di arr_time diganti dengan rata-rata arr_time, sedangkan NA di arr_delay diganti dengan nilai median dari arr_delay.

Eksplorasi dengan Operator Pipes %>%

Penjelasan Operator Pipes %>%

Operator pipes digunakan untuk membuat fungsi di R, Misalkan f(a, x) adalah sebuah fungsi di R dengan argumen a dan x. kemudian fungsi g(b, z) adalah fungsi lain di R dengan argumen b dan z. Dengan menggunakan operator %>% kita dapat menuliskannya sebagai berikut.

# fungsi f(a, x)
f(a, x) # atau
a %>% f(x)
# fungsi g(b, z)
g(b, z) # atau
b %>% g(z)

Dari kedua contoh di atas, dapat dilihat bahwa a adalah argumen pertama untuk fungsi f() dan b adalah argumen pertama untuk fungsi g(). Operator %>% “menyampaikan” objek a sebagai nilai untuk mengisi argumen pertama pada fungsi f(). Perhatikan ilustrasi di bawah ini.

Ilustrasi Pipes 1

Misalkan objek a menjadi argumen pertama fungsi f() dengan a %>% f(x). Kemudia hasil dari a %>% f(x) dijadikan argumen pertama dari fungsi g(). Dengan kata lain b <- a %>% f(x) sehingga b %>% g(z). Hal ini dapat dilakukan secara berurutan dengan operator %>% sebagai berikut.

a %>%
f(x) %>%
g(z)
Ilustrasi Pipes 2

“Fungsi f() diterapkan terhadap objek a sebagai argumen pertama dan x sebagai argumen kedua dari fungsi f() yang kemudian hasilnya digunakan sebagai argumen pertama pada fungsi g() dengan z sebagai argumen kedua.”

fungsi select(), filter(), arrange() dan beberapa fungsi yang lain di dplyr yang sering digunakan untuk transformasi dan eksplorasi data adalah data frame/tibble atau hasil dari proses sebelumnya. Misalnya, hasil dari fungsi select() adalah data frame yang kemudian diproses dengan fungsi filter() untuk memilih baris data tertentu dan hasilnya diteruskan lagi ke fungsi arrange() untuk diurutkan berdasarkan variabel tertentu.

Dengan konsep tidyverse, kita dapat menggunakan operator Pipes %>% agar lebih mudah dalam memahami script karena script tersebut menunjukkan urutan. Perhatikan contoh di bawah ini.

flights %>% 
select(dep_delay, arr_time, arr_delay, origin, dest, time_hour) %>%
filter(origin == "JFK" & between(dep_delay, -10, 100)) %>%
arrange(origin, desc(dest))

sintaks dan output diatas artinya, kita mengambil data penerbangan dari data frame flights kemudian pilih variabel-variabel tertentu saja. Selanjutnya kita filter yang origin-nya dari”JFK" dan waktu keberangkatan antara yang lebih awal 10 menit dan yang delay hingga 100 menit. Kemudian urutkan hasil tersebut berdasarkan origin secara ascending dan berdasarkan dest secara descending.

Membuat variabel baru

Selanjutnya kita akan membuat variabel baru dengan nama is_delaydan menggunakan fungsi mutate() . untuk caranya yaitu pertama kita ambil data penerbangan dari data frame flights kemudian pilih variabel-variabel tertentu saja. Selanjutnya filter yang dest-nya dari”TPA" dan waktu keberangkatan antara yang lebih awal 5 menit dan yang delay hingga 100 menit. Kemudian urutkan hasil tersebut berdasarkan dest secara ascending dan berdasarkan originsecara descending. Setelah itu membuat variabel baru bernama is_delay yang menunjukkan apakah suatu penerbangan terjadi delay atau tidak. Kemudian konversi variable time_hour yang masih bertipe character menjadi datetime atau <dttm> dengan nama variabel yang sama, yaitu time_hour.

flights %>% 
select(dep_delay, arr_time, arr_delay, origin, dest, time_hour) %>%
filter(dest == "TPA" & between(dep_delay, -5, 100)) %>%
arrange(dest, desc(origin)) %>%
mutate(is_delay = if_else(dep_delay > 0, 1, 0),
time_hour = as.POSIXct(time_hour))

Sekian untuk pembahasan kali ini, Untuk lanjutannya dapat dibaca disini. Terimakasih…

Sumber:

[1] http://rstudio-pubs-static.s3.amazonaws.com/503447_57eb680b5be348b6b965df58e3547672.html

--

--