salah satu skill paling mendasar untuk Data Scientist adalah Pengolahan Data(Manipulasi Data). Agar bisa bekerja dengan efektif, kamu perlu sekali menguasai manipulasi data-data. ini dikarenakan sebagian besar dari pekerjaanmu akan melibatkan Mendapat dan Membersihkan Data

Data Scientists menghabiskan 60% waktunya dalam membersihkan dan mengatur data. Mengumpulkan kumpulan data berada di tempat kedua menghabiskan 19% waktu mereka, yang berarti data sicentist menghabiskan sekitar 80% waktu mereka dalam menyiapkan dan mengelola data untuk di analisa.

Di bab ini, kamu akan belajar cara mudah melakukan persiapan data menggunakan R. kita akan membahas kata-kata dasar data manipulasi yang akan sering kamu gunakan di pekerjaanmu.

  • read_csv() Memasukkan Data (Bisa juga menggunakan yang lain)
  • str() Struktur Data
  • apply() Mengecek dan menggantikan nilai yang hilang
  • select() Memilih kolom yang ingin dimuat
  • filter()Memilih bagian dari data yang ditentukan
  • arrange()Menggolongkan data, berdasarkan ukuran untuk variabel tak terhingga, berdasarkan tanggal, atau berdasarkan abjad
  • rename() mengganti nama kolom
  • mutate() Membuat kolom baru di data, atau mengubah kolom yang sudah ada
  • bind_rows() Menggabungkan dua data frame menjadi satu, mengkombinasikan data dari menurut kolom yang mempuyai nama yang sama
  • group_by() Mengelompokkan data menurut variabel syarat
  • summarize() Meringkas, atau menggabungkan (setiap grup jika mengikuti group_by). Biasanya digunakan bersamaan dengan :
    • mean() Menghitung rataan, atau rata-rata.
    • meadian() Menghitung nilai tengah
    • max() Mencari nilai tertinggi
    • min() Mencari nilai terendah
    • sum() Menjumlahkan semua nilai bersamaan
    • n() menghitung berapa jumlah dari dokumen

saya sarankan untuk menginsta package [tidyverse](https://www.tidyverse.org/packages/) . Karena kunci dari tidyverse mengandung kumpulan package yang akan sering amu gunakan setiap menganalisa data.

install.package("tidyverse")

kita sebagian besar bekerja dengan dua pacakge yang sangat berguna oleh Hadley Wickham, kepala ilmuwan di Rstudio:

  • [readr](https://readr.tidyverse.org/) Untuk membaca dan menulis CSV dan file teks lain
  • [dplyr](https://dplyr.tidyverse.org/) untuk memproses dan memanipulasi data.

1 Memasukkan Data

data yang akan kita gunakan untuk bab ini adalah pfizer.csv dan fda.csv , mohon di download dan tempatkan di desktop anda. Sebagai opsional, kamu dapat memuat data ke sesi R dengan memilih Import Dataset>From Text File... didalam lingkup tab. tapi, dalam kasus ini kita akan menggunakan fungsi read_csv() dari package readr. saling kode berikut ke dalam pengerjaan kamu dan jalankan :

suppressPackageStartupMessages(library(tidyverse))    # memuat tidyverse
setwd("C:/Users/USER/Desktop/")                       # ingat untuk manambah bagian direktori kerja 
pfizer <- read_csv("pfizer.csv")                      # memuat data dari `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")                            # memuat data dari `fda`
## 
## -- Column specification --------------------------------------------------------
## cols(
##   name_last = col_character(),
##   name_first = col_character(),
##   name_middle = col_character(),
##   issued = col_date(format = ""),
##   office = col_character()
## )

2 Struktur Data

Perhatikan bahwa kamu membutuhkan pemahaman yang kuat mengenai dasar tipe data dan struktur data dan cara mengoperasikannya. fungsi str() akan memberitahu kamu lebih banyak mengenai kolom yag ada didata besera tipe datanya. salin kode berikut ke dalam pengerjaan kamu dan jalankan :

str(pfizer)                                            # melihat struktur 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)                                               # melihat struktur 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 sangat penting untuk memahaminya karena objek-objek ini akan kamu manipulasi setiap harinya dalam basis R. jika kamu perlu mengubah tipe data kolom manapun, gunakan fungsi berikut :

  • as.character() dijadikan rangkaian data
  • as.numeric() dijadikan angka
  • as.factor() dijadikan variabel kategori
  • as.integer() dijadikan bilangan bulat
  • as.Date() dijadikan tanggal
  • as.POSIXct() dijadikan tanggal dan waktu

sebagai contoh, tambahan kode berikut kedalam pengerjaanmu lalu jadikan total perubahan didalam data pfizer ke variabel angka (dimana akan lebih memungkinkan menyimpan nilai desimal jika punya)

pfizer$total <- as.numeric(pfizer$total)              #Total dijadikan variabel angka
str(pfizer$total)
##  num [1:10087] 2625 1000 448 119 1800 ...

3 Nilai yang Hilang

Tidak seperti programming pada umunya, ketika bekerja dengan data kehidupan asli , kamu mungkin akan mempunyai nilai yang hilang: perhitungan yang tidak tersimpan. R memiliki mekanisme yang lumayan canggih untuk menangani nilai yang hilang. dibedakan dalam beberapa jenis yaitu:

  • NA : Not Available atau tidak tersedia nilai (nilai NA dapat berupa kelas, sehingga mempunyai bilangan bulat NA, karakter NA, dsb )
  • NaN : Not a number atau bukan angka ( nilai NaN sama seperti NA tetapi tidak sebaliknya)

temukan nilai yang hilang di kolom dalam data frame pfizer

is.na(pfizer)                                     # cara biasa melihat NA
sum(is.na(pfizer))                                # menghitung NA
apply(is.na(pfizer),2, which)                     # indeks yang mana NA (df saja)
which(complete.cases(pfizer))                     # identifikasi nilai observasi lengkap

mekanisme yang lebih umum menghapuskannya secara manual :

clean.vector<- na.omit(pfizer$first_name)         # clean/remove a vector NA`s
clean.df <- na.omit(pfizer)                       # clean/remove a dataframe NA`s
apply(is.na(clean.df),2, which)                   # make sure if there are missing values 
## integer(0)

4 Menggantikan nilai yang hilang

kita juga dapat menggantikan nilai yang hilang dengan rataan(nilai tengah). praktik yang baik yaitu membuat dua variabel terpisah untuk rataan. setelah dibuat, kita dapat menggantikan nilai yang hilang dengan variabel baru yang terbentuk. mari unggah data dan mencari 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 menghilangkan semua nilai yang hilang, tetapi kita mneggunakan metode apply() untuk menghitung rataan dari kolom yang NA. pertama, kita perlu menghitung rataan dengan argume na.rm = TRUE. argumen ini wajib karena ketika kolom yang memiliki data yang hilang, dan R diberitahu 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 Kode : Kita akan menggunakan 4 argumen di metode apply

  • dftitanic[,colnames(titanic)%in%list_na]. kode ini akan mengembalikan nama kolom dari list_na objek (i.e. “age” dan “fare”)
  • 2 menghitung fungsi pada kolom
  • mean menghitung rataan
  • na.rm = TRUE mengabaikan nilai yang hilang.

selanjutnya, kita dapat menggantikan nilai NA. kata kerja ‘mutate’ dari dplyr. library berguna dalam membuat variabel baru. kita tidak perlu mengganti kolom yang asli untuk membuat variabel baru tanpa NA. mutate mudah digunakan, kita tinggal memilih nama variabel dan menentukan cara membuat variabel ini. berikut adalah kode 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

Usia kolom asli memiliki 86 nilai yang hilang sedangkan variabel yang baru dibuat menggantikannya dengan rataan dari variabel usia. kamu dapat mencoba sendiri untuk mengganti observasi yang hilang dengan median atau nilai tengah juga.

5 Memilih Data

Pada bagian ini, Kamu akan belajar cara memilih atau subset kolom data frame dengan nama dan posisi menggunakan fungsi R select () dalam paket [dplyr](https://dplyr.tidyverse.org/reference/summarise.html). Anda akan mempelajari cara menggunakan fungsi berikut:

  • pull() Ekstrak nilai kolom sebagai vektor. Kolom yang diminati dapat ditentukan menurut nama atau indeks.
  • select() Ekstrak satu atau beberapa kolom sebagai tabel data. Ini juga dapat digunakan untuk menghapus kolom dari bingkai data.
  • select_if() memilih kolom berdasarkan kondisi tertentu. dapat pula menggunakan fungsi ini untuk, misalnya, memilih kolom jika berupa numerik.
  • fungsi pembantu : starts_with(), ends_with(), contains(), matches() : memilih kolom. variabel berdasarkan nama

6 Memilah dan Mengurutkan data

Sekarang kita akan filter() dan mengatur() data dengan cara tertentu. Untuk setiap contoh berikut, salin kode berikut ke dalam pengerjaan Kamu, dan lihat hasilnya. Perhatikan bagaimana kita membuat objek baru untuk menampung data yang diproses.

6.1 Contoh 1

Temukan dokter di California di bayar $10,000 atau lebih oleh Pfize untuk menjalankan “Profesional Advising” atau “Penasehat Profesional”

ca_expert_10000 <- pfizer %>%                     # memuat semua `pfizer`    
  filter(state == "CA" &                          # memuat semua `pfizer` dipilih berdasarkan `state`
total >= 10000 &                                  # dipilih juga berdasarkan `total` lebih dari atau sama dengan 10000
         category == "Professional Advising")     # dan juga berdasarkan `category`
ca_expert_10000                                   # menunjukkan 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 kode untuk membuat daftar dokter dalam urutan menurun menurut pembayaran yang diterima!

ca_expert_10000 <- pfizer %>%                     # memuat semua `pfizer`    
  filter(state == "CA" &                          # memilih berdasarkan `state` di  California
         total >= 10000 &                         # Memlihi berdasarkan  `total` lebih dari atau sama dengan 10000
         category == "Professional Advising")%>%  # then moreover filter by `category`
  arrange(desc(total))                            # urutan menurun berdasarkan pembayaran yang diterima
ca_expert_10000                                   # menunjukkan 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))                                 # urutan naik telah ditetapkan sebagai pengaturan di R

6.3 Contoh 3

Temukan dokter di California atau New York yang dibayar $ 10.000 atau lebih oleh Pfizer untuk menjalankan “Professional Advising” Perhatikan bahwa, dalam kasus ini kita menggunakan | operator Boolean, dan tanda kurung sekitar pertanyaannya. ini memastikan bagian dari pertanyaan dijalankan pertama kali. kita lihat apa yang terjadi bila mengecualikan mereka.

ca_ny_expert_10000 <- pfizer %>%                  # memuat semua `pfizer`    
  filter((state == "CA" | state == "NY")  &       # dipilah berdasarkan `state` California atau New York
         total >= 10000 &                         # juga dipilah berdasarkan `total` lebih dari atau sama dengan 10000
         category == "Professional Advising")%>%  # dipilah berdasarkan `category` juga
  arrange(desc(total))                            # urutan menurun berdasarkan pembayaran yang diterima
ca_ny_expert_10000                                # menunjukkan 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

Temukan dokter di negara bagian selain California yang dibayar $ 10.000 atau lebih oleh Pfizer untuk menjalankan “Professional Advising”!

not_ca_expert_10000 <- pfizer %>%                 # memuat semua `pfizer`    
  filter(state != "CA" &                          # dipiliah berdasarkan `state`selain California
         total >= 10000 &                         # dipilah berdasarkan `total` lebih dari atau sama dengan 10000
         category == "Professional Advising")%>%  # dan juga dipilah berdasarkan `category`
  arrange(desc(total))                            #  urutan menurun berdasarkan pembayaran yang diterima
not_ca_expert_10000                               # menunjukkan 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

Temukan 20 dokter di empat negara bagian terbesar yaitu (CA, TX, FL, NY) yang mendapat pembayaran paling tinggi untuk “Forum yang Dipimpin Pakar”!

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

Pilah data pfizer untuk semua pembayaran untuk menjalankan “Forum yang dipimpin Pakar” atau “Penasehat profesional”, dan mengaturnya secara alphabet menurut nama dokter (nama terakhir lalu nama pertama)

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 Mengubah Nama dan isinya

dalam bagian ini, kamu akan belajar cara mengubah nama kolom data dari data frame di R. selanjutnya, kamu akan belajar cara menghitung dan menambahkan variabel baru dalam data frame di R. kamu akan belajar fungsi R dari paket dplyr R berikut :

  • rename() kode ini digunakan untuk mengubah nama dari kolom pada dataframe di R
  • mutate() menghitung dan menambahkan variabel baru kedalam tabel Data. ini menjaga variabel yang telah ada
  • transmute() menghitung kolom baru tetapi mengisinya dengan variabel yang telah ada
# mengubah nama kolom data `pfizer` dengan fungsi R dasar:
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")
# mengubah nama kolom 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*) dengan mempertahankan data `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*) dengan mngisinya menggunakan data `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 Menyatukan Data

adapun beberapa fungsi menyatukan data di dplyruntuk menggabungkan data dri 2 data frame. berikut adalah yang paling digunakan :

  • inner_join() mengembalikan nilai dari kedua tabel jika mempunyai kesamaan
  • left_join() mengembalikan semua nilai dari tabel pertama yang dipilih ditambah dari variabel kedua yang mempunyai kesamaan.
  • semi_join() memilah tabel pertama untuk memasukkan nilai yang sama dari tabel kedua
  • anti_join() memilah tabel pertama untuk memasukkan nilai yang tidak mempunyai kesamaan dari tabel kedua.

untuk menggambarkan fungsi diatas akan digunakan untuk menemukan pembayaran dokter pfizeruntuk menjalankan forum yang dipimpin pakar yang juga menerima suratperingaran 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")

kode didalam by=c()menentukan bagaiman penyatuan harus dibuat. jika instruksi bagaimana menyatukan tabel tidak tersedia, dplyrakan mencari kolom yang memiliki kesamaan nama, dan menyatukannya berdasarkan hal tersebut. perbedaan kedua penyatuan diatas adalah yang pertama mengandung semua kolom dari kedua data frame, sementara yang kedua hanya dari pfizerdata frame.

dalam mempraktikannya, kamu bisa menggunakan inner_join dan fungsi select dplyr untuk memilih kolom yang dipertahankan, sebagai contoh :

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)

Click here untuk lebih banyak referensi mengenai pengelolaan gabungan dengan dplyr

9 Kelompok dan meringkas

bagian ini memperkenalkan bagaiman menghitung dengan mudah kesimpulan perhitungan menggunakan paket dplyr. kamu akan belaar, bagaimana :

  • Menghitung kesimpulan statistik untuk data tak berkelompok , seperti data yang di kelompokkan berdasarkan 1 atau lebih variabel. fungsi R : summarise()dan group_by().
  • Meringkas banyak variabel kolom. Fungsi R:
    • summarise_all() menerapkan fungsi ringkas setiap kolom data frame.
    • summarise_at() menerapkan fungsi ringkas untuk kolom tertentu yang dipilih dengan karakter vektor
    • summarise_if() menerapkan fungsi ringkas ke kolom yang dipilih dengan fungsi predikat yang TRUE

9.1 Contoh 7

menghitung total pembayaran data pfizer, berdasarkan penurunan negara

state_sum <- pfizer %>%
  group_by(state) %>%
  summarize(sum = sum(total)) %>%
  arrange(desc(sum))
## `summarise()` ungrouping output (override with `.groups` argument)
state_sum
## # A tibble: 52 x 2
##    state     sum
##    <chr>   <dbl>
##  1 CA    4737807
##  2 TX    2802196
##  3 FL    2564047
##  4 PA    2484505
##  5 NC    2328435
##  6 NY    2065042
##  7 MA    1764771
##  8 IL    1256825
##  9 MI    1146285
## 10 OH    1019450
## # ... with 42 more rows

9.2 Contoh 8

menghitung ringkasan statistik tambahan dari data pfizer, berdasarkan penurunan negara

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))
## `summarise()` ungrouping output (override with `.groups` argument)
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

Kelompokkan dan rinkgas data pfizeruntuk kategori meningkat berganda!

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)
## `summarise()` regrouping output by 'state' (override with `.groups` argument)
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

Awas : menggunakan lagi variabel dapat memberikan hasil yang tidak di harapkan tapi tidak perlu dikhawatirkan. R akan memberikan semacam peringatan seperti summarise() ungrouping output (override with . groups argument)

10 Memisahkan Data

seperti yang sudah saya katakan diatas dalam chapter R programming mengenai menulis fungsi untuk memisahkan training dan testing data. disini, kita akan belajar lebih mengenai cara meggunakan paket untuk memisahkan data. karena bagian ini sangat penting sebagai data scientist terutama ketika kamu menerapkan tugas Pembelajaran Mesin untuk menganalisa data. bagian ini biasanya perlu untuk memisahkan kumpulan data antara kumpulan data train dan kumpulan data test. Kumpulan Data train membrikan kita algoritma untuk dipelajari dari data. dalam hal menguji pengerjaan pada model kita, kita dapat menggunakan kumpulan data test untuk menunjukkan pengukurannya. jadi, mari lihat beberapa paket yang dapat kamu gunakan untu memisahkan data:

10.1 dplyr

kamu dapat menggunakan dplyr untuk ini, yang membuatnya menjadi lebih sederhana. ini membutuhkan variabel id dalam kumpulan datamu, dimana merupakan ide yang bagus, bukan hanya untuk menciptakan kumpulan data tetapi juga mudah ditelusuri selama pengerjaanmu. tambahkan jika belum terisi :

library(dplyr)                                    # memuat paket `dplyr` 
data(mtcars)                                      # gunakan data dari dokumen R
set.seed(123)                                     # memastikan kita menghasilkan data yang sama
mtcars$id <- 1:nrow(mtcars)                       # tambahkan 'id' bila belum terisi
train<-mtcars %>% dplyr::sample_frac(.75)         # tetapkan kumpulan data train
test<-dplyr::anti_join(mtcars, train, by = 'id')  # tetapkan kumpulan data test
dim(train)                                        # lihat dimensi kumpulan data train
## [1] 24 12
dim(test)                                         # lihat dimensi kumpulan data test
## [1]  8 12

catatan : jika kumpulan data sebagai contoh , tidak cocok untuk pembelajaran tugas mesin karena datanya terlalu kecil.

10.2 caTools

ada berbagai macam pendekatan untuk mencapai partisi data. buat beberapa pendekatan lengkap silahkan lihat pada fungsi createDataPartition pada paket caTools .

library(caTools)                                  # memuat paket `caTools` 
data(mtcars)                                      # Gunakan data dari dokumen R
set.seed(123)                                     # memastikan menghasilkan 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, ]                      # tetapkan kumpulan data train
test <- mtcars[-train_ind, ]                      # tetapkan kumpulan data test
dim(train)                                        # lihat dimensi data train
## [1] 24 11
dim(test)                                         # lihat dimensi data test
## [1]  8 11

10.3 caret

Adapun paket yang bagus yang dapat digunakan untuk memisahkan kumpulan data adalah caret.

library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
data(mtcars)                                      # Gunakan data dari dokumen R
set.seed(123)                                     # memastikan menghasilkan data yang sama
intrain<-createDataPartition(mtcars$mpg,
                             p=0.75,list=FALSE)
train<-mtcars[intrain,]
test<-mtcars[-intrain,]
dim(train)                                        # lihat dimensi data train
## [1] 25 11
dim(test)                                         # lihat dimensi data test
## [1]  7 11

More