TP Bonus – Analyse des notes d’algèbre par sexe

Auteur·rice

HAMLIL Mohamed

Date de publication

30 avril 2026

Introduction

Ce TP bonus explore les notes d’algèbre sur trois années (2022, 2023, 2024) pour analyser s’il existe une différence significative entre les résultats des étudiants selon le sexe (M/F).

Nous utiliserons les outils vus dans les TPs précédents :

  • Statistiques descriptives et visualisations
  • Tests de normalité
  • ANOVA et tests non paramétriques

1. Importation des données

Code
alg22 = read.csv2("alg22.csv")
alg23 = read.csv2("alg23.csv")
alg24 = read.csv2("alg24.csv")

cat("=== 2022 ===\n")
head(alg22)
cat("\n=== 2023 ===\n")
head(alg23)
cat("\n=== 2024 ===\n")
head(alg24)
=== 2022 ===
A data.frame: 6 × 2
Sexe note22
<chr> <dbl>
1 F 0.0
2 M 0.0
3 M 2.5
4 M 3.0
5 M 3.0
6 M 3.0

=== 2023 ===
A data.frame: 6 × 2
Sexe note23
<chr> <dbl>
1 F 3.5
2 M 4.0
3 M 4.5
4 M 5.0
5 F 5.0
6 M 5.0

=== 2024 ===
A data.frame: 6 × 2
Sexe note24
<chr> <dbl>
1 M 0.0
2 M 3.5
3 M 7.5
4 M 8.0
5 F 9.0
6 F 9.0
Code
cat("Effectifs 2022 :", nrow(alg22))
cat("\nEffectifs 2023 :", nrow(alg23))
cat("\nEffectifs 2024 :", nrow(alg24))
Effectifs 2022 : 88
Effectifs 2023 : 72
Effectifs 2024 : 48

2. Analyse par année

2.1 Année 2022

Statistiques descriptives

Code
note22 = alg22$note22
sexe22 = alg22$Sexe

cat("Moyenne globale :", mean(note22, na.rm = TRUE))
cat("\nMoyenne F :", mean(note22[sexe22 == "F"], na.rm = TRUE))
cat("\nMoyenne M :", mean(note22[sexe22 == "M"], na.rm = TRUE))
Moyenne globale : 10.85227
Moyenne F : 11.13333
Moyenne M : 10.7069
Code
boxplot(note22 ~ sexe22,
        main = "Notes d'algèbre 2022 par sexe",
        col = c("pink", "lightblue"),
        ylab = "Note", xlab = "Sexe")

Test de normalité par groupe

Code
tapply(note22, sexe22, shapiro.test)
$F

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.96625, p-value = 0.4424


$M

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.96015, p-value = 0.05433

ANOVA

Code
anova(lm(note22 ~ sexe22))
A anova: 2 × 5
Df Sum Sq Mean Sq F value Pr(>F)
<int> <dbl> <dbl> <dbl> <dbl>
sexe22 1 3.595637 3.595637 0.2038419 0.652774
Residuals 86 1516.983908 17.639348 NA NA

Test de Wilcoxon (alternatif non paramétrique)

Code
wilcox.test(note22 ~ sexe22)

    Wilcoxon rank sum test with continuity correction

data:  note22 by sexe22
W = 905.5, p-value = 0.7577
alternative hypothesis: true location shift is not equal to 0

2.2 Année 2023

Code
note23 = alg23$note23
sexe23 = alg23$Sexe

cat("Moyenne F :", mean(note23[sexe23 == "F"], na.rm = TRUE))
cat("\nMoyenne M :", mean(note23[sexe23 == "M"], na.rm = TRUE))
Moyenne F : 11.46774
Moyenne M : 11.59756
Code
boxplot(note23 ~ sexe23,
        main = "Notes d'algèbre 2023 par sexe",
        col = c("pink", "lightblue"),
        ylab = "Note", xlab = "Sexe")

Code
tapply(note23, sexe23, shapiro.test)
$F

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.9805, p-value = 0.8266


$M

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.96268, p-value = 0.195
Code
anova(lm(note23 ~ sexe23))
wilcox.test(note23 ~ sexe23)
A anova: 2 × 5
Df Sum Sq Mean Sq F value Pr(>F)
<int> <dbl> <dbl> <dbl> <dbl>
sexe23 1 0.297502 0.297502 0.01587188 0.900106
Residuals 70 1312.077498 18.743964 NA NA

    Wilcoxon rank sum test with continuity correction

data:  note23 by sexe23
W = 636.5, p-value = 0.9955
alternative hypothesis: true location shift is not equal to 0

2.3 Année 2024

Code
note24 = alg24$note24
sexe24 = alg24$Sexe

cat("Moyenne F :", mean(note24[sexe24 == "F"], na.rm = TRUE))
cat("\nMoyenne M :", mean(note24[sexe24 == "M"], na.rm = TRUE))
Moyenne F : 12.8
Moyenne M : 12.95652
Code
boxplot(note24 ~ sexe24,
        main = "Notes d'algèbre 2024 par sexe",
        col = c("pink", "lightblue"),
        ylab = "Note", xlab = "Sexe")

Code
tapply(note24, sexe24, shapiro.test)
$F

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.87419, p-value = 0.005257


$M

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.86408, p-value = 0.004951
Code
anova(lm(note24 ~ sexe24))
wilcox.test(note24 ~ sexe24)
A anova: 2 × 5
Df Sum Sq Mean Sq F value Pr(>F)
<int> <dbl> <dbl> <dbl> <dbl>
sexe24 1 0.2934783 0.2934783 0.01881647 0.8914926
Residuals 46 717.4565217 15.5968809 NA NA

    Wilcoxon rank sum test with continuity correction

data:  note24 by sexe24
W = 240, p-value = 0.3309
alternative hypothesis: true location shift is not equal to 0

3. Analyse globale (toutes années confondues)

3.1 Fusion des données

Code
notes_all = c(note22, note23, note24)
sexe_all = c(as.character(sexe22), as.character(sexe23), as.character(sexe24))
annee_all = c(rep("2022", length(note22)), rep("2023", length(note23)), rep("2024", length(note24)))

sexe_all = factor(sexe_all)
annee_all = factor(annee_all)

3.2 Visualisation

Code
boxplot(notes_all ~ sexe_all,
        main = "Notes d'algèbre (toutes années) par sexe",
        col = c("pink", "lightblue"),
        ylab = "Note", xlab = "Sexe")

3.3 ANOVA à deux facteurs

On peut tester l’effet du sexe, de l’année, et de leur interaction :

Code
anova(lm(notes_all ~ sexe_all * annee_all))
A anova: 4 × 5
Df Sum Sq Mean Sq F value Pr(>F)
<int> <dbl> <dbl> <dbl> <dbl>
sexe_all 1 4.786533 4.786533 0.2726279 0.60214648
annee_all 2 122.684828 61.342414 3.4938968 0.03223111
sexe_all:annee_all 2 3.818403 1.909202 0.1087429 0.89701345
Residuals 202 3546.517928 17.557019 NA NA
Code
# Sans interaction
anova(lm(notes_all ~ sexe_all + annee_all))
A anova: 3 × 5
Df Sum Sq Mean Sq F value Pr(>F)
<int> <dbl> <dbl> <dbl> <dbl>
sexe_all 1 4.786533 4.786533 0.2750311 0.6005461
annee_all 2 122.684828 61.342414 3.5246949 0.0312679
Residuals 204 3550.336331 17.403609 NA NA
Code
interaction.plot(annee_all, sexe_all, notes_all,
                 main = "Interaction Année × Sexe",
                 col = c("pink", "lightblue"), lwd = 2,
                 xlab = "Année", ylab = "Moyenne des notes")

3.4 Test de Kruskal-Wallis

Code
kruskal.test(notes_all ~ sexe_all)

    Kruskal-Wallis rank sum test

data:  notes_all by sexe_all
Kruskal-Wallis chi-squared = 0.021761, df = 1, p-value = 0.8827

Résumé

Année Méthode Conclusion
2022 ANOVA + Wilcoxon À interpréter selon les p-values
2023 ANOVA + Wilcoxon À interpréter selon les p-values
2024 ANOVA + Wilcoxon À interpréter selon les p-values
Toutes ANOVA 2 facteurs + Kruskal-Wallis Effet global

Points clés :

  • Toujours vérifier la normalité avant l’ANOVA.
  • Le test de Wilcoxon est une bonne alternative pour 2 groupes.
  • L’ANOVA à deux facteurs permet de séparer l’effet du sexe, de l’année, et de leur interaction.