Salah satu skill yang mendasar untuk seorang Data Scientist adalah Persiapan Data (Manupulasi data). Agar benar-benar efektif, anda harus benar-benar menguasai untuk memanipulasi data yang penting. Karena sebagian besar pekerjaan anda hanya akan melibatkan pengambilan dan pembersihan data.
Data scientist menggunakan 60% waktunya untuk membersihkan dan merapikan data. Mengumpulkan dataset berada di urutan kedua dengan 19% waktunya, yang berarti data scientist menghabiskan sekitar 80% waktunya untuk menyiapkan dan mengelola data untuk analisis.
Di bagian ini, anda akan mempelajari cara melakukan persiapan data dengan mudah menggunakan R. Kami akan membahas beberapa kata kerja manipulasi data mendasar yang paling sering anda gunakan dalam pekerjaan anda.
read_csv() Mengimpor data (anda bisa mengikuti yang lain)str() Struktur Dataapply() Untuk memeriksa dan mengganti data yang hilangselect() Memilih kolum mana yang akan dimasukkanfilter() Memilih subset dari data yang ditentukanarrange() Menyusun data, dari ukuran variabel kontinu, berdasarkan tanggal, atau secara alfabetrename() Mengganti nama kolommutate() Membuat kolom baru pada data, atau mengganti kolom yang sudah adabind_rows() Menggabungkan dua data frame menjadi satu, mengkombinasikan data dari kolom yang namanya samagroup_by() Mengelompokkan data berdasarkan kategori variabelnyasummarize() Menyimpulkan, atau mengumpulan data (untuk masing-masing group jika menggunakan group_by). Biasa digunakan di konjungsi dengan beberapa fungsi termasuk:
mean() Mencari mean, atau rata-ratamedian() Mencari median atau nilai tengahmax() Mencari nilai maksimummin() Mencari nilai minimunsum() Menjumlahkan semua nilai secara bersamaann() Menghitung angka pada catatanSaya merekomendasikan anda untuk menginstall package tidyverse. Karena inti dari tidyverse termasuk packages yang kemungkinan besar akan anda gunakan setiap menganalisis data.
install.packages("tidyverse")
Kita terutama akan bekerja menggunakan dua packages yang sangat berguna yang dikembangkan oleh Hadley Wickham, kepala ilmuwan di Rstudio:
readr untuk membaca dan menulis CSV dan teks file lainnya.dplyr untuk memproses dan memanipulasi data.Data yang akan kita gunakan di bagian ini adalah pfizer.csv dan fda.csv, silahkan download dan letakkan di dekstop anda. Sebagai opsional, anda dapat memuat data ke R session saat ini dengan memilih Import Dataset > From text File... di Encironent tab. Tetapi, dalam kasur ini, kita akan menggunakan fungsi read_csv() dari package readr. Salin kode berikut kedalam script anda dan jalankan:
suppressPackageStartupMessages(library(tidyverse)) # Dalam diam memuat tidyverse
#setwd("C:\Users\vferd\Documents\Sherly\Campus\Semester 3\Algoritma\week 10") # Ingat untuk mengatur working directory
pfizer <- read_csv("data/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()
## )
Perhatikan bahwa anda perlu pemahaman yang kuat mengenai jenis data dasar dan struktur data serta cara mengoprasikannya. Fungsi str() akan memberi tahu anda lebih banyak tentang kolom dalam data anda beserta tipe datanya. Salin kode ini ke script anda dan jalankan:
## 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()
## .. )
Hal ini sangat penting untuk dimengerti karena ini adalah objek yang akan anda manipulasi dari hari ke hari berbasis R. Jika anda perlu untuk mengubah tipe data dari kolom tertentu, gunakan fungsi berikut:
as.character() mengubah menjadi teks string.as.numeric() mengubah menjadi numerik.as.factor() mengubah menjadi variabel kategorikal.as.integer() mengubah menjadi integeras.Date() mengubah menjadi tangaglas.POSIXct() mengubah menjadi tanggal dan waktu secara lengkapMisalnya, tambahkan kode berikut ke skrip anda untuk mengonversi total yang dikonversi dalam data pfizer menjadi variabel numerik (yang akan memungkinkannya menyimpan nilai desimal jika ada).
pfizer$total <- as.numeric(pfizer$total) # Mengkonversi total ke variabel numerik
str(pfizer$total) # Mari mengecek struktur data itu kembali## num [1:10087] 2625 1000 448 119 1800 ...
Tidak seperti pemograman biasa, saat bekerja dengan data di kehidupan nyata, mungkin anda memiliki nilai yang hilang: pengukuran data yang tidak direkam/ disimpan/ dll. R memiliki mekanisme yang cukup canggih untuk mengatasi nilai yang hilang. Ini membedakan antara jenis berikut:
NA: Entri tidak tersedia (nilai NA juga memiliki kelas, jadi ada bilangan bulat NA, karakter NA, dan sebagainya)NaN: Bukan angka (nilai NaN juga NA tetapi konversinya tidak benar)Mencari nilai yang hilang dari kolom pada data frame pfizer
is.na(pfizer) # cara klasik untuk memeriksa NA
sum(is.na(pfizer)) # menghitung NA
apply(is.na(pfizer),2, which) # yang manakah indeks NA (hanya df)
which(complete.cases(pfizer)) # mengidentifikasi nilai lengkap yang diamatiMekanisme yang lebih umum adalah menghapusnya secara manual:
clean.vector<- na.omit(pfizer$first_name) # membersihkan/menghapus vektor NA
clean.df <- na.omit(pfizer) # membersihkan/menghapus dataframe NA
apply(is.na(clean.df),2, which) # memastikan bahwa disana ada nilai yang hilang## integer(0)
Kita juga bisa mengganti nilai yang hilang dengan mean (median). Praktik yang baik adalah membuat dua variabel terpisah untuk mean. Setelah dibuat, kita dapat mengganti nilai yang hilang dengan variabel yang baru dibentuk. 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 kolom dengan NA. Pertama, kita perlu menghitung mean dengan argumen na.rm = TRUE. Argumen ini wajib karena kolom memiliki data yang hilang, dan ini memberitahu 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 Code: Kita memiliki 4 argumen dalam metode apply.
df titanic[,colnames(titanic) %in% list_na]. Code ini akan mengembalikan nama kolom dari objek list_na (yaitu, “age” dan “fare”)2 Menghitung fungsi pada kolommean Menghitung rata-rata/meanna.rm = TRUE Mengabaikan nilai yang hilangSelanjutnya, kita dapat mengganti nilai NA. Kata kerja ‘mutate’ dari pustaka dplyr berguna dalam membuat variabel baru. Kami tidak perlu mengubah kolom asli sehingga kami dapat membuat variabel baru tanpa NA. ‘mutate’ mudah digunakan, kita hanya tinggal memilih nama variabel dan menentukan cara membuat variabelnnya. Berikut 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
## [1] 1
## [1] 0
## [1] 0
Pada kolom umur yang original, terdapat 86 nilai yang hilang dimana pada variabel yang baru dibuat menggantikannya dengan mean dan variabel age. Anda dapat mencoba sendiri untuk mengganti observasi yang hilang dengan median juga.
Pada bagian ini, anda akan mempelajari bagaimana cara memilih atau mensubset kolom dataframe berdasarkan nama dan posisi menggunakan fungsi R select() pada package dplyr. Anda akan mempelajari cara menggunakan fungsi fungsi berikut:
pull() Mengekstrak nilai kolom sebagai vektor. Kolom Interest dapat ditentukan berdasarkan nama atau indeks.select() Mengekstrak satu atau beberapa kolom sebagai tabel data. Ini juga bisa digunakan untuk menghapus kolom dari dataframe.select_if() Memilih kolom berdasarkan kondisi tertentu. Fungsi ini dapat digunakan untuk misalnya memilih kolom jika bentuknya numerik.starts_with(), ends_with(), contains(), matches() : Memilih kolom atau variabel berdasarkan namanya.library(tidyverse) # menjalankan `tidyverse`, yang termasuk dalam `dplyr`
pfizer %>% pull(state) %>% head() # mengekstract nilai kolom 'state' sebagai vektor
pfizer %>% select(1:3) # memilih kolom 1 sampai 3
pfizer %>% select(1,3) # memilih kolom 1 dan 3
pfizer %>% select(state:total) # memilih semua kolom dari `state` sampai `total`
pfizer %>% select(state,total) # memilih kolom bersadarkan nama variabelnya
pfizer %>% select_if(is.numeric) # hanya memilih kolom numerik
pfizer %>% select_if(is.character) # hanya memilih kolom character
pfizer %>% select(starts_with("first")) # Memilih kolom yang dimulai dengan `first`
pfizer %>% select(ends_with("name")) # Memilih kolom yang diakhiri dengan `name`
pfizer %>% select(contains("rst")) # Memilih kolom yang namanya mencakup `rst`
pfizer %>% select(matches("_")) # Memilih kolom yang namanya cocok dengan yang biasa
pfizer %>% select(-(state:total)) # Menghapus semua kolom mulai dari `state` hingga `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 code berikut ke script anda dan lihat hasilnya. Perhatikan bagaimana kita membuat objek baru untuk menampung data yang diproses.
Temukan dokter di California yang dibayar $10,000 atau lebih oleh Pfizer untuk menjalankan “Professional Advising”!
ca_expert_10000 <- pfizer %>% # menjalankan semua `pfizer`
filter(state == "CA" & # menjalankan semua pfizer `pfizer` yang di filter berdasarkan `state`
total >= 10000 & # juga di filter berdasarkan `total` lebih besar/sama dengan 10000
category == "Professional Advising") # lalu filter bersadarkan 'category'
ca_expert_10000 # Menprint 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 sort di akhir code untuk mengurutkan membuat daftar dokter secara menurun berdasarkan pembayaran yang diterima!
ca_expert_10000 <- pfizer %>% # menjalankan semua `pfizer`
filter(state == "CA" & # difilter berdasarkan `state` di California
total >= 10000 & # juga difilter berdasarkan `total` lebih besar/sama dengan 10000
category == "Professional Advising")%>% # lalu difilter lagi berdasarkan `category`
arrange(desc(total)) # Mengurutkan order berdasarkan pembayaran yang diterima secara menurun
ca_expert_10000 # memprint 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 di California atau Newyork yang dibayar $10.000 atau lebih menggunakan Pfizer untuk menjalankan “Professional Advising”!
Perhatikan bahwa, dalam hal ini kita menggunakan | Operator Boolean, dan t anda kurung di sekitar bagian querynya. Ini memastikan bahwa bagian Query ini dijalankan pertama kali. Lihat apa yang terjadi jika Anda mengecualikan mereka.
ca_ny_expert_10000 <- pfizer %>% # menjalankan semua `pfizer`
filter((state == "CA" | state == "NY") & # filter berdasarkan `state` California atau New York
total >= 10000 & # juga difilter berdasarkan `total` sama dengan/ lebih dari 10000
category == "Professional Advising")%>% # lalu difilter lagi berdasarkan `category`
arrange(desc(total)) # Mengurutkan order berdasarkan pembayaran yang diterima secara menurun
ca_ny_expert_10000 # memprint 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 di negara bagian selain California yang dibayar $10,000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!
not_ca_expert_10000 <- pfizer %>% # menjalankan semua `pfizer`
filter(state != "CA" & # filter berdasarkan `state` selain California
total >= 10000 & # juga difilter berdasarkan `total` sama dengan/ lebih dari 10000
category == "Professional Advising")%>% # lalu difilter lagi berdasarkan `category`
arrange(desc(total)) # Mengurutkan order berdasarkan pembayaran yang diterima secara menurun
not_ca_expert_10000 # memprint 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 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>
Temukan 20 dokter yang ada di empat negara bagian terbesar (CA, TX, FL, NY) yang dibayar terbanyak 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 untuk semua pembayaran untuk menjalankan “Expert-Led Forums” atau “Professional Advising”, dan susun berdasarkan abjad dokter (nama belakang, lalu 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>
Pada bagian ini, anda akan mempelajari bagaimana cara mengganti nama kolom pada sebuah dataframe di R. Anda akan mempelajari fungsi R berikut dari package dplyr pada R:
rename() Kode ini digunakan untuk mengganti nama kolom dari sebuah dataframe R.mutate() Menghitung dan menambah variabel baru kedalam data table. Ini mempertahankan variabel yang ada.transmute() Menghitung kolom baru tetapi menghilang variabel yang ada.# Mengganti nama kolom data `pfizer` dengan fungsi basis 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 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>
# Add new columns (year*) by preserving existing 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
# Menambah kolom baru (year*) dan (last_name*) dengan menghilangkan data yang ada `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
Ada juga sejumlah fungsi gabungan di dplyr untuk menggabungkan data dari dua dataframe. Berikut ini yang paling berguna:
inner_join() Mengembalikan nilai dari kedua table hanya jika terdapat kecocokan.left_join() Mengembalikan semua nilai dari tabel yang disebutkan pertama, ditambah nilai dari tabel kedua yang cocok.semi_join() Memfilter tabel yang disebutkan pertama untuk menyertakan hanya nilai yang memiliki kecocokan pada tabel kedua.anti_join() Memfilter tabel yang disebutkan pertama untuk menyertakan hanya nilai yang tidak memiliki kecocokan di tabel kedua.Sebagai ilustrasi, gabungan ini akan menemukan dokter yang dibayar oleh Pfizer untuk menjalankan forum yang dipimpin oleh ahli yang 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 by=c() mendefinisikan bagaimana gabungan harus dibuat. Jika instruksi tentang cara menggabungkan tabel tidak disediakan, dplyr akan mencari kolom dengan nama yang cocok, dan melakukan penggabungan berdasarkan itu. Perbedaan antara dua gabungan di atas adalah yang pertama berisi semua kolom dari kedua dataframe, sedangkan yang kedua hanya memberikan kolom dari dataframe pfizer.
Dalam praktiknya, Anda mungkin ingin menggunakan inner_join dan kemudian menggunakan fungsi select dplyr untuk memilih kolom yang ingin Anda pertahankan, misalnya:
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)Tekan disini untuk lebih banyak referensi yang berguna untuk mengelola gabungan dengan dplyr.
Bagian ini memperkenalkan cara mudah menghitung ringkasan statistik dalam R menggunakan paket dplyr. Anda akan mempelajari, bagaimana:
summarise() dan group_by().summarise_all() Terapkan fungsi ringkasan ke setiap kolom di dataframe.summarise_at() Menerapkan fungsi ringkasan ke kolom tertentu yang dipilih dengan vektor karaktersummarise_if() Menerapkan fungsi ringkasan ke kolom yang dipilih dengan fungsi predikat yang mengembalikan TRUEHitung total pembayaran data pfizer, berdasarkan negara bagian secara menurun.
## `summarise()` ungrouping output (override with `.groups` argument)
Hitung beberapa tambahan ringkasan statistik dari pfizer data, menurut status 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
Kelompokkan dan ringkaslah data pfizer untuk beberapa kategori secara 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-surat yang dikirim dari awal tahun 2006 dan seterusnya dan ringkaslah!
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
Peringatan: menggunakan kembali variabel dapat menyebabkan hasil yang tidak diharapkan, tetapi jangan khawatir. R akan memberi peringatan seperti summarise() ungrouping output (override with .groups argument).
Seperti yang telah saya sebutkan di bab Pemograman R tentang fungsi penulisan untuk membagi data pelatihan dan pengujian. Di sini, kita akan belajar lebih banyak tentang bagaimana menggunakan beberapa packages untuk membagi data. Karena bagian ini sangat penting bagi data scientist terutama saat Anda menerapkan tugas Machine Learning untuk menganalisis data. Pada bagian ini biasanya kita perlu membagi dataset antara train set dan test set. Train set memungkinkan algoritma untuk belajar dari data. Untuk menguji kinerja model kita, kita dapat menggunakan set pengujian untuk mengembalikan ukuran kinerja. Jadi, mari kita lihat beberapa package yang dapat Anda gunakan untuk membagi data:
Anda dapat menggunakan dplyr untuk membuatnya menjadi sangat sederhana. Hal ini memang membutuhkan variabel id pada data set anda, yang merupakan ide bagus, tidak hanya untuk membuat set tetapi juga untuk keterlacakan selama proyek anda. Tambahkan jika belum berisi.
library(dplyr) # menjalankan package `dplyr`
data(mtcars) # Menggunakan data dari R
set.seed(123) # Untuk memastikan kita menjalankan data yang sama
mtcars$id <- 1:nrow(mtcars) # menambahkan variabel `id` apabila belum terdapat variabel tersebut.
train<-mtcars %>% dplyr::sample_frac(.75) # menetapkan train set
test<-dplyr::anti_join(mtcars, train, by = 'id') # menetapkan test set
dim(train) # mengecek dimensi dari train set## [1] 24 12
## [1] 8 12
Catatan: Pada dataset(kumpulan data) ini, misalnya, tidak cocok untuk tugas Machine Learning karena datanya terlalu kecil.
Ada banyak pendekatan untuk melakukan partisi data. Untuk pendekatan yang lebih lengkap, lihat fungsi createDataPartition dalam package caTools.
library(caTools) # menjalankan package `caTools`
data(mtcars) # Menggunakan data dari R
set.seed(123) # Untuk memastikan kita menjalankan data yang sama
smp_size <- floor(0.75 * nrow(mtcars)) # 75% dari ukuran sample
train_ind <- sample(seq_len(nrow(mtcars)),
size = smp_size)
train <- mtcars[train_ind, ] # menetapkan train set
test <- mtcars[-train_ind, ] # menetapkan test set
dim(train) # mengecek dimensi dari train set## [1] 24 11
## [1] 8 11
Paket hebat lainnya yang dapat anda gunakan untuk membagi dataset adalah caret.
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
data(mtcars) # Menggunakan data dari R
set.seed(123) # Untuk memastikan kita menjalankan 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
## [1] 7 11