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 Dataapply()
Mengecek dan menggantikan nilai yang hilangselect()
Memilih kolom yang ingin dimuatfilter()
Memilih bagian dari data yang ditentukanarrange()
Menggolongkan data, berdasarkan ukuran untuk variabel tak terhingga, berdasarkan tanggal, atau berdasarkan abjadrename()
mengganti nama kolommutate()
Membuat kolom baru di data, atau mengubah kolom yang sudah adabind_rows()
Menggabungkan dua data frame menjadi satu, mengkombinasikan data dari menurut kolom yang mempuyai nama yang samagroup_by()
Mengelompokkan data menurut variabel syaratsummarize()
Meringkas, atau menggabungkan (setiap grup jika mengikuti group_by
). Biasanya digunakan bersamaan dengan :
mean()
Menghitung rataan, atau rata-rata.meadian()
Menghitung nilai tengahmax()
Mencari nilai tertinggimin()
Mencari nilai terendahsum()
Menjumlahkan semua nilai bersamaann()
menghitung berapa jumlah dari dokumensaya 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.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()
## )
##
## -- Column specification --------------------------------------------------------
## cols(
## name_last = col_character(),
## name_first = col_character(),
## name_middle = col_character(),
## issued = col_date(format = ""),
## office = col_character()
## )
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 :
## 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()
## .. )
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 dataas.numeric()
dijadikan angkaas.factor()
dijadikan variabel kategorias.integer()
dijadikan bilangan bulatas.Date()
dijadikan tanggalas.POSIXct()
dijadikan tanggal dan waktusebagai 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)
## num [1:10087] 2625 1000 448 119 1800 ...
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)
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
df
titanic[,colnames(titanic)%in%list_na]. kode ini akan mengembalikan nama kolom dari list_na objek (i.e. “age” dan “fare”)2
menghitung fungsi pada kolommean
menghitung rataanna.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
## [1] 1
## [1] 0
## [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.
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.starts_with()
, ends_with()
, contains()
, matches()
: memilih kolom. variabel berdasarkan namaSekarang 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.
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>
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>
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>
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>
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>
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>
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 Rmutate()
menghitung dan menambahkan variabel baru kedalam tabel Data. ini menjaga variabel yang telah adatransmute()
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
adapun beberapa fungsi menyatukan data di dplyr
untuk menggabungkan data dri 2 data frame. berikut adalah yang paling digunakan :
inner_join()
mengembalikan nilai dari kedua tabel jika mempunyai kesamaanleft_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 keduaanti_join()
memilah tabel pertama untuk memasukkan nilai yang tidak mempunyai kesamaan dari tabel kedua.untuk menggambarkan fungsi diatas akan digunakan untuk menemukan pembayaran dokter pfizer
untuk 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, dplyr
akan 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 pfizer
data 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
bagian ini memperkenalkan bagaiman menghitung dengan mudah kesimpulan perhitungan menggunakan paket dplyr
. kamu akan belaar, bagaimana :
summarise()
dan group_by()
.summarise_all()
menerapkan fungsi ringkas setiap kolom data frame.summarise_at()
menerapkan fungsi ringkas untuk kolom tertentu yang dipilih dengan karakter vektorsummarise_if()
menerapkan fungsi ringkas ke kolom yang dipilih dengan fungsi predikat yang TRUEmenghitung total pembayaran data pfizer
, berdasarkan penurunan negara
## `summarise()` ungrouping output (override with `.groups` argument)
## # 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
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)
## # 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 rinkgas data pfizer
untuk 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)
## # 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)
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:
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
## [1] 8 12
catatan : jika kumpulan data sebagai contoh , tidak cocok untuk pembelajaran tugas mesin karena datanya terlalu kecil.
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
## [1] 8 11
Adapun paket yang bagus yang dapat digunakan untuk memisahkan kumpulan data adalah 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
## [1] 7 11