Tugas Akhir Praktikum STA261

A. Akses Database (chinook) menggunakan Engine SQL dan DPLYR

memanggil package tidyverse, RSQLite, dan DBI agar dapat melakukan pemanggilan database

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.1.2
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.5     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.1.0     v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.1.2
## Warning: package 'stringr' was built under R version 4.1.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(RSQLite)
## Warning: package 'RSQLite' was built under R version 4.1.2
library(DBI)
## Warning: package 'DBI' was built under R version 4.1.2

Engine SQL

Untuk melakukan eksekusi syntax SQL dan menampilkan hasilnya perlu dibuat suatu objek connection terlebih dahulu yaitu dengan:

chinook<-dbConnect(SQLite(), "C:/sqlite/db/chinook.db")

Kemudian dapat kita periksa Class dari objek chinook ini

class(chinook)
## [1] "SQLiteConnection"
## attr(,"package")
## [1] "RSQLite"

Lalu untuk menampilkan syntax SQL di rmarkdown dapat dilakukan dengan {r, connection=chinook, engine="sql"} pada bagian atas chunk yang digunakan, selanjutnya dapat dimasukkan syntax SQL yang diinginkan

SELECT 
EmployeeId, FirstName, Fax, Email
FROM 
employees
ORDER BY FirstName
8 records
EmployeeId FirstName Fax Email
1 Andrew +1 (780) 428-3457
3 Jane +1 (403) 262-6712
8 Laura +1 (403) 467-8772
4 Margaret +1 (403) 263-4289
6 Michael +1 (403) 246-9899
2 Nancy +1 (403) 262-3322
7 Robert +1 (403) 456-8485
5 Steve 1 (780) 836-9543

Maka yang akan muncul adalah daftar Fax dan Email setiap employee, beserta EmpoyeeID, yang diurutkan berdasarkan FirstName.

Menggunakan DPLYR

sama seperti Engine SQL perlu dibuat objek connection terlebih dahulu

chinook<-dbConnect(SQLite(), "C:/sqlite/db/chinook.db")

Selanjutnya dapat diperiksa tables yang terdapat di dalam database yaitu dengan:

dbListTables(chinook)
##  [1] "albums"          "artists"         "customers"       "employees"      
##  [5] "genres"          "invoice_items"   "invoices"        "media_types"    
##  [9] "playlist_track"  "playlists"       "sqlite_sequence" "sqlite_stat1"   
## [13] "tracks"

Untuk mengakses tabel, dapat dilakukan dengan memasukkan tabel yang diinginkan dalam database sebagai objek

tracks<-tbl(chinook, "tracks")

dan dapat dilihat juga Class dari objek tersebut

class(tracks)
## [1] "tbl_SQLiteConnection" "tbl_dbi"              "tbl_sql"             
## [4] "tbl_lazy"             "tbl"

Berikut adalah isi dari objek tracks

tracks
## # Source:   table<tracks> [?? x 9]
## # Database: sqlite 3.37.0 [C:\sqlite\db\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>

Seandainya ingin diketahui track tersingkat dalam setiap album yang harganya 0.99, dan diurutkan secara ascending berdasarkan AlbumId. Untuk memperoleh informasi tersebut dapat dilakukan dengan:

t<- tracks %>%
    filter(UnitPrice==0.99) %>% 
    group_by(AlbumId) %>% 
    summarize(milliseconds=min(Milliseconds)) %>%
    arrange(AlbumId)
t
## Warning: Missing values are always removed in SQL.
## Use `MIN(x, na.rm = TRUE)` to silence this warning
## This warning is displayed only once per session.
## # Source:     lazy query [?? x 2]
## # Database:   sqlite 3.37.0 [C:\sqlite\db\chinook.db]
## # Ordered by: AlbumId
##    AlbumId milliseconds
##      <int>        <int>
##  1       1       199836
##  2       2       342562
##  3       3       230619
##  4       4       215196
##  5       5       215875
##  6       6       176117
##  7       7       152084
##  8       8       126511
##  9       9       221701
## 10      10       206053
## # ... with more rows

Syntax R tersebut juga dapat diterjemahkan menjadi Engile SQL dengan:

show_query(t)
## <SQL>
## SELECT `AlbumId`, MIN(`Milliseconds`) AS `milliseconds`
## FROM `tracks`
## WHERE (`UnitPrice` = 0.99)
## GROUP BY `AlbumId`
## ORDER BY `AlbumId`

B. Data Wrangling

Untuk melakukan data wrangling maka perlu dipanggil package tidyverse terlebih dahulu

library(tidyverse)

Untuk menggunakan datasets yang tersedia di package datasets maka perlu dipanggil juga packagenya

library(datasets)

Misalkan akan digunakan datasets Theoph maka perlu dibuat objeknya, selanjutnya dapat diubah class objek tersebut menjadi tibble

data("Theoph")
theoph<-as_tibble(Theoph)
class(theoph)
## [1] "tbl_df"     "tbl"        "data.frame"

dengan penggunaan tibble, maka ketika data ditampilkan hanya akan menampilkan 10 baris data pertama dari keseluruhan data, seperti contoh objek theoph ketika ingin ditampilkan isi objeknya maka akan menampilkan seperti ini:

theoph
## # A tibble: 132 x 5
##    Subject    Wt  Dose  Time  conc
##    <ord>   <dbl> <dbl> <dbl> <dbl>
##  1 1        79.6  4.02  0     0.74
##  2 1        79.6  4.02  0.25  2.84
##  3 1        79.6  4.02  0.57  6.57
##  4 1        79.6  4.02  1.12 10.5 
##  5 1        79.6  4.02  2.02  9.66
##  6 1        79.6  4.02  3.82  8.58
##  7 1        79.6  4.02  5.1   8.36
##  8 1        79.6  4.02  7.03  7.47
##  9 1        79.6  4.02  9.05  6.89
## 10 1        79.6  4.02 12.1   5.94
## # ... with 122 more rows

Selanjutnya dapat dilakukan berbagai manipulasi data seperti summarize, arrange, filter, select, dan mutate

  • Rata-rata conc setiap subject
theoph%>%group_by(Subject)%>%summarise(mean=mean(conc))
## # A tibble: 12 x 2
##    Subject  mean
##    <ord>   <dbl>
##  1 6        3.53
##  2 7        3.91
##  3 8        4.27
##  4 11       4.51
##  5 3        5.09
##  6 2        4.82
##  7 4        4.94
##  8 9        4.89
##  9 12       5.41
## 10 10       5.93
## 11 1        6.44
## 12 5        5.78
  • Mengurutkan data berdasarkan berat objek (Wt) dari yang terkecil
theoph%>%arrange(Wt)
## # A tibble: 132 x 5
##    Subject    Wt  Dose  Time  conc
##    <ord>   <dbl> <dbl> <dbl> <dbl>
##  1 5        54.6  5.86  0     0   
##  2 5        54.6  5.86  0.3   2.02
##  3 5        54.6  5.86  0.52  5.63
##  4 5        54.6  5.86  1    11.4 
##  5 5        54.6  5.86  2.02  9.33
##  6 5        54.6  5.86  3.5   8.74
##  7 5        54.6  5.86  5.02  7.56
##  8 5        54.6  5.86  7.02  7.09
##  9 5        54.6  5.86  9.1   5.9 
## 10 5        54.6  5.86 12     4.37
## # ... with 122 more rows
  • Memilih data yang Dose> 5.00
theoph%>%filter(Dose>5.00)
## # A tibble: 33 x 5
##    Subject    Wt  Dose  Time  conc
##    <ord>   <dbl> <dbl> <dbl> <dbl>
##  1 5        54.6  5.86  0     0   
##  2 5        54.6  5.86  0.3   2.02
##  3 5        54.6  5.86  0.52  5.63
##  4 5        54.6  5.86  1    11.4 
##  5 5        54.6  5.86  2.02  9.33
##  6 5        54.6  5.86  3.5   8.74
##  7 5        54.6  5.86  5.02  7.56
##  8 5        54.6  5.86  7.02  7.09
##  9 5        54.6  5.86  9.1   5.9 
## 10 5        54.6  5.86 12     4.37
## # ... with 23 more rows
  • Membuat subset data yang berisi Subject, Time, dan conc
theoph%>%select(Subject,Time,conc)
## # A tibble: 132 x 3
##    Subject  Time  conc
##    <ord>   <dbl> <dbl>
##  1 1        0     0.74
##  2 1        0.25  2.84
##  3 1        0.57  6.57
##  4 1        1.12 10.5 
##  5 1        2.02  9.66
##  6 1        3.82  8.58
##  7 1        5.1   8.36
##  8 1        7.03  7.47
##  9 1        9.05  6.89
## 10 1       12.1   5.94
## # ... with 122 more rows
  • Menambahkan peubah rate yaitu laju reaksi dari theophylline (rate = conc/Time)
theoph%>%mutate(rate=conc/Time)
## # A tibble: 132 x 6
##    Subject    Wt  Dose  Time  conc    rate
##    <ord>   <dbl> <dbl> <dbl> <dbl>   <dbl>
##  1 1        79.6  4.02  0     0.74 Inf    
##  2 1        79.6  4.02  0.25  2.84  11.4  
##  3 1        79.6  4.02  0.57  6.57  11.5  
##  4 1        79.6  4.02  1.12 10.5    9.37 
##  5 1        79.6  4.02  2.02  9.66   4.78 
##  6 1        79.6  4.02  3.82  8.58   2.25 
##  7 1        79.6  4.02  5.1   8.36   1.64 
##  8 1        79.6  4.02  7.03  7.47   1.06 
##  9 1        79.6  4.02  9.05  6.89   0.761
## 10 1        79.6  4.02 12.1   5.94   0.490
## # ... with 122 more rows
  • Menampilkan data yang berisi Subject, Time, dan rate, dimana data yang ditampilkan adalah data yang Dose>5.00, dan diurutkan berdasarkan Dose
theophdata<-theoph%>%
            filter(Dose>5.00)%>%
            mutate(rate=conc/Time)%>%
            arrange(desc(Dose))%>%
            select(Subject, Dose, rate)
theophdata
## # A tibble: 33 x 3
##    Subject  Dose    rate
##    <ord>   <dbl>   <dbl>
##  1 5        5.86 NaN    
##  2 5        5.86   6.73 
##  3 5        5.86  10.8  
##  4 5        5.86  11.4  
##  5 5        5.86   4.62 
##  6 5        5.86   2.50 
##  7 5        5.86   1.51 
##  8 5        5.86   1.01 
##  9 5        5.86   0.648
## 10 5        5.86   0.364
## # ... with 23 more rows