Cursus
Heb je ooit een t-toets uitgevoerd, een keurige p-waarde gekregen en je toen gerealiseerd dat je nooit hebt gecontroleerd of je data normaal verdeeld was?
Statistische toetsen vertellen je niet wanneer hun aannames geschonden worden. Ze geven gewoon de waarde terug. Het probleem is dat toetsen zoals t-toetsen en ANOVA ervan uitgaan dat je data een normale verdeling volgt. Als dat niet zo is, bouw je conclusies op wankele grond.
Normaliteitstesten geven je een manier om die aanname te verifiëren. Er zijn zowel visuele als statistische methoden, en weten welke je gebruikt - en hoe je de resultaten leest - stelt je in staat vol vertrouwen achter je resultaten te staan.
In dit artikel neem ik je mee door de meest voorkomende visuele en statistische methoden om normaliteit te controleren, laat ik zien hoe je ze uitvoert in Python en R, en leg ik uit wat je kunt doen als je data de test niet doorstaat.
Wat normale verdeling in de praktijk is
Je hebt vast eerder de klokvormige curve gezien - maar dit is wat die daadwerkelijk voor je data betekent.
Een normale verdeling is een patroon waarbij de meeste waarden rond het midden clusteren, en er minder waarden voorkomen naarmate je verder naar links of rechts gaat. Als je het plot, krijg je een symmetrische, klokvormige curve. De linkerkant spiegelt de rechterkant.

Plot van een normale verdeling
Wat normale verdeling uniek maakt, is dat gemiddelde, mediaan en modus allemaal op hetzelfde punt liggen - het midden van de curve. Er is geen scheefheid naar links of rechts. Met andere woorden: de data is in balans.
Dit komt voortdurend voor in meetdata uit de echte wereld. Lichaamslengte, bloeddrukmetingen, maattoleranties in de productie, testscores - ze neigen allemaal naar een normale verdeling wanneer je genoeg steekproeven verzamelt. Natuurlijke variatie in biologische en fysieke systemen produceert vaak deze vorm.
Dat gezegd hebbende: niet alle data gedraagt zich zo. Inkomensdata is rechts-scheef. Reactietijden van websites hebben lange staarten.
In de echte wereld kan het flink misgaan als je normaliteit aanneemt zonder te controleren.
Waarom normaliteit testen ertoe doet
Het probleem met het niet controleren van normaliteit is dat de meeste gangbare statistische toetsen - t-toetsen, ANOVA - parametrische toetsen zijn.
Dat betekent dat ze berusten op aannames over de verdeling van je data. Normaliteit is er daar één van. Wanneer die aanname niet klopt, gaat de wiskunde van de toets ook mis. Je krijgt nog steeds een resultaat, maar dat kan tot verkeerde conclusies leiden.
Parametrische toetsen werken door wiskundige aannames te maken over de populatie waaruit je steekproef komt. Als die aannames gelden, zijn deze toetsen nuttig en accuraat. Als dat niet zo is, worden je p-waarden onbetrouwbaar en kun je geen juiste conclusies trekken.
Daar komen niet-parametrische toetsen om de hoek kijken.
Toetsen zoals Mann-Whitney U of Kruskal-Wallis gaan niet uit van normaliteit - ze werken met rangen in plaats van ruwe waarden. Ze zijn flexibeler, maar vaak ook minder nuttig als je data wél normaal is. Onnodig overschakelen is dus niet de oplossing.
De echte fout die veel beginners in data science maken, is de controle helemaal overslaan.
Normaliteit testen kost een paar regels code. Niet testen betekent dat je je data op goed vertrouwen neemt - of er helemaal niet over nadenkt.
Visuele methoden om normaliteit te controleren
Plot je data voordat je een formele toets draait. Visualisaties vertellen je veel over wat je in handen hebt.
Histogram
Een histogram laat de vorm van je verdeling zien.

Voorbeeldhistogram
Als je data normaal verdeeld is, ziet het histogram eruit als een klok - hoog in het midden, symmetrisch aflopend aan beide kanten. Waar je op let is scheefheid: een lange staart naar rechts betekent positieve scheefheid, een staart naar links negatieve scheefheid. In beide gevallen kan dat een teken zijn dat je data niet normaal is.
Het probleem met histograms is dat de vorm afhangt van de bakgrootte:
- Te weinig bakken en de verdeling oogt vlak
- Te veel en hij wordt grillig
Probeer altijd een paar bakgroottes voordat je conclusies trekt.
Q-Q-plot
Een Q-Q-plot (quantile-quantile plot) vergelijkt de kwantielen van je data met die van een theoretische normale verdeling.

Voorbeeld Q-Q-plot
Als je data normaal is, vallen de punten op een rechte diagonale lijn. Afwijkingen van die lijn laten zien waar de normaliteit afbreekt. Punten die aan de uiteinden omhoog buigen duiden op zware staarten. Een S-vorm wijst op scheefheid.
Q-Q-plots zijn preciezer dan histograms voor het opsporen van subtiele afwijkingen van normaliteit - vooral in de staarten, waar histograms dingen vaak missen.
Boxplot
Een boxplot laat in één oogopslag de mediaan, spreiding en uitschieters zien.

Voorbeeldboxplot
Een normaal verdeelde dataset levert een boxplot op waarbij de mediaan ongeveer in het midden van de box ligt en de snorharen aan beide kanten ongeveer even lang zijn. Als de mediaan uit het midden ligt of één snor veel langer is dan de andere, is dat scheefheid. Puntjes buiten de snorharen zijn uitschieters.
Het algemene probleem met visuals is dat ze subjectief zijn. Twee mensen kunnen naar hetzelfde histogram kijken en het oneens zijn. Gebruik ze om eerst gevoel voor je data te krijgen en bevestig daarna met een formele test.
Veelgebruikte normaliteitstesten in de statistiek
Er is geen enkele normaliteitstest die in elke situatie het beste werkt. De juiste keuze hangt af van je steekproefgrootte en wat je wilt detecteren.
Shapiro-Wilk-toets
De Shapiro-Wilk-toets is de eerste keus voor kleine tot middelgrote steekproeven, doorgaans tot enkele honderden observaties.
Hij meet hoe dicht je data een normale verdeling benadert door de geobserveerde waarden te vergelijken met wat je zou verwachten als de data normaal was. Hij is wijdverbreid, goed begrepen en beschikbaar in elke grote statistiekbibliotheek. Voor de meeste analisten is dit de eerste test om naar te grijpen.
De belangrijkste beperking is dat hij bij grote steekproeven overgevoelig wordt. Dan markeert hij piepkleine, praktisch onbeduidende afwijkingen als statistisch significant.
Kolmogorov-Smirnov-toets
De Kolmogorov-Smirnov (KS) toets vergelijkt de cumulatieve verdeling van je steekproef met een theoretische - in dit geval normaal.
Hij is algemener dan Shapiro-Wilk en kan tegen elke verdeling testen, niet alleen normaal. De KS-toets is minder krachtig dan Shapiro-Wilk voor normaliteit, wat betekent dat hij subtiele afwijkingen eerder mist. Je moet ook de parameters van de verdeling vooraf specificeren, wat bias introduceert als je ze uit dezelfde data schat.
Gebruik hem als je een snelle, algemene check nodig hebt - niet als je primaire normaliteitstest.
Anderson-Darling-toets
De Anderson-Darling-toets is een variant van de KS-toets, maar met één belangrijk verschil: hij geeft meer gewicht aan de staarten van de verdeling.
Daardoor is hij beter in het vangen van afwijkingen die zich aan de extremen laten zien - zware staarten, uitschieters of niet-normaal gedrag dat de KS-toets zou missen. Als je usecase gevoelig is voor staartgedrag, is Anderson-Darling een goede keuze.
D'Agostino-Pearson-toets
De D'Agostino-Pearson-toets pakt het anders aan.
In plaats van verdelingen direct te vergelijken, meet hij twee eigenschappen van je data: scheefheid (asymmetrie) en kurtosis (hoe zwaar of licht de staarten zijn).
Hij combineert beide in één teststatistiek. Daardoor is hij goed in het aanwijzen waarom je data mogelijk niet normaal is - niet alleen of ze dat is. Hij werkt het best bij grotere steekproeven, waar schattingen van scheefheid en kurtosis betrouwbaar zijn.
Jarque-Bera-toets
De Jarque-Bera-toets gebruikt ook scheefheid en kurtosis, vergelijkbaar met D'Agostino-Pearson.
Hij is gangbaar in econometrie en tijdreeksanalyse. Net als D'Agostino-Pearson heeft hij een redelijk grote steekproef nodig voor betrouwbare resultaten. Bij kleine steekproeven is de test niet zo betrouwbaar. Werk je in een finance- of economietcontext, dan kom je deze vaak tegen.
Kortom: begin met Shapiro-Wilk voor kleine steekproeven en combineer met een Q-Q-plot. Gebruik Anderson-Darling wanneer staartgedrag ertoe doet, en D'Agostino-Pearson als je de aard van de afwijking wilt begrijpen.
Hoe je normaliteitstestresultaten interpreteert
Elke normaliteitstest is een hypothesetoets.
De nulhypothese bij elke normaliteitstest is dat je data normaal verdeeld is. De test vraagt dan: gegeven wat we in de data zien, hoe waarschijnlijk is het dat die nulhypothese waar is?
Het antwoord komt terug als een p-waarde:
- p > 0,05 - je hebt niet genoeg bewijs om normaliteit te verwerpen. Ga uit van normaliteit en ga door met parametrische toetsen
- p < 0,05 - de data wijkt genoeg af van normaliteit om statistisch detecteerbaar te zijn. Verwerp de normaliteitsaannames
Klinkt simpel, maar hier gaat het vaak mis.
Een lage p-waarde vertelt je niet hoe niet-normaal je data is - alleen dat er een verschil is gedetecteerd. Bij grote steekproeven worden normaliteitstesten extreem gevoelig. Ze markeren afwijkingen die zo klein zijn dat ze geen echte impact op je analyse hebben.
Het omgekeerde probleem bestaat ook. Bij kleine steekproeven kan zelfs zichtbaar scheve data p > 0,05 opleveren omdat de test niet genoeg power heeft om de afwijking te detecteren.
Statistische significantie en praktische significantie zijn niet hetzelfde.
Een p-waarde vertelt je of er een afwijking van normaliteit bestaat. Ze vertelt je niet of die afwijking ertoe doet voor jouw specifieke analyse. Combineer je testresultaat altijd met een Q-Q-plot - als de punten de lijn nauw volgen, is je data waarschijnlijk normaal genoeg, ongeacht wat de p-waarde zegt.
Normaliteitstesten in Python
Pythons scipy.stats module heeft alles wat je nodig hebt om normaliteitstesten in een paar regels code uit te voeren.
Voor alle voorbeelden hieronder gebruik ik dezelfde dataset - 100 steekproeven getrokken uit een normale verdeling - zodat je de code kunt draaien en meelezen.
import numpy as np
from scipy import stats
np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=100)
Shapiro-Wilk-toets
Gebruik shapiro() als je eerste check, vooral bij kleinere datasets.
stat, p_value = stats.shapiro(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")
Dit is wat je terugkrijgt:

Output van een Shapiro-Wilk-toets in Python
De p-waarde is ruim boven 0,05, dus we verwerpen normaliteit niet. De data oogt normaal - wat logisch is, want we hebben haar uit een normale verdeling gegenereerd.
Kolmogorov-Smirnov-toets
kstest() vergelijkt je steekproef met een benoemde verdeling. Voor normaliteit geef je "norm" mee, samen met het gemiddelde en de standaardafwijking van de steekproef.
stat, p_value = stats.kstest(data, 'norm', args=(data.mean(), data.std()))
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Output van een Kolmogorov-Smirnov-toets in Python
Wederom p > 0,05 - geen bewijs tegen normaliteit.
Geef bij deze test in Python altijd expliciet het gemiddelde en de standaardafwijking door via args. Als je dat overslaat, gebruikt kstest() standaard een standaardnormaal (gemiddelde=0, sd=1), wat onbetrouwbare resultaten geeft tenzij je data al gestandaardiseerd is.
D'Agostino-Pearson-toets
normaltest() test normaliteit door scheefheid en kurtosis gecombineerd te controleren. Werkt het best met grotere steekproeven.
stat, p_value = stats.normaltest(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Output van een D'Agostino-Pearson-toets in Python
Opnieuw p > 0,05. De data slaagt hier voor alle drie de testen, maar dat is te verwachten - ik heb haar normaal gegenereerd. In de praktijk zul je vaak zien dat deze testen het oneens zijn, zeker rond de 0,05-grens. Val in dat geval terug op je Q-Q-plot om de knoop door te hakken.
Normaliteitstesten in R
R heeft ingebouwde functies voor normaliteitstesten. Voor de basis zijn geen extra packages nodig.
Net als bij de Python-voorbeelden gebruik ik dezelfde dataset: 100 steekproeven uit een normale verdeling.
set.seed(42)
data <- rnorm(100, mean = 0, sd = 1)
Shapiro-Wilk-toets
shapiro.test() is de go-to voor kleine tot middelgrote steekproeven. Geef simpelweg je vector met data door:
shapiro.test(data)

Output van een Shapiro-Wilk-toets in R
p > 0,05 - geen bewijs tegen normaliteit. De W-statistiek loopt van 0 tot 1, waarbij waarden dicht bij 1 aangeven dat de data een normale verdeling goed volgt.
Kolmogorov-Smirnov-toets
ks.test() vergelijkt je steekproef met een theoretische verdeling. Voor normaliteit specificeer je "pnorm" en geef je het steekproefgemiddelde en de standaardafwijking mee.
ks.test(data, "pnorm", mean(data), sd(data))

Output van een Kolmogorov-Smirnov-toets in R
Weer p > 0,05. Deze test in R heeft dezelfde kanttekening als in Python: geef altijd mean(data) en sd(data) mee. Anders wordt vergeleken met een standaardnormaal, wat het resultaat vertekent tenzij je data al gestandaardiseerd is.
Q-Q-plot
R's ingebouwde qqnorm() en qqline() geven je in twee regels code een Q-Q-plot.
qqnorm(data, main = "Q-Q Plot")
qqline(data, col = "steelblue", lwd = 2)

Q-Q-plot in R
qqnorm() plot je steekproefkwantielen tegen theoretische normale kwantielen. qqline() tekent de referentielijn. Punten die die lijn nauw volgen betekenen dat je data zich normaal gedraagt. Afwijkingen aan de uiteinden signaleren staartproblemen die het onderzoeken waard zijn.
Wat te doen als data niet normaal is
Als je data een normaliteitstest niet haalt, heb je een paar degelijke opties.
Transformeer de data
Soms is de oplossing om je data te transformeren zodat ze zich normaal gedraagt, en daarna je oorspronkelijke toetsen op de getransformeerde waarden te draaien.
Logtransformatie is de meest gebruikte keuze. Ze werkt goed bij rechts-scheve data - denk aan inkomen, reactietijden of biologische metingen met een lange staart aan de rechterkant. De functie in Python is np.log(data) en het R-equivalent is log(data).
Vierkantsworteltransformatie is een mildere optie voor matige scheefheid, en handig wanneer je data nullen bevat (je kunt immers geen log van nul nemen). Gebruik np.sqrt(data) in Python of sqrt(data) in R.
Voer na het transformeren je normaliteitstest opnieuw uit. Als de getransformeerde data slaagt, ga dan verder met je parametrische toetsen - onthoud alleen dat je resultaten in de getransformeerde schaal geïnterpreteerd moeten worden.
Gebruik niet-parametrische toetsen
Als transformeren niet werkt of niet logisch is voor je data, schakel dan over op niet-parametrische toetsen. Die gaan niet uit van normaliteit - ze rangschikken de data in plaats van met ruwe waarden te werken.
- Mann-Whitney U-toets is het niet-parametrische alternatief voor de onafhankelijke t-toets. Gebruik hem wanneer je twee groepen vergelijkt
- Kruskal-Wallis-toets is de niet-parametrische versie van eenweg-ANOVA. Gebruik hem wanneer je drie of meer groepen vergelijkt
Beide zijn beschikbaar in scipy.stats (mannwhitneyu() en kruskal()) en in R's basispakket (wilcox.test() en kruskal.test()).
Vertrouw op grote steekproeven
Met voldoende grote steekproeven kun je de normaliteitszorg vaak overslaan.
De centrale limietstelling zegt dat naarmate je steekproef groter wordt, de steekproevenverdeling van het gemiddelde normaal nadert - ongeacht hoe de oorspronkelijke data verdeeld is. In de praktijk betekent dit dat parametrische toetsen bij grote steekproeven vaak betrouwbaar zijn, zelfs als de onderliggende data niet perfect normaal is.
Veelgemaakte fouten bij het testen op normaliteit
Normaliteit testen is eenvoudig - je hebt gezien dat het één regel code kost. Toch zijn er een paar manieren om het verkeerd te doen.
Hier zijn enkele veelgemaakte fouten van beginnende data scientists:
- Alleen vertrouwen op p-waarden: Een p-waarde vertelt je of een afwijking van normaliteit is gedetecteerd, niet hoe groot die is of of ze ertoe doet. p > 0,05 als groen licht en p < 0,05 als rood licht behandelen is te bot. Combineer je testresultaat altijd met een Q-Q-plot
- Effecten van steekproefgrootte negeren: Bij kleine steekproeven kunnen normaliteitstesten echte afwijkingen missen en p > 0,05 teruggeven, zelfs als je data zichtbaar scheef is. Bij grote steekproeven wordt de test zo gevoelig dat piepkleine, betekenisloze afwijkingen als significant worden aangemerkt. Steekproefgrootte kan de betekenis van de p-waarde veranderen
- Te veel testen op normaliteit: Niet elke analyse heeft een formele normaliteitstest nodig. Bij verkennend werk volstaan meestal een histogram en een Q-Q-plot
- Kleine afwijkingen verkeerd interpreteren: Data uit de echte wereld is bijna nooit perfect normaal. Een kleine afwijking van de referentielijn op een Q-Q-plot, of een p-waarde net onder 0,05, betekent niet dat je data ver van normaal is. De vraag is of ze normaal genoeg is voor de toets die je draait
Dus, normaliteit testen is slechts één controle van je data. Gebruik het als één input onder vele, niet als het laatste woord.
Wanneer je normaliteitstesten kunt overslaan
Normaliteit testen is niet altijd nodig. Als je een deadline hebt, kan weten wanneer je het kunt overslaan je tijd besparen zonder de resultaten te beïnvloeden.
Grote datasets
Bij een grote steekproef garandeert de centrale limietstelling dat de steekproevenverdeling van het gemiddelde ongeveer normaal is, ongeacht de vorm van je ruwe data. Parametrische toetsen zijn dan doorgaans betrouwbaar, dus een formele normaliteitstest voegt weinig toe.
Sommige statistische methoden zijn ook robuust tegen niet-normaliteit. Technieken zoals lineaire regressie houden zich vaak goed, mits steekproeven redelijk groot zijn en schendingen niet extreem. (Lineaire regressie gaat nog steeds uit van normaliteit in de residuen.)
Verkennende analyse
Wanneer je data scant op patronen, gevoel opbouwt of beslist welke variabelen verdere aandacht verdienen, is een snel histogram of Q-Q-plot genoeg. Formele toetsen zijn voor bevestigende analyses - wanneer je conclusies moeten standhouden.
Onthoud dat normaliteitstesten bestaat om je te beschermen tegen verkeerde conclusies. Als je je in een context bevindt waar een verkeerde conclusie geen echte consequenties heeft, of waar je methode niet afhankelijk is van normaliteit, is de test optioneel.
Conclusie
Normaliteit testen draait erom te controleren of je aannames voldoende kloppen om je resultaten te vertrouwen.
Geen enkele dataset is perfect normaal. Het doel is te begrijpen hoe je data zich gedraagt en je methoden daarop af te stemmen. Een Q-Q-plot laat zien waar de afwijkingen zitten. Een formele test vertelt of ze statistisch detecteerbaar zijn. Samen geven ze een helderder beeld dan elk afzonderlijk.
De juiste test hangt af van je context. Gebruik Shapiro-Wilk voor kleine steekproeven, Anderson-Darling wanneer staarten ertoe doen, niet-parametrische alternatieven wanneer je normaliteit niet kunt aannemen. En soms - bij grote steekproeven of robuuste methoden - geen test.
Vind je het hele concept van p-waarden verwarrend? Lees ons artikel Hypothesetoetsing made easy om zeker te weten dat je ze correct interpreteert.
Normaliteitstest FAQ
Wat is een normaliteitstest?
Een normaliteitstest is een statistische methode die controleert of je data een normale (Gaussische) verdeling volgt. De meeste gangbare statistische toetsen - zoals t-toetsen, ANOVA en lineaire regressie - gaan uit van normaliteit, dus het controleren van deze aanname voordat je je analyse draait helpt je om verkeerde conclusies te vermijden.
Moet ik altijd testen op normaliteit?
Niet altijd. Bij grote steekproeven zorgt de centrale limietstelling ervoor dat parametrische toetsen betrouwbaar zijn, ongeacht de onderliggende verdeling. Voor verkennende analyses volstaat meestal een snel histogram of een Q-Q-plot - formele normaliteitstesten zijn het nuttigst wanneer je bevestigende analyses doet en je conclusies moeten standhouden.
Wat moet ik doen als mijn data een normaliteitstest niet haalt?
Je hebt een paar opties. Je kunt de data transformeren met een log- of vierkantsworteltransformatie en daarna opnieuw testen. Als de transformatie niet werkt, schakel dan over op niet-parametrische toetsen zoals Mann-Whitney U (voor twee groepen) of Kruskal-Wallis (voor drie of meer groepen), die niet van normaliteit uitgaan.
Wat is het verschil tussen de Shapiro-Wilk- en Kolmogorov-Smirnov-toetsen?
Shapiro-Wilk is specifiek ontworpen voor normaliteitstesten en werkt het best met kleine tot middelgrote steekproeven. De Kolmogorov-Smirnov-toets is algemener - hij kan een steekproef met elke theoretische verdeling vergelijken, niet alleen normaal - maar is minder krachtig dan Shapiro-Wilk specifiek voor normaliteit, waardoor hij subtiele afwijkingen eerder mist.
Hoe interpreteer ik een Q-Q-plot voor normaliteit?
Een Q-Q-plot vergelijkt de kwantielen van je data met de kwantielen van een theoretische normale verdeling. Als de punten dicht bij de diagonale referentielijn vallen, gedraagt je data zich normaal. Afwijkingen aan de uiteinden van de lijn signaleren staartproblemen - een S-vorm wijst op scheefheid, terwijl punten die aan beide uiteinden van de lijn afbuigen zwaardere of lichtere staarten suggereren dan een normale verdeling zou hebben.

