POL 2809 - Méthodes quantitatives d’analyse

Evelyne Brie

Automne 2026

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.