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.
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.
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:
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 |