Op deze pagina vind je een demonstratie van een statistische techniek aan de hand van een voorbeeld.
Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.
De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.
In een ideale wereld beschik je als onderzoeker over een perfect volledig databestand.
In de praktijk zal je echter in veel datasets ook ‘gaten’ tegenkomen. Die gaten worden in R aangegeven met NA
. Ze kunnen ontstaan om allerlei redenen. Misschien sloeg iemand een enquêtevraag over, of misschien werkte de apparatuur om een meting uit te voeren niet goed. Hoe dan ook, als onderzoeker zal je …
R kan hierbij helpen. Hieronder demonstreren we hoe.
De dataset enquete
bevat gegevens van 14 variabelen geobserveerd bij 42 Amerikaanse studenten die een vak statistiek volgen.
Deze dataset kan je inladen met read.csv()
. De data kan je best meteen in een object enquete
onderbrengen zodat je die later makkelijk opnieuw kan oproepen.
enquete <- read.csv("https://statlas.ugent.be/datasets/enquete2.csv")
Met str()
krijg je een opsomming van alle variabelen in de dataset. Je vindt er ook telkens bij om welk datatype het gaat. Afhankelijk van het datatype zal je sommige functies wel of juist niet kunnen gebruiken om je data te verkennen. Het heeft bijvoorbeeld geen zin om een gemiddelde te berekenen van een variabele van type chr
.
str(enquete)
'data.frame': 42 obs. of 14 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ Section : int 1 1 1 1 1 1 1 1 1 1 ...
$ Class : chr "Senior" "Freshman" "Freshman" "Freshman" ...
$ Sex : chr "F" "F" "F" "M" ...
$ Distance : int 400 450 3000 100 2000 500 1100 1000 400 450 ...
$ Height : int 62 61 61 72 69 73 60 71 70 75 ...
$ Handedness : chr "Right" "Left" "Right" "Right" ...
$ Coins : num 1.12 29 1.5 0.07 0.12 8 0.77 0 0 0 ...
$ WhiteString: int 42 45 22 40 48 30 50 45 38 36 ...
$ BlackString: int 6 5 4 4 7 8 0 6 0 12 ...
$ Reading : num 80 100 100 50 200 100 200 100 100 100 ...
$ TV : num 3 NA 4 25 NA 0 2 2 20 20 ...
$ Pulse : int 71 78 80 63 63 56 72 66 54 48 ...
$ Texting : int 3 100 2 200 100 1 50 30 40 25 ...
In de output van str()
zie je inderdaad dat er 14 variabelen zijn met telkens 42 observaties.
Hier zullen we de vector enquete$TV
gebruiken.
tv <- enquete$TV
Merk op: veel van de functies op deze pagina kan je even goed toepassen op een heel dataframe ineens. Het zal echter vaker voorkomen dat je dit variabele per variabele zal willen doen. Daarom spreken we in de voorbeelden hieronder meestal over vectoren en niet over dataframes.
Een goede start is om te achterhalen of er ontbrekende data zijn in je dataset. Daarvoor is de functie is.na()
heel nuttig. Voor elke plaats in een object zal die functie je een waarde TRUE
geven indien het element ontbreekt en een FALSE
als er wel een element te vinden is op die plaats.
is.na(tv)
[1] FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE
Zo’n lange nieuwe vector met allerlei TRUE
en FALSE
is onoverzichtelijk en niet zo informatief. Op dit moment stel je je de vraag of er ergens in je vector iets ontbreekt. Op die vraag wil je in eerste instantie een eenvoudige ja of nee als antwoord. De functie any()
kan hierbij helpen. Die geeft een waarde TRUE
als er op tenminste één plaats in de vector een TRUE
voorkomt.
any(is.na(tv))
[1] TRUE
Deze output houdt in dat er ergens in je vector een waarde ontbreekt. Daar zal je NA
zien staan. Dat is hoe ontbrekende data worden gemarkeerd in R.
Vervolgens moet je uitzoeken op welke plaats in de vector die ontbrekende data zich bevinden. De functie which()
vertelt je welke plaatsen in een vector een waarde TRUE
bevatten.
which(is.na(tv))
[1] 2 5
Als je de waarde op één van die plaatsen probeert op te roepen, dan zie je inderdaad NA
.
tv[2]
[1] NA
De functie length()
vertelt je nu hoeveel ontbrekende datapunten er zijn (al heb je in dit geval natuurlijk niet veel hulp nodig bij het tellen).
ontbrekend <- which(is.na(tv))
length(ontbrekend)
[1] 2
Ook het omgekeerde is mogelijk: welke plaatsen in de vector bevatten wél data? Dat kan met een uitroepteken !
in je code. Dat betekent zoveel als het woord “niet”. Alle TRUE
worden hierdoor FALSE
en omgekeerd.
which(!is.na(tv))
[1] 1 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[26] 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
Zie je welke getallen ontbreken?
Omwille van ontbrekende data zullen veel functies niet meer normaal werken. R zal je bijvoorbeeld niet toestaan om zomaar het gemiddelde te berekenen van een vector met ontbrekende waarden.
mean(tv)
[1] NA
Wat kan je daar nu aan doen?
na.rm
na.rm
is een argument dat je in veel functies vindt. Als je kiest voor na.rm = TRUE
dan worden alle ontbrekende waarden genegeerd bij het uitvoeren van die functie (“rm” staat voor “remove”).
mean(tv, na.rm=TRUE)
[1] 4.75
Om het gemiddelde te berekenen worden alle observaties (die niet NA
zijn) opgeteld en gedeeld door 40, niet door 42.
na.omit()
na.omit()
is een functie waarmee je alle ontbrekende data uit een vector of een dataframe kan verwijderen.
Hier passen we de functie toe op het dataframe enquete
. Je verwijdert dan alle rijen waarin tenminste één keer NA
voorkomt. Dat is nogal drastisch en kan ertoe leiden dat je heel wat nuttige data weggooit.
effectief <- na.omit(enquete)
Hoeveel rijen zijn er dan nog over?
dim(effectief)[1]
[1] 39
De which
-functie geeft je de locaties van de ontbrekende data in de vector (zie eerder). Dit kan je vervolgens gebruiken om die locaties op te vullen met waarden die je zelf kiest.
Je moet natuurlijk heel voorzichtig zijn met waarden invullen die niet bestaan. Het mag enkel als je goed kan verantwoorden waarom je het doet.
ontbrekend <- which(is.na(tv))
tv[ontbrekend] <- 0