#########################################################
# ANALYSE DES PERFORMANCES SCOLAIRES AVEC R
# Objectif : Aide à la décision pédagogique
#########################################################
##############################
# 1️⃣ IMPORTATION DES DONNÉES
##############################
notes <- read.csv("TESTR.csv", sep = ";", stringsAsFactors = FALSE)
cat("Aperçu des données :\n")
## Aperçu des données :
head(notes)
## Eleve Etablissement Maths PC SVT Moyenne
## 1 E1 Lycee A 12 11 13 12
## 2 E2 Lycee A 16 13 14 14,33333333
## 3 E3 Lycee A 10 11 13 11,33333333
## 4 E4 Lycee A 10 10 14 11,33333333
## 5 E5 Lycee A 14 14 11 13
## 6 E6 Lycee A 13 12 12 12,33333333
cat("\nStructure des données :\n")
##
## Structure des données :
str(notes)
## 'data.frame': 153 obs. of 6 variables:
## $ Eleve : chr "E1" "E2" "E3" "E4" ...
## $ Etablissement: chr "Lycee A" "Lycee A" "Lycee A" "Lycee A" ...
## $ Maths : int 12 16 10 10 14 13 16 13 14 11 ...
## $ PC : int 11 13 11 10 14 12 17 15 12 16 ...
## $ SVT : int 13 14 13 14 11 12 16 10 17 17 ...
## $ Moyenne : chr "12" "14,33333333" "11,33333333" "11,33333333" ...
##############################
# 2️⃣ NETTOYAGE DES DONNÉES
##############################
notes <- read.csv("TESTR.csv", sep = ";", stringsAsFactors = FALSE)
colonnes_notes <- c("Maths", "PC", "SVT", "Moyenne")
notes[colonnes_notes] <- lapply(notes[colonnes_notes], function(x) {
as.numeric(gsub(",", ".", x))
})
#cat("\nNettoyage terminé.\n")
##############################
# 3️⃣ STATISTIQUES DESCRIPTIVES
##############################
moyennes <- colMeans(notes[colonnes_notes], na.rm = TRUE)
ecarts_types <- apply(notes[colonnes_notes], 2, sd, na.rm = TRUE)
cat("\nMoyennes par matière :\n")
##
## Moyennes par matière :
print(round(moyennes,2))
## Maths PC SVT Moyenne
## 11.50 11.67 11.45 11.54
cat("\nDispersion (écart-type) :\n")
##
## Dispersion (écart-type) :
print(round(ecarts_types,2))
## Maths PC SVT Moyenne
## 2.57 2.77 2.69 2.20
##############################
# 4️⃣ CLASSEMENT DES ÉLÈVES
##############################
classement <- notes[order(-notes$Moyenne), ]
cat("\nTop 5 des élèves :\n")
##
## Top 5 des élèves :
print(head(classement, 5))
## Eleve Etablissement Maths PC SVT Moyenne
## 67 E67 Lycee B 17 17 17 17.00000
## 7 E7 Lycee A 16 17 16 16.33333
## 74 E74 Lycee B 16 15 17 16.00000
## 71 E71 Lycee B 14 16 17 15.66667
## 122 E122 Lycee D 16 16 15 15.66667
##############################
# 5️⃣ ANALYSE PÉDAGOGIQUE
##############################
# Élèves en difficulté
faibles <- notes[notes$Moyenne < 10, ]
faibles
## Eleve Etablissement Maths PC SVT Moyenne
## 22 E22 Lycee A 8 9 8 8.333333
## 23 E23 Lycee A 8 7 12 9.000000
## 24 E24 Lycee A 11 8 9 9.333333
## 26 E26 Lycee A 11 9 8 9.333333
## 27 E27 Lycee A 7 11 7 8.333333
## 29 E29 Lycee A 7 7 8 7.333333
## 33 E33 Lycee A 9 7 7 7.666667
## 36 E36 Lycee A 8 8 7 7.666667
## 38 E38 Lycee A 8 7 13 9.333333
## 39 E39 Lycee A 8 9 10 9.000000
## 41 E41 Lycee B 9 8 8 8.333333
## 46 E46 Lycee B 9 11 9 9.666667
## 55 E55 Lycee B 9 11 9 9.666667
## 59 E59 Lycee B 11 9 9 9.666667
## 81 E81 Lycee C 8 8 13 9.666667
## 83 E83 Lycee C 10 7 7 8.000000
## 84 E84 Lycee C 9 9 10 9.333333
## 85 E85 Lycee C 8 7 8 7.666667
## 90 E90 Lycee C 11 7 7 8.333333
## 91 E91 Lycee C 7 8 7 7.333333
## 92 E92 Lycee C 7 10 9 8.666667
## 94 E94 Lycee C 9 9 8 8.666667
## 95 E95 Lycee C 8 10 11 9.666667
## 97 E97 Lycee C 10 7 8 8.333333
## 99 E99 Lycee C 13 9 7 9.666667
## 101 E101 Lycee C 9 8 10 9.000000
## 102 E102 Lycee C 9 7 11 9.000000
## 103 E103 Lycee C 8 8 11 9.000000
## 105 E105 Lycee C 9 9 10 9.333333
## 115 E115 Lycee C 9 9 10 9.333333
## 140 E140 Lycee D 10 8 8 8.666667
## 142 E142 Lycee D 8 12 8 9.333333
## 143 E143 Lycee D 8 10 10 9.333333
## 147 E147 Lycee D 7 8 8 7.666667
#Taux de réussite
taux_reussite <- mean(notes$Moyenne >= 10) * 100
taux_reussite
## [1] 77.77778
# Mentions
notes$Mention <- cut(notes$Moyenne,
breaks = c(0,10,12,14,16,20),
labels = c("Insuffisant","Passable","Assez bien","Bien","Très bien"),
right = FALSE)
cat("\nRépartition des mentions :\n")
##
## Répartition des mentions :
print(table(notes$Mention))
##
## Insuffisant Passable Assez bien Bien Très bien
## 34 61 30 25 3
##############################
# 6️⃣ INTERPRÉTATION AUTOMATIQUE
##############################
cat("\n===== DIAGNOSTIC PÉDAGOGIQUE =====\n")
##
## ===== DIAGNOSTIC PÉDAGOGIQUE =====
moy_generale <- mean(notes$Moyenne, na.rm = TRUE)
moy_generale
## [1] 11.54031
"La classe a "
## [1] "La classe a "
if (moy_generale < 10) {
cat("➡ Classe en difficulté globale\n")
} else if (moy_generale < 12) {
cat("➡ niveau moyen\n")
} else {
cat("➡ Niveau satisfaisant\n")
}
## ➡ niveau moyen
cat("➡ Taux de réussite :", round(taux_reussite,2), "%\n")
## ➡ Taux de réussite : 77.78 %
matiere_faible <- names(which.min(moyennes[1:3]))
cat("➡ Matière la plus faible :", matiere_faible, "\n")
## ➡ Matière la plus faible : SVT
##############################
# 7️⃣ ANALYSE STATISTIQUE
##############################
correlation <- cor(notes[colonnes_notes], use = "complete.obs")
correlation
## Maths PC SVT Moyenne
## Maths 1.0000000 0.5734342 0.4811637 0.8281365
## PC 0.5734342 1.0000000 0.4728794 0.8376534
## SVT 0.4811637 0.4728794 1.0000000 0.7946507
## Moyenne 0.8281365 0.8376534 0.7946507 1.0000000
cat("\nCorrélations entre matières :\n")
##
## Corrélations entre matières :
print(round(correlation,2))
## Maths PC SVT Moyenne
## Maths 1.00 0.57 0.48 0.83
## PC 0.57 1.00 0.47 0.84
## SVT 0.48 0.47 1.00 0.79
## Moyenne 0.83 0.84 0.79 1.00
modele <- lm(Moyenne ~ Maths + PC + SVT, data = notes)
cat("\nInfluence des matières sur la moyenne :\n")
##
## Influence des matières sur la moyenne :
print(summary(modele))
##
## Call:
## lm(formula = Moyenne ~ Maths + PC + SVT, data = notes)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.747e-09 -3.036e-09 1.568e-10 2.951e-09 3.823e-09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.175e-09 1.096e-09 -1.072e+00 0.286
## Maths 3.333e-01 1.013e-10 3.289e+09 <2e-16 ***
## PC 3.333e-01 9.358e-11 3.562e+09 <2e-16 ***
## SVT 3.333e-01 9.029e-11 3.692e+09 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.52e-09 on 149 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 3.847e+19 on 3 and 149 DF, p-value: < 2.2e-16
##############################
# 8️⃣ VISUALISATION
##############################
par(mfrow = c(2,2))
# Histogramme
hist(notes$Moyenne, main="Distribution des moyennes", xlab="Moyenne")
# Boxplot
boxplot(notes[colonnes_notes],
main="Comparaison des matières")
# Nuage de points
plot(notes$Maths, notes$Moyenne,
main="Maths vs Moyenne",
xlab="Maths", ylab="Moyenne")
abline(lm(Moyenne ~ Maths, data = notes), lwd = 2)
# Barplot mentions
barplot(table(notes$Mention),
main="Répartition des mentions")

#########################################################
# PRÉDICTIONS CROISÉES ENTRE MATIÈRES
#########################################################
# 1️⃣ Prédire SVT à partir de Maths et PC
modele_SVT <- lm(SVT ~ Maths + PC, data = notes)
prediction_SVT <- predict(modele_SVT,
newdata = data.frame(Maths = 12, PC = 10))
cat("\nPrédiction SVT (Maths=12, PC=10) :\n")
##
## Prédiction SVT (Maths=12, PC=10) :
print(prediction_SVT)
## 1
## 11.13941
# 2️⃣ Prédire Maths à partir de PC et SVT
modele_Maths <- lm(Maths ~ PC + SVT, data = notes)
prediction_Maths <- predict(modele_Maths,
newdata = data.frame(PC = 10, SVT = 11))
cat("\nPrédiction Maths (PC=10, SVT=11) :\n")
##
## Prédiction Maths (PC=10, SVT=11) :
print(prediction_Maths)
## 1
## 10.69716
# 3️⃣ Prédire PC à partir de Maths et SVT
modele_PC <- lm(PC ~ Maths + SVT, data = notes)
prediction_PC <- predict(modele_PC,
newdata = data.frame(Maths = 18, SVT = 11))
cat("\nPrédiction PC (Maths=18, SVT=11) :\n")
##
## Prédiction PC (Maths=18, SVT=11) :
print(prediction_PC)
## 1
## 14.69786