Puuttuvien arvojen (NA) korvaaminen R:ssä: na.omit & na.rm
Datatieteessä puuttuvat arvot syntyvät, kun havainto puuttuu tietokehyksen sarakkeesta tai sisältää merkkiarvon numeroarvon sijaan. Puuttuvat arvot on poistettava tai korvattava, jotta tiedoista voidaan tehdä oikea johtopäätös.
Tässä opetusohjelmassa opimme käsittelemään puuttuvia arvoja dplyr-kirjaston avulla. dplyr-kirjasto on osa ekosysteemiä data-analyysin toteuttamiseksi.
Tässä opetusohjelmassa opit
muuttua()
Neljäs verbi dplyr-kirjasto on hyödyllistä luoda uusi muuttuja tai muuttaa olemassa olevan muuttujan arvoja.
Jatketaan kahdessa osassa. Opimme kuinka:
- sulje pois puuttuvat arvot tietokehyksestä
- laskea puuttuvat arvot keskiarvolla ja mediaanilla
Verbi mutate() on erittäin helppokäyttöinen. Voimme luoda uuden muuttujan noudattamalla tätä syntaksia:
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()
Sulje pois puuttuvat arvot (NA)
Dplyr-kirjaston na.omit()-menetelmä on yksinkertainen tapa sulkea pois puuttuvat havainnot. Kaiken NA:n pudottaminen tiedoista on helppoa, mutta se ei tarkoita, että se olisi tyylikkäin ratkaisu. Analyysin aikana on viisasta käyttää erilaisia menetelmiä puuttuvien arvojen käsittelemiseen
Puuttuvien havaintojen ongelman ratkaisemiseksi käytämme Titanic-tietoaineistoa. Tässä tietoaineistossa meillä on pääsy lentokoneessa olevien matkustajien tietoihin tragedian aikana. Tässä tietojoukossa on monia NA:ita, joista on huolehdittava.
Lataamme csv-tiedoston Internetistä ja tarkistamme sitten, missä sarakkeissa on NA. Palauttaaksemme sarakkeet, joissa on puuttuvia tietoja, voimme käyttää seuraavaa koodia:
Ladataan tiedot ja tarkistetaan puuttuvat tiedot.
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
lähtö:
## [1] "age" "fare"
Täällä
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Antaa nimet sarakkeille, joissa ei ole tietoja.
Ikä- ja hintasarakkeista puuttuvat arvot.
Voimme pudottaa ne komennolla na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
lähtö:
## [1] 1045 13
Uusi tietojoukko sisältää 1045 riviä verrattuna 1309 riviin alkuperäisessä tietojoukossa.
Imputoi puuttuvat tiedot keskiarvolla ja mediaanilla
Voisimme myös laskea (populoida) puuttuvat arvot mediaanilla tai keskiarvolla. Hyvä käytäntö on luoda kaksi erillistä muuttujaa keskiarvolle ja mediaanille. Kun se on luotu, voimme korvata puuttuvat arvot vasta muodostetuilla muuttujilla.
Käytämme soveltamismenetelmää sarakkeen keskiarvon laskemiseen NA:lla. Katsotaanpa esimerkkiä
Vaihe 1) Aiemmin opetusohjelmassa tallensimme sarakkeiden nimet ja puuttuvat arvot luetteloon lista_na. Käytämme tätä luetteloa
Vaihe 2) Nyt meidän on laskettava keskiarvo argumentilla na.rm = TOSI. Tämä argumentti on pakollinen, koska sarakkeista puuttuu tietoja, ja tämä käskee R:tä ohittamaan ne.
# Create mean average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, mean, na.rm = TRUE) average_missing
Koodin selitys:
Välitämme 4 argumenttia soveltamismenetelmässä.
- df: df_titanic[,colnames(df_titanic) %in% list_na]. Tämä koodi palauttaa sarakkeiden nimet list_na-objektista (eli "age" ja "fare")
- 2: Laske sarakkeiden funktio
- keskiarvo: Laske keskiarvo
- na.rm = TOSI: Ohita puuttuvat arvot
lähtö:
## age fare ## 29.88113 33.29548
Loimme onnistuneesti puuttuvia havaintoja sisältävien sarakkeiden keskiarvon. Näitä kahta arvoa käytetään korvaamaan puuttuvat havainnot.
Vaihe 3) Vaihda NA-arvot
Dplyr-kirjaston verbi mutate on hyödyllinen uuden muuttujan luomisessa. Emme välttämättä halua muuttaa alkuperäistä saraketta, jotta voimme luoda uuden muuttujan ilman NA:ta. mutate on helppokäyttöinen, valitsemme vain muuttujan nimen ja määritämme kuinka tämä muuttuja luodaan. Tässä on täydellinen koodi
# 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))
Koodin selitys:
Luomme kaksi muuttujaa, korvaa_keskiarvo ja korvaa_mean_fare seuraavasti:
- korvaa_keskimääräinen_ikä = ifelse(on.na(ikä), keskimääräinen_puuttuva[1], ikä)
- korvaa_keskihinta = ifelse(on.na(hinta), keskimääräinen_puuttuu[2],hinta)
Jos sarakkeesta ikä puuttuu arvoja, vaihda ensimmäisellä elementillä medium_missing (iän keskiarvo), muuten säilytä alkuperäiset arvot. Sama logiikka hinnoissa
sum(is.na(df_titanic_replace$age))
lähtö:
## [1] 263
Suorita vaihto
sum(is.na(df_titanic_replace$replace_mean_age))
lähtö:
## [1] 0
Alkuperäisestä sarakkeesta ikä puuttuu 263 arvoa, kun taas uusi muuttuja on korvannut ne muuttujan iän keskiarvolla.
Vaihe 4) Voimme korvata puuttuvat havainnot myös mediaanilla.
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)
lähtö:
Vaihe 5) Isossa datajoukossa voi olla paljon puuttuvia arvoja ja yllä oleva menetelmä voi olla hankala. Voimme suorittaa kaikki yllä olevat vaiheet yhdellä koodirivillä käyttämällä saply()-menetelmää. Vaikka emme tietäisi keskiarvon ja mediaanin arvoja.
sapply ei luo a datakehys, joten voimme kääriä sapply()-funktion data.frame()-tiedostoon datakehysobjektin luomiseksi.
# 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)))
Yhteenveto
Meillä on kolme tapaa käsitellä puuttuvia arvoja:
- Sulje pois kaikki puuttuvat havainnot
- Imuta keskiarvolla
- Imuta mediaanin kanssa
Seuraavassa taulukossa on yhteenveto siitä, kuinka kaikki puuttuvat havainnot poistetaan
Kirjasto | Tavoite | Koodi |
---|---|---|
pohja | Listaa puuttuvat havainnot |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Poista kaikki puuttuvat arvot |
na.omit(df) |
Imputointi keskiarvolla tai mediaanilla voidaan tehdä kahdella tavalla
- Käytä sovellusta
- Sapplyn käyttö
Menetelmä | Lisätiedot | edut | Haitat |
---|---|---|---|
Askel askeleelta hakemuksen kanssa | Tarkista sarakkeet, joissa puuttuu, laske keskiarvo/mediaani, tallenna arvo, korvaa mutate() | Tiedät keskiarvon/mediaanin arvon | Lisää toteutusaikaa. Voi olla hidasta suurella tietojoukolla |
Nopea tapa sapplylla | Käytä sapply() ja data.frame() etsiäksesi ja korvataksesi puuttuvat arvot automaattisesti keskiarvolla/mediaanilla | Lyhyt koodi ja nopea | En tiedä imputointiarvoja |