A hiányzó értékek (NA) pótlása az R-ben: na.omit & na.rm

Az adattudományban hiányzó értékek akkor fordulnak elő, ha egy megfigyelés hiányzik egy adatkeret oszlopából, vagy számérték helyett karakterértéket tartalmaz. A hiányzó értékeket el kell hagyni vagy pótolni kell, hogy az adatokból helyes következtetést lehessen levonni.

Ebben az oktatóanyagban megtanuljuk, hogyan kezeljük a hiányzó értékeket a dplyr könyvtárral. A dplyr könyvtár egy ökoszisztéma része az adatelemzés megvalósításához.

Cserélje ki a hiányzó értékeket az R-ben

Ebben az oktatóanyagban megtudhatja

mute()

A negyedik ige a dplyr könyvtár hasznos új változó létrehozásához vagy egy meglévő változó értékeinek megváltoztatásához.

Két részben folytatjuk. Megtanuljuk, hogyan:

  • zárja ki a hiányzó értékeket egy adatkeretből
  • a hiányzó értékeket az átlaggal és a mediánnal imputálja

A mute() ige nagyon könnyen használható. Létrehozhatunk egy új változót a következő szintaxis szerint:

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()

Hiányzó értékek kizárása (NA)

A dplyr könyvtár na.omit() metódusa egy egyszerű módszer a hiányzó megfigyelések kizárására. Az összes NA kidobása az adatokból egyszerű, de ez nem jelenti azt, hogy ez a legelegánsabb megoldás. Az elemzés során bölcs dolog különféle módszereket használni a hiányzó értékek kezelésére

A hiányzó megfigyelések problémájának megoldására a Titanic adatkészletet fogjuk használni. Ebben az adatállományban hozzáférünk a fedélzeten tartózkodó utasok információihoz a tragédia idején. Ez az adatkészlet sok NA-val rendelkezik, amelyekről gondoskodni kell.

Feltöltjük a csv fájlt az internetről, majd ellenőrizzük, hogy mely oszlopokban van NA. A hiányzó adatokat tartalmazó oszlopok visszaadásához a következő kódot használhatjuk:

Töltsük fel az adatokat, és ellenőrizzük a hiányzó adatokat.

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

output:

## [1] "age"  "fare"

Itt,

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Megadja azoknak az oszlopoknak a nevét, amelyek nem tartalmaznak adatokat.

Az életkor és a viteldíj oszlopok értékei hiányoznak.

Eldobhatjuk őket a na.omit() paranccsal.

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

output:

## [1] 1045   13

Az új adatkészlet 1045 sort tartalmaz, szemben az eredeti adatkészlet 1309 sorával.

A hiányzó értékek kizárása

Impulálja a hiányzó adatokat az átlaggal és a mediánnal

A hiányzó értékeket a mediánnal vagy az átlaggal is beszámíthatjuk (feltölthetjük). Egy jó gyakorlat az, ha két külön változót hozunk létre az átlaghoz és a mediánhoz. Miután létrehoztuk, a hiányzó értékeket pótolhatjuk az újonnan képzett változókkal.

Az NA-val rendelkező oszlop átlagának kiszámításához az Apply módszert fogjuk használni. Lássunk egy példát

Step 1) Az oktatóanyag korábbi részében a list_na nevű listában tároltuk az oszlopok nevét a hiányzó értékekkel. Ezt a listát fogjuk használni

Step 2) Most ki kell számítanunk az átlagot a na.rm = TRUE argumentummal. Ez az argumentum kötelező, mert az oszlopokból hiányzó adatok vannak, és ez arra utasítja R-t, hogy figyelmen kívül hagyja őket.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Kód magyarázata:

4 argumentumot adunk át az alkalmazó metódusban.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Ez a kód visszaadja a list_na objektum oszlopnevét (azaz „age” és „fare”)
  • 2: Számítsa ki a függvényt az oszlopokon
  • átlag: Számítsa ki az átlagot
  • na.rm = TRUE: A hiányzó értékek figyelmen kívül hagyása

output:

##      age     fare 
## 29.88113 33.29548

Sikeresen elkészítettük a hiányzó megfigyeléseket tartalmazó oszlopok átlagát. Ezzel a két értékkel pótoljuk a hiányzó megfigyeléseket.

Step 3) Cserélje ki az NA értékeket

A dplyr könyvtárból származó mute ige hasznos új változó létrehozásához. Nem feltétlenül akarjuk megváltoztatni az eredeti oszlopot, hogy új változót tudjunk létrehozni az NA nélkül. A mute használata egyszerű, csak kiválasztunk egy változónevet, és meghatározzuk, hogyan kell létrehozni ezt a változót. Itt a teljes kód

# 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))

Kód magyarázata:

Két változót hozunk létre, a change_mean_age és a change_mean_fare értéket a következők szerint:

  • csere_átlagos_kor = ifelse(is.na(kor), átlagos_hiányzó[1], életkor)
  • csere_átlagos_viteldíj = ifelse(is.na(viteldíj), átlagos_hiányzó[2],viteldíj)

Ha az életkor oszlopból hiányzó értékek vannak, akkor cserélje ki az átlag_hiányzó (életkor átlaga) első elemére, különben megtartja az eredeti értékeket. Ugyanez a logika a viteldíjnál

sum(is.na(df_titanic_replace$age))

output:

## [1] 263

Hajtsa végre a cserét

sum(is.na(df_titanic_replace$replace_mean_age))

output:

## [1] 0

Az eredeti oszlopkor 263 hiányzó értéket tartalmaz, míg az újonnan létrehozott változó ezeket az életkor átlagával helyettesítette.

Step 4) A hiányzó megfigyeléseket a mediánnal is pótolhatjuk.

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)

output:

Impulálja a hiányzó adatokat az átlaggal és a mediánnal

Step 5) Egy nagy adatkészlet sok hiányzó értéket tartalmazhat, és a fenti módszer nehézkes lehet. Az összes fenti lépést végrehajthatjuk egy kódsorban a saply() metódussal. Bár nem ismernénk az átlag és a medián értékeit.

az apply nem hoz létre a adatkeret, így a sapply() függvényt becsomagolhatjuk a data.frame() keretbe, hogy adatkeret objektumot hozzunk létre.

# 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)))

Összegzésként

Három módszerünk van a hiányzó értékek kezelésére:

  • Zárja ki az összes hiányzó megfigyelést
  • Imputáld az átlaggal
  • Imputáld a mediánnal

Az alábbi táblázat összefoglalja, hogyan távolíthatja el az összes hiányzó megfigyelést

könyvtár Objektív Kód
bázis Sorolja fel a hiányzó megfigyeléseket
colnames(df)[apply(df, 2, anyNA)]
dplyr Távolítsa el az összes hiányzó értéket
na.omit(df)

Az átlaggal vagy mediánnal való imputálás kétféleképpen történhet

  • Az alkalmazás használata
  • Sapply használata
Módszer Részletek Előnyök Hátrányok
Lépésről lépésre az alkalmazással Ellenőrizze a hiányzó oszlopokat, számítsa ki az átlagot/mediánt, tárolja az értéket, cserélje ki a mute() Tudod az átlag/medián értékét Több végrehajtási idő. Lassú lehet nagy adatkészlettel
Gyors út, applikátorral A sapply() és data.frame() használatával automatikusan megkeresheti és a hiányzó értékeket átlag/mediánra cserélheti Rövid kód és gyors Nem ismeri az imputációs értékeket