#########################################################
# 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