Ongepaarde t-toets
Contents
3. Ongepaarde t-toets#
3.1. Toepassing#
Gebruik de ongepaarde t-toets om de gemiddelden van twee onafhankelijke groepen te vergelijken.1
3.2. Onderwijscasus#
Dit onderzoek vertaalt zich in de volgende combinatie van hypothesen, waarbij de nulhypothese zo geformuleerd is dat er geen effect of verschil is en de alternatieve hypothese zo geformuleerd is dat er wel een effect of verschil is.
H0: Het gemiddelde tentamencijfer dat de studenten halen aan de opleiding Taalwetenschap is niet veranderd na de invoer van het BSA, µ0 = µ1
HA: Het gemiddelde tentamencijfer dat de studenten halen aan de opleiding Taalwetenschap is veranderd na de invoer van het BSA, µ0 ≠ µ1
3.3. Assumpties#
Voor een valide resultaat moet de data aan een aantal voorwaarden voldoen voordat de toets uitgevoerd kan worden.
3.3.1. Normaliteit#
De ongepaarde t-toets gaat ervan uit dat de afhankelijke variabele normaal verdeeld is voor alle groepen. Als elke groep een aantal observaties (n) heeft dat groter dan 100 is, ga er dan vanuit dat de ongepaarde t-toets robuust genoeg is om uit te voeren zonder dat de afhankelijke variabele een normale verdeling volgt.
Controleer de assumptie van normaliteit met de volgende stappen:
Controleer de afhankelijke variabele per groep visueel met een histogram, een boxplot en een Q-Q plot.
Toets of de afhankelijke variabele voor beide groepen normaal verdeeld is met de Kolmogorov-Smirnov test of bij een kleinere steekproef (n < 50) met de Shapiro-Wilk test.3, 4
De eerste stap heeft als doel een goede indruk te krijgen van de verdeling van de steekproef. In de tweede stap wordt de assumptie van normaliteit getoetst. De statistische toets laat zien of de verdeling van de observaties van een groep voldoet aan de assumptie van normaliteit. Voor beide groepen moet er voldaan zijn aan de assumptie van normaliteit.
Als blijkt dat de afhankelijke variabele niet normaal verdeeld is voor één van of allebei de groepen, transformeer5 dan de afhankelijke variabele en bepaal daarna of deze wel normaal verdeeld is of gebruik de Mann-Whitney U toets.6, 7
3.3.2. Wel of geen gepoolde variantie#
De ongepaarde t-toets kan met en zonder gepoolde variantie uitgevoerd worden. Bij een gepoolde variantie is de berekening van de variantie van het verschil in gemiddelden anders en wordt aangenomen dat de varianties van beide steekproeven even groot zijn. Deze aanname is te toetsen met de Levene’s test, waarbij een significant resultaat aangeeft dat er een verschil is in de varianties van beide groepen. De hedendaagse consensus is echter om altijd deze aanname niet te toetsen en de ongepaarde t-toets zonder gepoolde variantie uit te voeren.8 Een gepoolde variantie zorgt ervoor dat het onderscheidend vermogen14 van de ongepaarde t-toets iets hoger is als de varianties van beide groepen ongeveer gelijk zijn, maar geeft verkeerde resultaten als de varianties van elkaar afwijken. Daarnaast heeft Levene’s test een laag onderscheidend vermogen, wat betekent dat het lastig is om ongelijke varianties goed te toetsen. Gebruik daarom de ongepaarde t-toets zonder gepoolde variantie; deze staat ook wel bekend als Welch’s t-toets.8
3.4. Uitvoering#
Er is een dataset ingeladen met gemiddelde cijfers van tweedejaarsstudenten bij de opleiding Taalwetenschap: dfCijfers_gemiddeld. De data bevatten cijfers van 180 studenten begonnen in 2010 en cijfers van 160 studenten begonnen in 2011.
3.4.1. De data bekijken#
Gebruik <dataframe>.head() en <dataframe>.tail() om de structuur van de data te bekijken.
## Eerste 6 observaties
print(dfCijfers_gemiddeld.head())
Unnamed: 0 Studentnummer Cohort Cijfers
0 1 302256 2010 5.548
1 2 344374 2010 6.520
2 3 302078 2010 5.297
3 4 325370 2010 8.214
4 5 362912 2010 6.695
## Laatste 6 observaties
print(dfCijfers_gemiddeld.tail())
Unnamed: 0 Studentnummer Cohort Cijfers
335 336 317635 2011 7.185
336 337 396683 2011 7.264
337 338 393299 2011 7.132
338 339 362510 2011 5.763
339 340 335445 2011 4.814
Selecteer beide groepen en sla deze op in een vector om deze makkelijker aan te kunnen roepen.
Cijfers_2010 = dfCijfers_gemiddeld[dfCijfers_gemiddeld['Cohort'] == 2010]['Cijfers']
Cijfers_2011 = dfCijfers_gemiddeld[dfCijfers_gemiddeld['Cohort'] == 2011]['Cijfers']
Inspecteer de data met np.size(), np.mean() en np.std()), door deze aan te roepen uit het package numpy.
# Om het gemiddelde en de standaard deviatie te berekenen, hebben we de library 'numpy' nodig
import numpy as np
## Aantallen, gemiddelde en standaarddeviatie 2010
print(np.size(Cijfers_2010))
print(np.mean(Cijfers_2010))
print(np.std(Cijfers_2010))
180
6.369188888888889
1.1145533025930108
## Aantallen, gemiddelde en standaarddeviatie 2011
print(np.size(Cijfers_2011))
print(np.mean(Cijfers_2011))
print(np.std(Cijfers_2011))
160
6.4623625
1.1962198506519401
Gemiddeld tentamencijfer 2010 (standaarddeviatie):
r Round_and_format(py$vMean_t0)(r Round_and_format(py$vSD_t0)). n =r py$vN_t0.Gemiddeld tentamencijfer 2011 (standaarddeviatie):
r Round_and_format(py$vMean_t1)(r Round_and_format(py$vSD_t1)). n =r py$vN_t1.
3.4.2. Visuele inspectie van normaliteit#
Geef de verdeling van de tentamencijfers van beide groepen visueel weer met een histogram, Q-Q plot en boxplot.
3.4.2.1. Histogram#
Focus bij het analyseren van een histogram18 op de symmetrie van de verdeling, de hoeveelheid toppen (modaliteit) en mogelijke uitbijters. Een normale verdeling is symmetrisch, heeft één top en geen uitbijters.9, 10
## Histogram met matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
sub1 = fig.add_subplot(1, 2, 1)
title1 = plt.title("2010")
xlab = plt.xlabel("Cijfers")
ylab = plt.ylabel("Frequentiedichtheid")
hist1 = plt.hist(Cijfers_2010, density = True, edgecolor = "black", bins = 9)
sub2 = fig.add_subplot(1, 2, 2)
title2 = plt.title("2011")
xlab = plt.xlabel("Cijfers")
hist2 = plt.hist(Cijfers_2011, density = True, edgecolor = "black", bins = 9)
main = fig.suptitle('Taalwetenschap gemiddelde cijfers voor en na de BSA')
plt.show()
Beide histogrammen laten een verdeling zien die redelijk symmetrisch is, één top heeft en geen uitbijters. Daarom zijn beide verdelingen bij benadering normaal verdeeld.
3.4.2.2. Q-Q plot#
Gebruik de functie probplot van het scipy package om een Q-Q plot te maken, met als datapunten kleine cirkels.
Als over het algemeen de meeste datapunten op de lijn liggen, kan aangenomen worden dat de data normaal verdeeld is.
import scipy.stats as stats
qq = stats.probplot(Cijfers_2010, dist="norm", plot=plt)
title = plt.title("Normaal Q-Q plot van tentamencijfers 2010")
xlab = plt.xlabel("Theoretische kwantielen")
ylab = plt.ylabel("Kwantielen in data")
plt.show()
import scipy.stats as stats
qq = stats.probplot(Cijfers_2011, dist="norm", plot=plt)
title = plt.title("Normaal Q-Q plot van tentamencijfers 2011")
xlab = plt.xlabel("Theoretische kwantielen")
ylab = plt.ylabel("Kwantielen in data")
plt.show()
Voor beide Q-Q plots liggen de meeste datapunten op of vlakbij de lijn. Hoewel er bij de uiteinden van de verdeling wat afwijkingen zijn, duidt deze grafiek op een goede benadering van de normaalverdeling voor beide cohorten.
3.4.2.3. Boxplot#
De box geeft de middelste 50% van de tentamencijfers weer. De zwarte lijn binnen de box is de mediaan. In de staarten of snorreharen zitten de eerste 25% en de laatste 25%. Cirkels visualiseren mogelijke uitbijters.9 Hoe meer de boxen overlappen, hoe waarschijnlijker er geen significant verschil is tussen de groepen.
fig, ax = plt.subplots()
box = ax.boxplot([Cijfers_2010, Cijfers_2011], labels = ["2010", "2011"])
title = plt.title("Tentamencijfers Taalwetenschap voor en na de BSA")
plt.show()
De boxplotten geven de spreiding weer van het gemiddelde tentamencijfer voor de BSA en na de BSA. De boxplotten en de staarten lijken symmetrisch, wat een teken is van een bij benadering normale verdeling. Het cohort van 2011 heeft een aantal mogelijke uitbijters.10
3.4.3. Toetsen van normaliteit#
Om te controleren of de afhankelijke variabele voor beide groepen normaal verdeeld is, kan de normaliteit getoetst worden. Twee veelgebruikte toetsen zijn: de Kolmogorov-Smirnov test en de Shapiro-Wilk test.
3.4.3.1. Kolmogorov-Smirnov#
De Kolmogorov-Smirnov test toetst het verschil tussen twee verdelingen. Standaard toetst deze test het verschil tussen een normale verdeling en de verdeling van de steekproef. De Lilliefors correctie is vereist als het gemiddelde en de standaardafwijking niet van tevoren bekend of bepaald zijn, wat meestal het geval is bij een steekproef. Als de p-waarde kleiner dan 0,05 is, is de verdeling van de steekproef significant verschillend van de normale verdeling.
De standaard interpretatie van de statistische toetsen van normaliteit in Python is: (<teststatistiek>, <p-waarde>). Verder toetst Python hierbij tweezijdig. Gebruik bij deze toets het argument pvalmethod = "table" om een betrouwbare p-waarde te krijgen.
import statsmodels.stats.api as smod
Bij deze casus is van beide groepen de p-waarde groter dan 0,05, dus er zijn geen significante verschillen gevonden tussen de verdeling van de steekproef en de normale verdeling. De ongepaarde t-toets kan uitgevoerd worden.
3.4.3.2. Shapiro-Wilk Test#
De Shapiro-Wilk test is een soortgelijke test als de Kolmogorov-Smirnov test en vooral geschikt bij kleine steekproeven (n < 50). Als de p-waarde kleiner dan 0,05 is, is de verdeling van de steekproef significant verschillend van de normale verdeling.
Er zijn twee subsets van Cijfers_gemiddeld ingeladen: Cijfers_2010_n30 en Cijfers_2011_n30. Beide subsets bevatten r py$n studenten. Voor relatief kleine steekproeven als deze is de Shapiro-Wilk Test geschikt.
De p-waarde is groter dan 0,05 voor beide groepen, dus er zijn geen significante verschillen gevonden tussen de verdeling van de steekproef en de normale verdeling. De ongepaarde t-toets kan uitgevoerd worden.
3.4.4. Ongepaarde t-toets#
Voer een ongepaarde t-toets uit in twee stappen. Definieer eerst de vergelijking van de twee groepen met CompareMeans() met als argumenten de observaties uit 2010 DescrStatsW(Cijfers_2010) en de observaties uit 2011 DescrStatsW(Cijfers_2011). Voer daarna de t-toets uit met ttest_ind() met de argumenten alternative='two-sided' vanwege de tweezijdige alternatieve hypothese en usevar = 'unequal' omdat er geen gepoolde variantie wordt gebruikt. Bereken daarna het 95%-betrouwbaarheidsinterval met tconfint_diff() met als nieuw argument alpha = 0.05 om het significantieniveau aan te geven. Deze functies zijn afkomstig van het package statsmodels.stats.api.
# Importeer library voor statistische toets
import statsmodels.stats.api as stat
# Maak een object voor de groepen die vergeleken worden
Groepen = stat.CompareMeans(stat.DescrStatsW(Cijfers_2010), stat.DescrStatsW(Cijfers_2011))
# Print de resultaten van de ongepaarde t-toets
print(Groepen.ttest_ind(alternative = 'two-sided', usevar = 'unequal'))
# Print het 95%-betrouwbaarheidsinterval
print(Groepen.tconfint_diff(alpha = 0.05, alternative = 'two-sided', usevar = 'pooled'))
(-0.7379995531363375, 0.46104501473201753, 326.37494442189814)
(-0.340474145197353, 0.15412692297512695)
t =
r Round_and_format(py$stat), p =r Round_and_format(py$pval)Vrijheidsgraden, df = n -1 =
r py$n-1 =r py$dfDe p-waarde is groter dan 0,05, dus de H0 wordt niet verworpen 11
Vrijheidsgraden: df =
r Round_and_format(py$df), niet gelijk aan aantal observaties min één bij een ongepaarde t-toets zonder gepoolde varianties95%-betrouwbaarheidsinterval: bij het herhalen van het experiment met verschillende steekproeven van de populatie zal 95% van de betrouwbaarheidsintervallen de daadwerkelijke parameter bevatten, het verschil tussen de hoogte van de cijfers voor en na de BSA cursus, µ~verschil~ = µ~T2011~ - µ~T2010~. In deze casus is het interval tussen
r Round_and_format(py$lb)enr Round_and_format(py$ub). Aangezien 0 in dit interval zit, is er geen significant verschil tussen beide gemiddelden in 2010 en 2011.Het gemiddelde van de steekproef is in 2010
r Round_and_format(py$mean1)Het gemiddelde van de steekproef is in 2011
r Round_and_format(py$mean2)
3.4.4.1. Effectmaat: Cohen’s d#
De p-waarde geeft aan of het verschil tussen twee groepen significant is. De grootte van het verschil of effect is echter ook relevant. Een effectmaat is een gestandaardiseerde maat die de grootte van een effect weergeeft, zodat effecten van verschillende onderzoeken met elkaar vergeleken kunnen worden.12 Een veel gebruikte effectmaat is Cohen’s d. Cohen’s d geeft een gestandaardiseerd verschil weer: het verschil in gemiddelden tussen twee groepen gecorrigeerd voor de gecombineerde standaardafwijking van de twee groepen. Een indicatie om d te interpreteren is: rond 0,3 is het een klein effect, rond 0,5 is het een gemiddeld effect en rond 0,8 is het een groot effect.13
In dit voorbeeld is de p-waarde groter dan 0,05, dus is een effectmaat uitrekenen onnodig. Pas de volgende stappen toe bij een p-waarde kleiner dan 0,05.
Er is geen Python functie voor Cohen’s d. Bereken daarom de effectmaat zelf door het verschil tussen de gemiddelden van beide groepen te delen door de ongepoolde standaardafwijking.15 Neem de absolute waarde omdat het gebruikelijk is om een effectmaat als positief getal weer te geven.
# Bereken verschil in gemiddelden beide groepen
Verschil = np.mean(Cijfers_2011) - np.mean(Cijfers_2010)
# Bereken ongepoolde standaardafwijking
SD = np.sqrt((np.var(Cijfers_2010, ddof = 1) + np.var(Cijfers_2010, ddof = 1)) / 2)
# Bereken Cohen's d
d = abs(Verschil / SD)
# Print effectmaat
print(d)
0.08336472992402968
d = r Round_and_format(py$d). De sterkte van het effect van de tutor op het cijfer is verwaarloosbaar.
3.5. Rapportage#
Een ongepaarde t-toets is uitgevoerd om te toetsen of het gemiddelde tentamencijfer is veranderd na de invoer van het BSA. Het verschil tussen het gemiddelde tentamencijfer van cohort 2010 (M~2010~ = r Round_and_format(py$vMean_t0), SD~2010~ = r Round_and_format(py$vSD_t0)) en het gemiddelde tentamencijfer van cohort 2011 (M~2011~ = r Round_and_format(py$vMean_t1), SD~2011~ = r Round_and_format(py$vSD_t1)) is niet significant, t ~r py$df~ = r Round_and_format(py$stat), p = r Round_and_format(py$pval). Het 95% betrouwbaarheidsinterval voor het verschil tussen het gemiddelde van beide groepen loopt van r Round_and_format(py$lb) tot r Round_and_format(py$ub). Het gemiddelde tentamencijfer lijkt niet veranderd te zijn na de invoer van het BSA.
Cohort |
N |
M |
SD |
|---|---|---|---|
2010 |
|
|
|
2011 |
|
|
|
Tabel 1. Groepsgrootte, gemiddeld tentamencijfer en standaarddeviatie per cohort
- 1
Van Geloven, N. (25 mei 2016). T-toets Wiki Statistiek Academisch Medisch Centrum.
- 3
Laerd statistics. (2018). Testing for Normality using SPSS Statistics.
- 4
Normaliteit. (14 juli 2014). UvA Wiki Methodologiewinkel.
- 5
Er zijn verschillende opties om variabelen te transformeren, zoals de logaritme, wortel of inverse (1 gedeeld door de variabele) nemen van de variabele. Zie Discovering statistics using IBM SPSS statistics van Field (2013) pagina 201-210 voor meer informatie over welke transformaties wanneer gebruikt kunnen worden.
- 6
Van Geloven, N. (13 maart 2018). Mann-Whitney U toets Wiki Statistiek Academisch Medisch Centrum.
- 7
De Mann-Whitney U toets maakt een rangschikking van de data. Hierdoor is de test verdelingsvrij en is normaliteit geen assumptie. Ook zijn uitbijters minder van invloed op het eindresultaat. Toch wordt er voor deze test minder vaak gekozen, doordat bij het maken van een rankschikking de data informatie verliest. Als de data wel normaal verdeeld is, heeft de Mann-Whitney U toets minder onderscheidend vermogen dan wanneer de ongepaarde t-toets uitgevoerd zou worden.
- 8(1,2)
Lakens, D. (26 januari 2015). Always use Welch’s t-test instead of Student’s t-test. The 20% Statistician.
- 14
Onderscheidend vermogen, in het Engels power genoemd, is de kans dat de nulhypothese verworpen wordt wanneer de alternatieve hypothese ‘waar’ is.
- 18
De breedte van de staven van het histogram wordt vaak automatisch bepaald, maar kan handmatig aangepast worden. Aangezien de breedte van de staven bepalend zijn voor de indruk die de visualisatie geeft, is het verstandig om hier goed op te letten.
- 9(1,2)
Outliers (13 augustus 2016). UvA Wiki Methodologiewinkel.
- 10(1,2)
Uitbijters kunnen bepalend zijn voor de uitkomst van toetsen. Bekijk of de uitbijters valide uitbijters zijn en niet een meetfout of op een andere manier incorrect verkregen data. Het weghalen van uitbijters kan de uitkomst ook vertekenen, daarom is het belangrijk om verwijderde uitbijters te melden in een rapport.
- 11
In dit voorbeeld wordt uitgegaan van een waarschijnlijkheid van 95% c.q. een p-waardegrens van 0,05. De grens is naar eigen inzicht aan te passen; houd hierbij rekening met type I en type II fouten.
- 12
Field, A., Miles, J., & Field, Z. (2012). Discovering statistics using R. London: Sage publications.
- 13
Marshall, E., & Boggis, E. (2016). The statistics tutor’s quick guide to commonly used statistical tests. http://www.statstutor.ac.uk/resources/uploaded/tutorsquickguidetostatistics.pdf.
- 15
Navarro, D. J. (2015). Learning statistics with R: A tutorial for psychology students and other beginners. (Version 0.5) University of Adelaide. Adelaide, Australia. Link