Cara Mengganti Nilai yang Hilang (NA) di R: na.omit & na.rm
Nilai yang hilang dalam ilmu data muncul ketika observasi hilang di kolom bingkai data atau berisi nilai karakter, bukan nilai numerik. Nilai yang hilang harus dihilangkan atau diganti untuk menarik kesimpulan yang benar dari data.
Dalam tutorial ini, kita akan mempelajari cara menangani nilai yang hilang dengan pustaka dplyr. Pustaka dplyr merupakan bagian dari ekosistem untuk mewujudkan analisis data.
Dalam tutorial ini, Anda akan belajar
mengubah()
Kata kerja keempat dalam perpustakaan dplyr berguna untuk membuat variabel baru atau mengubah nilai variabel yang sudah ada.
Kami akan melanjutkan dalam dua bagian. Kita akan belajar bagaimana:
- mengecualikan nilai yang hilang dari bingkai data
- menghubungkan nilai yang hilang dengan mean dan median
Kata kerja mutate() sangat mudah digunakan. Kita dapat membuat variabel baru dengan mengikuti sintaks berikut:
mutate(df, name_variable_1 = condition, ...) arguments: -df: Data frame used to create a new variable -name_variable_1: Name and the formula to create the new variable -...: No limit constraint. Possibility to create more than one variable inside mutate()
Kecualikan Nilai yang Hilang (NA)
Metode na.omit() dari pustaka dplyr adalah cara sederhana untuk mengecualikan observasi yang hilang. Menghilangkan semua NA dari data itu mudah, tetapi bukan berarti itu adalah solusi yang paling elegan. Selama analisis, sebaiknya gunakan berbagai metode untuk menangani nilai yang hilang.
Untuk mengatasi masalah observasi yang hilang, kami akan menggunakan dataset Titanic. Dalam kumpulan data ini, kami memiliki akses terhadap informasi penumpang di pesawat saat tragedi tersebut. Dataset ini memiliki banyak NA yang perlu diperhatikan.
Kita akan mengunggah berkas csv dari internet dan kemudian memeriksa kolom mana yang memiliki NA. Untuk mengembalikan kolom dengan data yang hilang, kita dapat menggunakan kode berikut:
Ayo unggah data dan verifikasi data yang hilang.
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv" df_titanic <- read.csv(PATH, sep = ",") # Return the column names containing missing observations list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ] list_na
Keluaran:
## [1] "age" "fare"
Di sini,
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Memberi nama kolom yang tidak memiliki data.
Kolom age dan fare memiliki nilai yang hilang.
Kita bisa membuangnya dengan na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
Keluaran:
## [1] 1045 13
Dataset baru berisi 1045 baris dibandingkan 1309 dengan dataset asli.
Perhitungkan data yang Hilang dengan Mean dan Median
Kita juga dapat menghubungkan (mengisi) nilai yang hilang dengan median atau mean. Praktik yang baik adalah membuat dua variabel terpisah untuk mean dan median. Setelah dibuat, kita dapat mengganti nilai yang hilang dengan variabel yang baru dibentuk.
Kami akan menggunakan metode apply untuk menghitung mean kolom dengan NA. Mari kita lihat sebuah contoh
Langkah 1) Sebelumnya di tutorial, kita menyimpan nama kolom dengan nilai yang hilang dalam daftar yang disebut list_na. Kami akan menggunakan daftar ini
Langkah 2) Sekarang kita perlu menghitung mean dengan argumen na.rm = TRUE. Argumen ini wajib karena kolom mempunyai data yang hilang, dan ini memberitahu R untuk mengabaikannya.
# Create mean average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, mean, na.rm = TRUE) average_missing
Penjelasan Kode:
Kami meneruskan 4 argumen dalam metode penerapan.
- df: df_titanic[,nama kolom(df_titanic) %dalam% list_na]. Kode ini akan mengembalikan nama kolom dari objek list_na (yaitu “usia” dan “tarif”)
- 2: Hitung fungsi pada kolom
- mean: Hitung meannya
- na.rm = TRUE: Abaikan nilai yang hilang
Keluaran:
## age fare ## 29.88113 33.29548
Kami berhasil membuat mean kolom yang berisi observasi yang hilang. Kedua nilai ini akan digunakan untuk menggantikan observasi yang hilang.
Langkah 3) Ganti Nilai NA
Kata kerja mutate dari perpustakaan dplyr berguna dalam membuat variabel baru. Kita tidak serta merta ingin mengubah kolom asli sehingga kita bisa membuat variabel baru tanpa NA. mutate mudah digunakan, kita tinggal memilih nama variabel dan menentukan cara membuat variabel ini. Berikut kode lengkapnya
# Create a new variable with the mean and median df_titanic_replace <- df_titanic %>% mutate(replace_mean_age = ifelse(is.na(age), average_missing[1], age), replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))
Penjelasan Kode:
Kami membuat dua variabel, replace_mean_age dan replace_mean_fare sebagai berikut:
- replace_mean_age = ifelse(is.na(usia), rata-rata_hilang[1], usia)
- replace_mean_fare = ifelse(is.na(tarif), rata-rata_hilang[2],tarif)
Jika kolom age memiliki nilai yang hilang, ganti dengan elemen pertama rata-rata_hilang (rata-rata usia), jika tidak pertahankan nilai aslinya. Logika yang sama untuk tarif
sum(is.na(df_titanic_replace$age))
Keluaran:
## [1] 263
Lakukan penggantian
sum(is.na(df_titanic_replace$replace_mean_age))
Keluaran:
## [1] 0
Kolom age yang asli memiliki 263 nilai yang hilang sedangkan variabel yang baru dibuat telah menggantinya dengan mean dari variabel age.
Langkah 4) Kita juga bisa mengganti observasi yang hilang dengan median.
median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, median, na.rm = TRUE) df_titanic_replace <- df_titanic %>% mutate(replace_median_age = ifelse(is.na(age), median_missing[1], age), replace_median_fare = ifelse(is.na(fare), median_missing[2], fare)) head(df_titanic_replace)
Keluaran:
Langkah 5) Kumpulan data besar mungkin memiliki banyak nilai yang hilang dan metode di atas mungkin rumit. Kita dapat menjalankan semua langkah di atas dalam satu baris kode menggunakan metode sapply(). Padahal kita tidak akan mengetahui nilai mean dan median.
sapply tidak membuat a bingkai data, sehingga kita dapat menggabungkan fungsi sapply() di dalam data.frame() untuk membuat objek bingkai data.
# Quick code to replace missing values with the mean df_titanic_impute_mean < -data.frame( sapply( df_titanic, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))
Ringkasan
Kami memiliki tiga metode untuk menangani nilai yang hilang:
- Kecualikan semua pengamatan yang hilang
- Menyalahkan dengan maksudnya
- Perhitungkan dengan median
Tabel berikut merangkum cara menghapus semua observasi yang hilang
Perpustakaan | Tujuan | Kode |
---|---|---|
mendasarkan | Buat daftar pengamatan yang hilang |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Hapus semua nilai yang hilang |
na.omit(df) |
Imputasi dengan mean atau median dapat dilakukan dengan dua cara
- Menggunakan terapkan
- Menggunakan aplikasi
metode | Rincian | Kelebihan | Kekurangan |
---|---|---|---|
Langkah demi langkah dengan melamar | Periksa kolom yang hilang, hitung mean/median, simpan nilainya, ganti dengan mutate() | Anda tahu nilai sarana/median | Waktu eksekusi lebih lama. Bisa lambat dengan kumpulan data besar |
Cara cepat dengan sapply | Gunakan sapply() dan data.frame() untuk secara otomatis mencari dan mengganti nilai yang hilang dengan mean/median | Kode pendek dan cepat | Tidak tahu nilai imputasinya |