Tests t et corrélations en R
Dans ce laboratoire, nous allons (1) comparer les moyennes de deux groupes à l’aide d’un test t et (2) mesurer la relation entre deux variables avec la corrélation, en portant attention à ses limites. Les exercices se trouvent à la toute fin du document.
Fonctions pertinentes : read.csv(),
tapply(), t.test(), cor(),
cor.test(), plot()
Petit rappel : en R, le symbole <-
sert à assigner (c’est-à-dire à stocker) une valeur dans un
objet. Par exemple, x <- 5 signifie « mettre la valeur 5
dans l’objet nommé x ».
1. Importer et préparer les données
Nous commençons par charger le jeu de données nommé « Data_Poll.csv », disponible sur STUDIUM. Il s’agit d’un petit sondage (fictif) de sortie de bureau de vote auprès de 11 personnes. N’utilisez pas la fonction « import dataset » dans la fenêtre d’environnement. Votre script à lui seul doit être suffisant pour reproduire votre travail.
# Exemple (à adapter selon l'emplacement du fichier sur VOTRE ordinateur)
PollData <- read.csv("/Users/evelynebrie/Desktop/monDossier/Data_Poll.csv",
fileEncoding = "UTF-8-BOM")
À noter : l’argument
fileEncoding = "UTF-8-BOM" évite qu’un caractère invisible
au début du fichier ne vienne modifier le nom de la première colonne
(par exemple X.U.FEFF.voteChoice au lieu de
voteChoice).
# Afficher les dimensions du jeu de données (nombre de lignes, nombre de colonnes)
dim(PollData)
## [1] 11 6
# Afficher les 5 premières observations (lignes) du jeu de données
head(PollData,5)
## voteChoice age female educHS educCollege educGrad
## 1 red 28 1 0 1 0
## 2 blue 18 0 1 0 0
## 3 blue 65 0 0 1 0
## 4 yellow 40 1 0 0 1
## 5 red 44 1 0 0 1
# Afficher la classe de chaque variable avec class() et sapply()
sapply(PollData, FUN=class)
## voteChoice age female educHS educCollege educGrad
## "character" "integer" "integer" "integer" "integer" "integer"
Chaque ligne correspond à une personne répondante. La variable voteChoice indique le parti choisi (red, blue ou yellow), age indique l’âge, female vaut 1 pour les femmes et 0 sinon, et les trois variables educ indiquent le niveau de scolarité le plus élevé (secondaire, collégial, études supérieures).
Créons deux nouvelles variables : une variable dichotomique votedBlue (1 si la personne a voté pour le parti bleu, 0 sinon) et une variable numérique education (1 = secondaire, 2 = collégial, 3 = études supérieures).
# Variable dichotomique pour le vote bleu
PollData$votedBlue <- NA
PollData$votedBlue[PollData$voteChoice=="blue"] <- 1
PollData$votedBlue[PollData$voteChoice!="blue"] <- 0
# Variable numérique de scolarité
PollData$education <- NA
PollData$education[PollData$educHS==1] <- 1
PollData$education[PollData$educCollege==1] <- 2
PollData$education[PollData$educGrad==1] <- 3
# Vérification
table(PollData$votedBlue)
##
## 0 1
## 7 4
table(PollData$education)
##
## 1 2 3
## 3 4 4
Notre échantillon compte donc 4 électeurs bleus et 7 autres, ainsi que 3 personnes de niveau secondaire, 4 de niveau collégial et 4 aux études supérieures.
2. Le test t
2.1 L’idée
Un test t (pour deux échantillons indépendants) permet de vérifier si la moyenne d’une variable numérique est différente entre deux groupes. Par exemple : les femmes et les non-femmes de notre échantillon ont-ils le même âge moyen?
- Hypothèse nulle (H0) : les deux moyennes sont égales dans la population (aucune différence).
- Hypothèse alternative (H1) : les deux moyennes sont différentes.
La syntaxe est la suivante :
t.test(variableNumerique ~ variableGroupe, data = monJeuDeDonnees).
Le symbole ~ se lit « en fonction de ».
2.2 Exemple 1 : l’âge selon le genre
# Âge moyen par groupe (0 = non-femme, 1 = femme)
tapply(PollData$age, PollData$female, mean)
## 0 1
## 47.20000 33.83333
# Test t
t.test(age ~ female, data = PollData)
##
## Welch Two Sample t-test
##
## data: age by female
## t = 1.2272, df = 4.876, p-value = 0.2757
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -14.84744 41.58077
## sample estimates:
## mean in group 0 mean in group 1
## 47.20000 33.83333
Comment lire ce résultat?
- Les moyennes (mean in group 0 et mean in group 1) : les non-femmes de l’échantillon ont en moyenne 47,2 ans et les femmes 33,8 ans. La différence observée est donc d’environ 13,4 ans.
- La statistique t (t = 1.2272) : elle mesure la taille de la différence par rapport à la variabilité des données. Plus elle est éloignée de 0, plus la différence est « nette ». Elle est positive ici parce que R calcule la différence groupe 0 moins groupe 1 (non-femmes moins femmes).
- La valeur p (p-value = 0.2757) : c’est la probabilité d’observer une différence au moins aussi grande que celle-ci si l’hypothèse nulle était vraie. Ici, p ≈ 0,28.
- L’intervalle de confiance à 95 % (-14.85 à 41.58) : il contient les valeurs plausibles de la vraie différence d’âge entre les non-femmes et les femmes. Il est très large et contient 0 : il est tout à fait plausible qu’il n’y ait aucune différence dans la population.
Règle de décision : on utilise habituellement un seuil de 0,05.
- Si p < 0,05 : on rejette H0. La différence est statistiquement significative.
- Si p ≥ 0,05 : on ne rejette pas H0. On ne peut pas conclure qu’il existe une différence dans la population.
Conclusion : comme p ≈ 0,28 > 0,05, on ne rejette pas l’hypothèse nulle. Même si une différence de 13 ans semble grande, elle n’est pas statistiquement significative : avec seulement 11 personnes et des âges très dispersés (de 18 à 72 ans), elle pourrait facilement être due au hasard.
2.3 Exemple 2 : la scolarité selon le genre
# Scolarité moyenne par groupe (0 = non-femme, 1 = femme)
tapply(PollData$education, PollData$female, mean)
## 0 1
## 1.400000 2.666667
# Test t
t.test(education ~ female, data = PollData)
##
## Welch Two Sample t-test
##
## data: education by female
## t = -3.9194, df = 8.4233, p-value = 0.003998
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -2.0054497 -0.5278837
## sample estimates:
## mean in group 0 mean in group 1
## 1.400000 2.666667
Conclusion : les femmes ont un niveau de scolarité moyen de 2,67 contre 1,40 pour les non-femmes. La statistique t (-3,92) est négative parce que le groupe 0 (non-femmes) a une moyenne plus basse que le groupe 1 (femmes). La valeur p (≈ 0,004) est inférieure à 0,05 et l’intervalle de confiance (-2,01 à -0,53) ne contient pas 0 : on rejette l’hypothèse nulle. Dans ce sondage, les femmes sont significativement plus scolarisées que les non-femmes.
Pourquoi un résultat significatif ici, mais pas pour l’âge? La différence de scolarité (environ 1,3 point sur une échelle de 1 à 3) est grande par rapport à la dispersion de cette variable, alors que la différence d’âge (13 ans) est petite par rapport à la dispersion de l’âge. Le test t tient compte des deux. Notez aussi qu’une différence non significative ne prouve pas que les groupes sont identiques : avec un très petit échantillon comme le nôtre, il est difficile de détecter des différences.
3. La corrélation
3.1 Rappel : interpréter un coefficient de corrélation
Le coefficient de corrélation de Pearson (\(r\)) mesure la force et la direction d’une relation linéaire entre deux variables. Il se situe toujours entre -1 et +1.
La force se lit dans la valeur absolue de \(r\) :
| Faible | Moyenne | Forte |
|---|---|---|
| \(\lvert r \rvert < 0{,}3\) | \(0{,}3 \leq \lvert r \rvert < 0{,}7\) | \(\lvert r \rvert \geq 0{,}7\) |
La direction se lit dans le signe :
- Pas de signe moins \(\rightarrow\) relation positive
- Signe moins \(\rightarrow\) relation négative
Exemples
- \(r = 0{,}85\) : forte et positive
- \(r = -0{,}85\) : forte et négative
- \(r = -0{,}45\) : moyenne et négative
- \(r = 0{,}12\) : faible et positive
3.2 Calculer une corrélation avec cor()
# Corrélation entre l'âge et la scolarité
cor(PollData$age, PollData$education)
## [1] 0.02155227
Interprétation :
- Âge et scolarité : \(r \approx 0{,}02\), une relation faible et positive (pratiquement nulle).
3.3 La corrélation est-elle significative?
cor.test()
La fonction cor.test() donne le même coefficient, mais
ajoute une valeur p et un intervalle de
confiance. Elle s’interprète comme le test t : si p < 0,05,
on conclut que la corrélation est statistiquement différente de 0 dans
la population.
cor.test(PollData$age, PollData$education)
##
## Pearson's product-moment correlation
##
## data: PollData$age and PollData$education
## t = 0.064672, df = 9, p-value = 0.9498
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.5858976 0.6134956
## sample estimates:
## cor
## 0.02155227
À retenir : la force d’une corrélation
(faible, moyenne, forte) et sa significativité (p < 0,05 ou
non) sont deux questions différentes. Une corrélation moyenne peut être
non significative dans un petit échantillon, et une corrélation faible
peut être significative dans un très grand échantillon. Enfin, s’il y a
des valeurs manquantes dans vos données, ajoutez l’argument
use="pairwise.complete.obs" à cor().
3.4 Attention : la corrélation ne mesure que les relations linéaires
Une corrélation proche de 0 ne veut pas dire qu’il n’y a aucune relation entre deux variables. Elle veut seulement dire qu’il n’y a pas de relation linéaire (en ligne droite).
Pour l’illustrer, créons une variable fictive de cynisme politique qui suit une courbe en U selon l’âge : les plus jeunes et les plus âgés sont les plus cyniques, alors que les personnes d’âge moyen le sont moins.
# Variable FICTIVE, créée à des fins d'illustration seulement
PollData$cynisme <- (PollData$age - 45)^2 / 100
# Corrélation entre l'âge et le cynisme
cor(PollData$age, PollData$cynisme)
## [1] -0.005229895
La corrélation est d’environ -0,005 : selon nos seuils, la relation serait faible, presque inexistante. Pourtant, le cynisme dépend entièrement de l’âge! Regardons le nuage de points :
plot(PollData$age, PollData$cynisme,
main="Cynisme politique (fictif) selon l'âge",
xlab="Âge",
ylab="Cynisme politique",
col="blue", # Couleur des points
pch=16) # Type de point
La relation est très claire, mais elle est en forme de U plutôt qu’en ligne droite. Le cynisme est au plus bas autour de 45 ans (la personne de 44 ans a un score presque nul), alors que la personne de 18 ans et celle de 72 ans ont exactement le même score, le plus élevé de l’échantillon (7,29). Lorsque l’âge augmente, le cynisme commence par diminuer, puis se met à augmenter : les deux tendances s’annulent et le coefficient de corrélation s’approche de 0.
Leçon à retenir : avant d’interpréter une corrélation, faites toujours un nuage de points. Le coefficient \(r\) résume une relation linéaire en un seul chiffre; il peut passer complètement à côté d’une relation non linéaire.
4. Exercices
Les solutions sont cachées par défaut : cliquez sur le bouton « Voir la solution » seulement après avoir essayé par vous-même!
Exercice 1
Effectuez un test t pour vérifier si l’âge moyen (age) diffère entre les personnes qui ont voté pour le parti bleu et les autres (votedBlue). Quel est l’âge moyen de chaque groupe? La différence est-elle statistiquement significative?
Indice : la logique est la même qu’à la section 2.2.
Voir la solution
# Solution
tapply(PollData$age, PollData$votedBlue, mean)
## 0 1
## 43.71429 33.25000
t.test(age ~ votedBlue, data = PollData)
##
## Welch Two Sample t-test
##
## data: age by votedBlue
## t = 0.85988, df = 4.6164, p-value = 0.4322
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -21.61665 42.54522
## sample estimates:
## mean in group 0 mean in group 1
## 43.71429 33.25000
# Les électeurs bleus ont en moyenne environ 33,3 ans, contre 43,7 ans pour
# les autres. Cependant, la valeur p (environ 0,43) est supérieure à 0,05 et
# l'intervalle de confiance contient 0 : on ne rejette pas l'hypothèse nulle.
# La différence n'est pas statistiquement significative.
Exercice 2
Calculez la corrélation entre age et votedBlue, puis vérifiez si elle est statistiquement significative. Interprétez sa force et sa direction. Votre conclusion concorde-t-elle avec celle de l’exercice 1?
Indice : utilisez cor(), puis
cor.test() (section 3.3).
Voir la solution
# Solution
cor(PollData$age, PollData$votedBlue)
## [1] -0.3059916
cor.test(PollData$age, PollData$votedBlue)
##
## Pearson's product-moment correlation
##
## data: PollData$age and PollData$votedBlue
## t = -0.96422, df = 9, p-value = 0.3601
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.7653766 0.3599557
## sample estimates:
## cor
## -0.3059916
# r est d'environ -0,31 : une relation moyenne et négative. Les personnes
# qui ont voté pour le parti bleu ont tendance à être plus jeunes.
# Toutefois, p (environ 0,36) est supérieure à 0,05 : la corrélation n'est
# pas statistiquement significative. Cela concorde avec l'exercice 1 : même
# direction (les électeurs bleus sont plus jeunes), mais pas de différence
# significative avec seulement 11 personnes.
Exercice 3
(a) Sans utiliser R, interprétez les coefficients suivants : \(r = 0{,}72\), \(r = -0{,}18\), \(r = -0{,}69\).
(b) Une collègue obtient \(r = 0{,}03\) entre deux variables et conclut qu’elles n’ont « aucun lien ». Que devrait-elle faire avant de tirer cette conclusion?
Voir la solution
# Solution (a)
# r = 0,72 : forte et positive
# r = -0,18 : faible et négative
# r = -0,69 : moyenne et négative (|r| est inférieur à 0,7)
# Solution (b)
# Elle devrait faire un nuage de points. Un r proche de 0 indique seulement
# l'absence de relation LINÉAIRE : il pourrait exister une relation non
# linéaire (par exemple en forme de U), comme à la section 3.4.