Salah satu skill yang paling mendasar dalam Data Science adalah Data Preparation (Data Manipulation). Efektifnya, kamu harus lebih pandai dalam melakukan manipulasi data. Ini karena sebagian besar pekerjaan mu akan berkutat dengan mendapat dan membersihkan data.
Seorang Data Scientist menghabiskan 60% waktunya dalam membersihkan dan merapikan data. Mengumpulkan data set muncul di urutan ke-dua yaitu 19% dari waktunya, artinya sebanyak 80% waktu Data Scientist dihabiskan untuk menyiapkan dan mengatur data untuk analisis.
Pada bagian ini kita akan mempelajari bagaimana menampilkan Data Preparation menggunakan R dengan mudah. Kita akan membahas beberapa hal mendasar dalam Data Manipulation yang mana akan sering digunakan di pekerjaan anda nantinya.
read_csv() Import data (Memasukkan data, bisa juga gunakan yang lain selain csv)str() Data Structures (Struktur Data)apply() Untuk mengecek dan memindahkan nilai yang hilangselect() Memilih kolom mana yang dimasukkanfilter() Memilih subset dari dataarrange() Mengurutkan data, dalam ukuran untuk data yang kontinu, dalam tanggal, atau alfabetrename() Menggantikan nama kolommutate() Menambahkan kolom baru dalam data atau menggantikan kolom yang tersediabind_rows() Menggabungkan dua data frame menjadi satu, menggabungkan data berdasarkan kolom dengan nama yang samagroup_by() Mengkelompokkan data berdasarkan kategorisummarize() Merangkum, atau pengumpulan(untuk setiap grup jika diikuti group_by()). Sering digunakan yang mana berhubungan dengan fungsi berikut:
mean() Menghitung rata-ratamedian() Menghitung nilai tengahmax() Menghitung nilai maximummin() Menghitung nilai minimumsum() Total dari seluruh nilainyan() Menghitung banyak dataSaya merekomendasikan untuk menginstal packages tidyverse. Karena inti dari tidyverse meliputi packages yang kamu akan sering gunakan setiap hari untuk analisis data.
Kita biasanya akan sering bekerja menggunakan dua packages hebat ini yang dikembangkan oleh Hadley Wickham, Kepala Ilmuwan di RStudio:
readr untuk membaca dan menulis file CSV dan file teks lainnya.dplyr untuk memproses dan memanipulasi data.Data yang akan kita gunakan pada bagian ini yaitu pfizer.csv dan fda.csv, tolong untuk men-download dan simpan di desktop anda. Kita juga bisa memuat data ke R session saat ini dengan cara memilih Import Dataset>From Text File... didalam Environment tab. Tetapi, untuk kasus ini kita akan gunakan read_csv() dari packages readr. Salin code dibawah ini dan jalankan di R Script mu.
suppressPackageStartupMessages(library(tidyverse)) # diam-diam memuat tidyverse
#setwd("D:/Documents/Campus Documents/Semester 3/Algoritma dan Struktur Data/Week10") # ingat untuk setel tempat hasil kerja kita
pfizer <- read_csv("pfizer.csv") # memuat 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()
## )
##
## -- Column specification --------------------------------------------------------
## cols(
## name_last = col_character(),
## name_first = col_character(),
## name_middle = col_character(),
## issued = col_date(format = ""),
## office = col_character()
## )
Sadar bahwa kita perlu sangatt mengerti tentang dasar tipe data dan struktur data dan bagaimana mengoperasikan mereka. Fungsi str() akan memberitahu kita banyak mengenai kolom data kita, termasuk tipe datanya. Salin code dibawah ini dan jalankan di R Script mu:
## 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()
## .. )
## 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()
## .. )
Sangatlah penting untuk memahaminya karena akan ada objek yang kita manipulasikan dalam R. Jika kamu harus mengubah tipe data dari kolom apapun, gunakan fungsi berikut:
as.character() ubah menjadi rangkaian teks.as.numeric() ubah menjadi angka.as.factor() ubah menjadi variabel kategori.as.integer() ubah menjadi integer (bilangan bulat).as.Date() ubah menjadi tanggal.as.POSIXct() ubah menjadi tanggal dan waktu keseluruhan.Untuk lebih jelasnya, tambahkan kode berikut ke script mu untuk mengubah total pada data pfizer menjadi variabel numerik (dimana bisa mengandung nilai desimal).
pfizer$total <- as.numeric(pfizer$total) # Mengubah data total menjadi numeric
str(pfizer$total) # Mari kita cek kembali struktur datanya## num [1:10087] 2625 1000 448 119 1800 ...
Tidak seperti programming biasanya, ketika bekerja dengan data asli, kita mungkin akan mempunyai nilai yang hilang: perhitungan yang tidak tercatat/tersimpan/dll. R mempunyai mekanisme yang cukup canggih untuk mengatasi nilai yang hilang. Itu dibagikan menjadi beberapa tipe berikut:
NA:Tidak ada masukan (Nilai NA juga memiliki kelas antara lain, integer NA, character NA, dll)NaN:Bukan angka (NaN juga termasuk NA tetapi konteksnya sudah tidak benar)Mencari nilai yang hilang dari data frame pfizer
is.na(pfizer) # Cara klasik untuk mengetahui NA pada data
sum(is.na(pfizer)) # Menghitung NA`s
apply(is.na(pfizer),2, which) # Indeks mana yang mengandung NA (hanya df)
which(complete.cases(pfizer)) # Mengidentifikasi nilai pengamatan keseluruhanMekanisme yang lebih dasar yaitu dengan cara menghapus secara manual:
clean.vector <- na.omit(pfizer$first_name) # membersihkan/menghapus vektor dari NA
clean.df <- na.omit(pfizer) # membersihkan/menghapus dataframe dari NA
apply(is.na(clean.df),2, which) # pastikan bahwa disana ada nilai yang hilang## integer(0)
Kita juga bisa memindahkan nilai yang hilang dengan rata-rata(nilai tengah). Cara yang baik yaitu dengan membuat 2 variabel berbeda dari rata-ratanya. Setelah dibuat, kita bisa memindahkan nilai yang hilang dengan variabel baru. Mari unggah data dan verifikasi 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, tetapi kita menggunakan metode apply() untuk menghitung rata-rata dari kolom yang mengandung NA. Pertama, kita perlu menghitung rata-rata dengan argumen na.rm = TRUE. Argument ini wajib karena kolom nya mengandung data yang hilang, dan ini memberitahu R untuk mengabaikan mereka.
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 menggunakan 4 argumen dalam metode apply().
df titanic[,colnames(titanic) %in% list_na]. Kode ini akan me-return nama kolom berdasarkan objek list_na (yaitu “age” and “fare”)2 Menghitung fungsi yang ada pada kolommean Menghitung rata-ratana.rm = TRUE Mengabaikan nilai yang hilangSelanjutnya, kita bisa memindahkan nilai NA. ‘mutate’ pada library dplyr ini sangat berguna untuk membuat variabel baru. Kita tidak perlu mengubah kolom aslinya jadi kita bisa membuat variabel baru tanpa NA. ‘mutate’ mudah digunakan, kita hanya perlu memilih nama variabel dan menetapkan bagaimana membuat variabel ini. Dibawah ini merupakan kode nya.
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
## [1] 1
## [1] 0
## [1] 0
Kolom umur aslinya memiliki 86 nilai yang hilang, sementara variabel yang baru saja di buat sudah memindahkan mereka dengan rata-rata dari variabel umur. Demikian juga, kamu bisa mencoba sendiri untuk memindahkan observasi yang hilang dengan median.
Pada bagian ini, kamu akan belajar bagaimana memilih atau subset kolom data frame berdasarkan nama dan posisi menggunakan fungsi R select() pada packages dplyr. Kamu akan mempelajari fungsi berikut:
pull() Mengekstrak nilai kolom menjadi vektor. Kolom yang diinginkan bisa ditentukan dari nama ataupun indeks.select() Mengekstrak satu atau lebih kolom menjadi data table. Itu bisa juga digunakan untuk menghapus kolom dari data frame.select_if() Memilih kolom berdasarkan kondisi tertentu. Fungsi ini bisa digunakan, sebagai contoh, memilih kolom jika mereka adalah numerik.starts_with(), ends_with(), contains(), matches(): Memilih kolom/variabel berdasarkan nama mereka.library(tidyverse) # memuat `tidyverse`, dimana ada pada `dplyr`
pfizer %>% pull(state) %>% head() # mengekstrak nilai kolom `state` menjadi 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 hanya kolom numerik
pfizer %>% select_if(is.character) # memilih hanya kolom karakter
pfizer %>% select(starts_with("first")) # memilih kolom yang mana dimulai dengan `first`
pfizer %>% select(ends_with("name")) # memilih kolom yang mana diakhiri dengan `name`
pfizer %>% select(contains("rst")) # memilih kolom yang mana namanya mengandung `rst`
pfizer %>% select(matches("_")) # memilih kolom yang mana namanya sesuai dengan yang biasa (regular)
pfizer %>% select(-(state:total)) # menghapus semua kolom dari `state` sampai `total`
pfizer %>% select(-state, -total) # menghapus kolom `state` dan `total`Sekarang kita akan filter() dan arrange() data dengan cara yang spesifik. Untuk setiap contoh berikut, salin kode berikut ke dalam script mu dan lihat hasilnya. Sadar bahwa kita membuat objek baru untuk data tersebut.
Temukan dokter-dokter di dalam California yang dibayar $10,000 atau lebih dari data Pfizer untuk menjalankan “Professional Advising”!
ca_expert_10000 <- pfizer %>% # memuat data `pfizer`
filter(state == "CA" & # memuat data `pfizer` filter dengan `state`
total >= 10000 & # juga filter dengan `total` lebih dari sama dengan 10000
category == "Professional Advising") # lalu juga filter dengan `category`
ca_expert_10000 # cetak hasil## # 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>
Sekarang tambahkan urutan pada bagian akhir kode, untuk mendaftarkan dokter dalam urutan menurun berdasarkan pembayaran yang diterima!
ca_expert_10000 <- pfizer %>% # memuat data `pfizer`
filter(state == "CA" & # filter dengan `state` California
total >= 10000 & # juga filter dengan `total` lebih dari sama dengan 10000
category == "Professional Advising")%>% # lalu juga filter dengan `category`
arrange(desc(total)) # urutan menurun berdasarkan pembayaran yang diterima
ca_expert_10000 # cetak hasil## # 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>
Temukan dokter-dokter di dalam California atau New York yang dibayar $10,000 atau lebih dari data Pfizer untuk menjalankan “Professional Advising”!
Sadar bahwa dalam kasus ini kita perlu gunakan Boolean operator |, dan kurung pada variabel yang diinginkan. Itu artinya menandakan bahwa variabel mana yang dijalankan terlebih dahulu. Lihatlah apa yang terjadi pada kode dibawah ini.
ca_ny_expert_10000 <- pfizer %>% # memuat data `pfizer`
filter((state == "CA" | state == "NY") & # filter dengan `state` California atau New York
total >= 10000 & # juga filter dengan `total` lebih dari sama dengan 10000
category == "Professional Advising")%>% # lalu juga filter dengan `category`
arrange(desc(total)) # urutan menurun berdasarkan pembayaran yang diterima
ca_ny_expert_10000 # cetak hasil ## # 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>
Temukan dokter-dokter selain California yang dibayar $10,000 atau lebih dari data Pfizer untuk menjalankan “Professional Advising”!
ca_expert_10000 <- pfizer %>% # memuat data `pfizer`
filter(state != "CA" & # filter dengan `state` selain California
total >= 10000 & # juga filter dengan `total` lebih dari sama dengan 10000
category == "Professional Advising") # lalu juga filter dengan `category`
ca_expert_10000 # cetak hasil## # 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 ADAMS, S~ SANDRA GA~ SANDRA ADAMS SAN ~ TX Profess~ 12840 0
## 2 AGRAWAL,~ NAURANG NAURANG AGRAWAL KANS~ KS Profess~ 12300 0
## 3 ANTHENEL~ ROBERT MI~ ROBERT ANTHENEL~ CINC~ OH Profess~ 15520 0
## 4 AYYASH, ~ MAHER OMAR MAHER AYYASH PITT~ PA Profess~ 25750 0
## 5 AZAROV, ~ NICK NICK AZAROV ODES~ TX Profess~ 16000 0
## 6 BAILES, ~ JOSEPH SW~ JOSEPH BAILES AUST~ TX Profess~ 105000 0
## 7 BALLAS, ~ CHRISTOS ~ CHRISTOS BALLAS GLAD~ PA Profess~ 11000 0
## 8 BEUTLER,~ BRUCE ALAN BRUCE BEUTLER DALL~ TX Profess~ 50000 0
## 9 BIRNBAUM~ MORRIS J MORRIS BIRNBAUM NEW ~ NY Profess~ 25000 0
## 10 BRAD D S~ BRAD DAVID BRAD SIMONS JUPI~ FL Profess~ 19500 0
## # ... with 125 more rows, and 1 more variable: total <dbl>
Temukan 20 dokter dari empat negara terbesar (CA,TX,FL,NY) yang mana paling banyak membayar untuk “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>
Filter data pfizer semua pembayaran untuk kategori “Expert-Led Forums” atau “Professional Advising”, dan urutkan dokter-dokter berdasarkan abjad (nama terakhir, lalu nama awal)
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>
Pada bagian ini, kamu akan mempelajari bagaimana mengganti nama kolom pada data frame R. Selanjutnya, kamu akan mempelajari bagaimana menghitung dan menambahkan variabel baru ke data frame R. Kamu akan mempelajari fungsi R berikut dari packages dplyr:
rename() kode ini digunakan untuk mengganti nama kolom pada data frame R.mutate() menghitung dan menambahkan variabel baru ke data table. Hal ini mempertahankan variabel yang ada.transmute() menghitung kolom baru tetapi menjatuhkan variabel yang ada.# Mengubah nama kolom 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")
# Mengubah nama kolom data `pfizer` dengan packages `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` yang ada:
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 menjatuhkan data `fda` yang ada:
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
Terdapat juga angka pada fungsi join dalam dplyr untuk menyatukan data dari dua data frame. Ini merupakan fungsi join yang banyak digunakan:
inner_join() Mengembalikan nilai dari kedua tabel hanya jika ada yang sesuai.left_join() Mengembalikan semua nilai yang disebutkan dari awal tabel, dan yang dari tabel kedua yang sesuai.semi_join() Melakukan filter nilai yang disebutkan dari awal tabel untuk hanya mengandung nilai yang sesuai dengan tabel kedua.anti_join() Melakukan filter nilai yang disebutkan dari awal tabel untuk hanya mengandung nilai yang tidak sesuai dengan tabel kedua.Untuk ilustrasi, fungsi join ini akan menemukan dokter-dokter yang dibayar oleh pfizer untuk menjalankan forum yang dipimpin ahli (Expert-led forums) dimana juga telah 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")Kode pada by=c() mengartikan bagaimana join harus dibuat. Jika intruksi dalam bagaimana menggabungkan tabel tidak disediakan, dplyr akan melihat ke kolom dengan nama yang sesuai, dan menampilkan gabungannya berdasarkan hal tersebut. Perbedaan antara kedua join diatas yaitu pertama, inner_join mengandung semua kolom yang ada pada kedua data frame, sedangkan yang kedua, semi_join hanya memberi kolom dari data frame pfizer.
Pada praktiknya, kamu mungkin bisa menggunakan inner_join kemudian gunakan fungsi select() yang ada pada dplyr, untuk memilih kolom yang kamu ingin tahan, 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)Klik disini jika ingin referensi yang lebih berguna untuk mengatur join dengan dplyr.
Bagian ini menjelaskan bagaimana menghitung perhitungan statistik dengan mudah di R menggunakan package dplyr. Kamu akan belajar:
summarise() dan group_by().summarise_all() Menerapkan fungsi summary ke setiap kolom di data frame.summarise_at() Menerapkan fungsi summary ke kolom yang lebih spesifik dengan vektor karakter.summarise_if() Menerapkan fungsi summary ke kolom yang dipilih dengan fungsi predikat mengembalikan TRUE (BENAR).Hitung total pembayaran dari data pfizer, dengan urutan menurun!
## `summarise()` ungrouping output (override with `.groups` argument)
Hitung beberapa ringkasan statistik dari data pfizer, dengan urutan 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
Group dan summarize dari data pfizer untuk beberapa kategori naik!
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
Filter data fda untuk surat yang dikirim mulai tahun 2006 hingga seterusnya, dan summarize!
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
Hati-hati: menggunakan kembali variabel akan menghasilkan hasil yang tak terduga, tetapi tak perlu khawatir. R akan memberikan peringatan seperti summarise() ungrouping output (override with .groups argument).
Seperti yang sudah saya sebutkan di bab R Programming mengenai menulis fungsi untuk pelatihan split dan pengujian data. Sekarang kita akan pelajari lebih lanjut bagaimana menggunakan beberapa package dengan tujuan untuk membagi data (split data). Karena bagian ini sangat penting bagi Data Scientist khususnya ketika kamu menggunakannya untuk Machine Learning untuk analisis data. Bagian ini biasanya, kita perlu membagi dataset antara train set dan test set untuk mengembalikan ukuran kinerja. Jadi, mari kita lihat beberapa package yang dapat kamu gunakan untuk split data:
Kamu bisa gunakan dplyr untuk ini, membuat lebih sederhana. Ini memerlukan variabel Id di data kamu, dimana merupakan ide yang bagus, bukan hanya untuk membuat set tetapi juga untuk ketertelusuran selama projekmu. Tambahkan itu jika belum ada didalam data.
library(dplyr) # memuat package `dplyr`
data(mtcars) # gunakan data dari R environment
set.seed(123) # untuk memastikan kita menghasilkan data yang sama
mtcars$id <- 1:nrow(mtcars) # tambahkan `id` kedalam data jika belum ada
train <- mtcars %>% dplyr::sample_frac(.75) # tetapkan train set
test <- dplyr::anti_join(mtcars, train, by = 'id') # tetapkan test set
dim(train) # cek dimensi dari train set## [1] 24 12
## [1] 8 12
Catatan: Data ini hanya sebagai contoh, tidak cocok untuk machine learning karena data terlalu kecil.
Terdapat banyak sekali pendekatan untuk mencapai partisi data. Untuk pendekatan lebih banyak, lihatlah fungsi createDataPartition didalam package caTools.
library(caTools) # memuat package `caTools`
data(mtcars) # gunakan data dari R environment
set.seed(123) # untuk memastikan kita 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 train set
test <- mtcars[-train_ind,] # tetapkan test set
dim(train) # cek dimensi dari train set## [1] 24 11
## [1] 8 11
Package keren lainnya yang dapat kita gunakan untuk split data yaitu caret.
library(caret) # memuat package `caret`
data(mtcars) # gunakan data dari R environment
set.seed(123) # untuk memastikan kita menghasilkan data yang sama
intrain <- createDataPartition(mtcars$mpg,
p=0.75,list=FALSE)
train <- mtcars[intrain,] # tetapkan train set
test <- mtcars[-intrain,] # tetapkan test set
dim(train) # cek dimensi dari train set## [1] 25 11
## [1] 7 11