Salah satu kemampuan yang paling dasar untuk seorang Data Scienctist adalah Persiapan Data (Manipulasi Data). Agar menjadi efektif, Anda perlu paham betul dalam melakukan manipulasi data. Ini dikarenakan sebagian besar pekerjaan Anda hanya akan menyangkut mengumpulkan dan membersihkan data.

Data Scientist meluangkan 60% waktu mereka untuk membersihkan dan mengorganisir data. Mengumpulkan data set berada di posisi ke-2 dengan besar 19%, yang berarti Data Scientist meluangkan sekitar 80% waktu mereka untuk menyiapkan dan memanajemen data untuk dianalisis.

Di bagian ini, Anda akan belajar bagaimana cara melakukan persiapan data dengan mudah menggunakan R. Kita akan memberikan beberapa kata kunci dasar manipulasi data yang akan Anda sering pakai di pekerjaan Anda.

  • read_csv() Mengimport data (Anda bisa menggunakan yang lain)
  • str() Struktur Data
  • apply() Untuk mengecek dan mengganti data yang hilang
  • select() Memilih kolom mana yang akan dimasukan
  • filter() Memilih subset dari data yang ditentukan
  • arrange() Menyusun data, dari ukuran variabel kontinu, dari tanggal, atau secara alfabet
  • rename() Mengganti nama kolom
  • mutate() Menambahkan kolom baru pada data, atau mengganti kolom yang sudah ada
  • bind_rows() Menggabungkan dua data frame menjadi satu dan mengkombinasikan data dari kolom sekaligus
  • group_by Mengelompokan data dengan berbagai kategori variabel
  • summarize() Meringkas atau mengumpulkan (untuk masing-masing kelompok menggunakan group_by). Biasa digunakan di konjungsi dengan beberapa fungsi termasuk:
    • mean() Menghitung rata-rata
    • median() Menghitung nilai tengah
    • max() Mencari nilai tertinggi
    • min() Mencari nilai terendah
    • sum() Menjumlahkan semua nilai bersamaan
    • n() Menghitung angka pada catatan

Saya merekomendasikan anda untuk menginstall packages tidyverse. Karena inti dari tidyverse termasuk packages yang akan Anda sering gunakan untuk analisis data setiap harinya.

install.packages("tidyverse")

Kita biasanya bekerja menggunakan 2 packages sangat berguna yang diciptakan oleh Hadley Wickham, ketua peneliti di RStudio:

  • readr Untuk membaca dan menulis CSV dan jenis text lain.
  • dplyr Untuk memproses dan memanipulasi data.

1 Mengimpor Data

Data yang akan kita gunakan pada bagian ini adalah pfizer.csv dan fda.csv. Mohon download dan letakan pada desktop Anda. Sebagai opsional, Anda dapat meng-load data ke R Session yang sedang digunakan dengan memilih Import Dataset>From Text File... di tab “Environment”. Tapi dalam kasus ini, kita akan menggunakan fungsi read_csv dari packages readr. Salin perintah dibawah pada coding anda dan jalankan:

suppressPackageStartupMessages(library(tidyverse))# Meng-load packages tidyverse tidyverse secara diam-diam
#setwd("C:/Users/H/Desktop/Week_10")              # Selalu ingat untuk mengatur working directory
pfizer <- read_csv("pfizer.csv")                  # Meng-load data `pfizer` 
## 
## -- Column specification --------------------------------------------------------
## cols(
##   org_indiv = col_character(),
##   first_plus = col_character(),
##   first_name = col_character(),
##   last_name = col_character(),
##   city = col_character(),
##   state = col_character(),
##   category = col_character(),
##   cash = col_double(),
##   other = col_double(),
##   total = col_double()
## )
fda <- read_csv("fda.csv")                        # Meng-load data`fda`
## 
## -- Column specification --------------------------------------------------------
## cols(
##   name_last = col_character(),
##   name_first = col_character(),
##   name_middle = col_character(),
##   issued = col_date(format = ""),
##   office = col_character()
## )

2 Sktruktur Data

Sadar bahwa Anda akan membutuhkan pengertian yang kuat dari jenis dasar data dan struktur data serta bagaimana cara mengoperasikan mereka. Fungsi str() akan memberi tau Anda tentang kolom di dalam data, termasuk jenis data mereka. Salin perintah ini pada coding anda dan jalankan:

str(pfizer)                                       # Memperlihatkan struktur dari data `pfizer`
## tibble [10,087 x 10] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ org_indiv : chr [1:10087] "3-D MEDICAL SERVICES LLC" "AA DOCTORS, INC." "ABBO, LILIAN MARGARITA" "ABBO, LILIAN MARGARITA" ...
##  $ first_plus: chr [1:10087] "STEVEN BRUCE" "AAKASH MOHAN" "LILIAN MARGARITA" "LILIAN MARGARITA" ...
##  $ first_name: chr [1:10087] "STEVEN" "AAKASH" "LILIAN" "LILIAN" ...
##  $ last_name : chr [1:10087] "DEITELZWEIG" "AHUJA" "ABBO" "ABBO" ...
##  $ city      : chr [1:10087] "NEW ORLEANS" "PASO ROBLES" "MIAMI" "MIAMI" ...
##  $ state     : chr [1:10087] "LA" "CA" "FL" "FL" ...
##  $ category  : chr [1:10087] "Professional Advising" "Expert-Led Forums" "Business Related Travel" "Meals" ...
##  $ cash      : num [1:10087] 2625 1000 0 0 1800 ...
##  $ other     : num [1:10087] 0 0 448 119 0 0 47 0 0 396 ...
##  $ total     : num [1:10087] 2625 1000 448 119 1800 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   org_indiv = col_character(),
##   ..   first_plus = col_character(),
##   ..   first_name = col_character(),
##   ..   last_name = col_character(),
##   ..   city = col_character(),
##   ..   state = col_character(),
##   ..   category = col_character(),
##   ..   cash = col_double(),
##   ..   other = col_double(),
##   ..   total = col_double()
##   .. )
str(fda)                                          # Memperlihatkan struktur dari data `fda`
## tibble [272 x 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ name_last  : chr [1:272] "ADELGLASS" "ADKINSON" "ALLEN" "AMSTERDAM" ...
##  $ name_first : chr [1:272] "JEFFREY" "N." "MARK" "DANIEL" ...
##  $ name_middle: chr [1:272] "M." "FRANKLIN" "S." NA ...
##  $ issued     : Date[1:272], format: "1999-05-25" "2000-04-19" ...
##  $ office     : chr [1:272] "Center for Drug Evaluation and Research" "Center for Biologics Evaluation and Research" "Center for Devices and Radiological Health" "Center for Biologics Evaluation and Research" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   name_last = col_character(),
##   ..   name_first = col_character(),
##   ..   name_middle = col_character(),
##   ..   issued = col_date(format = ""),
##   ..   office = col_character()
##   .. )

Ini sangatlah penting untuk dipahami karena ini adalah objek-objek yang akan Anda manipulasi setiap harinya di R. Jika Anda perlu merubah tipe data untuk kolom manapun, gunakan fungsi berikut:

  • as.character() Mengubah ke karakter converts to a text string.
  • as.numeric() Mengubah ke angkaconverts to a number.
  • as.factor() Mengubah ke kategori-kategori variabel converts to a categorical variable.
  • as.integer() Mengubah ke bilangan bulat converts to an integer
  • as.Date() Mengubah ke tanggal converts to a date
  • as.POSIXct() Mengubah ke tanggal lengkap dan waktu

Sebagai contoh, masukan kode berikut ke coding Anda untuk mengubah total yang telah terubah di data pfizer menjadi variabel numerik (yang akan mengizinkannya untuk menjadi nilai desimal jika kita mempunyainya).

pfizer$total <- as.numeric(pfizer$total)          # Mengubah total menjadi variabel numerik
str(pfizer$total)                                 # Mari kita periksa struktur datanya ulang
##  num [1:10087] 2625 1000 448 119 1800 ...

3 Nilai yang Hilang

Tidak seperti programming biasa, ketika bekerja dengan data nyata, Anda mungkin memiliki Nilai yang hilang: Peungukuran yang tidak terekam/tersimpan/dll. R memiliki mekanisme untuk mengatasi nilai yang hilang. Ini dibedakan diantara jenis berikut:

  • NA : Data yang ditak dimasukan (nilai NA memiliki kelas juga, jadi terdapat bilangan bulat NA, karakter NA, dll)
  • NaN : Bukanlah suatu bilangan (sebuah nilai NaN juga merupakan NA namun hasilnya tidak benar)

Mencari nilai yang hilang pada kolom data frame pfizer

is.na(pfizer)                                     # Cara klasik untuk mencari nilai NA
sum(is.na(pfizer))                                # Menghitung jumlah NA
apply(is.na(pfizer),2, which)                     # Indeks dari NA (hanya untuk data frame)
which(complete.cases(pfizer))                     # mengidentifikasi nilai lengkap yang telah diobservasi

Mekanisme yang lebih umum adalah mehapusnya secara manual

clean.vector<- na.omit(pfizer$first_name)         # membersihkan/menyingkirkan vektor NA
clean.df <- na.omit(pfizer)                       # membersihkan/menyingkirkan data frame NA
apply(is.na(clean.df),2, which)                   # memastukan jika didalamnya ada nilai yang hilang
## integer(0)

4 Mengubah Nilai yang Hilang

Kita juga dapat mengubah nilai yang hilang dengan rata-ratanya(medianya). Latihan yang baik adalah membuat dua variabel terpisah untuk rata-ratanya. Saat dibuat, kita dapat mengubah nilai yang hilang dengan variabel terbentuk yang baru. Mari upload datanya dan memverifikasi data yang hilang.

PATH    <- "https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Missing_Values.csv"
titanic <- read.csv(PATH, sep = ",")
list_na <- colnames(titanic)[ apply(titanic, 2, anyNA) ]
list_na
## [1] "Age"  "Fare"

Dalam kasus ini, kita tidak menghapus semua nilai yang hilang, melainkan kita menggunakan metode apply() untuk menghitung rata-rata dari kolom dengan NA. Pertama, kita perlu menghitung rata-rata dengan argumen na.rm = TRUE. Argumen ini wajib karena kolom memiliki data yang hilang, dan memberi tau R untuk mengabaikannya.

average_missing <- apply(titanic[,colnames(titanic) %in% list_na],
                         2,
                         mean,
                         na.rm =  TRUE)
average_missing
##      Age     Fare 
## 30.27259 35.62719

Penjelasan Perintah: Kita melewati 4 argumen di metode apply

  • df titanic[,colnames(titanic) %in% list_na]. Perintah ini akan mengembalikan nama kolom dari objek list_na (yaitu “age” dan “fare”)
  • 2 Mengitung fungsi pada kolom
  • mean Menghitung rata-ratanya
  • na.rm = TRUE Mengabaikan nilai yang hilang

Kemudian kita dapat mengubah nilai NA. Kata kunci ‘mutate’ dari dplyr sangat berguna dalam membuat variabel baru. Kita belum tentuingin mengubah kolom aslinya jadi kita dapat membuat variabel baru tanpa NA. mutate’ sangat mudah digunakan, kita cukup memilih nama variabel dan menjelaskan bagaimana cara membuat variabel ini. Ini adalah perintah lengkapnya

titanic_replace <- titanic %>%
mutate(age  = ifelse(is.na(Age), average_missing[1], Age),
fare = ifelse(is.na(Fare), average_missing[2], Fare))
sum(is.na(titanic_replace$Age))
## [1] 86
sum(is.na(titanic_replace$Fare))
## [1] 1
sum(is.na(titanic_replace$age))
## [1] 0
sum(is.na(titanic_replace$fare))
## [1] 0

5 Memilih Data

Di bagian ini Anda akan belajar bagaimana cara untuk memilih atau men-subset kolom data frame berdasarkan nama dan posisi menggunakan fungsi select() pada R dalam packages dplyr. Anda akan belajar bagaimana cara menggunakan fungsi berikut:

  • pull() Mengekstrak nilai suatu kolom menjadi vektor. Kolom yang dipilih dapat ditentukan berdasarkan nama maupun indeks
  • select() Mengekstrak satu atau lebih kolom sebagai data tabel. Ini juga dapat digunakan untuk menghapus kolom pada data frame
  • select_if() Memilih kolom berdasarkan suatu kondisi tertentu. Salah satu kegunaan dari fungsi ini, contohnya, memilih kolom jika datanya numerik
  • Helper Function starts_with() , ends_with() , contains() , matches() : Memilih kolom atau variabel berdasarkan nama mereka
library(tidyverse)                                # Men-load `tidyverse`, dimana termasuk ddalam `dplyr`
pfizer %>% pull(state) %>% head()                 # Mengekstrak nilai kolom dari `state` menjadi sebuah vektor
pfizer %>% select(1:3)                            # Memilih kolom 1 sampai 3
pfizer %>% select(1,3)                            # Memilih kolom 1 dan 3, tetapi 2 tidak
pfizer %>% select(state:total)                    # Memilih semua kolom dari `state` sampai `total`
pfizer %>% select(state,total)                    # Memilih kolom berdasarkan nama variabel
pfizer %>% select_if(is.numeric)                  # Memilih kolom yang hanya numerik
pfizer %>% select_if(is.character)                # Memilih kolom yang hanya karakter
pfizer %>% select(starts_with("first"))           # Memilih kolom yang diawali dengan `first`
pfizer %>% select(ends_with("name"))              # Memilih kolom yang diakhiri dengan `name`
pfizer %>% select(contains("rst"))                # Memilih kolom yang dertapat nama `rst`
pfizer %>% select(matches("_"))                   # Memilih kolom yang namanya sama dengan reguler
pfizer %>% select(-(state:total))                 # Menghapus seluruh kolom dari `state` sampai `total`
pfizer %>% select(-state, -total)                 # Menghapus kolom `state` dan `total`

6 Menyaring dan Mengurutkan Data

Sekarang kita akan meng-filter() dan meng-arrange() data secara spesifik. Untuk setiap contoh berikut. Salin perintah yang berhubungan dengan coding Anda, dan lihat hasilnya. Lihatlah bagaimana kita membuat objek baru untuk memproses data.

6.1 Contoh 1

Carilah dokter di California dengan bayaran $10.000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!

ca_expert_10000 <- pfizer %>%                     # Meng-load semua `pfizer`    
  filter(state == "CA" &                          # Meng-load semua `pfizer` di filter berdasarkan `state`
         total >= 10000 &                         # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
         category == "Professional Advising")     # Kemudian memfilter bersadarkan `category`
ca_expert_10000                                   # Menunjukan Hasilnya
## # A tibble: 35 x 10
##    org_indiv first_plus first_name last_name city  state category  cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>    <dbl> <dbl>
##  1 CUMMINGS~ JEFFREY L~ JEFFREY    CUMMINGS  LOS ~ CA    Profess~ 13500     0
##  2 FONAROW,~ GREGG CUR~ GREGG      FONAROW   LOS ~ CA    Profess~ 15750     0
##  3 GANZ, PE~ PETER      PETER      GANZ      SAN ~ CA    Profess~ 22000     0
##  4 GT AND A~ GEORGE     GEORGE     TRIADAFI~ SAN ~ CA    Profess~ 33705     0
##  5 HANAHAN,~ DOUGLAS    DOUGLAS    HANAHAN   SAN ~ CA    Profess~ 37500     0
##  6 HERBERT ~ HERBERT    HERBERT    CRUZ      FRES~ CA    Profess~ 13250     0
##  7 HU, RONA~ RONA JANE  RONA       HU        PALO~ CA    Profess~ 22500     0
##  8 KAPLOWIT~ NEIL       NEIL       KAPLOWITZ LOS ~ CA    Profess~ 12000     0
##  9 KIZER, K~ KENNETH W~ KENNETH    KIZER     ALIS~ CA    Profess~ 10000     0
## 10 KOO, EDW~ EDWARD HA~ EDWARD     MANG      LA J~ CA    Profess~ 12500     0
## # ... with 25 more rows, and 1 more variable: total <dbl>

6.2 Contoh 2

Sekarang tambahkan pengurutan di akhir perintah ke daftar dokter dalam urutan menurun berdasarkan bayaran yang diterima!

ca_expert_10000 <- pfizer %>%                     # Meng-load semua `pfizer    
  filter(state == "CA" &                          # Memfilter berdasarkan `state` di California
         total >= 10000 &                         # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
         category == "Professional Advising")%>%  # Kemudian memfilter bersadarkan `category`
  arrange(desc(total))                            # Urutan menurun berdasarkan bayaran yang diterima
ca_expert_10000                                   # Menunjukan Hasilnya
## # A tibble: 35 x 10
##    org_indiv first_plus first_name last_name city  state category  cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>    <dbl> <dbl>
##  1 MALENKA,~ ROBERT CH~ ROBERT     MALENKA   STAN~ CA    Profess~ 75566     0
##  2 REGENTS ~ DAVID RAY~ DAVID      GANDARA   IRVI~ CA    Profess~ 38500     0
##  3 PTACEK, ~ LOUIS JOHN LOUIS      PTACEK    SAN ~ CA    Profess~ 37588     0
##  4 HANAHAN,~ DOUGLAS    DOUGLAS    HANAHAN   SAN ~ CA    Profess~ 37500     0
##  5 REGENTS ~ JOHN POWER JOHN       KANE      IRVI~ CA    Profess~ 37500     0
##  6 RISCH, S~ SAMUEL CR~ SAMUEL     RISCH     SAN ~ CA    Profess~ 36000     0
##  7 GT AND A~ GEORGE     GEORGE     TRIADAFI~ SAN ~ CA    Profess~ 33705     0
##  8 SANDROCK~ CHRISTIAN~ CHRISTIAN  SANDROCK  SACR~ CA    Profess~ 33000     0
##  9 MATTHEW ~ MATTHEW J~ MATTHEW    BUDOFF    MANH~ CA    Profess~ 31500     0
## 10 OLEFSKY,~ JERROLD M~ JERROLD    OLEFSKY   SOLA~ CA    Profess~ 27746     0
## # ... with 25 more rows, and 1 more variable: total <dbl>
# arrange((total))                                # ascending was assigned as R default

6.3 Contoh 3

Carilah dokter di California/New York dengan bayaran $10.000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!

Perhatikan bahwa, dalam kasus ini kita menggunakan | dari Boolean operator, dan tanda kurung disekitar bagian query. Ini memastikan bahwa bagian query ini berjalan terlebih dahulu. Lihat apa yang terjadi jika Anda mengecualikan mereka.

ca_ny_expert_10000 <- pfizer %>%                  # Meng-load semua `pfizer`    
  filter((state == "CA" | state == "NY")  &       # Memfilter berdasarkan `state` di California atau New York
         total >= 10000 &                         # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
         category == "Professional Advising")%>%  # Kemudian memfilter bersadarkan `category`
  arrange(desc(total))                            # Urutan menurun berdasarkan bayaran yang diterima
ca_ny_expert_10000                                # Menunjukan Hasilnya
## # A tibble: 46 x 10
##    org_indiv first_plus first_name last_name city  state category   cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>     <dbl> <dbl>
##  1 SAWYERS,~ CHARLES L~ CHARLES    SAWYERS   NEW ~ NY    Profess~ 100000     0
##  2 MALENKA,~ ROBERT CH~ ROBERT     MALENKA   STAN~ CA    Profess~  75566     0
##  3 REGENTS ~ DAVID RAY~ DAVID      GANDARA   IRVI~ CA    Profess~  38500     0
##  4 PTACEK, ~ LOUIS JOHN LOUIS      PTACEK    SAN ~ CA    Profess~  37588     0
##  5 HANAHAN,~ DOUGLAS    DOUGLAS    HANAHAN   SAN ~ CA    Profess~  37500     0
##  6 JAVITT, ~ DANIEL CO~ DANIEL     JAVITT    ORAN~ NY    Profess~  37500     0
##  7 REGENTS ~ JOHN POWER JOHN       KANE      IRVI~ CA    Profess~  37500     0
##  8 RISCH, S~ SAMUEL CR~ SAMUEL     RISCH     SAN ~ CA    Profess~  36000     0
##  9 GT AND A~ GEORGE     GEORGE     TRIADAFI~ SAN ~ CA    Profess~  33705     0
## 10 SANDROCK~ CHRISTIAN~ CHRISTIAN  SANDROCK  SACR~ CA    Profess~  33000     0
## # ... with 36 more rows, and 1 more variable: total <dbl>

6.4 Contoh 4

Carilah dokter selain di California dengan bayaran $10.000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!

not_ca_expert_10000 <- pfizer %>%                 # Meng-load semua `pfizer`    
  filter(state != "CA" &                          # Memfilter berdasarkan `state` selain di California
         total >= 10000 &                         # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
         category == "Professional Advising")%>%  # Kemudian memfilter bersadarkan `category`
  arrange(desc(total))                            # Urutan menurun berdasarkan bayaran yang diterima
not_ca_expert_10000                               # Menunjukan Hasilnya
## # A tibble: 135 x 10
##    org_indiv first_plus first_name last_name city  state category   cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>     <dbl> <dbl>
##  1 BAILES, ~ JOSEPH SW~ JOSEPH     BAILES    AUST~ TX    Profess~ 105000     0
##  2 SAWYERS,~ CHARLES L~ CHARLES    SAWYERS   NEW ~ NY    Profess~ 100000     0
##  3 MARDER, ~ HAROLD KAY HAROLD     MARDER    PHIL~ PA    Profess~  87610     0
##  4 WILLIAMS~ GRANT      GRANT      WILLIAMS  WAYNE PA    Profess~  85621     0
##  5 THE SCHE~ PHILIP SA~ PHILIP     SCHEIN    BRYN~ PA    Profess~  75609     0
##  6 GORDON, ~ JEFFREY I~ JEFFREY    GORDON    SAIN~ MO    Profess~  75108     0
##  7 KOLLEF, ~ MARIN HRI~ MARIN      KOLLEF    SAIN~ MO    Profess~  72750     0
##  8 JOSEPH, ~ WARREN S   WARREN     JOSEPH    HUNT~ PA    Profess~  71875     0
##  9 SHORR, A~ ANDREW FR~ ANDREW     SHORR     WASH~ DC    Profess~  62000     0
## 10 MAYO FOU~ PETER JAM~ PETER      DYCK      ROCH~ MN    Profess~  61175     0
## # ... with 125 more rows, and 1 more variable: total <dbl>

6.5 Contoh 5

Carilah 20 dokter di 4 negara bagian terbesar (CA, TX, FL, NY) dengan bayaran harga tertinggi untul “Expert-Led Forums”!

ca_ny_tx_fl_prof_top20 <- pfizer %>%
  filter((state == "CA" | 
          state == "NY" |
          state == "TX" | 
          state == "FL") &
          category == "Expert-Led Forums") %>%
  arrange(desc(total)) %>%
  head(20)
ca_ny_tx_fl_prof_top20
## # A tibble: 20 x 10
##    org_indiv first_plus first_name last_name city  state category   cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>     <dbl> <dbl>
##  1 SACKS, G~ GERALD MI~ GERALD     SACKS     SANT~ CA    Expert-~ 146500     0
##  2 NIDES, M~ MITCHELL   MITCHELL   NIDES     LOS ~ CA    Expert-~  70500     0
##  3 ROBERT B~ ROBERT BU~ ROBERT     NETT      SAN ~ TX    Expert-~  60750     0
##  4 SOLERA C~ STEVEN AB~ STEVEN     KAPLAN    CHAP~ NY    Expert-~  56500     0
##  5 GRIFFIN,~ JAMES DALE JAMES      GRIFFIN   DALL~ TX    Expert-~  54250     0
##  6 STUBBLEF~ MICHAEL D  MICHAEL    STUBBLEF~ NEW ~ NY    Expert-~  50500     0
##  7 POTKIN, ~ STEVEN GA~ STEVEN     POTKIN    ORAN~ CA    Expert-~  48350     0
##  8 GINSBERG~ DAVID ALAN DAVID      GINSBERG  LOS ~ CA    Expert-~  45750     0
##  9 LOUIE, S~ SAMUEL     SAMUEL     LOUIE     SACR~ CA    Expert-~  41250     0
## 10 INSTITUT~ GURKIPAL   GURKIPAL   SINGH     WOOD~ CA    Expert-~  40000     0
## 11 NEURONLI~ JEFFREY B~ JEFFREY    GELBLUM   MIAMI FL    Expert-~  39200     0
## 12 HENNEKEN~ CHARLES H  CHARLES    HENNEKENS BOCA~ FL    Expert-~  33250     0
## 13 SOBHY EL~ SAAD A     SAAD       SOBHY     SYRA~ NY    Expert-~  31500     0
## 14 COHEN, L~ LEE STEVEN LEE        COHEN     HAST~ NY    Expert-~  30500     0
## 15 BAROYA, ~ IVAN STEP~ IVAN       BAROYA    BONI~ CA    Expert-~  26400     0
## 16 JONES, S~ STEPHEN E~ STEPHEN    JONES     DALL~ TX    Expert-~  26250     0
## 17 CRANE, D~ DANIEL LI~ DANIEL     CRANE     NEW ~ NY    Expert-~  25500     0
## 18 AXONZ INC STANLEY J  STANLEY    KROLCZYK  WESL~ FL    Expert-~  24750     0
## 19 MATTHEW ~ MATTHEW J~ MATTHEW    BUDOFF    MANH~ CA    Expert-~  24000     0
## 20 QUANG H ~ QUANG H    QUANG      NGUYEN    LA J~ CA    Expert-~  22500     0
## # ... with 1 more variable: total <dbl>

6.6 Contoh 6

Filterlah data pfizer untuk semua pembayaran untuk menjalankan “Expert-Led Forums” atau untuk “Professional Advising”, dan urutkan secara alfabet berdasarkan nama dokter (nama belakang, kemudian nama depan)

expert_professional_advice <- pfizer %>%
  filter(category == "Expert-Led Forums" | 
         category == "Professional Advising") %>%
  arrange(last_name, first_name)
expert_professional_advice
## # A tibble: 4,382 x 10
##    org_indiv first_plus first_name last_name city  state category  cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>    <dbl> <dbl>
##  1 ABBO, LI~ LILIAN MA~ LILIAN     ABBO      MIAMI FL    Profess~  1800     0
##  2 ABEBE, S~ SHEILA Y   SHEILA     ABEBE     INDI~ IN    Expert-~   825     0
##  3 NEW YORK~ JUDITH ANN JUDITH     ABERG     NEW ~ NY    Profess~  1750     0
##  4 ABOLNIK,~ IGOR Z     IGOR       ABOLNIK   PROVO UT    Expert-~  1750     0
##  5 ABRAKSIA~ SAMIR      SAMIR      ABRAKSIA  BEAC~ OH    Expert-~  2000     0
##  6 ABRAKSIA~ SAMIR      SAMIR      ABRAKSIA  BEAC~ OH    Profess~  2500     0
##  7 ABRAMSON~ STEVEN BA~ STEVEN     ABRAMSON  NEW ~ NY    Profess~  4400     0
##  8 ABUZZAHA~ FARUK S    FARUK      ABUZZAHAB MINN~ MN    Profess~  1750     0
##  9 ABUZZAHA~ MARY JENN~ MARY       ABUZZAHAB SAIN~ MN    Expert-~  1000     0
## 10 ACCACHA,~ SIHAM DON~ SIHAM      ACCACHA   MINE~ NY    Expert-~  1250     0
## # ... with 4,372 more rows, and 1 more variable: total <dbl>

7 Mengganti Nama dan Mengubah

Di bagian ini, Anda akan belajar bagaimana cara mengganti nama kolom pada data frame di R. Kemudian, Anda akan belajar bagaimana cara menghitung dan menambahkan variabel baru ke dalam data frame di R. Anda akan belajar beberapa fungsi R dari package dplyr di R diantaranya sebagai berikut:

  • rename() Perintah ini digunakan untuk mengganti nama kolom pada data frame di R
  • mutate() Menghitung dan menambahkan variabel baru pada data tabel. Ini tidak mengubah variabel yang sebelumnya sudah ada.
  • transmute() Menghitung kolom baru namun menimpa variabel yang sudah ada
# Mengganti nama kolom pada data `pfizer` dengan fungsi dasar R:
names(pfizer)[names(pfizer) == "org_indiv"] <- "rename1"
names(pfizer)[1] <- "rename2"
names(pfizer)[names(pfizer)==names(pfizer)] <- c("rename3",
                                                 "rename4",
                                                 "first_name",
                                                 "last_name",
                                                 "city",
                                                 "state",
                                                 "category",
                                                 "cash",
                                                 "other",
                                                 "total")
# Mengganti nama kolom pada data `pfizer` dengan `dplyr::rename()`:
pfizer %>% 
  rename(
    org_indiv = rename3 ,
    first_plus = rename4  
    )
## # A tibble: 10,087 x 10
##    org_indiv first_plus first_name last_name city  state category  cash other
##    <chr>     <chr>      <chr>      <chr>     <chr> <chr> <chr>    <dbl> <dbl>
##  1 3-D MEDI~ STEVEN BR~ STEVEN     DEITELZW~ NEW ~ LA    Profess~  2625     0
##  2 AA DOCTO~ AAKASH MO~ AAKASH     AHUJA     PASO~ CA    Expert-~  1000     0
##  3 ABBO, LI~ LILIAN MA~ LILIAN     ABBO      MIAMI FL    Busines~     0   448
##  4 ABBO, LI~ LILIAN MA~ LILIAN     ABBO      MIAMI FL    Meals        0   119
##  5 ABBO, LI~ LILIAN MA~ LILIAN     ABBO      MIAMI FL    Profess~  1800     0
##  6 ABDULLAH~ ABDULLAH   ABDULLAH   RAFFEE    FLINT MI    Expert-~   750     0
##  7 ABEBE, S~ SHEILA Y   SHEILA     ABEBE     INDI~ IN    Educati~     0    47
##  8 ABEBE, S~ SHEILA Y   SHEILA     ABEBE     INDI~ IN    Expert-~   825     0
##  9 ABILENE ~ GALEN CHR~ GALEN      ALBRITTON ABIL~ TX    Profess~  3000     0
## 10 ABOLNIK,~ IGOR Z     IGOR       ABOLNIK   PROVO UT    Busines~     0   396
## # ... with 10,077 more rows, and 1 more variable: total <dbl>
# Menambahkan kolom baru (year*) tanpa mengubah data yang sebelumnya sudah ada pada `fda`:
letters_year <- fda %>%
  mutate(year = format(issued, "%Y")) %>%
  group_by(year)
letters_year
## # A tibble: 272 x 6
## # Groups:   year [15]
##    name_last  name_first name_middle issued     office                     year 
##    <chr>      <chr>      <chr>       <date>     <chr>                      <chr>
##  1 ADELGLASS  JEFFREY    M.          1999-05-25 Center for Drug Evaluatio~ 1999 
##  2 ADKINSON   N.         FRANKLIN    2000-04-19 Center for Biologics Eval~ 2000 
##  3 ALLEN      MARK       S.          2002-01-28 Center for Devices and Ra~ 2002 
##  4 AMSTERDAM  DANIEL     <NA>        2004-11-17 Center for Biologics Eval~ 2004 
##  5 AMSTUTZ    HARLAN     C.          2004-07-19 Center for Devices and Ra~ 2004 
##  6 ANDERSON   C.         JOSEPH      2000-02-25 Center for Devices and Ra~ 2000 
##  7 ANDREWS    DAVID      W.          2000-07-19 Center for Biologics Eval~ 2000 
##  8 AQEL       RAED       <NA>        2002-10-30 Center for Devices and Ra~ 2002 
##  9 ARROWSMITH PETER      N.          2004-01-21 Center for Devices and Ra~ 2004 
## 10 BARR       JOHN       D.          2000-01-14 Center for Devices and Ra~ 2000 
## # ... with 262 more rows
# Menambahkan kolom baru (year*) dan (last_name*) demgan cara menimpa data yang sebelumnya sudah ada pada `fda`:
fda %>%
  transmute(
    year = format(issued, "%Y"),
    last_name = name_last  
    )
## # A tibble: 272 x 2
##    year  last_name 
##    <chr> <chr>     
##  1 1999  ADELGLASS 
##  2 2000  ADKINSON  
##  3 2002  ALLEN     
##  4 2004  AMSTERDAM 
##  5 2004  AMSTUTZ   
##  6 2000  ANDERSON  
##  7 2000  ANDREWS   
##  8 2002  AQEL      
##  9 2004  ARROWSMITH
## 10 2000  BARR      
## # ... with 262 more rows

8 Menggabungkan Data

Adapun beberapa fungsi menggabungkan di dplyr untuk mengkombinasikan data dari dua data frame. Berikut ini adalah yang paling penting: * inner_join Mengembalikan nilai dari kedua tabel hanya ketika ada kecocokan. * left_join Mengembalikan semua nilai dari tabel pertama dan ditambah dari tabel ke-dua yang sama. * semi_join Memfilter tabel pertama untuk hanya memasukan nilai yang sama dengan tabel ke-dua. * anti_join Memfilter tabel pertama untuk hanya memasukan nilai yang tidak sama dengan tabel ke-dua.

Sebagai ilustrasi, gabungan berikut akan mencari dokter yang dibayar berdasarjab pfizer untuk menjalankan forum expert-led yang juga menerima surat peringatan dari fda:

expert_warned_inner <- inner_join(pfizer, fda, 
                                  by=c("first_name" = "name_first", 
                                       "last_name" = "name_last")) %>%
                                  filter(category=="Expert-Led Forums")

expert_warned_semi <- semi_join(pfizer, fda, 
                                by=c("first_name" = "name_first", 
                                     "last_name" = "name_last")) %>%
                                filter(category=="Expert-Led Forums")

Perintah pada by=c() mendefenisikan bagaimana penggabungan terbuat. Jika instruksi pada bagaimana penggabungan tabel tidak tersedia, dplyr akan mencari kolom dengan nama yang sama, dan melakukan penggabungan berdasarkan hal tersebut. Perbedaan diantara kedua gabungan diatas adalah yang pertama mencakup semua kolom dari kedua data frame, sedangkan yang ke-dua hanya memberikan kolom dari data frame pfizer.

Sebagai latihan, Anda mungkin ingin meng-inner_join dan menggunakan fungsi select milik dplyr untuk memilih kolom yang ingin Anda pertahankan, contohnya

expert_warned <- inner_join(pfizer, fda, 
                            by=c("first_name" = "name_first", 
                                 "last_name" = "name_last")) %>%
                            filter(category=="Expert-Led Forums") %>%
                            select(last_name, 
                                   city, 
                                   state, 
                                   total, 
                                   issued)

expert_warned <- inner_join(pfizer, fda, 
                            by=c("first_name" = "name_first",
                                 "last_name" = "name_last")) %>%
                            filter(category=="Expert-Led Forums") %>%
                            select(2:5,10,12)

Klik disini Untuk referensi yang berguna dalam mengolah penggabungan dplyr

9 Group dan Summary

This part introduces how to easily compute statistical summaries in R using the dplyr package. You will learn, how to:

  • Menghitung summary statistika untuk data yang tidak berkelompok, seperti, untuk data yang dikelompokan berdasarkan satu atau lebih variabel. fungsi R: summarise() dan group_by().
  • Summarise variabel kolom lebih dari satu. Fungsi R:
    • summarise_all() Menerapkan fungsi summary pada setiap kolom di data frame.
    • summarise_at () Menerapkan fungsi summary pada kolom tertentu yang dipilih berdasarkan kharakter vektor.
    • summarise_if () Menerapkan fungsi summary pada kolom yang telah dipilih dengan fungsi predikat yang menghasilkan TRUE

9.1 Contoh 7

Mengkalkulasi total pembayaran dari data pfizer, secara menurun!

state_sum <- pfizer %>%
  group_by(state) %>%
  summarize(sum = sum(total)) %>%
  arrange(desc(sum))
## `summarise()` ungrouping output (override with `.groups` argument)
state_sum

9.2 Contoh 8

Mengkalkulasi beberapa summary statistik tambahan pada data pfizer, secara menurun!

state_summary <- pfizer %>%
  group_by(state) %>%
  summarize(sum = sum(total), 
        average = mean(total), 
         median = median(total),
            min = min(total),
            max = max(total),
            count = n()) %>%
  arrange(desc(sum))
state_summary
## # A tibble: 52 x 7
##    state     sum average median   min     max count
##    <chr>   <dbl>   <dbl>  <dbl> <dbl>   <dbl> <int>
##  1 CA    4737807   4042.   886.    25  323122  1172
##  2 TX    2802196   4491.   802     25  479314   624
##  3 FL    2564047   3474.   669     25 1185466   738
##  4 PA    2484505   4661.   669     25  672263   533
##  5 NC    2328435   6079.   777      0  857698   383
##  6 NY    2065042   2479.   750     25  100000   833
##  7 MA    1764771   6814.  1250     29  617548   259
##  8 IL    1256825   2805.   661     25  160984   448
##  9 MI    1146285   3352.   750     26  152466   342
## 10 OH    1019450   2207.   685     25  107292   462
## # ... with 42 more rows

9.3 Contoh 9

Kelompokan dan summarize data pfizer untuk lebih dari satu kategori meningkat!

state_summary <- pfizer %>%
  group_by(state, category) %>%
  summarize(sum = sum(total), 
        average = mean(total), 
         median = median(total),
            min = min(total),
            max = max(total),
            count = n()) %>%
  arrange(state, category)
state_summary
## # A tibble: 319 x 8
## # Groups:   state [52]
##    state category                          sum average median   min    max count
##    <chr> <chr>                           <dbl>   <dbl>  <dbl> <dbl>  <dbl> <int>
##  1 AK    Expert-Led Forums                1750  1.75e3 1.75e3  1750   1750     1
##  2 AL    Business Related Travel         29123  9.39e2 3.31e2    39   8041    31
##  3 AL    Educational Items                 431  6.16e1 6.70e1    47     78     7
##  4 AL    Expert-Led Forums              129850  4.06e3 2.00e3   550  26250    32
##  5 AL    Investigator-Initiated Resear~  55937  5.59e4 5.59e4 55937  55937     1
##  6 AL    Meals                           10217  2.69e2 1.86e2    26   1385    38
##  7 AL    Pfizer Sponsored Research ini~ 279485  1.40e5 1.40e5 46494 232991     2
##  8 AL    Pfizer Sponsored Research ini~  66096  6.61e4 6.61e4 66096  66096     1
##  9 AL    Professional Advising          110560  5.53e3 2.00e3   702  35000    20
## 10 AR    Business Related Travel          3783  2.70e2 1.41e2    27   1017    14
## # ... with 309 more rows

9.4 Contoh 10

Filterlah data fda untuk surat yang telah terkirim mulai dari 2006 dan seterusnya kemudian summarize-kan!

year_summary <- fda %>%
  filter(issued >= "2005-01-01") %>%
  arrange(issued) %>%
  mutate(year = format(issued, "%Y")) %>%
  group_by(year) %>%
  summarize(letters=n())
year_summary
## # A tibble: 6 x 2
##   year  letters
##   <chr>   <int>
## 1 2005       31
## 2 2006       25
## 3 2007       11
## 4 2008       23
## 5 2009       25
## 6 2010        5

Beware: menggunakan ulang variabel akan menyebabkan hasil yang tidak lazim namun tidak perlu khawatir. R akan memberikan peringatan seperti summarise() ungrouping output (override with .groups argument).

10 Memisahkan Data

Seperti yang saya katakan sebelumnya, dalam bab R Programming tentang penulisan fungsi untuk latihan memisahkan dan meng-test data. Disini, kita akan belajar lebih lagi bagaimana cara menggunakan packages dengan tujuan memisahkan data. Karena bagian ini sangat penting bagi data scientist terlebih lagi jika Anda mengaplikasikan Machine learning untuk menganalisis data. Pada bagian ini biasanya kita butuh untuk memisahkan dataset diantara. Dengan tujuan untung meng-test performa dari model kita, kita dapat menggunakan set percobaan untuk mengembalikan tingkat performa. Jadi, mari kita lihat beberapa packages yang dapat Anda gunakan untuk memisahkan data:

10.1 dplyr

Anda dapat menggunakan dplyr untuk membuatnya sangat sederhana. Ini wajib memiliki Id variabel pada data set Anda, dimana ide yang tidak buruk, tidak hanya untuk membuat set-set baru tapi juga untuk proses pemantauan selama projek. Tambahkanlah juga belum terdapat.

library(dplyr)                                    # Meng-load package `dplyr` 
data(mtcars)                                      # Menggunakan data dari R environment
set.seed(123)                                     # Untuk memasikan kita menciptakan data yang sama
mtcars$id <- 1:nrow(mtcars)                       # tambahkan `id` juga belum terdapat dalam data
train<-mtcars %>% dplyr::sample_frac(.75)         # Masukan train set
test<-dplyr::anti_join(mtcars, train, by = 'id')  # Masukan test set
dim(train)                                        # Mengecek dimensi dari train set
## [1] 24 12
dim(test)                                         # Mengecek dimensi dari test set
## [1]  8 12

Catatan: Data set ini hanya digunakan sebagai contoh, data ini tidak cocok digunakan untuk machine learning karena jumlah data yang terlalu kecil.

10.2 caTools

Ada banyak pendekatan untuk mencapai partisi data. Untuk pendekatan yang lebih lengkap, lihat fungsi createDataPartition dalam packages caTools.

library(caTools)                                  # Meng-load package `caTools` 
data(mtcars)                                      # Menggunakan data dari R environment
set.seed(123)                                     # Untuk memasikan kita menciptakan data yang sama
smp_size <- floor(0.75 * nrow(mtcars))            # 75% dari ukuran sampel
train_ind <- sample(seq_len(nrow(mtcars)), 
                    size = smp_size)
train <- mtcars[train_ind, ]                      # Masukan train set
test <- mtcars[-train_ind, ]                      # Masukan test set
dim(train)                                        # Mengecek dimensi dari train set
## [1] 24 11
dim(test)                                         # Mengecek dimensi dari test set
## [1]  8 11

10.3 caret

packages sangat berguna lainnya yang dapat membantu anda memisahkan data set adalah caret.

library(caret)                                    # Meng-load package `caret`
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
data(mtcars)                                      # Menggunakan data dari R environment
set.seed(123)                                     # Untuk memasikan kita menciptakan data yang sama
intrain<-createDataPartition(mtcars$mpg,
                             p=0.75,list=FALSE)
train<-mtcars[intrain,]
test<-mtcars[-intrain,]
dim(train)                                        # Mengecek dimensi dari train set
## [1] 25 11
dim(test)                                         # Mengecek dimensi dari test set
## [1]  7 11

Lebih lanjut