Ga naar hoofdinhoud

R sd()-functie: standaarddeviatie in R

Leer hoe je de variabiliteit in je data meet met de R-functie sd(). Ontdek praktische voorbeelden en essentiële technieken voor het omgaan met ontbrekende waarden en gegroepeerde data.
· 5 min lezen

Verken met AI

De standaarddeviatie is een van de meestgebruikte manieren om samen te vatten hoe verspreid je data is. In R geeft de functie sd() je een snelle manier om deze maat voor variabiliteit te berekenen, of je nu werkt met vectoren, dataframes of gegroepeerde data. 

In dit artikel neem ik je mee door de basis van het gebruik van sd() in R, leg ik uit hoe je met ontbrekende waarden omgaat en laat ik zien hoe je standaarddeviaties per groep berekent met functies als tapply() en pakketten als dplyr.

Wat doet sd() in R?

In R berekent de sd()-functie uit base R de standaarddeviatie van een numerieke vector of kolom in een dataframe. Het meet hoeveel de waarden in je data afwijken van het gemiddelde, zodat je een idee krijgt van de variabiliteit of spreiding.

Als je bekend bent met het begrip variantie: de standaarddeviatie is simpelweg de vierkantswortel daarvan en omdat hij zo wordt berekend (de wortel van het gemiddelde van de kwadratische afwijkingen) blijft de standaarddeviatie op dezelfde schaal als de oorspronkelijke data. Dat maakt de interpretatie in de praktijk makkelijker.

Een eenvoudig sd()-voorbeeld

Stel, je hebt een reeks getallen en wilt weten hoeveel ze afwijken van het gemiddelde.

Zo doe je dat in R:

exam_scores <- c(75, 80, 85, 90, 95) 
sd(exam_scores) 

De output geeft je de standaarddeviatie, die de gemiddelde afstand van elke score tot het gemiddelde kwantificeert.

Je kunt sd() gebruiken met elke numerieke vector, inclusief integers, doubles of de resultaten van berekeningen. Je weet misschien dat R logische vectoren als numeriek behandelt (TRUE als 1, FALSE als 0), dus technisch werkt sd() ook op logische vectoren (je kunt het gerust proberen), maar het idee van standaarddeviatie is het meest betekenisvol voor continue numerieke data.

Omgaan met ontbrekende waarden met sd()

Datasets uit de praktijk bevatten vaak ontbrekende waarden, dus dit is het vermelden waard: als je data NA-waarden bevat, geeft sd() standaard NA terug.

Kijk naar dit voorbeeld:

heights <- c(170, 175, NA, 180, 185)
sd(heights)

Het resultaat is NA.

Om ontbrekende waarden te negeren en de standaarddeviatie van de beschikbare getallen te berekenen, gebruik je het argument na.rm = TRUE. Of je kunt de NA-waarden uit je dataset verwijderen, maar doe dat alleen als dat inhoudelijk klopt.

sd(heights, na.rm = TRUE) 

Nu krijg je de standaarddeviatie voor 170, 175, 180 en 185.

Standaarddeviatie berekenen voor dataframes in R

Je kunt eenvoudig de standaarddeviatie van een specifieke kolom in een dataframe berekenen met de $-operator. Stel, je hebt een dataframe met productgewichten:

product_data <- data.frame( weight = c(1.2, 1.5, 1.3, 1.7, 1.4), price = c(10, 12, 11, 13, 12) ) 
sd(product_data$weight)

Dit geeft je de standaarddeviatie van de kolom weight. Vergeet niet dat sd() bedoeld is voor numerieke vectoren, niet voor hele dataframes. Kies altijd de juiste kolom.

sd() en gegroepeerde standaarddeviaties

Vaak wil je de variabiliteit binnen groepen meten, bijvoorbeeld per categorie, regio of een andere factor. R biedt meerdere manieren om gegroepeerde standaarddeviaties te berekenen. Ik laat er drie zien:

tapply() gebruiken voor gegroepeerde standaarddeviaties

Stel, je hebt verkoopdata voor verschillende regio's en je wilt de standaarddeviatie per regio:

sales_amount <- c(200, 220, 210, 250, 240, 230) 
region <- c("North", "North", "South", "South", "North", "South") 
tapply(sales_amount, region, sd)

tapply() past sd() toe op elke groep die door region is gedefinieerd.

aggregate() gebruiken voor gegroepeerde standaarddeviaties

Als je de resultaten liever in een net dataframe hebt, werkt aggregate() prima:

sales_data <- data.frame( region = c("North", "North", "South", "South", "North", "South"), amount = c(200, 220, 210, 250, 240, 230) ) 
aggregate(amount ~ region, data = sales_data, sd)

Dit levert een samenvattend dataframe op met de standaarddeviatie per regio.

dplyr gebruiken voor gegroepeerde standaarddeviaties

Met het pakket dplyr zijn gegroepeerde berekeningen nog leesbaarder. Gebruik summarize() na groeperen:

library(dplyr) 

sales_data %>% 
   group_by(region) %>% 
   summarize(sd_amount = sd(amount))

Deze aanpak is vooral handig voor grotere datasets of wanneer je meerdere datatransformaties aan elkaar wilt koppelen. (Of als je gewoon graag met de pipe-operator werkt, zoals ik.)

Veelgemaakte fouten en tips

Zelfs een eenvoudige functie als sd() kan problemen geven als je niet oplet. Dit zijn veelvoorkomende valkuilen:

  • Niet-numerieke data: sd() werkt alleen met numerieke vectoren. Als je data tekens of factoren bevat, krijg je een foutmelding. Gebruik is.numeric() om je data te controleren.

  • Ontbrekende waarden: Één NA zorgt ervoor dat sd() NA retourneert. Gebruik altijd na.rm = TRUE als je ontbrekende waarden wilt negeren.

  • Kleine steekproeven: sd() gebruikt n-1 in de noemer (steekproefstandaarddeviatie). Voor vectoren van lengte 1 geeft sd() NA terug, niet 0.

Die laatste fout vind ik in het bijzonder interessant. Het is een minder bekend verschil, en het kan je parten spelen als je overstapt van Python naar R, omdat Python deelt door de populatiestandaarddeviatie en niet die van de steekproef.

Handige varianten en verwante functies in R

R biedt verschillende verwante functies om variabiliteit te meten en data samen te vatten:

  • var(): Berekent de variantie, het kwadraat van de standaarddeviatie.

  • apply(), sapply(), lapply(): Handig om sd() toe te passen over rijen of kolommen van matrices en dataframes.

  • mad(): Berekent de median absolute deviation (mediane absolute afwijking), een andere interessante en robuustere maat voor variabiliteit.

Laat me sd() even met apply() laten zien, zoals beloofd: zo gebruik je apply() om de standaarddeviatie van elke kolom in een matrix te krijgen. Net als eerder maak ik die matrix ter plekke.

measurement_matrix <- matrix(1:9, nrow = 3) 
apply(measurement_matrix, 2, sd)

Dit retourneert de standaarddeviatie voor elke kolom, zodat je snel een overzicht krijgt van de variabiliteit over meerdere variabelen.

Conclusie

De functie sd() in R is relatief eenvoudig (het is maar één regel code). Maar als je hem gebruikt voor rapporten of presentaties en je voelt je wat wazig over de details, schrijf je dan in voor onze Statistician in R career track. Er zit veel nuance in statistiek en data-analyse, dus zorg dat je goed beslagen ten ijs komt.

Josef Waples

Auteur

Josef Waples

Ik ben een schrijver en editor op het gebied van data science en heb bijgedragen aan onderzoeksartikelen in wetenschappelijke tijdschriften. Ik ben vooral geïnteresseerd in lineaire algebra, statistiek, R en dergelijke. Ik speel ook best wat schaak! 

Onderwerpen

Gerelateerd