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.

Korvaa puuttuvat arvot R:ssä

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.

Sulje pois puuttuvat arvot

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

Imputoi puuttuvat tiedot keskiarvolla ja mediaanilla

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