flowchart TB A(Variabelen) --> B("Numeriek (Kwantitatief)") A --> C("Categorisch (Kwalitatief)") B --> F(Discreet) B --> G(Continu) C --> E(Nominaal) C --> D(Ordinaal)
20 Variabelen en hun verdelingen
20.1 Beschrijvende statistiek
Je hebt maandenlang hele dagen in het lab gestaan, en het resultaat van je werk is een enorme verzameling getallen, zorgvuldig gerangschikt in een Excel-bestand. Wat nu? Je bent eigenlijk pas halverwege: je begrijpt dat het je taak is om in de cijferbrij patronen te ontdekken die iets vertellen over de onderliggende biologie, maar met al die getallen voor je neus zie je door de bomen het bos niet meer. Beschrijvende statistiek (descriptive statistics) is het onderdeel van de statistiek dat zich bezighoudt met methoden en technieken voor het creëren van overzicht in gegevens.
In de praktijk kunnen de gebruikte technieken worden onderverdeeld in drie categorieën.
Ten eerste kun je kengetallen berekenen. Met kengetallen bedoelen we getallen die een bepaald aspect van een reeks gegevens karakteriseren. Een voorbeeld is het gemiddelde; dat typeert hoe groot de waarden in je reeks getallen zoal zijn. Kengetallen worden ook wel statistieken (statistics) genoemd.
Ten tweede kun je gegevens samenvatten in tabellen, zoals frequentietabellen of kruistabellen. Vaak zijn die tabellen een stuk beter te overzien dan de lange lijst met individuele gegevens.
Ten derde kun je je gegevens visualiseren met grafieken en diagrammen. Heb je er ooit bij stilgestaan hoe slim het idee van een grafiek eigenlijk is? Ons visueel systeem is enorm goed in het analyseren van beelden van objecten in de ruimte. Het idee is om grootheden die eigenlijk helemaal geen ruimtelijke eigenschappen voorstellen, zoals gewicht of temperatuur, weer te geven als de coördinaten, vormen, kleuren, of maten van inktpatronen op papier. Structuur in de gegevens kan zo met het oog worden ontdekt.
Deze drie categorieën — kengetallen, tabellen, visualisaties — komen hieronder allemaal aan bod. Je zult zien dat ze sterk met elkaar samenhangen.
Maar hoe je gegevens kunt beschrijven hangt sterk af van het soort gegevens waarmee je te maken hebt. Daarom moeten we eerst stilstaan bij de verschillende typen gegevens die je kunt tegenkomen.
20.2 Verschillende soorten variabelen
Een dataset is een verzameling meetwaarden of observaties van eigenschappen. Die eigenschappen worden variabelen genoemd. Bijvoorbeeld, mutanten van Drosophila (fruitvliegen) kunnen verschillende kleuren ogen hebben; oogkleur is dus een variabele. Andere voorbeelden van variabelen zijn het aantal eieren in een vogelnest, de dikte van een jaarring in een boomstam, of de beoordeling van een hotel (1 tot 5 sterren).
Het is nuttig om variabelen in te delen in categorieën. Een veelgebruikte indeling is weergegeven in Figuur 20.1.
Het diagram maakt eerst onderscheid tussen numerieke en categorische variabelen.
Numerieke variabelen zijn variabelen waarvan de waarden getallen zijn. Voorbeelden zijn de het aantal dendrieten aan een neuron, of de concentratie van het stresshormoon cortisol in het speeksel van een varken. Numerieke variabelen worden ook wel kwantitatieve variabelen genoemd.
Categorische variabelen (categorical) zijn variabelen waarvan de waarden een categorie of groep aanduiden. De waarden stellen geen meetbare hoeveelheden voor. Je kunt ze dus ook niet optellen of aftrekken. De verschillende mogelijke waarden worden niveaus (levels) genoemd. Voorbeelden zijn de genus (het fylogenetisch geslacht) van bacteriën aangetroffen bij een blaasontsteking (met niveaus Escherichia, Klebsiella, …), of het stadium van kanker (met als niveaus de kankerstadia 0, I, II, III, of IV). Categorische variabelen worden ook wel kwalitatieve variabelen genoemd.
Dat kankerstadium in een (Romeins) getal wordt uitgedrukt (0, I, II, III, of IV) wil niet zeggen dat het een numerieke variabele is. Het getal stelt namelijk geen meetbare hoeveelheid voor, en het optellen van kankerstadia is onzinnig. We hadden de stadia net zo goed kunnen aanduiden met letters A, B, C, D, en E. Dit laat zien dat je soms goed moet nadenken om te bepalen van welk type een variabele is.
Binnen de numerieke variabelen maken we onderscheid tussen discrete en continue variabelen. Een numerieke variabele is discreet als deze alleen specifieke, afzonderlijke waarden kan aannemen. Dit is bijvoorbeeld het geval bij tellingen, zoals het aantal plantensoorten dat je op een vierkante meter heidegrond aantreft: deze variabele kan alleen niet-negatieve gehele getallen aannemen (0, 1, 2, …). Een numerieke variabele is continu als deze in theorie elke waarde uit een interval van reële getallen kan aannemen. Een voorbeeld hiervan is lichaamsgewicht, omdat een gewicht in principe elk positieve reële waarde kan aannemen, zoals 86,143875 kg of zelfs 20\(\pi\) kg.
In de Introductie van het onderdeel Biologische modellen ben je het verschil tussen continue en discrete variabelen al tegengekomen toen de verschillen tussen differentievergelijkingen en differentiaalvergelijkingen werden uitgelegd. Het belangrijkste verschil was of de variabele tijd
als een discrete of als een continue variabele werd behandeld.
Binnen de categorische variabelen onderscheiden we ordinale en nominale variabelen. Bij ordinale variabelen hebben de niveaus een natuurlijke volgorde. De kankerstadia (0, I, II, III, IV) die we hierboven al tegenkwamen zijn hiervan een goed voorbeeld. Bij nominale variabelen hebben de niveaus géén natuurlijke rangorde; het zijn enkel namen of labels. Een voorbeeld is de voedingsstrategie van organismen, ingedeeld als “herbivoor”, “carnivoor”, “omnivoor”, of “detrivoor”.
De indeling van Figuur 20.1 is niet de enige manier waarop variabelen kunnen worden ingedeeld. Over andere indelingen kun je desgewenst meer lezen in het artikel Statistical data type op Wikipedia.
Oefening 20.1 (Typen variabelen.)
Van welk type zijn de volgende variabelen?
Bloedgroep (A, B, AB, of O).
Aantal chromosomen in een cel.
Opleidingsniveau. Het Centraal Bureau voor de Statistiek (CBS) hanteert vaak 5 niveaus:
Tabel 20.1: Onderwijsniveaus gebruikt door het CBS. Onderwijsniveau Omschrijving 1 Basisonderwijs 2 Vmbo, havo-, vwo-onderbouw, mbo1 3 Havo, vwo, mbo2-4 4 Hbo-, wo-bachelor 5 Hbo-, wo-master, doctor Hartslagfrequentie.
Verdubbelingstijd van een bacteriekolonie.
Fitness, gemeten als het aantal nakomelingen van een organisme in de volgende generatie.
Oefening 20.2 (Variabelen in de dataset NHANES van de US National Center for Health Statistics)
Om de theorie in dit hoofdstuk te illustreren zullen we vaak gebruik maken van een dataset met de naam NHANES. Deze dataset is samengesteld door het US National Center for Health Statistics (NCHS). Jaarlijks onderzoekt het NCHS de gezondheid van ongeveer 5000 Amerikanen van alle leeftijden. De deelnemers vullen ook een enquête in. De NHANES dataset bevat de gegevens van een groot aantal personen die tussen 2009 en 2012 zijn onderzocht.
Je kunt de dataset ook gemakkelijk zelf onderzoeken met R.
De dataset is beschikbaar gesteld in een R-package met de naam
NHANES
. Om de dataset te bekijken moet je dat package eenmalig installeren, met het commando:install.packages("NHANES", dependencies = TRUE)
Kopieer het commando en voer het uit in R.
Start een nieuw R-script. Kopieer onderstaande code en plak die in je script.
library("NHANES") # laad de library data("NHANES") # laad de dataset "NHANES" in een dataframe View(NHANES) # open een tab in RStudio om de dataframe te bekijken
Zorg dat je begrijpt waar de verschillende regels code goed voor zijn en voer ze dan uit.
Bekijk de gegevens in RStudio. (Met het commando
View(NHANES)
is een tab geopend binnen RStudio waar je door de gegevens heen kunt scrollen.) Je zult zien dat de dataset bestaat uit een groot aantal regels en kolommen. Iedere regel beschrijft één persoon; iedere kolom bevat de informatie voor één variabele.Een van de variabelen is burgerlijke staat (
MaritalStatus
). Zoek die kolom op, en kijk door de waarden. Van welk type is deze variabele volgens het systeem van Figuur 20.1?Zoek ook de kolom voor variabele lichaamslengte (
Height
).- Van welk type is deze variabele?
- Welke eenheid wordt gebruikt?
(Tip: Bij twijfel gebruik je het commando
?NHANES
om de Help-files te bekijken; daar staat voor iedere variabele informatie.)Zoek de kolom voor
nBabies
. Voor iedere vrouw vanaf 20 jaar is daar het aantal baby’s weergegeven dat zij op de wereld heeft gezet.- Van welk type is deze variabele?
- Wat is er bij mannen ingevuld?
- Wat is er bij vrouwen ingevuld als zij geen babies hebben?
Voer het volgende commando toe aan je script en voer het uit:
str(NHANES)
De functie
str()
geeft de structuur van het data frame weer.- Van hoeveel personen is er informatie opgenomen in deze dataset?
- Hoeveel variabelen zijn er?
20.3 De verdeling van een variabele
In de praktijk willen we vaak weten hoe de waarden van een variabele over de mogelijke waarden zijn verspreid. We noemen dat de verdeling (distribution) van de variabele.
Histogrammen
Als de variabele numeriek is, kunnen we zijn verdeling visualiseren met een histogram. Figuur 20.2 hieronder laat een voorbeeld zien voor variabele AgeMonths
(leeftijd in maanden) uit de dataset NHANES die we in Oefening 20.2 hebben bekeken
Code
# Controleer of ggplot2 en NHANES zijn geladen
if (!("ggplot2" %in% .packages())) {
library(ggplot2)
}if (!("NHANES" %in% .packages())) {
library(NHANES)
}
data("NHANES")
ggplot(
data = NHANES,
aes(x = AgeMonths)
+
) geom_histogram(
fill = opvulkleur,
color = "black",
binwidth = 36,
boundary = 0,
closed = "left"
+
) labs(title = NULL,
x = "Leeftijd (maanden)",
y = "Frequentie"
+
) theme_minimal()
Een histogram is opgebouwd uit staafjes. De hoogte van die staafjes geeft weer hoe vaak een leeftijd binnen een bepaalde leeftijdscategorie valt; dat wordt de frequentie van die categorie genoemd. We komen later uitgebreider terug op histogrammen en andere manieren om verdelingen te visualiseren (Paragraaf 20.11.1), maar gaan ervan uit dat histogrammen niet nieuw voor je zijn.
Kwalitatieve beschrijvingen van de verdeling numerieke variabelen
Om de vorm van de verdeling van een numerieke variabele te omschrijven worden vaak bepaalde woorden gebruikt. Het is handig als je die kent.
Een verdeling is symmetrisch als de vorm van het histogram (grofweg) spiegelsymmetrisch is. Als dat niet zo is, dan is de verdeling scheef (skewed). Het woord scheef wordt vooral gebruikt als de verdeling een “staart” heeft naar links of naar rechts. Heeft de verdeling een staart aan de linkerkant, dan is hij links-scheef (left-skewed); zit de staart aan de rechterkant, dan is hij een rechts-scheef (right-skewed). Figuur 20.3 laat voorbeelden zien.
Code
# Controleer of ggplot2 geladen is
if (!("ggplot2" %in% .packages())) {
library(ggplot2)
}
# Stel een seed in voor reproduceerbaarheid
set.seed(123)
# Definieer parameters
<- 3 * 10^3 # Aantal punten per histogram
aantal_punten <- 25 # Aantal bins voor de histogrammen
aantal_bins
# Genereer steekproeven uit gamma- en normale verdelingen
<- data.frame(
data x = c(
-rgamma(aantal_punten, shape = 3, scale = 1), # Links-scheef
rnorm(aantal_punten), # Symmetrisch
rgamma(aantal_punten, shape = 3, scale = 1) # Rechts-scheef
),groep = factor(
rep(
c("Links-scheef", "Symmetrisch", "Rechts-scheef"),
each = aantal_punten
)
)
)
# Plot de histogrammen per verdelingstype
ggplot(data, aes(x = x)) +
geom_histogram(
bins = aantal_bins,
fill = opvulkleur,
color = "black"
+
) facet_wrap(~groep, nrow = 1, scales = "free_x") +
labs(
x = "Waarde",
y = "Frequentie"
+
) theme_minimal() +
theme(
strip.text = element_text(face = "bold"),
axis.text.y = element_text(size = 9),
axis.ticks.y = element_line(),
panel.spacing = unit(1, "lines")
)
Verdelingen binnen de biologie en daarbuiten hebben vaak de vorm van een kerkklok (Figuur 20.4). We noemen ze dan klokvormig (bell shaped). Klokvormige verdelingen spelen later in de cursus een grote rol.
Code
# kies een random seed om de figuur reproduceerbaar te maken
set.seed(125)
<- 10^4 # aantal punten per histogram
samplesize <- 25
nr.bins
# genereer steekproef
<- rnorm(samplesize)
data_klok
# histogram
ggplot(data.frame(x = data_klok), aes(x)) +
geom_histogram(bins = nr.bins, fill = "#8c644e", color = "black") +
theme_minimal() +
theme(axis.ticks = element_blank(),
axis.text = element_blank(),
axis.title = element_blank()
)
Een verdeling wordt uniform genoemd als iedere uitkomst even vaak voorkomt. Bijvoorbeeld, de verdeling in Figuur 20.5 heeft alleen waarden in het domein van 0 tot 1, en daar komen alle waarden ongeveer even vaak voor. Deze verdeling is dus ongeveer uniform in het domein tussen 0 en 1.
Code
# Laad benodigde bibliotheken
if (!("ggplot2" %in% loadedNamespaces())) { library(ggplot2) }
# Stel een seed in voor reproduceerbaarheid
set.seed(125)
<- 10^5 # Aantal punten per histogram
samplesize
# Genereer steekproef
<- runif(samplesize) # Uniforme verdeling
data_unif
# Histogram plotten
ggplot(data.frame(x = data_unif), aes(x)) +
geom_histogram(
binwidth = 0.05, boundary = 0, fill = opvulkleur, color = "black"
+
) labs(
title = NULL, # Titel
x = "Waarde", # Label voor de x-as
y = "Frequentie" # Label voor de y-as
+
) theme_minimal() +
coord_cartesian(
xlim = c(-0.5, 1.5),
ylim = c(0, 6000)
)
Een verdeling die één piek heeft noemen we unimodaal. Een verdeling met twee pieken is bimodaal (zie Figuur 20.6). Voor verdelingen met nog meer pieken bestaan ook namen (trimodaal, quadrimodaal, pentamodaal, …), maar die worden in de praktijk zelden gebruikt. Wel kom je soms multimodaal tegen voor verdelingen met meerdere pieken.
Code
# Controleer of ggplot2 geladen is
if (!("ggplot2" %in% loadedNamespaces())) {
library(ggplot2)
}
# Stel een seed in voor reproduceerbaarheid
set.seed(123)
# Definieer parameters
<- 3 * 10^3 # Aantal punten per histogram
aantal_punten <- 30 # Aantal bins voor de histogrammen
aantal_bins
# Genereer steekproeven van twee gamma-verdelingen
<- -rgamma(
data_links_scheef round(aantal_punten * 0.55),
shape = 8, scale = 1
+ 3
) <- rgamma(
data_rechts_scheef round(aantal_punten * 0.45),
shape = 8, scale = 1
- 3
)
# Combineer om een bimodale verdeling te maken
<- c(data_links_scheef, data_rechts_scheef)
data_bimodaal
# Genereer een unimodale verdeling (Poisson)
<- rpois(aantal_punten, lambda = 10)
data_unimodaal
# Combineer gegevens en voeg een groepsvariabele toe
<- data.frame(
data x = c(data_unimodaal, data_bimodaal),
groep = factor(
rep(
c("Unimodaal", "Bimodaal"),
each = aantal_punten
), levels = c("Unimodaal", "Bimodaal")
)
)
# Plot de histogrammen per verdelingstype
ggplot(data, aes(x = x)) +
geom_histogram(
data = subset(data, groep == "Unimodaal"),
binwidth = 1,
fill = opvulkleur,
color = "black"
+
) geom_histogram(
data = subset(data, groep == "Bimodaal"),
bins = aantal_bins,
fill = opvulkleur,
color = "black"
+
) facet_wrap(~groep, nrow = 1, scales = "free_x") +
labs(
x = "Waarde",
y = "Frequentie"
+
) theme_minimal() +
theme(
strip.text = element_text(face = "bold"),
axis.text.y = element_text(size = 9),
axis.ticks.y = element_line(),
axis.text.x = element_text(size = 9),
axis.ticks.x = element_line(),
panel.spacing = unit(1, "lines")
)
Multimodale verdelingen ontstaan vaak als binnen een steekproef meerdere deelpopulaties voorkomen met ieder een verschillend gemiddelde. De variabele Weight
(lichaamsgewicht) uit de dataset NHANES is een voorbeeld.
Voorbeeld 20.1 (De verdeling van Weight
is bimodaal in de dataset NHANES) De verdeling van Weight
(lichaamsgewicht) in de dataset NHANES ziet er als volgt uit:
Code
ggplot(
data = NHANES,
aes(x = Weight)
+
) geom_histogram(
fill = opvulkleur,
color = "black",
binwidth = 5,
boundary = 0,
closed = "left"
+
) labs(title = NULL,
x = "Lichaamsgewicht (kg)",
y = "Frequentie"
+
) theme_minimal()
Het histogram laat twee pieken zien: één rond 20 kg, en één in de buurt van 75 kg. De verdeling is dus bimodaal. In Oefening 20.17 ga je zelf aantonen waar die twee pieken vandaan komen.
Oefening 20.3 (Omschrijf de verdeling)
Code
library(ggplot2)
# Aantal samples
<- 9000
n
# Data genereren
set.seed(124)
<- {x <- runif(n); x[runif(n) < pmax(0, abs(2 * (x - 0.5)))] <- NA; na.omit(x)}
driehoek
<- data.frame(
data value = c(
rnorm(n),
rgamma(n, shape = 2, scale = 2),
runif(n),
c(rnorm(n/2), rnorm(n/2, mean = 3)),
c(rnorm(n/3), rnorm(n/3, mean = 3), rnorm(n/3, mean = 6)),
driehoek
),distribution = c(
rep(c("Normaal",
"Gamma (shape=2)",
"Uniform",
"Bimodaal",
"Trimodaal"),
each = n),
rep("Driehoek",
length(driehoek))),
label = c(
rep(c("(a)",
"(b)",
"(c)",
"(d)",
"(e)"),
each = n),
rep("(f)",
length(driehoek)))
)
# Plot maken
ggplot(data, aes(x = value, fill = distribution)) +
geom_histogram(bins = 40, color = "black", alpha = 1, fill= opvulkleur) +
facet_wrap(~label, scales = "free") +
theme_minimal() +
theme(legend.position = "none") +
labs(x = "Waarde", y = "Frequentie")
Bekijk Figuur 20.8. Zet vervolgens vinkjes in onderstaande tabel als de omschrijving van toepassing is.
Figuur | Symmetrisch | Links-scheef | Rechts-scheef | Klokvormig | Uniform | Bimodaal |
---|---|---|---|---|---|---|
a. | ||||||
b. | ||||||
c. | ||||||
d. | ||||||
e. | ||||||
f. |
20.4 De cumulatieve verdeling van een variabele
De cumulatieve verdeling (cumulative distribution) van een variabele laat zien welk deel van de waarnemingen kleiner of gelijk is aan een bepaalde waarde. We leggen dit uit aan de hand van een voorbeeld.
Voorbeeld 20.2 (De cumulatieve verdeling van lichaamsgewicht) In Figuur 20.9 is als voorbeeld de cumulatieve verdeling van Weight
(lichaamsgewicht) weergegeven (de oranje curve). Voor elk lichaamsgewicht op de \(x\)-as geeft de \(y\)-as aan welke proportie van de waarnemingen kleiner of gelijk is aan die waarde; dat wordt de cumulatieve proportie genoemd. De grafiek van de cumulatieve verdeling wordt de cumulatieve frequentiepolygoon genoemd.
Je kunt uit deze grafiek bijvoorbeeld aflezen (zie de paarse onderbroken lijnen) dat 86% van de mensen een gewicht heeft van hoogstens 100kg. Daaruit volgt dat de overige 14% méér weegt dan 100 kg.
Code
# Maak een cumulatieve verdelingsplot
<- ggplot(NHANES, aes(x = Weight)) +
cumulplot stat_ecdf(
geom = "step",
color = opvulkleur,
size = 1,
bw = 2
+
) labs(
x = "Lichaamsgewicht (kg)",
y = "Cumulatieve proportie"
+
) theme_minimal()
# Definieer het kruispunt van de lijnen
<- c(100, 0.86)
kruispunt
+
cumulplot # Voeg een horizontale stippellijn toe bij 0.86
geom_segment(
aes(
x = 0, xend = kruispunt[1],
y = kruispunt[2], yend = kruispunt[2]
), linetype = "dashed",
color = lijnkleur1,
size = 1
+
) # Voeg een verticale stippellijn toe bij 100 kg
geom_segment(
aes(
x = kruispunt[1], xend = kruispunt[1],
y = 0, yend = kruispunt[2]
), linetype = "dashed",
color = lijnkleur1,
size = 1
+
) # Voeg een punt toe op het kruispunt van de lijnen
geom_point(
aes(x = kruispunt[1], y = kruispunt[2]),
color = lijnkleur1,
size = 3
+
) scale_y_continuous(
breaks = c(0, 0.2, 0.4, 0.6, 0.8, 0.86, 1),
minor_breaks = c(0.1, 0.3, 0.5, 0.7, 0.9),
labels = function(breaks) ifelse(breaks == 0.86, "0.86", breaks)
)
De cumulatieve proportie neemt van links naar rechts altijd toe, omdat bij grotere waarden op de \(x\)-as het aantal waarnemingen kleiner dan die waarde ook groter is. Hierdoor is de cumulatieve verdeling altijd een stijgende functie die begint bij 0 (bij de kleinste waarde binnen de waarnemingen) en eindigt bij 1 (bij de grootste waarde).
Oefening 20.4 (De cumulatieve verdeling)
Gebruik Figuur 20.9 om de antwoorden te schatten op de volgende vragen.
- Welk percentage van de mensen weegt hoogstens 75kg?
- Welk percentage van de mensen weegt meer dan 50kg?
- Welk percentage van de mensen heeft een gewicht tussen 75 en 100kg?
- Stel, we selecteren de lichtste 10% van deze populatie. Hoeveel weegt de zwaarste persoon in deze groep?
20.5 Ligging en spreiding van een verdeling
Om de verdeling van een variabele te karakteriseren kunnen we naast woorden ook getallen gebruiken. Dat soort getallen worden kengetallen of statistieken genoemd.
Om de verdeling van een numerieke variabele kort te omschrijven geven we vaak twee getallen. De eerste waarde geeft de ligging (location) aan van de verdeling. Informeel bedoelen we met de ligging van een verdeling de plek op de \(x\)-as waar zich het histogram bevindt. We kunnen de ligging aangeven door een typische waarde voor de variabele te bepalen.
Het tweede getal geeft de spreiding (spread) van de verdeling weer. Informeel bedoelen we met de spreiding van de verdeling de mate waarin de verschillende waarden van de waarnemingen van elkaar verschillen; dus in hoeverre de waarden verspreid zijn.
Figuur 20.10 illustreert die twee begrippen, ligging en spreiding, aan de hand van histogrammen. De twee histogrammen aan de linkerkant zijn enkel ten opzichte van elkaar verschoven. Daarom verschilt hun ligging maar is hun spreiding gelijk. De twee histogrammen aan de rechterkant liggen ongeveer op dezelfde plek, gecentreerd op de waarde 0, maar in het onderste histogram zijn de waarden over een groter domein verspreid. (De piek is breder.) Daarom verschilt hun spreiding, maar is hun ligging gelijk.
Code
# Laad benodigde bibliotheken
if (!("ggplot2" %in% loadedNamespaces())) { library(ggplot2) }
# Stel een seed in voor reproduceerbaarheid
set.seed(124)
# Parameters
<- 10^4 # Aantal punten per histogram
steekproefgrootte <- 0 # Gemiddelde voor de eerste verdeling
gemiddelde1 <- gemiddelde1 + 1.5 # Gemiddelde voor de verschoven verdeling
gemiddelde2 <- 1 # Standaardafwijking voor de eerste verdeling
standaardafwijking1 <- standaardafwijking1 * 2 # Verdubbelde standaardafwijking
standaardafwijking2
# Data genereren
<- data.frame(
data waarden = c(
rnorm(steekproefgrootte, gemiddelde1 - 2.5, standaardafwijking1), # Linksboven: verschoven naar links
rnorm(steekproefgrootte, gemiddelde1, standaardafwijking1), # Rechtsboven
rnorm(steekproefgrootte, gemiddelde2 + 1, standaardafwijking1), # Linksonder: verschoven naar rechts
rnorm(steekproefgrootte, gemiddelde1, standaardafwijking2) # Rechtsonder: grotere spreiding
),groep = factor(
rep(
c(
"Zelfde spreiding, verschillende ligging",
"Zelfde ligging, verschillende spreiding",
"Linksonder",
"Rechtsonder"
), each = steekproefgrootte
),levels = c(
"Zelfde spreiding, verschillende ligging",
"Zelfde ligging, verschillende spreiding",
"Linksonder",
"Rechtsonder"
)
)
)
# Paneltitels aanpassen
<- data.frame(
paneel_titels groep = factor(
c(
"Zelfde spreiding, verschillende ligging",
"Zelfde ligging, verschillende spreiding",
"Linksonder",
"Rechtsonder"
),levels = levels(data$groep)
),titel = c(
"Zelfde spreiding, verschillende ligging",
"Zelfde ligging, verschillende spreiding",
"",
""
)
)
<- data.frame(
annotatie_linksonder x = c(gemiddelde1 - 2.5),
xend = c(gemiddelde2 + 1),
y = c(500),
yend = c(500),
groep = "Linksonder"
)
<- data.frame(
annotatie_rechtsboven x = c(gemiddelde1 - 1.2 * standaardafwijking1),
xend = c(gemiddelde1 + 1.2 * standaardafwijking1),
y = c(1000),
yend = c(1000),
groep = "Zelfde ligging, verschillende spreiding"
)
<- data.frame(
annotatie_rechtsonder x = c(gemiddelde1 - 1.1 * standaardafwijking2),
xend = c(gemiddelde1 + 1.1 * standaardafwijking2),
y = c(500),
yend = c(500),
groep = "Rechtsonder"
)
# plot
<- ggplot(data, aes(x = waarden)) +
basis_plot geom_histogram(
binwidth = 0.5,
boundary = 0,
fill = opvulkleur,
color = "black"
+
) geom_segment(
data = annotatie_linksonder,
aes(x = x, xend = xend, y = y, yend = yend),
arrow = arrow(length = unit(0.3, "cm")),
color = lijnkleur3,
size = 1.2
+
) geom_segment(
data = annotatie_linksonder,
aes(x = x, xend = x, y = y - 100, yend = yend + 100),
color = lijnkleur3,
size = 1.2
+
) geom_segment(
data = annotatie_rechtsboven,
aes(x = x, xend = xend, y = y, yend = yend),
arrow = arrow(ends = "both", length = unit(0.3, "cm")),
color = lijnkleur1,
size = 1.2
+
) geom_segment(
data = annotatie_rechtsonder,
aes(x = x, xend = xend, y = y, yend = yend),
arrow = arrow(ends = "both", length = unit(0.3, "cm")),
color = lijnkleur1,
size = 1.2
+
) facet_wrap(
~factor(
c(
groep, "Zelfde spreiding, verschillende ligging",
"Zelfde ligging, verschillende spreiding",
"Linksonder",
"Rechtsonder"
)
), ncol = 2,
scales = "free_y",
labeller = as_labeller(setNames(paneel_titels$titel, paneel_titels$groep))
+
) scale_x_continuous(
limits = c(-6, 6),
breaks = seq(-6, 6, by = 2)
+ # Gelijke x-assen
) labs(
x = "Waarde",
y = "Frequentie"
+
) theme_minimal() +
theme(
strip.text = element_text(face = "bold", size = 12), # Paneltitels
panel.spacing = unit(1, "lines"), # Ruimte tussen panelen
axis.title.x = element_text(size = 12),
axis.title.y = element_text(size = 12)
)
basis_plot
Om ligging en spreiding in getallen uit te drukken worden verschillende maten gebruikt. Over die specifieke maten zullen we het nu hebben.
20.6 Maten voor de ligging van een verdeling
Maten voor de ligging van een verdeling worden ook wel centrummaten genoemd (measures of central tendency). Hieronder bespreken we drie verschillende centrummaten: de modus, de mediaan, en het gemiddelde (mean). Deze drie maten geven allemaal een “typische” waarde voor de variabele, maar “typisch” is bij iedere maat net anders gedefinieerd.
De modus
De eerste centrummaat is de modus. Met de modus wordt de waarde bedoeld die het vaakst voorkomt. Bij categorische variabelen kun je simpelweg tellen welke uitkomst dat is. Bij numerieke variabelen wordt meestal het interval bedoeld dat hoort bij de hoogste staaf van het histogram. Als er meerdere pieken zijn, dan zijn er meerdere modi (meervoud van modus). Daar komen ook de woorden unimodaal, bimodaal, etc. vandaan. In Figuur 20.7, het histogram van Weight
, waren twee pieken te zien. Er zijn dan ook twee modi: het interval \([15,20)\) en het interval \([75,80)\).
De mediaan
Een andere veel gebruikte centrummaat is de mediaan. De mediaan van een serie waarnemingen is een getal met de eigenschap dat de helft van de waarnemingen kleiner is en de helft van de waarnemingen groter. De berekening gaat als volgt:
- Sorteer je de waarnemingen eerst van klein naar groot.
- Als het aantal waarnemingen \(n\) oneven is, dan is de mediaan het middelste getal in de gesorteerde rij.
- Als het aantal waarnemingen \(n\) even is, dan bestaat zo’n middelste getal niet; in dat geval nemen we het gemiddelde van de middelste twee getallen.
In dit boek noteren we de mediaan van een serie waarnemingen \(x_1\), \(x_2\), \(\ldots, x_n\) als \(\tilde{x}\).
Voorbeeld 20.3 (De mediaan van je tentamencijfers) Laten we een voorbeeld nemen. Stel dat je voor vijf tentamens de volgende cijfers hebt gehaald:
\[7 \qquad 7{,}5 \qquad 1 \qquad 8{,}5 \qquad 9.\] Wat is dan de mediaan van je cijfers?
We sorteren de cijfers en krijgen
\[1 \qquad 7 \qquad {\color{darkorange}7{,}5} \qquad 8{,}5 \qquad 9.\]
Het getal midden in de rij is de \({\color{darkorange}7{,}5}\) en dus is de mediaan gelijk aan \({\color{darkorange}7{,}5}\).
Als je voor het volgende tentamen een 10 haalt, verandert de gesorteerde reeks als volgt:
\[1 \qquad 7 \qquad {\color{darkorange}7{,}5} \qquad {\color{darkorange}8{,}5} \qquad 9 \qquad 10.\]
Omdat het aantal tentamencijfers nu even is, is er geen middelste getal meer. Als mediaan nemen we daarom het gemiddelde van de twee middelste getallen:
\[\tilde{x}=\frac{{\color{darkorange}7{,}5} + {\color{darkorange}8{,}5}}{2} = 8.\]
De mediaan is dus een “typische” of representatieve waarde in de zin dat er evenveel waarden groter zijn als kleiner. Dat hoeft bij de modus en het gemiddelde niet zo te zijn.
In Paragraaf 20.4 hebben we de cumulatieve verdeling besproken. Per definitie is de helft van de waarnemingen kleiner dan de mediaan; dat wil zeggen dat de cumulatieve proportie die hoort bij de mediaan gelijk is aan \(0{,}5\). De mediaan kan daarom uit de cumulatieve verdeling worden afgelezen door de waarde op de \(x\)-as te bepalen die hoort bij een cumulatieve proportie van \(0{,}5\). In Figuur 20.11 is net als in Voorbeeld 20.2 de cumulatieve verdeling van de variabele Weight
(lichaamsgewicht) weergegeven. Het paarse kruis geeft de mediaan van lichaamsgewicht aan. De paarse lijnen laten zien dat de cumulatieve proportie daar inderdaad \(0{,}5\) is.
Code
# Bereken de kwartielen van de Weight-variabele
<- quantile(
quantiles $Weight,
NHANESprobs = c(0.25, 0.5, 0.75),
na.rm = TRUE
)
# Voeg lijnen, punten en labels toe aan de cumulatieve plot
<- cumulplot +
cumulplot_median # Horizontale lijn bij de mediaan
geom_segment(
aes(
x = 0, xend = quantiles[2],
y = 0.5, yend = 0.5
),linetype = "dashed",
color = lijnkleur1,
size = 1
+
) # Verticale lijn bij de mediaan
geom_segment(
aes(
x = quantiles[2], xend = quantiles[2],
y = 0, yend = 0.5
),linetype = "dashed",
color = lijnkleur1,
size = 1
+
) # Punt op het kruispunt van mediaan en cumulatieve proportie 0.5
geom_point(
aes(
x = quantiles[2],
y = 0.5
),color = lijnkleur1,
size = 3
+
) # Kruis op de x-as bij de mediaan
geom_point(
aes(
x = quantiles[2],
y = 0
),color = lijnkleur1,
shape = 4,
size = 3,
stroke = 2
+
) # Labels voor titel en assen
labs(
title = NULL,
x = "Lichaamsgewicht (kg)",
y = "Cumulatieve proportie"
)
# Toon de plot met de mediaan
cumulplot_median
Het gemiddelde
De meest gebruikte maat voor de ligging van een verdeling is het gemiddelde. Zoals je weet, is het gemiddelde niets anders dan de optelsom van alle waarden, gedeeld door het aantal waarden. Tot zover niets nieuws.
Om de definitie van het gemiddelde wiskundig te kunnen noteren is het nuttig om wat notatie te introduceren die we in het vervolg vaak nodig zullen hebben. Het aantal waarnemingen (metingen, observaties) noemen we \(n\). Iedere individuele waarneming kunnen we nu een nummer geven. Zo’n nummer noemen we een index, en omdat het aantal waarnemingen \(n\) is lopen de indices (meervoud van index) van 1 tot \(n\). De waarde van de waarneming met index 1 noteren we als \(x_1\), de waarde van de waarneming met index 2 als \(x_2\), enzovoort. Het gemiddelde van de waarnemingen, geschreven als \(\overline{x}\), en kunnen we nu definiëren met de volgende formule: \[ \overline{x} = \frac{\sum_{i=1}^n x_i}{n}. \tag{20.1}\] (Ken je het sommatieteken nog? Kijk anders terug naar Paragraaf 4.4.)
Je hebt al lang geleden geleerd wat een gemiddelde is en bent er waarschijnlijk volledig aan gewend. Maar waarom is het gemiddelde eigenlijk een logische manier om een rij cijfers samen te vatten?
Een nuttig perspectief is om over het gemiddelde te denken als het zwaartepunt van je getallen. Om dat concreet te maken stellen we ons weer voor dat je, net als in Voorbeeld 20.3, voor vijf tentamens de volgende cijfers hebt gehaald:
\[7 \qquad 7{,}5 \qquad 1 \qquad 8{,}5 \qquad 9.\]
Stel je die cijfers voor als kralen die op een getallenlijn geprikt zijn, zoals in Figuur 20.12 hieronder. Het gemiddelde is nu precies het zwaartepunt van de kralen. Dat wil zeggen: als je de getallenlijn precies met het gemiddelde op het oranje driehoekje plaatst, dan blijft het geheel in balans. (We gaan er daarbij vanuit dat het gewicht van de getallenlijn zelf verwaarloosbaar is.)
Code
# Plot de volgende getallen
<- c(1, 7, 7.5, 8.5, 9)
x <- mean(x)
m
# Genereer een data frame met zowel de getallen als hun labels
<- data.frame(x = x, label = as.character(x))
df
# Teken de figuur
ggplot(df, aes(x = x, y = 0)) +
geom_segment( # dunne as, "gewichtsloos"
aes(x = min(x), xend = max(x), y = 0, yend = 0),
size = 1,
color = "SlateGray"
+
) geom_point( # plot de getallen als gevulde cirkels
shape = 21, size = 6, fill = "SlateGray"
+
) geom_text( # geef ze labels
aes(label = label), vjust = -1, size = 5
+
) annotate( # teken een driehoek onder het zwaartepunt / gemiddelde
"polygon",
x = c(m, m - 0.2, m + 0.2),
y = c(0, -0.3, -0.3),
fill = opvulkleur
+
) coord_cartesian(xlim = c(min(x), max(x)), ylim = c(-0.6, 0.5)) +
annotate(
"text",
x = m,
y = 0.2,
label = expression(
bar(italic(x))),
size = 7,
vjust = 1,
color = opvulkleur
+
) theme_void() + # geen y-as, geen ticks, geen labels
theme(axis.line.x = element_blank())
Merk trouwens op dat alle tentamencijfers voldoende zijn, behalve één trieste uitzondering: een 1. Zo’n waarneming die ver buiten de rest van de reeks ligt noemen we een uitbijter (outlier). Uitbijters kunnen een groot effect hebben op het gemiddelde. Dat zie je ook in Figuur 20.12: doordat de 1 zo ver van de andere cijfers ligt, kan deze in z’n eentje als tegengewicht dienen voor alle overige getallen. Het is de moeite waard om deze toets te herkansen.
Oefening 20.5 (Gevoeligheid voor uitbijters)
Je tentamencijfers zijn zoals weergegeven in Figuur 20.12. Stel dat je het tentamen waarvoor je een 1 had gehaald mag herkansen. Je haalt voor het hertentamen een 7.
Wat is het effect op je gemiddelde cijfer?
Wat is het effect op de mediaan?
Welke waarde is gevoeliger voor uitbijters?
Een ander nuttig perspectief is Figuur 20.13 hieronder. Dezelfde tentamencijfers zijn nu op de verticale as geplot. (De horizontale positie van de punten is willekeurig.) De oranje lijn markeert het gemiddelde \(\overline{x}\). Vanuit ieder punt is een verticale grijze lijn getekend naar het gemiddelde. De lengte van zo’n lijn (de afstand van een punt tot het gemiddelde) wordt wordt het residu (residual) genoemd.
Code
# Maak een dataset met handmatige jitter
<- data.frame(
data x = c(0, -0.04, 0.08, 0.03, -0.08), # handmatige jitter
y = x
)
ggplot(data, aes(x = x, y = y)) +
# Verticale lijnen naar het gemiddelde
geom_segment(
aes(
x = x, xend = x,
y = y, yend = m
),color = "SlateGray",
linetype = "solid",
size = 1
+
) # Punten
geom_point(
shape = 21,
fill = "SlateGray",
size = 4
+
) # Gemiddelde lijn
geom_segment(
aes(
x = -0.15, xend = 0.15,
y = m, yend = m
),color = opvulkleur,
size = 1
+
) # Label bij de gemiddelde lijn
annotate(
"text",
x = 0.12,
y = m + 0.3,
label = expression(bar(italic(x))),
color = opvulkleur,
hjust = 0,
size = 6
+
) # Y-as instellen
scale_y_continuous(
breaks = x,
limits = c(min(x), max(x)),
labels = scales::number_format(accuracy = 0.1)
+
) ylab("Tentamencijfers") +
# Geen x-as, geen gridlijnen
theme_classic() +
theme(
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.line.x = element_blank(),
axis.ticks.x = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
)
Intuïtief verwacht je misschien dat het gemiddelde de waarde is die zo dicht mogelijk bij alle punten ligt. Dat zou betekenen dat de oranje lijn precies op de hoogte ligt die de totale lengte van de residuen (grijze lijntjes) zo kort mogelijk maakt. Dat is helaas niet het geval.
Stel nu dat we de lengtes van de grijze lijntjes niet simpelweg optellen, maar die lengtes eerst kwadrateren voordat we ze optellen. Deze som van deze kwadraten noemen we de kwadratensom (sum of squares):
\[ \mathrm{SS} = \sum_{i=1}^n \left( x_i - \overline{x}\right)^2. \tag{20.2}\]
Het is eenvoudig aan te tonen dat het gemiddelde \(\overline{x}\) wél de waarde is die deze kwadratensom minimaliseert. Voor wie benieuwd is: de afleiding kun je vinden in Bijlage A.
Hier past een metafoor. Je kunt je de grijze lijntjes voorstellen als elastiekjes die zowel aan de oranje lijn als aan de datapunten vastgeknoopt zijn. Alle datapunten trekken via hun elastiekje aan de oranje lijn, en daardoor zal de oranje lijn omhoog of omlaag bewegen totdat de krachten in evenwicht zijn. Dat evenwicht is precies het gemiddelde.
De trek-kracht van een elastiekje is groter naarmate deze verder wordt uitgerekt. Punten die verder van de lijn afliggen, trekken daardoor harder aan de oranje lijn. De oranje lijn zal dus sterk naar uitbuiters worden toegetrokken. (Zie Vergelijking 20.2: een punt dat twee keer zo ver van \(\overline{x}\) afligt, draagt door het kwadrateren van de residuen vier keer zo sterk bij aan de kwadratensom.)
Het gemiddelde is dus niet de waarde die de som van de residuen minimaliseert.
Het gemiddelde is wel de waarde die de kwadratensom minimaliseert: de som van de kwadraten van de residuen
Voor wie dat interessant vindt: het is geen toeval dat deze metafoor “werkt”.
In de metafoor zou de evenwichtspositie van de oranje lijn de positie zijn waar de totale potentiële energie minimaal is. De potentiële energie van een “ideale” elastiek of veer is gelijk is aan \(E(u) = \frac{1}{2} k u^2\), waar \(u\) de uitrekking is van de elastiek, en \(k\) de veerconstante. De energie hangt dus samen met het kwadraat van de uitrekking! De potentiële energie is dus minimaal op de positie waar de som van de kwadraten van \(u\) minimaal is. De oranje lijn komt dus echt tot rust bij het gemiddelde.
20.7 Maten voor de spreiding van een verdeling
Na de centrummaten zijn nu de spreidingsmaten aan de beurt.
Het bereik
We beginnen bij het bereik (range). Het bereik van een rij getallen is simpelweg het interval dat begint bij het kleinste getal en eindigt met het grootste getal. Dus, het bereik van de vijf tentamencijfers uit Voorbeeld 20.3 is het interval \([1, 9]\).
Kwantielen en de interkwartielafstand
We hebben het gehad over de mediaan (Paragraaf 20.6.2). Je weet dus dat de helft van de waarnemingen kleiner is dan de mediaan. Om de mediaan te bepalen, deelde je de waarnemingen in twee groepen: de kleinere waarden en de grotere waarden. De mediaan is de scheidslijn tussen deze twee groepen.
Op een vergelijkbare manier kunnen we kengetallen definiëren die we de kwartielen (quartiles) noemen. Hiervoor splitsen we de twee helften nogmaals in tweeën, waardoor we in totaal vier kwarten krijgen. De kwartielen markeren de grenzen tussen deze vier delen.
Een kwart van de waarnemingen is kleiner dan het eerste kwartiel (Q1). De helft van de waarnemingen is kleiner dan het tweede kwartiel (Q2); die is dus precies gelijk aan de mediaan. Drie kwart van de waarnemingen is kleiner dan het derde kwartiel (Q3). De kwartielen zijn in Figuur 20.14 geïllustreerd.
Code
# Laad de benodigde bibliotheken als ze nog niet beschikbaar zijn
if (!("ggplot2" %in% .packages())) { library("ggplot2") }
if (!("NHANES" %in% .packages())) { library("NHANES") }
if (!("dplyr" %in% .packages())) { library("dplyr") }
# Gebruik de Weight-variabele uit de NHANES dataset
<- NHANES %>%
data filter(!is.na(Weight)) %>%
select(Weight)
# Bereken kwartielen
<- quantile(data$Weight, probs = c(0.25, 0.50, 0.75, 1.0))
quartiles <- quartiles[1] # Q1 (25e percentiel)
q1 <- quartiles[2] # Q2 (50e percentiel / Mediaan)
q2 <- quartiles[3] # Q3 (75e percentiel)
q3 <- quartiles[4] # Q4 (100e percentiel)
q4
# Functie om een kleur lichter te maken
<- function(color, percentage) {
lighten_color # Zorg ervoor dat het percentage tussen 0 en 1 ligt
<- max(0, min(percentage, 1))
percentage
# Converteer de kleur naar RGB en meng met wit
<- col2rgb(color) / 255
rgb <- rgb + (1 - rgb) * percentage
blended_rgb
# Retourneer de kleur in HEX-formaat
rgb(blended_rgb[1], blended_rgb[2], blended_rgb[3], maxColorValue = 1)
}
# Maak een density-plot met kwartielgebaseerde opvulling
ggplot(data, aes(x = Weight)) +
# Volledige density-plot (achtergrondlaag) met bw = 2
geom_density(
aes(
y = ifelse(after_stat(x) <= q1 + 5, after_stat(density), NA)
),color = opvulkleur,
fill = lighten_color(opvulkleur, 0.8),
bw = 2,
size = 1
+
) # Density-plot voor Q1 tot Q2
geom_density(
aes(
y = ifelse(
after_stat(x) >= q1 & after_stat(x) <= q2 + 5,
after_stat(density),
NA
)
),color = opvulkleur,
fill = lighten_color(opvulkleur, 0.6),
bw = 2,
size = 1
+
) # Density-plot voor Q2 tot Q3
geom_density(
aes(
y = ifelse(
after_stat(x) >= q2 & after_stat(x) <= q3 + 5,
after_stat(density),
NA
)
),color = opvulkleur,
fill = lighten_color(opvulkleur, 0.4),
bw = 2,
size = 1
+
) # Density-plot voor Q3 tot Q4
geom_density(
aes(
y = ifelse(after_stat(x) >= q3, after_stat(density), NA)
),color = opvulkleur,
fill = lighten_color(opvulkleur, 0.2),
bw = 2,
size = 1
+
) # Voeg aangepaste x-as ticks en labels toe voor de kwartielen
scale_x_continuous(
breaks = c(q1, q2, q3),
labels = c("Q1", "Q2", "Q3"),
minor_breaks = NULL
+
) # Voeg "25%" labels toe aan elk deel
annotate(
"text",
x = (min(data$Weight) + q1) / 2,
y = 0.002,
label = "25%",
color = "black",
size = 4,
fontface = "bold"
+
) annotate(
"text",
x = (q1 + q2) / 2,
y = 0.005,
label = "25%",
color = "black",
size = 4,
fontface = "bold"
+
) annotate(
"text",
x = (q2 + q3) / 2,
y = 0.005,
label = "25%",
color = "black",
size = 4,
fontface = "bold"
+
) annotate(
"text",
x = (q3 + 0.15 * q4) / 1.15,
y = 0.002,
label = "25%",
color = "black",
size = 4,
fontface = "bold"
+
) labs(
title = NULL,
x = "Lichaamsgewicht (kg)",
y = "Dichtheid"
+
) geom_segment(
aes(
x = quantiles[1],
xend = quantiles[3],
y = 0.002,
yend = 0.002
),arrow = arrow(ends = "both", length = unit(0.3, "cm")),
color = "black",
size = 0.8,
lineend = "round"
+
) theme_minimal()
De interkwartielafstand (IKA; interquartile range) wordt gedefinieerd als het verschil tussen Q3 en Q1:
\[ \mathrm{IKA} = \mathrm{Q3} - \mathrm{Q1} \tag{20.3}\]
Dit is een maat voor de spreiding van de gegevens omdat de IKA aangeeft hoe breed het interval is waarin zich de “middelste” 50% van de waarnemingen bevindt. Het interval van Q1 tot Q3 is in Figuur 20.14 weergegeven met een dubbele pijl. De lengte van die pijl is dus de IKA.
Je kunt de kwartielen en de IKA ook bepalen met behulp van de cumulatieve verdelingsfunctie. In Figuur 20.15 zie je een oranje curve die de cumulatieve verdeling weergeeft voor de variabele Weight
(lichaamsgewicht) uit de NHANES-dataset. We hadden die curve al eerder bekeken (zie Figuur 20.9). De horizontale zwarte lijnen snijden de \(y\)-as bij \(0{,}25\) en \(0{,}75\), en raken de cumulatieve verdeling daarom precies bij Q1 en Q3. Deze kwartielen zijn vervolgens op de \(x\)-as gemarkeerd. De zwarte pijl geeft opnieuw de interkwartielafstand aan.
Code
# Laad de benodigde bibliotheken als ze nog niet geladen zijn
if (!("ggplot2" %in% loadedNamespaces())) { library(ggplot2) }
if (!("dplyr" %in% loadedNamespaces())) { library(dplyr) }
if (!("NHANES" %in% loadedNamespaces())) { library(NHANES) }
if (!("dplyr" %in% loadedNamespaces())) { library(dplyr) }
# Gebruik de Weight-variabele uit de NHANES dataset
<- NHANES %>%
data filter(!is.na(Weight)) %>%
select(Weight)
# Bereken kwartielen
<- quantile(data$Weight, probs = c(0.25, 0.50, 0.75, 1.0))
quartiles <- quartiles[1] # Q1 (25e percentiel)
q1 <- quartiles[2] # Q2 (50e percentiel / Mediaan)
q2 <- quartiles[3] # Q3 (75e percentiel)
q3 <- quartiles[4] # Q4 (100e percentiel)
q4
# Maak een cumulatieve verdelingsplot met kwartielopvulling
ggplot(data, aes(x = Weight)) +
# Opvulgebied voor Q1
stat_ecdf(
geom = "area",
aes(
y = after_stat(y),
fill = "Q1"
),bw = 2
+
) # Opvulgebied voor Q2
stat_ecdf(
geom = "area",
aes(
y = ifelse(
after_stat(x) > q1 & after_stat(x) <= q2,
after_stat(y),
NA
),fill = "Q2"
),bw = 2
+
) # Opvulgebied voor Q3
stat_ecdf(
geom = "area",
aes(
y = ifelse(
after_stat(x) > q2 & after_stat(x) <= q3,
after_stat(y),
NA
),fill = "Q3"
),bw = 2
+
) # Opvulgebied voor Q4
stat_ecdf(
geom = "area",
aes(
y = ifelse(
after_stat(x) > q3,
after_stat(y),
NA
),fill = "Q4"
),bw = 2
+
) # Volledige ECDF-curve (consistent over de hele dataset)
stat_ecdf(
geom = "step",
size = 1,
color = opvulkleur,
bw = 2
+
) # Voeg aangepaste x-as ticks en labels toe voor de kwartielen
scale_x_continuous(
breaks = c(q1, q2, q3),
labels = c("Q1", "Q2", "Q3"),
minor_breaks = NULL
+
) # Voeg aangepaste kleuren toe voor de kwartielen
scale_fill_manual(
values = c(
"Q1" = lighten_color(opvulkleur, 0.8),
"Q2" = lighten_color(opvulkleur, 0.6),
"Q3" = lighten_color(opvulkleur, 0.4),
"Q4" = lighten_color(opvulkleur, 0.2)
)+
) geom_segment(
aes(
x = min(NHANES$Weight, na.rm = TRUE),
xend = quantiles[1],
y = 0.25,
yend = 0.25
),linetype = "dashed",
color = "black",
size = 0.8
+
) geom_segment(
aes(
x = min(NHANES$Weight, na.rm = TRUE),
xend = quantiles[2],
y = 0.5,
yend = 0.5
),linetype = "dashed",
color = "black",
size = 0.8
+
) geom_segment(
aes(
x = min(NHANES$Weight, na.rm = TRUE),
xend = quantiles[3],
y = 0.75,
yend = 0.75
),linetype = "dashed",
color = "black",
size = 0.8
+
) geom_point(
aes(
x = quantiles[1],
y = 0.25
),color = "black",
size = 3
+
) geom_point(
aes(
x = quantiles[2],
y = 0.5
),color = lijnkleur2,
size = 3
+
) geom_point(
aes(
x = quantiles[3],
y = 0.75
),color = "black",
size = 3
+
) geom_segment(
aes(
x = quantiles[1],
xend = quantiles[3],
y = 0.1,
yend = 0.1
),arrow = arrow(ends = "both", length = unit(0.3, "cm")),
color = "black",
size = 0.8,
lineend = "round"
+
) labs(
title = NULL,
x = "Lichaamsgewicht (kg)",
y = "Cumulatieve proportie",
fill = "Kwartielen"
+
) theme_minimal() +
theme(legend.position = "none") # Verwijder de legenda
Statistieken die nauw met de kwartielen samenhangen zijn de percentielen (percentiles). Deze zijn gemakkelijk te begrijpen aan de hand van een paar voorbeelden. Omdat 25% van de waarnemingen kleiner is dan Q1, wordt Q1 ook wel het vijf-en-twintigste percentiel genoemd, oftewel P25. Op dezelfde manier is 90% van de waarnemingen kleiner dan P90, het negentigste percentiel.
In algemene termen worden statistieken zoals kwartielen en percentielen samen aangeduid als kwantielen (quantiles). We komen die in latere hoofdstukken ook nog tegen.
Oefening 20.6 (Opgave: Ligging en spreiding van tentamencijfers)
De scores van 16 studenten op een tentamen zijn als volgt (in volgorde van laag naar hoog):
\[ 12, 15, 18, 20, 21, 23, 25, 28, 30, 32, 35, 38, 40, 42, 45, 46. \]
Bereken met de hand de mediaan van deze dataset.
Bereken Q1 (het eerste kwartiel) en Q3 (het derde kwartiel) met de hand. (Zie Note 20.1.)
Wat is de interkwartielafstand (IKA)?
Een student die bij de eerste toets ziek was haalt het tentamen in, en krijgt score 19. Nu zijn er dus 17 cijfers. Wat zijn de Q1, Q2, en Q3 nu?
Variantie
De variantie (variance) van een rij waarnemingen is gedefinieerd als de gemiddelde gekwadrateerde afwijking van de waarnemingen ten opzichte van hun gemiddelde. De formule luidt:
\[ V_X = \frac{\sum_{i=1}^n \left(x_i - \overline{x}\right)^2}{n-1}. \tag{20.4}\]
- De teller is de kwadratensom die we in Figuur 20.13 al tegenkwamen. Dat is de som van de gekwadrateerde afwijkingen ten opzichte van het gemiddelde (\(\overline{x}\)). Door de afwijkingen te kwadrateren, zorgen we ervoor dat positieve en negatieve afwijkingen elkaar niet opheffen.
- In de noemer zou je misschien \(n\) verwachten in plaats van \(n - 1\). De reden waarom hier \(n - 1\) wordt gebruikt kunnen we helaas pas in hoofdstuk Hoofdstuk 24 uitleggen; je zult het hier even moeten aannemen.
De dimensie van de variantie, \(V_X\), is het kwadraat van de dimensie van \(X\). Als \(X\) bijvoorbeeld een gewicht is (de dimensie) en gemeten wordt in kilogrammen (de eenheid), dan heeft \(V_X\) de dimensie van gewicht-kwadraat en wordt die uitgedrukt in vierkante kilogrammen (\(\text{kg}^2\)). Dit maakt de variantie lastig te interpreteren in termen van de oorspronkelijke eenheden. Daarom gebruiken we vaak de standaarddeviatie – de volgende maat op onze lijst!
Standaarddeviatie
De standaarddeviatie (standard deviation) is waarschijnlijk de meest gebruikte spreidingsmaat. De definitie van de standaarddeviatie is eenvoudig: het is de wortel van de variantie: \[ s_X = \sqrt{V_X}. \tag{20.5}\] Als we de definitie van de variantie invullen levert dat op: \[ s_X = \sqrt{\frac{\sum_{i=1}^n \left(x_i - \overline{x}\right)^2}{n-1}}. \tag{20.6}\] De standaarddeviatie wordt ook wel de standaardafwijking genoemd.
Die twee woorden zijn synoniem en kunnen door elkaar gebruikt worden.
Zoals we eerder zagen, worden de afwijkingen \((x_i - \overline{x})\) ook wel residuen genoemd. In Figuur 20.13 waren de residuen weergegeven met grijze lijntjes. In de formule worden de residuen eerst gekwadrateerd en opgeteld, maar uiteindelijk nemen we weer de wortel. Hierdoor heeft de standaarddeviatie heeft dezelfde dimensie als de variabele zelf. Meet je dus een lengte in mm, dan is de standaarddeviatie ook een lengte in mm. Dit maakt de standaarddeviatie gemakkelijker te interpreteren dan de variantie.
Je kunt de standaarddeviatie interpreteren als een “typische” afwijking van het gemiddelde. Het is dus niet verrassend als een willekeurig gekozen waarneming een standaarddeviatie groter of kleiner is dan het gemiddelde. Bij de meeste verdelingen liggen verreweg de meeste waarnemingen binnen twee standaarddeviaties van het gemiddelde.
Als voorbeeld nemen we weer een variabele uit de dataset NHANES. Van de mensen die onderzocht zijn is ook de rusthartslag bepaald. Dat is variabele Pulse
. Een histogram van die variabele is in Figuur 20.16 weergegeven. Deze variabele is unimodaal en redelijk klokvormig. Je kunt de standaarddeviatie dan grofweg inschatten als de helft van de breedte van de piek van het histogram, gemeten iets boven de helft van de hoogte van het histogram. In de figuur is de standaarddeviatie met een pijl aangegeven.
Code
# Controleer of de benodigde pakketten zijn geladen
if (!("ggplot2" %in% .packages())) { library(ggplot2) }
if (!("NHANES" %in% .packages())) { library(NHANES) }
if (!("scales" %in% .packages())) { library(scales) }
# Laad de NHANES dataset
data("NHANES")
# Bereken het gemiddelde en de standaarddeviatie van Pulse
<- mean(NHANES$Pulse, na.rm = TRUE)
mean_pulse <- sd(NHANES$Pulse, na.rm = TRUE)
sd_pulse
# Automatisch gegenereerde breaks met het gemiddelde toegevoegd
<- extended_breaks()(range(NHANES$Pulse, na.rm = TRUE))
default_breaks <- sort(c(default_breaks, mean_pulse))
all_breaks <- ifelse(
labels == mean_pulse,
all_breaks expression(italic(bar(x))),
all_breaks
)
# Maak een histogram met een binbreedte van 6
ggplot(NHANES, aes(x = Pulse)) +
geom_histogram(
binwidth = 6,
fill = opvulkleur,
color = "black",
+
)
# Voeg een verticale stippellijn toe voor het gemiddelde
#geom_vline(
# xintercept = mean_pulse,
# linetype = "dashed",
# color = "black",
# size = 1
#) +
# Voeg een horizontale stippenlijn toe op de hoogte van de pijl
geom_hline(
yintercept = 850,
linetype = "dotted",
color = "black",
size = 0.8
+
)
# Voeg een horizontale pijl toe om de standaarddeviatie aan te geven
geom_segment(
aes(
x = mean_pulse,
xend = mean_pulse + sd_pulse,
y = 850,
yend = 850
),arrow = arrow(
length = unit(0.3, "cm"),
ends = "both"
), color = "DarkOrchid",
size = 1
+
)
# Voeg een label toe voor de standaarddeviatie (s_X)
annotate(
"text",
x = mean_pulse + sd_pulse / 2.5 -1,
y = 960,
label = expression(italic(s[X])),
color = "DarkOrchid",
size = 4.5,
parse = TRUE
+
)
# Pas de x-as aan met automatische ticks en het gemiddelde als extra
scale_x_continuous(
name = "Hartslag in rust",
# breaks = all_breaks,
# labels = labels,
minor_breaks = NULL # Schakel minor ticks uit
+
)
# Pas de labels aan
labs(
y = "Frequentie"
+
)
# Gebruik een minimalistisch thema
theme_minimal()
Oefening 20.7 (Oefenen met het sommatieteken en spreidingsmaten)
Het wegen van \(n = 3\) volwassen poezen levert de volgende gewichten op: \(X_1 = 3{,}0\,\)kg, \(X_2 = 3{,}4\,\)kg en \(X_3=4{,}2\),kg.
- Bereken \(\sum_{i=1}^3 X_i\).
- Leg uit dat het gemiddelde gewicht \(\overline{X}\) kan worden geschreven als: \[\overline{X} = \frac{\sum_{i=1}^3 X_i}{3}.\] Bereken \(\overline{X}\).
- Bereken \(\sum_{i=2}^3 X_i\).
- Bereken \(\sum^n_{i=1} X_i\).
- Bereken \(\sum^n_{i=1} X_i^2\).
- Bereken \(\left( \sum^n_{i=1} X_i\right)^2\).
- Bereken \(\sum^n_{i=1} \left(X_i - \overline{X}\right)\).
- Bereken \(\sum^n_{i=1} \left(X_i - \overline{X}\right)^2\).
- Bereken de variantie en de standaarddeviatie van de gewichten. Maak daarbij gebruik van je eerdere antwoorden.
Oefening 20.8 (Standaarddeviaties inschatten)
Schat van alle histogrammen in Figuur 20.8 op het oog de standaarddeviatie. Houd er rekening mee dat uitbijters en staarten van een verdeling sterk bijdragen aan de standaarddeviatie.
Het is geen probleem als je er, zeg, 25% naast zit; het gaat erom dat je een gevoel ontwikkelt bij het concept standaarddeviatie.
Schat ook de interkwartielafstand door in gedachte de histogram in vier delen te verdelen, zoals in Figuur 20.14.
20.8 Wanneer gebruik je welke centrum- en spreidingsmaat?
We hebben drie centrummaten besproken: de modus, de mediaan, en het gemiddelde. Bovendien hebben we vier spreidingsmaten gezien: het bereik, de IKA, de variantie en de standaarddeviatie. Wanneer gebruik je nu welke maat om een rij gegevens samen te vatten?
Een belangrijk verschil tussen de verschillende maten is hoe ze reageren op uitbijters. We hebben gezien dat het gemiddelde sterk beïnvloed kan worden door een uitbijter, terwijl de modus en mediaan daar veel minder gevoelig voor zijn. Ook de standaarddeviatie is gevoelig voor uitbijters, doordat in de berekening van de standaarddeviatie de residuen gekwadrateerd worden. De IKA trekt zich juist niets aan van uitbijters.
Daarmee samenhangend worden het gemiddeld en de standaarddeviatie ook sterk beïnvloed door de symmetrie van de verdeling. Hieronder is in Figuur 20.17 een histogram gegeven die sterk rechts-scheef is. In zo’n geval is de modus typisch kleiner dan de mediaan en de mediaan kleiner dan het gemiddelde, doordat de “staart” aan de rechterkant een sterk effect heeft op het gemiddelde maar nauwelijks op de andere centrummaten.
Code
# Installeer en laad ggplot2 als het niet al beschikbaar is
if (!("ggplot2" %in% .packages())) {
library(ggplot2)
}
# Stel een seed in voor reproduceerbaarheid
set.seed(123)
# Parameters voor de Gamma-verdeling
<- 1.5 # Vormparameter (k)
shape <- 3 # Schaalparameter (θ)
scale <- 8000 # Aantal observaties
sample_size
# Trek een steekproef uit de Gamma-verdeling
<- rgamma(sample_size, shape = shape, scale = scale)
gamma_sample
# Bereken statistieken
<- mean(gamma_sample)
mean_value <- median(gamma_sample)
median_value
# Modus berekening voor een Gamma-verdeling
<- (shape - 1) * scale
mode_value
# Zet de data in een dataframe voor ggplot2
<- data.frame(
gamma_df value = gamma_sample
)
# Maak een histogram en voeg verticale lijnen en labels toe
ggplot(gamma_df, aes(x = value)) +
geom_histogram(
binwidth = 0.5,
boundary = 0,
fill = opvulkleur,
color = "black",
+
) geom_vline(
aes(xintercept = mean_value),
color = lijnkleur1,
linetype = "dashed",
size = 1.2
+
) geom_vline(
aes(xintercept = median_value),
color = lijnkleur4,
linetype = "dashed",
size = 1.2
+
) geom_vline(
aes(xintercept = mode_value),
color = lijnkleur3,
linetype = "dashed",
size = 1.2
+
) annotate(
"text",
x = 10,
y = 630,
vjust = 0,
label = paste0("Gemiddelde = ", round(mean_value, 1)),
color = lijnkleur1
+
) annotate(
"text",
x = 10,
y = 530,
vjust = 0,
label = paste0("Mediaan = ", round(median_value, 1)),
color = lijnkleur4
+
) annotate(
"text",
x = 10,
y = 430,
vjust = 0,
label = paste0("Modus = ", round(mode_value, 1)),
color = lijnkleur3
+
) labs(
title = NULL,
x = "Waarden",
y = "Frequentie"
+
) theme_minimal()
Daarom gebruiken we de volgende richtlijnen.
Situatie 1: De verdeling van gegevens is grofweg symmetrisch en er zijn geen opvallende uitbijters. In dat geval is het beste het gemiddelde en de standaarddeviatie te rapporteren.
Situatie 2: De verdeling van gegevens is scheef en/of er zijn opvallende uitbijters. In dat geval kunnen het gemiddelde en de standaarddeviatie sterk beïnvloed worden door uitbijters en de staart van de verdeling. Daarom kun je in dat geval het beste de mediaan en de IKA rapporteren.
20.9 Verdelingen samenvatten met frequentietabellen
De verdeling van een variabele wordt vaak samengevat door middel van een frequentietabel (frequency table). Dat is een tabel die aangeeft hoe vaak een waarde in een bepaalde categorie of klasse valt. De manier waarop je een frequentietabel opstelt, hangt af van het type variabele dat de tabel beschrijft.
Frequentietabellen voor categorische variabelen
We beginnen met categorische variabelen.
Voorbeeld 20.4 (Frequentietabel van gezondheidsstatus in de dataset NHANES) De dataset NHANES bevat ook gegevens over de gezondheidsstatus van de deelnemers aan het onderzoek (variabele HealthGen
). Die gegevens zijn gebaseerd op een enquête die door alle deelnemers wordt ingevuld. Daarin geven ze onder andere aan hoe ze zelf hun algemene gezondheid inschatten: Slecht, Matig, Goed, Zeer Goed, of Uitstekend. Gezondheidsstatus is in deze dataset dus een ordinale variabele.
De frequentietabel van gezondheidsstatus ziet er als volgt uit:
Warning: 'xfun::attr()' is deprecated.
Use 'xfun::attr2()' instead.
See help("Deprecated")
Warning: 'xfun::attr()' is deprecated.
Use 'xfun::attr2()' instead.
See help("Deprecated")
Gezondheidsstatus | Absolute frequentie | Relatieve frequentie |
---|---|---|
Slecht | 187 | 0.02 |
Matig | 1010 | 0.13 |
Goed | 2956 | 0.39 |
Zeer Goed | 2508 | 0.33 |
Uitstekend | 878 | 0.12 |
Je ziet dat voor elke mogelijke waarde van gezondheidsstatus de frequentie wordt weergegeven. In dit geval laat de tabel zowel de absolute frequentie als de relatieve frequentie zien. De absolute frequentie geeft aan hoe vaak een bepaalde waarde voorkomt in de dataset. De relatieve frequentie toont het aandeel van een bepaalde waarde in verhouding tot het totale aantal waarnemingen. Dit wordt uitgedrukt als een fractie of proportie: een getal tussen 0 en 1. Soms wordt een relatieve frequentie ook als een percentage uitgedrukt.
Het voordeel van de frequentietabel is duidelijk: een dataset met duizenden regels is samengevat in een frequentietabel met 5 regels, zonder dat daarbij informatie verloren ging. Bovendien zijn de gegevens nu veel beter te overzien. Zo laat de frequentietabel direct zien dat de meeste mensen hun eigen gezondheid positief beoordelen (Goed, Zeer Goed, of Uitstekend). In de duizenden regels van de ruwe data springt die conclusie niet direct in het oog.
Frequentietabel voor continue variabelen
Het opstellen van een frequentietabel voor een numerieke variabele is net iets minder vanzelfsprekend.
Voor een voorbeeld grijpen we weer naar de dataset met gezondheidsgegevens van de NCHS. Deze dataset bevat van alle deelnemers die in de steekproef zijn opgenomen ook hun gewicht. Dit gewicht is gegeven in kg, tot op één decimaal. Het gevolg is dat er erg veel verschillende waarden gemeten zijn. Tellen hoe vaak iedere waarde voorkomt levert dus geen nuttige samenvatting op. Dit is een algemeen probleem voor continue variabelen.
Als we een frequentietabel willen maken voor een continue variabele moeten we de gegevens daarom opdelen in verschillende intervallen. Die intervallen noemen we klassen (bins). Vervolgens tellen we voor iedere klasse hoe vaak een waarneming in die klasse valt. Toegepast op het voorbeeld is dit het resultaat:
Lichaamsgewicht (kg) | Absolute frequentie |
---|---|
[0,10) | 133 |
[10,20) | 618 |
[20,30) | 424 |
[30,40) | 288 |
[40,50) | 448 |
[50,60) | 1068 |
[60,70) | 1547 |
[70,80) | 1630 |
[80,90) | 1416 |
[90,100) | 939 |
[100,110) | 691 |
[110,120) | 355 |
[120,130) | 174 |
[130,140) | 86 |
[140,150) | 49 |
[150,160) | 11 |
[160,170) | 26 |
[170,180) | 6 |
[180,190) | 6 |
[190,200) | 2 |
[200,210) | 1 |
[210,220) | 0 |
[220,230) | 2 |
Uit deze tabel kun je gemakkelijk aflezen dat de meest voorkomende gewichten zo tussen 50 en 100 kg liggen.
De lastigste stap is het kiezen van de klassen. Daarvoor moet je namelijk besluiten hoe breed je de klassen maakt en op welke plek je ze laat beginnen. Hiervoor zijn allerlei formele regels voorgesteld, maar met gezond verstand kom je een heel eind.
- Ronde getallen zijn overzichtelijk.
- Als je heel brede intervallen gebruikt, veeg je veel gegevens op één hoop. Het gevaar is dat je daarmee belangrijke patronen in je data onzichtbaar maakt. Aan de andere kant, als je heel smalle intervallen gebruikt, wordt de tabel onoverzichtelijk lang en het aantal waarnemingen per klasse erg klein. Het is dus zoeken naar een middenweg.
Frequentietabellen voor discrete variabelen
Als je een frequentietabel wilt maken voor een discrete numerieke variabele, dan kunnen we twee situaties onderscheiden.
Soms zijn de waarnemingen verspreid over een klein aantal waarden. Bijvoorbeeld, stel dat in een dataset over Nederlandse huishoudens ook het aantal kinderen per gezin is opgenomen In dat geval zullen de waarden 0 t/m 3 heel vaak voorkomen. Het ligt dan voor de hand om de frequentie van iedere mogelijke uitkomst te berekenen, net als bij categorische variabelen.
In andere gevallen zijn de waarden verspreid over een veel groter bereik en zijn de meeste waarden uniek. Dit is bijvoorbeeld het geval als we het aantal inwoners bekijken van alle landen in de wereld. Strikt genomen is deze variabele discreet, want het aantal inwoners is altijd een geheel getal. Maar er zijn geen twee landen met exact hetzelfde aantal inwoners, en dus ligt het voor de hand om de waarden in te delen in brede klassen, net als bij continue variabelen.
Oefening 20.9 (Gewogen gemiddelden)
Deze opgave is bedoeld als voorbereiding voor Oefening 20.10.
Je hebt voor de tentamens van een vak een 5, een 8, en een 7 gehaald. Het eerste cijfer telt mee voor 10%, het tweede voor 60%, en het derde voor 30%. Bereken het (gewogen) gemiddelde. Schrijf op hoe je dat berekent.
Oefening 20.10 (Gemiddelden berekenen op basis van een frequentietabel.)
Je bent een middagje naar de vogeltrek aan het kijken en wilt graag weten hoe groot de zwermen vogels meestal zijn. Telkens als er een zwerm overvliegt tel je het aantal vogels dat erin zit. Uiteindelijk heb je de volgende 10 waarnemingen:
\[5 \quad 3\quad 6\quad 2\quad 4\quad 3\quad 3\quad 2\quad 2\quad 5\]
- Bereken het gemiddeld aantal vogels in een zwerm.
Je kunt de waarnemingen ook weergeven in een frequentietabel:
Aantal vogels | Frequentie | Relatieve frequentie |
---|---|---|
2 | 3 | 0,3 |
3 | 3 | 0,3 |
4 | 1 | 0,1 |
5 | 2 | 0,2 |
6 | 1 | 0,1 |
Leg uit dat het gemiddelde ook zo berekend kan worden: \[ \overline{x} = \frac{3\times {\color{darkorange}2} + 3\times {\color{darkorange}3} + 1\times {\color{darkorange}4} + 2\times {\color{darkorange}5} + 1 \times {\color{darkorange}6} }{10}.\] Wat stelt het eerste getal in de vermenigvuldigingen steeds voor?
Leg uit dat het gemiddelde ook zo berekend kan worden: \[ \overline{x} = {\color{darkorchid}0{,}3}\times {\color{darkorange}2} + {\color{darkorchid}0{,}3}\times {\color{darkorange}3} + {\color{darkorchid}0{,}1}\times {\color{darkorange}4} + {\color{darkorchid}0{,}2}\times {\color{darkorange}5} + {\color{darkorchid}0{,}1}\times {\color{darkorange}6}.\] Wat stelt het eerste getal in de vermenigvuldigingen nu voor?
Stel dat de relatieve frequentie van de waarde \(x\) genoteerd wordt als \({\color{darkorchid}f(x)}\). Leg uit dat het gemiddelde dan altijd zo kan worden geschreven: \[ \overline{x} = \sum_{\color{darkorange}x} {\color{darkorchid}f(x)} {\color{darkorange}x}. \tag{20.7}\] Met de notatie \(\sum_x\) wordt gedoeld dat je moet sommeren over alle waarden van \(x\) die kunnen voorkomen.
Wat is de relatie tussen Vergelijking 20.7 en Oefening 20.9?
In Oefening 20.10 heb je geleerd hoe je het gemiddelde kan berekenen van waarnemingen die zijn samengevat in een frequentietabel. Vergelijking 20.7 is eigenlijk gemakkelijk te begrijpen: het is een gewogen gemiddelde, waarbij je voor het gewicht van iedere mogelijke uitkomst de relatieve frequentie gebruikt.
Het is handig als je dit goed begrijpt: dat komt van pas als we het in Hoofdstuk 22 gaan hebben over het gemiddelde van kansverdelingen.
20.10 Het visualiseren van verdelingen van categorische variabelen
Het is bijna altijd nuttig om de verdeling van een variabele te visualiseren. Daar zijn verschillende technieken voor. Welke techniek gebruikt kan worden, hangt af van het type van de variabele. Hieronder passeren een aantal standaardmethodes kort de revue. Je kent ze waarschijnlijk allemaal.
Staafdiagrammen
Als de variabele categorisch is, wordt vaak een staafdiagram (bar graph) gebruikt om de verdeling te laten zien. Het idee van een staafdiagram is om de frequenties van iedere categorie weer te geven als de oppervlakte van een staaf. Zo is het op het oog direct duidelijk welke categorieën de hoogste frequentie hebben.
Voorbeeld 20.5 (Staafdiagram van HealthGen
(gezondheidsstatus)) Als voorbeeld kijken we terug naar de frequentietabel in Tabel 20.2 hierboven, over de HealthGen
(gezondheidsstatus) van de deelnemers aan de studie van de NCHS. Die frequentietabel ziet er als staafdiagram als volgt uit:
Code
# De gegevens zijn gepubliceerd in dit package:
library(NHANES)
library(ggplot2)
library(knitr)
library(dplyr)
# Laad de dataset in:
data(NHANES)
# Eerst: de variabele `HealthGen` (gezondheidsstatus)
# Vertaal de levels en zet ze in een logische volgorde:
$HealthGen <- factor(
NHANES$HealthGen,
NHANESlevels = c("Poor", "Fair", "Good", "Vgood", "Excellent"),
labels = c("Slecht", "Matig", "Goed", "Zeer Goed", "Uitstekend"),
ordered = TRUE
)
# We filteren de regels met missende waarden voor Gezondheidsstatus:
<- NHANES %>% filter(!is.na(HealthGen))
NHANES_filtered
# Maak een frequentietabel en laat die zien.
<- table(NHANES$HealthGen)
freq_table <- addmargins(freq_table)
tot_table
# Maak een staafdiagram:
ggplot(
data = NHANES_filtered,
aes(x = HealthGen)
+
) geom_bar(
fill = opvulkleur,
color = "black"
+
) labs(
title = NULL,
x = "Gezondheidsstatus",
y = "Frequentie"
+
) theme_minimal()
Dit staafdiagram laat helder zien hoe de gegevens over de waarden zijn verdeeld. Je ziet gelijk dat de meeste mensen hun gezondheid beoordelen als Goed of Zeer goed.
Let bij het maken van een staafdiagram op drie dingen.
- Laat de \(y\)-as altijd op 0 beginnen. Als je de \(y\)-as “afsnijdt”, zijn de oppervlaktes van de staven niet meer representatief voor de frequenties die ze voorstellen. Op het oog lijken de verschillen tussen de frequenties dan veel groter dan ze daadwerkelijk zijn, wat een misleidend beeld geeft. Het volgende voorbeeld laat dat duidelijk zien.
Voorbeeld 20.6 (The Times leaves the rest behind) Het volgende krantenknipsel laat zien dat De Times beter verkoopt dan de Daily Telegraph:
Maar kijk eens goed naar het staafdiagram aan de rechterkant. Op het eerste gezicht lijkt het verschil tussen de verkoopcijfers enorm omdat de staaf van The Times een veel groter oppervlakte heeft dan die van de Telegraph. (Die indruk wordt nog versterkt door het verschil in de kleur!) Pas als je naar de \(y\)-as kijkt, blijkt het verschil wel mee te vallen: zo’n 10%.
Houd ruimte tussen de staven. Dat laat zien dat de categorieën van een categorische variabele niet geleidelijk in elkaar overlopen maar los van elkaar staan.
Kies de volgorde van de staven verstandig. Als de variabele ordinaal is, ligt het voor de hand om de natuurlijke volgorde van de categorieën te laten terugkomen in de volgorde van de staven. In het staafdiagram van de
gezondheidsstatus
(Figuur 20.18) staan de staven in de volgorde Slecht, Matig, Goed, Zeer Goed, Uitstekend. Een andere volgorde zou erg verwarrend zijn. Bij nominale variabelen bestaat zo’n natuurlijke volgorde niet, en hangt de beste volgorde af van de toepassing. Vaak is het handig om de staven op volgorde van grootte te sorteren, zodat de belangrijkste categorieën vooraan staan. Maar in andere gevallen kan bijvoorbeeld een alfabetische volgorde passender zijn.
Taart- en stapeldiagrammen
Een alternatief voor het staafdiagram is het taartdiagram (pie chart). Een taartdiagram representeert de verdeling van een variabele als een cirkel – de “taart” – die verdeeld is in verschillende sectoren – de taartpunten. De grootte van ieder taartpunt geeft de frequentie van een categorie aan.
Voorbeeld 20.7 (Burgerlijke staat) In de NHANES dataset van het NCHS is ook van de meeste deelnemers aangegeven wat hun burgerlijke staat is. Deze gegevens kunnen we goed laten zien in een taartdiagram:
Code
$MaritalStatus <- factor(
NHANES$MaritalStatus,
NHANESlevels = c("Married", "LivePartner", "Divorced", "Separated", "Widowed", "NeverMarried"),
labels = c("Getrouwd", "Samenwonend", "Gescheiden", "Uit elkaar", "Weduwe/weduwnaar", "Nooit getrouwd"),
ordered = TRUE
)
<- table(NHANES$MaritalStatus)
table_MaritalStatus
<- data.frame(
data
table_MaritalStatus
)colnames(data) <- c("BurgerlijkeStaat", "Frequentie")
# Taartdiagram
ggplot(
data, aes(
x = "",
y = Frequentie,
fill = BurgerlijkeStaat
)+
) geom_bar(
stat="identity",
width = 1,
color = "white"
+
) coord_polar( "y", start = 0 ) +
labs( fill = "Burgerlijke staat") +
theme_void()
Meer dan de helft van de personen in de steekproef blijkt getrouwd te zijn.
Een taartdiagram laat vooral de relatieve frequenties van categorieën goed zien. Zo zagen we hierboven gemakkelijk dat meer dan de helft van de deelnemers aan dit onderzoek getrouwd was. De absolute frequenties zijn niet af te lezen. Een taartdiagram gebruik je dus vooral als je relatieve frequenties wilt laten zien.
Taartdiagrammen zijn ook alleen voor nominale variabelen aan te raden. Bij ordinale variabelen is er altijd van nature een eerste en een laatste categorie. Omdat een taartdiagram cirkelvormig is is er geen goede manier om dat te laten zien. In dat geval is een stapeldiagram een betere optie. Bij een stapeldiagram worden de relatieve frequenties weergegeven als opgestapelde staven. Dit geeft wél de mogelijkheid om dat in een specifieke volgorde te doen, zoals dat bij een ordinale variabele wenselijk is.
Voorbeeld 20.8 (Stapeldiagram van gezondheidsstatus
) De variabele gezondheidsstatus
is ordinaal; een taartdiagram is dus niet erg geschikt om zijn verdeling weer te geven. In plaats daarvan kan wel een stapeldiagram worden gebruikt:
Code
<- data.frame(
freq_df
freq_table
)colnames(freq_df) <- c("Gezondheidsstatus", "Frequentie")
ggplot(
freq_df, aes(
x = "",
y = Frequentie/nrow(NHANES_filtered),
fill = Gezondheidsstatus
)+
) geom_bar(
position = "stack",
stat="identity",
width = 0.2,
color="black"
+
) theme_classic() +
labs( x = "", y = "Relatieve frequentie") +
theme(
axis.title.x = element_blank(), # Remove x-axis title
axis.text.x = element_blank(), # Remove x-axis text/labels
axis.ticks.x = element_blank(), # Remove x-axis ticks
axis.line.x = element_blank()
+
) scale_y_continuous(limits = c(0, 1), expand = c(0, 0))
20.11 Het visualiseren van verdelingen van numerieke variabelen
Na het verkennen van methoden voor categorische variabelen, richten we ons nu op technieken om numerieke variabelen te visualiseren.
Histogrammen en frequentiepolygonen
Histogrammen zijn we eerder in dit hoofdstuk al vaak tegengekomen; toch komen we er even op terug. Histogrammen worden gebruikt om de verdeling van numerieke variabelen te laten zien. Een histogram lijkt op een staafdiagram: beide zijn visualisaties van een frequentietabel waarbij frequenties worden gerepresenteerd door de oppervlakte van staven. Het grote verschil is dat staafdiagrammen bedoeld zijn voor categorische variabelen. De categorieën van een categorische variabele staan los van elkaar, terwijl de klassen van een numerieke variabele direct in elkaar overlopen. Om dat te verbeelden wordt er bij staafdiagrammen altijd ruimte gelaten tussen de staven, en bij een histogram juist niet. (Kijk maar eens terug naar het histogram van Weight
(lichaamsgewicht) in Figuur 20.7.)
Net als bij staafdiagrammen is het belangrijk dat de \(y\)-as altijd bij 0 begint, omdat anders de oppervlaktes van de staven niet meer proportioneel zijn met de frequenties die ze representeren.
Een alternatieve manier om exact dezelfde gegevens te presenteren is het frequentiepolygoon. Hieronder is een voorbeeld voor Weight
(lichaamsgewicht). De frequentie van iedere gewichtsklasse wordt uitgezet tegen het midden van die gewichtsklasse, en vervolgens wordt een lijn getrokken tussen deze punten.
Vioolplot
Een vioolplot is aan andere grafische weergave die de verdeling van een numerieke variabele toont. Als voorbeeld is in Figuur 20.22 een vioolplot weergegeven voor de variabele Weight
(lichaamsgewicht).
- Een vioolplot wordt meestal verticaal weergegeven. Dat wil zeggen, de variabele staat op de \(y\)-as.
- De breedte van de “viool” geeft de frequentie aan: hoe breder de viool op een bepaald punt, hoe meer waarnemingen er zijn bij die waarde.
- De frequentie die bij een waarde hoort wordt niet direct geteld, maar geschat door het aantal punten te tellen in de buurt van die waarde. Dat resulteert in een vloeiende vorm. Hoe groot de “buurt” is die wordt meegenomen wordt bepaald door een parameter die de bandwidth wordt genoemd. Software kiest vaak automatisch een geschikte waarde voor de bandwidth, maar je kunt deze aanpassen om meer of minder detail in de grafiek weer te geven, vergelijkbaar met de breedte van de staven in een histogram.
De boxplot
Een boxplot is een compacte grafische weergave die een verdeling samenvat aan de hand van vijf kengetallen plus eventuele uitbijters. Boxplots worden vaak gebruikt voor het verkennen en vergelijken van datasets. De anatomie van een boxplot is getoond in Figuur 20.23. In dat figuur zie je aan de linkerkant de ruwe data weergegeven als een puntenwolk. Dit wordt een jitterplot genoemd. Aan de rechterkant zie je de bijbehorende boxplot. We leggen het hieronder verder uit.
Code
# Data voorbereiden
<- NHANES[1:200, ]
data <- data[order(data$Weight), ]
data <- quantile(data$Weight)
kwantielen 1] <- kwantielen[1] - 1 # Aanpassing voor visualisatie
kwantielen[<- kwantielen[4] - kwantielen[2]
interkwartielafstand <- c(
uitbijters 2] - 1.5 * interkwartielafstand,
kwantielen[4] + 1.5 * interkwartielafstand
kwantielen[
)<- c(kwantielen, uitbijters)
grenzen
# Plot
ggplot(data, aes(x = "", y = Weight)) +
# Boxplot
geom_boxplot(
aes(x = 3),
fill = "Bisque",
color = opvulkleur,
size = 0.7,
outlier.color = "red",
outlier.alpha = 0.3
+
) stat_boxplot(
aes(x = 3),
geom = "errorbar",
colour = "DarkOrchid",
size = 0.7,
width = 0.15
+
) geom_boxplot(
aes(x = 3),
fill = "Bisque",
color = opvulkleur,
coef = 0,
outlier.shape = NA
+
) # Jitterplot
geom_jitter(
aes(
x = 2,
col = cut(data$Weight, grenzen)
)+
) # Annotaties
annotate(
"text",
y = kwantielen[2],
x = 3.47,
label = "Q1",
color = opvulkleur
+
) annotate(
"text",
y = kwantielen[4],
x = 3.47,
label = "Q3",
color = opvulkleur
+
) annotate(
"text",
y = kwantielen[3],
x = 3.8,
label = "interkwartiel-
afstand",
color = opvulkleur
+
) annotate(
"text",
y = mean(kwantielen[4:5]),
x = 3.45,
label = "snorhaar",
color = "DarkOrchid"
+
) annotate(
"text",
y = mean(kwantielen[1:2]),
x = 3.45,
label = "snorhaar",
color = "DarkOrchid"
+
) annotate(
"segment",
y = kwantielen[2] + 5,
yend = kwantielen[4] - 5,
x = 3.46,
size = 0.7,
color = opvulkleur
+
) annotate(
"text",
y = uitbijters + c(-3, 3),
x = 3.45,
label = "outliers",
color = "red"
+
) annotate(
"text",
y = kwantielen[3],
x = 1,
label = "50% van de data
bevindt zich in de box"
+
) annotate(
"text",
y = mean(kwantielen[1:2]),
x = 1,
label = "25% van de data
bevindt zich onder Q1"
+
) annotate(
"text",
y = mean(kwantielen[4:5]),
x = 1,
label = "25% van de data
bevindt zich boven Q3"
+
) # Labels en thema
labs(
title = NULL,
x = "",
y = "Lichaamsgewicht (kg)"
+
) theme_minimal() +
scale_x_continuous(
breaks = NULL,
limits = c(0.5, 4)
+
) scale_colour_manual(
values = c("red", "DarkOrchid", opvulkleur, opvulkleur, "DarkOrchid", "red")
+
) theme(legend.position = "none")
Een boxplot bestaat uit verschillende elementen die elk een specifiek aspect van de verdeling van de variabele weergeven.
De mediaan:
De mediaan, oftewel Q2 wordt weergegeven met een horizontale streep.De box:
Om de mediaan wordt een rechthoek getekend – de “box”. Deze rechthoek loopt van het eerste kwartiel (Q1, 25e percentiel) tot het derde kwartiel (Q3, 75e percentiel). De hoogte van de box vertegenwoordigt dus de interkwartielafstand (IKA), waarbinnen de middelste 50% van de data zich bevindt. Hoe hoger de box, hoe groter de spreiding in dit centrale gebied.Uitbijters:
Waarden die meer dan \(1{,}5\) keer de IKA buiten de box liggen, worden als uitbijters beschouwd. Deze datapunten worden afzonderlijk weergegeven, vaak als kleine stippen. Dit maakt uitbijters makkelijk herkenbaar.Snorharen:
De snorharen (whiskers) zijn lijnen die vanuit het midden van de box naar boven en naar beneden lopen. Ze eindigen bij de verste datapunten die géén uitbijters zijn. De uiteinden van de whiskers geven aan waar de “normale” gegevens ophouden en de uitbijters beginnen.
Een boxplot biedt een visueel overzicht van de verdeling en maakt het mogelijk om een aantal aspecten snel te herkennen. Q1 (de onderkant van de box), de mediaan (de lijn binnenin de box), en Q3 (de bovenkant van de box) kunnen direct worden afgelezen. De box maakt het zo gemakkelijk om te zien in welk gebied zich de meeste waarnemingen bevinden en de spreiding (de IKA) is zichtbaar als de hoogte van de box. Uitbijters die mogelijk grote invloed zouden kunnen hebben op gemiddelde en standaarddeviatie zijn apart geplot en worden zo niet over het hoofd gezien.
De boxplot laat ook gemakkelijk beoordelen of een verdeling scheef is. Bij een scheve verdeling zijn de snorharen vaak asymmetrisch. Is de verdeling rechts-scheef, dan zijn de snorharen aan de bovenkant vaak langer dan aan de onderkant. Vaak ligt de mediaan dan ook onder het midden van de box. Bovendien zullen er dan vaak ook meer uitbijters zijn aan de bovenkant dan aan de onderkant.
Naast deze voordelen hebben boxplots ook een aantal beperkingen.
Doordat boxplots grote datasets in feite samenvatten met een klein aantal kengetallen kunnen ze belangrijke details verbergen. Kijk als voorbeeld eens naar Figuur 20.24, waarin de boxplot van de lichaamsgewichten van de NHANES dataset is weergegeven. Eerder hebben we in Figuur 20.21 gezien dat de verdeling van lichaamsgewicht bimodaal is. Die belangrijke eigenschap is in de boxplot niet te zien. Een histogram, vioolplot of frequentiepolygoon geeft in zulke gevallen meer inzicht.
Een boxplot kan ook misleidend zijn bij datasets met weinig waarnemingen. Het heeft niet veel zin om een dataset met zes datapunten samen te vatten in vijf kengetallen (plus uitbijters). De kengetallen zijn dan bovendien zozeer door het toeval bepaald dat de vorm dan de boxplot niet veel zegt. In zulke gevallen is het vaak beter om individuele datapunten weer te geven, bijvoorbeeld met een jitterplot (zoals in Figuur 20.23).
Code
ggplot(NHANES, aes(x = "", y = Weight)) +
geom_boxplot(fill = "Bisque", color = opvulkleur) +
labs(title = NULL,
x = "",
y = "Lichaamsgewicht (kg)") +
theme_minimal()
Oefening 20.11 (Nationale Tuinvogeltelling)
Een bioloog doet mee aan de Nationale Tuinvogeltelling en telt hoeveel vogels van elke soort ze in een uur in haar tuin ziet. Welke grafiek zou ze het best kunnen gebruiken om de verdeling van vogelsoorten weer te geven?
A een histogram
B een cumulatieve frequentiepolygoon
C een boxplot
D een staafdiagram
Oefening 20.12 (Zetelverdeling tweede kamer)
Je wilt in een figuur laten zien hoe de zetels van de Tweede Kamer verdeeld zijn over de partijen.
Welk van de diagrammen die we in dit hoofdstuk behandeld hebben lijkt je daarvoor het meest geschikt?
Zie de visualisatie hieronder, afkomstig van Wikipedia. Wat zijn de voor- en nadelen van deze representatie?
20.12 Alles samen: het beschrijven van een de verdeling van een dataset
We hebben hierboven een groot aantal begrippen en technieken beschreven. Hoe pas je die informatie nu specifiek toe bij het beschrijven van een verdeling?
De verdeling van numerieke gegevens beschrijven
Als je een lijst numerieke gegevens wilt beschrijven maak je tenminste gebruik van:
- Een visualisatie. Bij kleine datasets kan dat een jitterplot zijn (voor kleine datasets), een boxplot (als dit geen belangrijke eigenschappen van de gegevens verbergt), een histogram, een frequentiepolygoon, of een vioolplot.
- Een centrummaat. Bij grofweg symmetrische verdelingen zonder extreme uitbijters is het gemiddelde het meest geschikt, en anders de mediaan of de modus (of modi!).
- Een spreidingsmaat. Bij grofweg symmetrische verdelingen zonder extreme uitbijters is de standaarddeviatie het meest nuttig, en anders de interkwartielafstand.
De verdeling van categorische gegevens beschrijven
Wil je een lijst categorische gegevens beschrijven, maak dan tenminste gebruik van:
- Een visualisatie. Als je alleen de relatieve frequenties wilt benadrukken en de variabelen nominaal is, dan is een taartdiagram geschikt. Anders ligt een staafdiagram of stapeldiagram meer voor de hand.
- Een frequentietabel.
20.13 Beschrijvende statistiek in R
Hieronder geven we kort aan hoe je verschillende technieken uit dit hoofdstuk in R kunt toepassen.
Typen variabelen in R
In Paragraaf 2.1 heb je geleerd dat variabelen in R ook verschillende types hebben, zoals numeric
, integer
, of character
. Deze typen komen niet één op één overeen met de indeling van Figuur 20.1. Wat is de relatie tussen Figuur 20.1 en de data-typen van R?
Voor numerieke variabelen zul je meestal het datatype numeric
gebruiken, waarin getallen met decimalen (“kommagetallen”, floats) kunnen worden opgeslagen. Op zich kan numeric
zowel voor continue als voor discrete numerieke variabelen worden gebruikt. Maar als een discrete variabele alleen gehele waarden kan aannemen ligt integer
meer voor de hand.
Voor categorische variabelen kan het type character
worden gebruikt, omdat je daarin de waarden van de variabele als een string kunt opslaan. Maar in R bestaat ook in een datastructuur die speciaal bedoeld is voor categorische data: de factor
.
Categorische gegevens in R: de factor
Om te illustreren wat een factor is, definiëren we in R eerst een vector van type character
:
# Vector met de voedingsstrategie van 5 organismen:
<- c("herbivoor", "carnivoor", "omnivoor", "detrivoor", "herbivoor")
voedingsstrategie voedingsstrategie
[1] "herbivoor" "carnivoor" "omnivoor" "detrivoor" "herbivoor"
Bekijk de uitvoer; je kunt daaraan zien dat voedingsstrategie
simpelweg een lijstje (vector) met strings is.
Deze vector van type character
zetten we nu om naar een factor
en slaan die op onder de naam factor.voedingsstrategie
:
# Omzetten naar een factor-variabele:
<- factor(voedingsstrategie)
factor.voedingsstrategie factor.voedingsstrategie
[1] herbivoor carnivoor omnivoor detrivoor herbivoor
Levels: carnivoor detrivoor herbivoor omnivoor
De uitvoer ziet er subtiel anders uit. De vijf verschillende waarden worden weer getoond, maar er is nu een extra regel die begint met het woord “Levels”. Op die regel worden de verschillende niveaus van de categorische variabele weergegeven. In dit geval waren dat “carnivoor”, “detrivoor”, “herbivoor” en “omnivoor”. Je kunt de niveaus ook rechtstreeks opvragen met de functie levels()
:
levels(factor.voedingsstrategie)
[1] "carnivoor" "detrivoor" "herbivoor" "omnivoor"
R slaat factoren in het computergeheugen op met behulp van een soort code. Ieder niveau van de variabele krijgt een nummer (integer
); in het voorbeeld levert dat de volgende codetabel op:
Code | Niveau |
---|---|
1 | carnivoor |
2 | detrivoor |
3 | herbivoor |
4 | omnivoor |
Met behulp van die codetabel wordt de oorspronkelijke vector voedingsstrategie
efficiënt opgeslagen als de rij integers: 3,1,4,2,3.
Dat de gegevens nu opgeslagen zijn als integers heeft veel voordelen. Integers gebruiken veel minder geheugen dan strings. Bovendien, doordat factoren intern als integers worden behandeld zijn operaties zoals groeperen, filteren en sorteren ook vaak sneller dan bij vectoren van type character
.
Oefening 20.13 (Factors en niveaus)
In de code hieronder wordt een dataframe geconstrueerd met daarin gegevens over meerdere spelers van een videogame. Eerst worden de gegevens opgeslagen in meerdere vectoren; daarna worden ze samengevoegd tot een dataframe.
<- c("Mario", "Luigi", "Peach", "Toad", "Bowser")
naam <- c(8, 1, 3, 2, 10)
level <- c(57884, 14841, 7709, 5513, 109867)
totale_speeltijd <- c("Goud", "Brons", "Zilver", "Zilver", "Goud")
klassement <- c("Switch", "Switch", "Wii", "Wii", "Switch")
console
= data.frame(naam, level, totale_speeltijd, klassement, console) df
Schrijf voor elke vector het type variabele op volgens het schema van Figuur 20.1.
Gebruik het commando
str(df)
om te zien welk datatype R gebruikt voor de verschillende kolommen in dataframedf
.Om de data efficiënter te kunnen opslaan en analyseren willen we sommige variabelen omzetten naar een factor. Welke variabelen komen daar het meest voor in aanmerking?
Pas de code hierboven aan zodat de vector
klassement
een factor wordt. Run de aangepaste code in R.Gebruik de functie
levels()
om te bepalen wat de levels zijn van de vectorklassement
.
Maten voor ligging en spreiding in R
Centrummaten
Voor het berekenen van gemiddelde en mediaan van een numerieke vector v
zijn in R functies ingebouwd:
mean(v) # gemiddelde
median(v) # mediaan
summary(v) # verschillende statistieken voor vector v
Probeer ze eens uit!
Spreidingsmaten
Het bereik, de standaarddeviatie, de variantie, en de IKA van een vector bereken je zo:
range(v) # bereik
sd(v) # standaarddeviatie
var(v) # variantie
IQR(v) # interkwartielafstand (IKA)
Kwantielen
Kwantielen bereken je met de functie quantile()
. Als v
een vector is, geeft
quantile(v)
de kwartielen weer van die vector. Je kunt ook een specifieke kwantiel opvragen, met het argument prob
. Bijvoorbeeld, Q1 of P25 kun je zo berekenen:
quantile(v, prob = 0.25)
Frequentietabellen
Het is in R eenvoudig om een frequentietabel te maken voor een factor. Daarvoor is de functie table()
. Als voorbeeld maken we een frequentietabel voor de burgerlijke staat (MaritalStatus
) van de personen in de dataaset NHANES:
table(NHANES$MaritalStatus)
Divorced LivePartner Married NeverMarried Separated Widowed
707 560 3945 1380 183 456
Oefening 20.14 (Frequentietabellen voor een categoriale variabele met R)
In deze opdracht ga je de frequentietabel uit Voorbeeld 20.4 reproduceren in R.
Start een nieuw script en neem de onderstaande code over om de gegevens te importeren:
library("NHANES") # gebruik het package NHANES
data(NHANES) # laad de gegevens in een dataframe
<- NHANES$HealthGen # kopieer de kolom HealthGen naar een vector gezondheid
Van welk type is variabele
gezondheid
? Als welk type is deze variabele in R opgeslagen?Tip: Voeg
str(gezondheid)
enlevels(gezondheid)
toe aan je code.Bekijk de eerste 20 waarden van
gezondheid
met het commandohead(gezondheid, 20)
. Wat valt je op?
In plaats van een gezondheidstoestand is vaak de waarde NA
ingevuld. Dat staat voor “Not Available”; voor deze personen is de gezondheidsstatus dus onbekend.
Voeg
gezondheid <- na.omit(gezondheid)
onderaan je code toe. Wat is er veranderd? Wat doet de functieis.omit()
?Voeg
gezondheid.t <- table(gezondheid)
toe aan je code. Bekijkgezondheid.t
. Wat heeft de functietable()
gedaan?Bereken nu ook de relatieve frequenties van alle niveaus. Sla deze op in een nieuwe variabele
gezondheid.f
. Hoe zietgezondheid.f
eruit?Tip: Gebruik de functie
sum()
en het feit dat je een hele tabel kunt delen door een getal.
Grafieken en figuren in R
Een spreidingsdiagram waarin twee numerieke variabelen tegen elkaar worden uitgezet maak je met de functie plot()
:
Voor een lijndiagram (punten verbonden door lijnen) gebruik je het argument type = "l"
of type = "b"
:
Een histogram op basis van een numerieke vector maak je zo:
Het argument breaks
specificeert het aantal staven, maar R kan daarvan afwijken om de ervoor te zorgen dat de grenzen tussen de klassen een mooi rond getal zijn.
Een staafdiagram maak je op basis van een frequentietabel:
Oefening 20.15 (Staafdiagram van opleidingsniveau in NHANES)
Schrijf een kort R-script om een staafdiagram te maken van de variabele opleidingsniveau (Education
) in de dataset NHANES.
20.14 Samenvatting
Typen variabelen & bijbehorende datatypen in R
Type variabele | Datatype in R | |
---|---|---|
Numeriek | Continu | numeric |
Discreet | numeric /integer |
|
Categorisch | Nominaal | factor |
Ordinaal | factor |
Maten van ligging (centrummaten) van een reeks numerieke waarnemingen
Modus: Plaats van de piek in de verdeling.
Mediaan: Middelste waarde na sorteren (bij oneven aantal waarnemingen) of gemiddelde van de middelste twee waarden (bij even aantal waarnemingen).
Gemiddelde:
\[\overline{x} = \frac{\sum^n_{i=1}x_i}{n}.\]
Maten van spreiding (spreidingsmaten) van een reeks numerieke waarnemingen
Bereik: Interval van kleinste tot grootste waarde.
Kwartielen (Q1, Q2, Q3), percentielen, en kwantielen. (Zie tekst.)
IKA:
\[\text{IKA} = \text{Q3} - \text{Q1}.\]
Variantie:
\[V_X = \frac{\sum_{i=1}^n \left(x_i - \overline{x}\right)^2}{n-1}.\]
Standaarddeviatie / -afwijking:
\[s_X = \sqrt{V_X}=\sqrt{\frac{\sum_i^n \left(x_i - \overline{x}\right)^2}{n-1}}.\]
Frequentietabellen
Categorische variabelen: Tabel met de (relatieve of absolute) frequenties van ieder niveau.
Numerieke variabelen: Verdeel het domein eerst in klassen (intervallen); de frequentietabel geeft aan hoe vaak waarnemingen in iedere klasse vallen.
Veelgebruikte diagrammen voor het visualiseren van verdelingen
Methode | Type variabele | Opmerking |
---|---|---|
Staafdiagram | categorisch | |
Taartdiagram | nominaal | Met name geschikt voor relatieve frequenties. |
Stapeldiagram | categorisch | |
Jitterplot | numeriek | Goed voor kleine datasets. |
Histogram | numeriek | |
Frequentiepolygoon | numeriek | |
Cumulatief frequentiepolygoon | numeriek | |
Vioolplot | numeriek | |
Boxplot | numeriek | Vooral geschikt voor unimodale verdelingen, en ongeschikt voor kleine datasets. |
20.15 Terminologie
Terminologie over variabelen
Nederlands | Engels | Beschrijving |
---|---|---|
beschrijvende statistiek | descriptive statistics | Het onderdeel van statistiek dat zich bezig houdt met het beschrijven van gegevens d.m.v. grafieken, tabellen en kengetallen. |
categorische variabele | categorical variable | Variabele met waarden die een groep, label of categorie aanduiden. Synoniem: kwalitatieve variabele. |
continue variabele | continuous variable | Een numerieke variabele met reële waarden, zoals een tijdsduur of zoutconcentratie. |
discrete variabele | discrete variable | Een numerieke variabel die alleen specifieke waardes kan hebben, zoals gehele getallen. |
index | index | Een rangnummer dat we aan elementen uit een verzameling (zoals de waarden in een rij waarnemingen) geven zodat we ernaar kunnen verwijzen. |
kengetal | descriptive statistic | Een getal dat een aspect van een reeks gegevens samenvat, zoals het gemiddelde, de som, een proportie, of de standaard deviatie. |
kwadratensom | sum of squares | De som van gekwadrateerde afwijkingen van de meetwaarden ten opzichte van het gemiddelde. |
nominale variabele | nominal variable | Een categorische variabele waarvan de waarden geen natuurlijke volgorde hebben, zoals soortnamen of kleuren. |
numerieke variabele | numerical variable | Variabele die waarvan de waarden getallen zijn (waarmee betekenisvol gerekend kan worden). |
ordinale variabele | ordinal variable | Een categorische variabele waarvan de waarden een natuurlijke volgorde hebben, zoals ontwikkelingsstadia. |
proportie | proportion | Fractie of deel, aangegeven als een waarde tussen 0 en 1. |
spreiding | spread | De mate waarin waarden van een variabele onderling verschillen. |
variabele | variable | Een eigenschap van eenheden van een “populatie”. |
Terminologie over verdelingen
Nederlands | Engels | Beschrijving |
---|---|---|
absolute frequentie | absolute frequency | Hoe vaak een waarde voorkomt in een bepaalde dataset. |
bereik | range | Het interval van de kleinste naar grootste waarde in een reeks waarnemingen. |
bimodaal | bimodal | Een verdeling is bimodaal als die twee pieken heeft. |
centrummaat | measure of central tendency | Een maat die de ligging van een distributie beschrijft, zoals de modus, de mediaan en het gemiddelde. |
gemiddelde | mean | De som van alle waardes in een numerieke dataset, gedeeld door het aantal waarnemingen in die dataset. |
ligging | location | Een omschrijving van de positie waar de verdeling van een variabele zich bevindt; wordt beschreven met centrummaten. |
mediaan | median | In een georderde rij getallen (van laag naar hoog) de middelste waarde. Gelijk aan het tweede kwartiel Q2, het 50e percentiel P50, en de waarde waar de cumulatieve proportie 0,5 is. |
modus | mode | De meest voorkomende waarde in een distributie, of de plek van de “piek” van een histogram. |
percentiel | percentile | Kengetal dat gebruikt wordt voor de beschrijving van een verdeling. Per definitie is 75% van de waarden in een verdeling kleiner dan het 75e percentiel, genoteerd als P75. |
relatieve frequentie | relative frequency | De frequentie van een waarde, uitgedrukt als proportie van het totaal aantal waarnemingen. |
residuen | residuals | Het verschil tussen een datapunt en het gemiddelde van de verdeling. |
standaarddeviatie | standard deviation | De “typische” afwijking van het gemiddelde, de meest gebruikte verspreidingsmaat. Synoniem: standaardafwijking |
standaardafwijking | standard deviation | De “typische” afwijking van het gemiddelde, de meest gebruikte verspreidingsmaat. Synoniem: standaarddeviatie |
scheef | skewed | Een verdeling is scheef als deze een dikkere en/of langer staart heeft in één van de richtingen en dus niet symmetrisch is. Een links-scheve variabele heeft een dikkere/langere staart naar links als deze in een histogram wordt bekeken. |
uniform | uniform | Een verdeling waarin iedere uitkomst ongeveer even vaak voorkomt. |
unimodaal | unimodal | Een verdeling die één piek heeft. |
variantie | variance | De gemiddelde gekwadrateerde afwijking van de waarnemingen ten opzichte van hun gemiddelde. |
verdeling (van een variabele) | distribution (of a variable) | De manier waarop de waarden van een variabele over de mogelijk waarden zijn verdeeld. |
Terminologie over grafieken en diagrammen
Nederlands | Engels | Beschrijving |
---|---|---|
bandbreedte | bandwidth | Een vioolplot geeft de dichtheid van waarnemingen weer in de omgeving van bepaalde waarde. De bandbreedte is de grootte van de omgeving die voor die berekening gebruikt wordt. |
boxplot | boxplot | Een diagram dat de verdeling van een variable visualiseert d.m.v. een box (rechthoek) die de kwartielen weergeeft, snorharen, en uitbijters. |
cumulatieve verdeling | cumulative distribution | Een functie die aangeeft welk deel van de waarnemingen kleiner is dan een bepaalde waarde. |
frequentie | frequency | In een histogram: hoe vaak een variabele een bepaalde waarde aanneemt in de dataset. |
frequentiepolygon | frequency polygon | Een lijngrafiek die de frequentie van klassen weergeeft van een numerieke variabele. Vergelijkbaar met een histogram, maar met een lijn in plaats van staven. |
frequentietabel | frequency table | Een tabel waarin de frequenties worden weergegeven waarmee de verschillende waarden van een variabele in de waarnemingen voorkomen. |
histogram | histogram | Een diagram dat de verdeling van een numerieke variabele visualiseert d.m.v. staven die frequenties weergeven. |
interkwartielafstand (IKA) | interquartile range (IQR) | Het verschil in waarde tussen het eerste en het derde kwartiel van een dataset. |
jitterplot | jitterplot | Een visualisatie die individuele datapunten toont met willekeurige horizontale of verticale verschuiving (jitter) om overlap te voorkomen. |
klasse | bin | Intervallen waarin een continue numerieke variabele opgedeeld wordt om een frequentietabel of histogram te maken. |
klokvormig | Bell-shaped | Een verdeling is klokvormig als het histogram de vorm heeft van een kerkklok: een gladde vorm met een hogere frequentie rondom het gemiddelde en aan beide kanten een staart. |
kwantiel | quantile | Waarden zoals een percentiel of een kwartiel. |
kwartiel | quartile | Een kengetal waarmee verdelingen worden beschreven. Per definitie is een kwart van de gegevens kleiner dan het eerste kwartiel, de helft kleiner dan het tweede kwartiel, en drie kwart kleiner dan het derde kwartiel. |
snorharen | whiskers | In een boxplot, de lijnen die vanaf de box naar boven en naar beneden lopen. Ze eindigen bij de verste punten die geen uitbijters zijn. |
staafdiagram | bar chart | Een diagram dat de frequenties van een categorische variabele weergeeft als de oppervlakte van staven. |
stapeldiagram | stack chart | Een diagram dat de frequenties van een categorische variabele weergeeft als de oppervlakte van staven die op elkaar gestapeld zijn. |
taartdiagram | pie chart | Een diagram dat de relatieve frequenties (proporties) van de categorieën van een categorische variabele weergeeft als delen van een cirkel. |
uitbijter | outlier | Een waarde die sterk afwijkt van de rest van de verdeling. In een boxplot zijn deze gedefinieerd als waarden die meer dan 1,5 keer de IKA van de box verwijderd zijn. |
vioolplot | violin plot | Een grafiek die de verdeling van een variabele weergeeft in een symmetrische figuur waarvan de breedte de dichtheid van waarnemingen aangeeft. |
visualiseren | to visualise | In de statistiek: gegevens zichtbaar maken door ze als lengtes, oppervlaktes, kleuren, of vormen af te beelden. |
20.16 Opgaven
Oefening 20.16 (Twijfelachtige variabelen)
We hebben geleerd dat variabelen kunnen worden ingedeeld in verschillende categorieën: categoriale variabelen kunnen nominaal of ordinaal zijn, en numerieke variabelen zijn discreet of continu.
Kun je je variabelen voorstellen waarbij je kunt discussiëren over de vraag of ze numeriek en discreet zijn, of categoriaal en ordinaal?
Kun je je variabelen voorstellen waarbij je kunt discussiëren over de vraag of ze discreet of continu zijn?
Kun je je variabelen voorstellen waarbij je kunt discussiëren over de vraag of ze nominaal of ordinaal zijn?
Oefening 20.17 (De twee pieken in de verdeling van lichaamsgewicht)
Figuur 20.7 liet zien dat de verdeling van lichaamsgewicht (Weight
) in de dataset NHANES bimodaal is.
Hoe zou dat komen?
Om dat te onderzoeken start je een nieuw script.
Schrijf de code die nodig is om de dataset NHANES in een dataframe te laden. (Kijk zo nodig terug naar Oefening 20.14.)
Maak nu eerst een histogram van
Weight
. Verifieer dat de verdeling bimodaal is. Kies een geschikt aantal klassen (met argumentbreaks
).Voeg een regel code toe om een spreidingsdiagram te maken met leeftijd in maanden (
AgeMonths
) op de \(x\)-as en lichaamsgewicht (Weight
) op de \(y\)-as. Gebruik daarvoor de functieplot()
; zie Paragraaf 20.13.Wat vertelt deze plot je over de oorsprong van de twee pieken?
Oefening 20.18 (De lengte van sprinkhanen)
We bestuderen een aselecte steekproef van vijf sprinkhanen en meten de lichaamslengte van iedere sprinkhaan. We vinden: 3,5 inches, 2,4 inches, 3,4 inches, 3,9 inches, en 2,7 inches.
Bereken met de hand gemiddelde, variantie en standaardafwijking van deze waarden. Verifieer je resultaat met R.
Hoe veranderen gemiddelde, variantie en standaardafwijking als we van iedere lengte 2 inches aftrekken? Bedenk eerst wat je verwacht, en verifieer dan met R.
Hoe veranderen gemiddelde, variantie en standaardafwijking als we de lengte niet in inches maar in centimeters willen uitdrukken? (1 inch = 2,54 cm). Bedenk eerst aan de hand van de formules van gemiddelde, variantie en standaardafwijking wat het antwoord zou moeten zijn; verifieer dan met R.