A. Contoh Akses Database

1. Engine SQL

R dapat melakukan eksekusi syntax SQL serta menampilkan hasilnya. Hal ini dimungkinkan karena terdapat package rmarkdown yang memfasilitasi penggunaan engine SQL di R.

untuk menggunakan rmarkdown sebelumnya harus membuat suatu objek connection serta menggunakan connection ini bersama dengan engine sql.

Di sini saya membuat objek db yang terkoneksi dengan database chinook.db. alamat file yang disimpan disesuaikan dengan pengguna masing-masing di mana file tersebut disimpan.

db<-DBI::dbConnect(RSQLite::SQLite(), "C:/Users/Agsyan/Documents/kuliah IPB/Manajemen Data Relasional/chinook.db")

dalam kurung kurawal, opsi connection digunakan untuk objek db dan opsi engine digunakan untuk "sql". sehingga kita dapat menuliskan syntax SQL di dalamnya.

SELECT
  *
FROM
  albums
ORDER BY
  Title DESC;
Displaying records 1 - 10
AlbumId Title ArtistId
208 [1997] Black Light Syndrome 136
240 Zooropa 150
267 Worlds 202
334 Weill: The Seven Deadly Sins 264
8 Warner 25 Anos 6
239 War 150
175 Walking Into Clarksdale 115
287 Wagner: Favourite Overtures 221
182 Vs. 118
53 Vozes do MPB 21

2. Menggunakan DPLYR

Secara umum, koneksi terhadap database di R menggunkan syntax sebagai berikut:

DBI::dbConnect(RSQLite::SQLite(), path = ":dbname:")

untuk menjalanan syntax ini saya menggunakan database chinook yang disimpan pada C:/Users/Agsyan/Documents/kuliah IPB/Manajemen Data Relasional/chinook.db.

chinook<-DBI::dbConnect(RSQLite::SQLite(), "C:/Users/Agsyan/Documents/kuliah IPB/Manajemen Data Relasional/chinook.db")
class(chinook)
## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"
RSQLite::dbListTables(chinook)
##  [1] "albums"          "artists"         "customers"       "employees"      
##  [5] "genres"          "invoice_items"   "invoices"        "media_types"    
##  [9] "playlist_track"  "playlists"       "sqlite_sequence" "sqlite_stat1"   
## [13] "tracks"
dplyr::tbl(chinook, "tracks")
## # Source:   table<tracks> [?? x 9]
## # Database: sqlite 3.37.0 [C:\Users\Agsyan\Documents\kuliah IPB\Manajemen Data
## #   Relasional\chinook.db]
##    TrackId Name     AlbumId MediaTypeId GenreId Composer     Milliseconds  Bytes
##      <int> <chr>      <int>       <int>   <int> <chr>               <int>  <int>
##  1       1 For Tho~       1           1       1 Angus Young~       343719 1.12e7
##  2       2 Balls t~       2           2       1 <NA>               342562 5.51e6
##  3       3 Fast As~       3           2       1 F. Baltes, ~       230619 3.99e6
##  4       4 Restles~       3           2       1 F. Baltes, ~       252051 4.33e6
##  5       5 Princes~       3           2       1 Deaffy & R.~       375418 6.29e6
##  6       6 Put The~       1           1       1 Angus Young~       205662 6.71e6
##  7       7 Let's G~       1           1       1 Angus Young~       233926 7.64e6
##  8       8 Inject ~       1           1       1 Angus Young~       210834 6.85e6
##  9       9 Snowbal~       1           1       1 Angus Young~       203102 6.60e6
## 10      10 Evil Wa~       1           1       1 Angus Young~       263497 8.61e6
## # ... with more rows, and 1 more variable: UnitPrice <dbl>
tracks<- dplyr::tbl(chinook, "tracks")
class(tracks)
## [1] "tbl_SQLiteConnection" "tbl_dbi"              "tbl_sql"             
## [4] "tbl_lazy"             "tbl"
tracks
## # Source:   table<tracks> [?? x 9]
## # Database: sqlite 3.37.0 [C:\Users\Agsyan\Documents\kuliah IPB\Manajemen Data
## #   Relasional\chinook.db]
##    TrackId Name     AlbumId MediaTypeId GenreId Composer     Milliseconds  Bytes
##      <int> <chr>      <int>       <int>   <int> <chr>               <int>  <int>
##  1       1 For Tho~       1           1       1 Angus Young~       343719 1.12e7
##  2       2 Balls t~       2           2       1 <NA>               342562 5.51e6
##  3       3 Fast As~       3           2       1 F. Baltes, ~       230619 3.99e6
##  4       4 Restles~       3           2       1 F. Baltes, ~       252051 4.33e6
##  5       5 Princes~       3           2       1 Deaffy & R.~       375418 6.29e6
##  6       6 Put The~       1           1       1 Angus Young~       205662 6.71e6
##  7       7 Let's G~       1           1       1 Angus Young~       233926 7.64e6
##  8       8 Inject ~       1           1       1 Angus Young~       210834 6.85e6
##  9       9 Snowbal~       1           1       1 Angus Young~       203102 6.60e6
## 10      10 Evil Wa~       1           1       1 Angus Young~       263497 8.61e6
## # ... with more rows, and 1 more variable: UnitPrice <dbl>
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
q<-tracks %>%
  select(TrackId, AlbumId, UnitPrice) %>%
  filter(UnitPrice>1)
q
## # Source:   lazy query [?? x 3]
## # Database: sqlite 3.37.0 [C:\Users\Agsyan\Documents\kuliah IPB\Manajemen Data
## #   Relasional\chinook.db]
##    TrackId AlbumId UnitPrice
##      <int>   <int>     <dbl>
##  1    2819     226      1.99
##  2    2820     227      1.99
##  3    2821     227      1.99
##  4    2822     227      1.99
##  5    2823     227      1.99
##  6    2824     227      1.99
##  7    2825     227      1.99
##  8    2826     227      1.99
##  9    2827     227      1.99
## 10    2828     227      1.99
## # ... with more rows
dplyr::show_query(q)
## <SQL>
## SELECT *
## FROM (SELECT `TrackId`, `AlbumId`, `UnitPrice`
## FROM `tracks`)
## WHERE (`UnitPrice` > 1.0)

class(chinook) berarti objek chinook mempunyai Class SQLiteConnection.

Lalu, RSQLite::dbListTables(chinook) yang memiliki fungsi dbListTables digunakan untuk melihat tabel-tabel yang terdapat di dalam database.

Untuk mengakses database dapat menggunakan fungsi tbl(database, "tables") dari package dplyr. dalam contoh di atas saya ingin melihat isi dari tabel tracks dari database chinook. Dengan tracks merupakan objek dengan class tbl.

dplyr::tbl(chinook, "tracks") tracks<- dplyr::tbl(chinook, "tracks") class(tracks)

Di bagian akhir kita ingin mengetahui tracks dengan UnitPrice di atas 1.00 dengan menampilkan TrackId, AlbumId, dan UnitPrice.

Kemudian dplyr dengan fungsi show_query() digunakan untuk menerjemahkan pipeline.

B. Data Wrangling

Data Wrangling merupakan proses transformasi suatu data mentah menjadi suatu data yang dapat dipakai untuk analisis. Di sini kita akan menggunakan package tidyverse.

1. Datasets

Sebelum memulai data wrangling, pastikan sudah terinstall package tidyverse. Jika belum, dapat menggunakan syntax di bawah ini.

install.packages("tidyverse")

setelah terinstall selanjutnya memuat package tidyverse

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.5     v stringr 1.4.0
## v tidyr   1.1.4     v forcats 0.5.1
## v readr   2.0.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

di sini akan menggunakan syntax ??tidyverse untuk melihat isi dari package tidyverse atau dapat juga menggunakan syntax help(tidyverse)

??tidyverse
## starting httpd help server ... done

Kita sekarang akan menentukan datasets yang akan digunakan yang berada dalam package datasets. Jika kita tidak mengetahui isi-isi dari libray datasets dapat menggunakan syntax library(help="datasets").

library(datasets)
library(help = "datasets")

2. Kualitas udara

Kita menggunakan data airquality dari library datasets. Penggunakan syntax tibble::as_tibble() untuk mengubah class suatu datasets menjadi tibble

data(airquality)
airquality<-tibble::as_tibble(airquality)
class(airquality)
## [1] "tbl_df"     "tbl"        "data.frame"

Dengan memuat library tidyverse kita dapat juga menggunakan fungsi-fungsi dari dplyr seperti fungsi glimpse() yang memberikan rangkuman tentang keadaan data.

glimpse(airquality)
## Rows: 153
## Columns: 6
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, 18, 14, ~
## $ Solar.R <int> 190, 118, 149, 313, NA, NA, 299, 99, 19, 194, NA, 256, 290, 27~
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6, 6.9, 9~
## $ Temp    <int> 67, 72, 74, 62, 56, 66, 65, 59, 61, 69, 74, 69, 66, 68, 58, 64~
## $ Month   <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,~
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,~

Terdapat suatu operator yang bernama pipes %>% yang sangat populer di kalangan pengguna tidyvese yang mana operator pipes ini memudahkan pengguna untuk melihat urutan suatu program dijalankan.

mean(airquality$Temp) == airquality$Temp %>% mean()
## [1] TRUE
x<-c(0.54,0.61,0.94,0.87,0.11,0.31,0.69,0.88,0.1)
round(exp(diff(log(x))), 1)
## [1] 1.1 1.5 0.9 0.1 2.8 2.2 1.3 0.1
x %>% log() %>%
  diff() %>%
  exp() %>%
  round(1)
## [1] 1.1 1.5 0.9 0.1 2.8 2.2 1.3 0.1

3. Fungsi-Fungsi

Fungsi-Fungsi di sini merupakan fungsi yang berada pada package dplyr yang mana juga sudah dipanggil dari package tidyverse. Fungsi-fungsi yang akan digunakan, antara lain summarise(), arrange(), filter(), select(), dan mutate() ### summarise() summarise() berfungsi untuk meringkas data

Menghitung rata-rata temperatur tiap bulannya

airquality %>% group_by(Month) %>% summarise(mean.Temp=mean(Temp),.groups='drop')
## # A tibble: 5 x 2
##   Month mean.Temp
##   <int>     <dbl>
## 1     5      65.5
## 2     6      79.1
## 3     7      83.9
## 4     8      84.0
## 5     9      76.9

Menghitung rata-rata kecepatan angin tiap bulannya

airquality %>% group_by(Month) %>% summarise(mean.Wind=mean(Wind),.groups='drop')
## # A tibble: 5 x 2
##   Month mean.Wind
##   <int>     <dbl>
## 1     5     11.6 
## 2     6     10.3 
## 3     7      8.94
## 4     8      8.79
## 5     9     10.2

Menghitung rata-rata radiasi matahari tiap bulannya

Terlihat rata-rata radiasi matahari terdapat data yang tidak ada, NA (Not Available), ini terjadi karena data mentah airquality memang memiliki beberapa data kosong sehingga tidak dapat dihitung rata-ratanya.

airquality %>% group_by(Month) %>% summarise(mean.Solar=mean(Solar.R),.groups='drop')
## # A tibble: 5 x 2
##   Month mean.Solar
##   <int>      <dbl>
## 1     5        NA 
## 2     6       190.
## 3     7       216.
## 4     8        NA 
## 5     9       167.

arrange()

fungsi ini memungkinkan kita untuk mengurutkan data secara menaik (ascending) dan menurun (descending)

Mengurutkan berdasarkan peubah Ozone dari nilai terkecil

airquality %>% arrange(Temp)
## # A tibble: 153 x 6
##    Ozone Solar.R  Wind  Temp Month   Day
##    <int>   <int> <dbl> <int> <int> <int>
##  1    NA      NA  14.3    56     5     5
##  2     6      78  18.4    57     5    18
##  3    NA      66  16.6    57     5    25
##  4    NA      NA   8      57     5    27
##  5    18      65  13.2    58     5    15
##  6    NA     266  14.9    58     5    26
##  7    19      99  13.8    59     5     8
##  8     1       8   9.7    59     5    21
##  9     8      19  20.1    61     5     9
## 10     4      25   9.7    61     5    23
## # ... with 143 more rows

Mengurutkan berdasarkan peubah Ozone dari nilai terbesar

airquality %>% arrange(desc(Ozone))
## # A tibble: 153 x 6
##    Ozone Solar.R  Wind  Temp Month   Day
##    <int>   <int> <dbl> <int> <int> <int>
##  1   168     238   3.4    81     8    25
##  2   135     269   4.1    84     7     1
##  3   122     255   4      89     8     7
##  4   118     225   2.3    94     8    29
##  5   115     223   5.7    79     5    30
##  6   110     207   8      90     8     9
##  7   108     223   8      85     7    25
##  8    97     267   6.3    92     7     8
##  9    97     272   5.7    92     7     9
## 10    96     167   6.9    91     9     1
## # ... with 143 more rows

filter()

filter() berfungsi memilih sebagian data berdasarkan nilai tertentu

Memilih data berdasarkan bulan tertentu

airquality %>% filter(Month=="7")
## # A tibble: 31 x 6
##    Ozone Solar.R  Wind  Temp Month   Day
##    <int>   <int> <dbl> <int> <int> <int>
##  1   135     269   4.1    84     7     1
##  2    49     248   9.2    85     7     2
##  3    32     236   9.2    81     7     3
##  4    NA     101  10.9    84     7     4
##  5    64     175   4.6    83     7     5
##  6    40     314  10.9    83     7     6
##  7    77     276   5.1    88     7     7
##  8    97     267   6.3    92     7     8
##  9    97     272   5.7    92     7     9
## 10    85     175   7.4    89     7    10
## # ... with 21 more rows

Memilih data berdasarkan nilai Ozone yang kosong

airquality %>% filter(is.na(Ozone))
## # A tibble: 37 x 6
##    Ozone Solar.R  Wind  Temp Month   Day
##    <int>   <int> <dbl> <int> <int> <int>
##  1    NA      NA  14.3    56     5     5
##  2    NA     194   8.6    69     5    10
##  3    NA      66  16.6    57     5    25
##  4    NA     266  14.9    58     5    26
##  5    NA      NA   8      57     5    27
##  6    NA     286   8.6    78     6     1
##  7    NA     287   9.7    74     6     2
##  8    NA     242  16.1    67     6     3
##  9    NA     186   9.2    84     6     4
## 10    NA     220   8.6    85     6     5
## # ... with 27 more rows

select()

select() berfungsi untuk memilih subset data berdasarkan peubah tertentu

Memilih subset data berdasarkan peubah yang ingin dipilih ataupun yang tidak ingin dipilih (dengan tambahan “-”)

airquality %>% select(Month,Day,Ozone,Temp)
## # A tibble: 153 x 4
##    Month   Day Ozone  Temp
##    <int> <int> <int> <int>
##  1     5     1    41    67
##  2     5     2    36    72
##  3     5     3    12    74
##  4     5     4    18    62
##  5     5     5    NA    56
##  6     5     6    28    66
##  7     5     7    23    65
##  8     5     8    19    59
##  9     5     9     8    61
## 10     5    10    NA    69
## # ... with 143 more rows
airquality %>% select(-Ozone,-Solar.R)
## # A tibble: 153 x 4
##     Wind  Temp Month   Day
##    <dbl> <int> <int> <int>
##  1   7.4    67     5     1
##  2   8      72     5     2
##  3  12.6    74     5     3
##  4  11.5    62     5     4
##  5  14.3    56     5     5
##  6  14.9    66     5     6
##  7   8.6    65     5     7
##  8  13.8    59     5     8
##  9  20.1    61     5     9
## 10   8.6    69     5    10
## # ... with 143 more rows

mutate()

mutate() berfungsi untuk menambahkan peubah baru pada data

Menambahkan peubah baru week dengan anggapan hari pertama tiap bulan adalah minggu ke-1 dan seterusnya

airquality %>% mutate(Week=floor((Day+7)/7))
## # A tibble: 153 x 7
##    Ozone Solar.R  Wind  Temp Month   Day  Week
##    <int>   <int> <dbl> <int> <int> <int> <dbl>
##  1    41     190   7.4    67     5     1     1
##  2    36     118   8      72     5     2     1
##  3    12     149  12.6    74     5     3     1
##  4    18     313  11.5    62     5     4     1
##  5    NA      NA  14.3    56     5     5     1
##  6    28      NA  14.9    66     5     6     1
##  7    23     299   8.6    65     5     7     2
##  8    19      99  13.8    59     5     8     2
##  9     8      19  20.1    61     5     9     2
## 10    NA     194   8.6    69     5    10     2
## # ... with 143 more rows

4. Penggabungan fungsi

Apakah kita bisa menjalankan fungsi-fungsi di atas secara bersama-sama? jawabannya bisa dengan menggunakan pipes operator %>%. Contoh di bawah adalah penggunaan fungsi select(), mutate(), dan arrange() serta membuat data baru yaitu udarabaru.

airquality %>% select(Ozone,Temp,Month,Day) %>%
  mutate(Week=floor((Day+7)/7)) %>%
  arrange(desc(Month))
## # A tibble: 153 x 5
##    Ozone  Temp Month   Day  Week
##    <int> <int> <int> <int> <dbl>
##  1    96    91     9     1     1
##  2    78    92     9     2     1
##  3    73    93     9     3     1
##  4    91    93     9     4     1
##  5    47    87     9     5     1
##  6    32    84     9     6     1
##  7    20    80     9     7     2
##  8    23    78     9     8     2
##  9    21    75     9     9     2
## 10    24    73     9    10     2
## # ... with 143 more rows
udarabaru <- airquality %>% select(Ozone,Temp,Month,Day) %>%
  mutate(Week=floor((Day+7)/7)) %>%
  arrange(desc(Month))
udarabaru
## # A tibble: 153 x 5
##    Ozone  Temp Month   Day  Week
##    <int> <int> <int> <int> <dbl>
##  1    96    91     9     1     1
##  2    78    92     9     2     1
##  3    73    93     9     3     1
##  4    91    93     9     4     1
##  5    47    87     9     5     1
##  6    32    84     9     6     1
##  7    20    80     9     7     2
##  8    23    78     9     8     2
##  9    21    75     9     9     2
## 10    24    73     9    10     2
## # ... with 143 more rows

Semoga bermanfaat terimakasih