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.

Ganti Nilai yang Hilang di R

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.

Kecualikan Nilai yang Hilang

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:

Perhitungkan data yang Hilang dengan Mean dan Median

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