ACP_EN_R

Les étapes pour construire une ACP

Application de l’ACP en pratique

Base de données

La base de données contient les performances des athlètes à une compétition de décathlon. La base contient 41 lignes et inlut des résultats pour diverses épreuves telles que le 100m, le saut en longueur, le lancer du poids, etc. Chaque ligne détaille les performances d’un athlète dans chaque épreuve, son classement, le total des points, et le nom de la compétition.

L’objectif de l’ACP sur cette base de données est double:

-L’ACP permettra d’identifier les épreuves qui sont le plus fortement corrélées entre elles, de déterminer les épreuves les plus influentes pour le score total, et de déceler des patterns ou des groupes d’épreuves qui ont tendance à aller de pair dans la détermination des performances athlétiques.

-L’ACP aidera à identifier des groupes d’athlètes avec des profils de compétences similaires, de découvrir des athlètes qui se distinguent dans certaines épreuves, et de visualiser la dispersion des athlètes en fonction de leur polyvalence et de leurs forces et faiblesses spécifiques. Cela fournira des insights sur la manière dont les compétences et les performances individuelles se répartissent au sein de l’ensemble des participants.

Utilité pratique du projet

  1. Identification des Facteurs Clés de Réussite : En analysant les corrélations entre différentes épreuves, l’ACP peut révéler quelles compétences et quelles épreuves sont les plus déterminantes pour réussir en décathlon. Cela peut aider les entraîneurs et les athlètes à cibler leurs entraînements sur les aspects les plus influents.

  2. Stratégies d’Entraînement et de Compétition : En comprenant les forces et les faiblesses des athlètes individuels, les entraîneurs peuvent élaborer des stratégies d’entraînement personnalisées. Cela peut également aider à développer des stratégies de compétition, en se concentrant sur les épreuves où les athlètes sont les plus susceptibles de gagner des points.

  3. Sélection et Recrutement d’Athlètes : Les équipes et les organisations sportives peuvent utiliser les résultats de l’ACP pour identifier des athlètes ayant des profils de compétences particuliers qui correspondent à leurs besoins ou à leur philosophie de formation.

  4. Engagement des Fans et des Médias : Les résultats de l’analyse peuvent être utilisés pour créer des narrations intéressantes pour les fans et les médias, en mettant en lumière les subtilités des performances des athlètes et les dynamiques complexes du décathlon.

Etape 1: Importation et description des données

# Définir l'URL du fichier
url <- "https://raw.githubusercontent.com/LeCoinStat/LeCoinStat/main/ACPAvecR/data/decathlon.txt"

# Importer les données
decathlon_data <- read.table(url, header = TRUE, sep = "\t")

# Afficher les premières lignes pour vérifier
head(decathlon_data)
        X100m Long.jump Shot.put High.jump X400m X110m.hurdle Discus Pole.vault
SEBRLE  11.04      7.58    14.83      2.07 49.81        14.69  43.75       5.02
CLAY    10.76      7.40    14.26      1.86 49.37        14.05  50.72       4.92
KARPOV  11.02      7.30    14.77      2.04 48.37        14.09  48.95       4.92
BERNARD 11.02      7.23    14.25      1.92 48.93        14.99  40.87       5.32
YURKOV  11.34      7.09    15.19      2.10 50.42        15.31  46.26       4.72
WARNERS 11.11      7.60    14.31      1.98 48.68        14.23  41.10       4.92
        Javeline X1500m Rank Points Competition
SEBRLE     63.19  291.7    1   8217    Decastar
CLAY       60.15  301.5    2   8122    Decastar
KARPOV     50.31  300.2    3   8099    Decastar
BERNARD    62.77  280.1    4   8067    Decastar
YURKOV     63.44  276.4    5   8036    Decastar
WARNERS    51.77  278.1    6   8030    Decastar
# Renommer les colonnes avec des noms de compétitions sportives en français
colnames(decathlon_data) <-  c(
  "Course100m",     # X100m
  "SautEnLongueur", # Long.jump
  "LancerDePoids",  # Shot.put
  "SautEnHauteur",  # High.jump
  "Course400m",     # X400m
  "Course110mHaies",# X110m.hurdle
  "LancerDeDisque", # Discus
  "SautALaPerche",  # Pole.vault
  "LancerDeJavelot",# Javeline
  "Course1500m",    # X1500m
  "Classement",     # Rank
  "Points",         # Points
  "Compétition"     # Competition
)

head(decathlon_data)
        Course100m SautEnLongueur LancerDePoids SautEnHauteur Course400m
SEBRLE       11.04           7.58         14.83          2.07      49.81
CLAY         10.76           7.40         14.26          1.86      49.37
KARPOV       11.02           7.30         14.77          2.04      48.37
BERNARD      11.02           7.23         14.25          1.92      48.93
YURKOV       11.34           7.09         15.19          2.10      50.42
WARNERS      11.11           7.60         14.31          1.98      48.68
        Course110mHaies LancerDeDisque SautALaPerche LancerDeJavelot
SEBRLE            14.69          43.75          5.02           63.19
CLAY              14.05          50.72          4.92           60.15
KARPOV            14.09          48.95          4.92           50.31
BERNARD           14.99          40.87          5.32           62.77
YURKOV            15.31          46.26          4.72           63.44
WARNERS           14.23          41.10          4.92           51.77
        Course1500m Classement Points Compétition
SEBRLE        291.7          1   8217    Decastar
CLAY          301.5          2   8122    Decastar
KARPOV        300.2          3   8099    Decastar
BERNARD       280.1          4   8067    Decastar
YURKOV        276.4          5   8036    Decastar
WARNERS       278.1          6   8030    Decastar
summary(decathlon_data)
   Course100m    SautEnLongueur LancerDePoids   SautEnHauteur     Course400m   
 Min.   :10.44   Min.   :6.61   Min.   :12.68   Min.   :1.850   Min.   :46.81  
 1st Qu.:10.85   1st Qu.:7.03   1st Qu.:13.88   1st Qu.:1.920   1st Qu.:48.93  
 Median :10.98   Median :7.30   Median :14.57   Median :1.950   Median :49.40  
 Mean   :11.00   Mean   :7.26   Mean   :14.48   Mean   :1.977   Mean   :49.62  
 3rd Qu.:11.14   3rd Qu.:7.48   3rd Qu.:14.97   3rd Qu.:2.040   3rd Qu.:50.30  
 Max.   :11.64   Max.   :7.96   Max.   :16.36   Max.   :2.150   Max.   :53.20  
 Course110mHaies LancerDeDisque  SautALaPerche   LancerDeJavelot
 Min.   :13.97   Min.   :37.92   Min.   :4.200   Min.   :50.31  
 1st Qu.:14.21   1st Qu.:41.90   1st Qu.:4.500   1st Qu.:55.27  
 Median :14.48   Median :44.41   Median :4.800   Median :58.36  
 Mean   :14.61   Mean   :44.33   Mean   :4.762   Mean   :58.32  
 3rd Qu.:14.98   3rd Qu.:46.07   3rd Qu.:4.920   3rd Qu.:60.89  
 Max.   :15.67   Max.   :51.65   Max.   :5.400   Max.   :70.52  
  Course1500m      Classement        Points     Compétition       
 Min.   :262.1   Min.   : 1.00   Min.   :7313   Length:41         
 1st Qu.:271.0   1st Qu.: 6.00   1st Qu.:7802   Class :character  
 Median :278.1   Median :11.00   Median :8021   Mode  :character  
 Mean   :279.0   Mean   :12.12   Mean   :8005                     
 3rd Qu.:285.1   3rd Qu.:18.00   3rd Qu.:8122                     
 Max.   :317.0   Max.   :28.00   Max.   :8893                     

Analyse des valeurs manquantes

# Fonction pour calculer la proportion de valeurs manquantes par variable
proportion_valeurs_manquantes <- function(data) {
    # Calcul du nombre de valeurs manquantes par colonne
  nb_valeurs_manquantes <- sapply(data, function(x) sum(is.na(x)))

  # Calcul de la proportion de valeurs manquantes
  proportion_manquantes <- nb_valeurs_manquantes / nrow(data)

  # Création d'un dataframe pour le résultat
  resultat <- data.frame(Nombre = nb_valeurs_manquantes, Proportion = proportion_manquantes)

  return(resultat)
}

# Utilisation de la fonction avec votre base de données
resultat <- proportion_valeurs_manquantes(decathlon_data)

# Affichage du résultat
resultat
                Nombre Proportion
Course100m           0          0
SautEnLongueur       0          0
LancerDePoids        0          0
SautEnHauteur        0          0
Course400m           0          0
Course110mHaies      0          0
LancerDeDisque       0          0
SautALaPerche        0          0
LancerDeJavelot      0          0
Course1500m          0          0
Classement           0          0
Points               0          0
Compétition          0          0
# Charger le package VIM
if (!require(dplyr)) install.packages("VIM")
Le chargement a nécessité le package : dplyr

Attachement du package : 'dplyr'
Les objets suivants sont masqués depuis 'package:stats':

    filter, lag
Les objets suivants sont masqués depuis 'package:base':

    intersect, setdiff, setequal, union
library(VIM)
Le chargement a nécessité le package : colorspace
Le chargement a nécessité le package : grid
VIM is ready to use.
Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues

Attachement du package : 'VIM'
L'objet suivant est masqué depuis 'package:datasets':

    sleep
# Utilisation de la fonction aggr() pour visualiser les valeurs manquantes
aggr(decathlon_data, col=c('navyblue','yellow'), numbers=TRUE, sortVars=TRUE, 
     labels=names(decathlon_data), cex.axis=.7, gap=3, ylab=c("Histogram of missing data","Pattern"))


 Variables sorted by number of missings: 
        Variable Count
      Course100m     0
  SautEnLongueur     0
   LancerDePoids     0
   SautEnHauteur     0
      Course400m     0
 Course110mHaies     0
  LancerDeDisque     0
   SautALaPerche     0
 LancerDeJavelot     0
     Course1500m     0
      Classement     0
          Points     0
     Compétition     0

Description des variables quantitatives

# Installer les packages nécessaires si ce n'est pas déjà fait
if (!require(ggplot2)) install.packages("ggplot2")
Le chargement a nécessité le package : ggplot2
# Charger les packages
library(ggplot2)
# Identifier les colonnes quantitatives
vars_quantitatives <- sapply(decathlon_data, is.numeric)



# Créer un histogramme pour chaque variable quantitative
for (var in names(decathlon_data)[vars_quantitatives]) {
  print(ggplot(decathlon_data, aes_string(x = var)) +
          geom_histogram(bins = 30, fill = "blue", color = "black") +
          theme_minimal() +
          labs(title = paste("Histogramme de", var), x = var, y = "Fréquence"))
}
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.

# Créer un boxplot pour chaque variable quantitative

for (var in names(decathlon_data)[vars_quantitatives]) {
  print(ggplot(decathlon_data, aes_string(x = factor(1), y = var)) +
          geom_boxplot(fill = "skyblue", color = "darkblue") +
          theme_minimal() +
          labs(title = paste("Boxplot de", var), x = "", y = var))
}

# Fonction pour créer un barplot en proportions
creer_barplot_proportion <- function(data, column_name) {
  # Calculer les proportions
  proportions <- data %>%
    count(.data[[column_name]]) %>%
    mutate(Proportion = n / sum(n))

  # Créer le barplot
  ggplot(proportions, aes_string(x = column_name, y = "Proportion", fill = column_name)) +
    geom_bar(stat = "identity") +
    scale_y_continuous(labels = scales::percent_format()) +
    labs(x = column_name, y = "Proportion (%)") +
    theme_minimal()
}

# Créer un barplot pour la variable "Compétition"
creer_barplot_proportion(decathlon_data, "Compétition")

Etape 2: Analyser les corrélations entre les variables quantitatives

# Installer les packages si nécessaire
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(corrplot)) install.packages("corrplot")
Le chargement a nécessité le package : corrplot
corrplot 0.95 loaded
# Charger les packages
library(ggplot2)
library(corrplot)


donnees_quantitatives <- decathlon_data[, vars_quantitatives]



# Calculer la matrice de corrélation
matrice_correlation <- cor(donnees_quantitatives, use = "complete.obs")


# Créer la heatmap de corrélation avec des coefficients plus visibles
corrplot(matrice_correlation, method = "color", type = "upper", order = "hclust",
         tl.col = "black", tl.srt = 45, 
         addCoef.col = "black", # Couleur des coefficients
         cl.pos = "n", # Position de la légende de couleur
         cl.cex = 1.2, # Taille de la légende de couleur
         addCoefasPercent = TRUE, # Afficher les coefficients en pourcentage
         number.cex = 0.8) # Taille des chiffres des coefficients

Etape 3: Centrer et réduire les données

# Centrer et réduire les données
donnees_centrees_reduites <- scale(donnees_quantitatives,center = TRUE,scale=TRUE)
?scale
démarrage du serveur d'aide httpd ... fini

Etape 4: Réalisation de l’ACP avec Factominer

# Installer les packages si nécessaire
if (!require("FactoMineR")) install.packages("FactoMineR")
Le chargement a nécessité le package : FactoMineR
if (!require("devtools")) install.packages("devtools")
Le chargement a nécessité le package : devtools
Le chargement a nécessité le package : usethis
library("devtools")
install_github("kassambara/factoextra")
WARNING: Rtools is required to build R packages, but is not currently installed.

Please download and install Rtools 4.5 from https://cran.r-project.org/bin/windows/Rtools/.
Skipping install of 'factoextra' from a github remote, the SHA1 (1689fc74) has not changed since last install.
  Use `force = TRUE` to force installation
# Charger les packages
library(FactoMineR)
library("factoextra")
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Réaliser l'ACP
resultat_acp <- PCA(donnees_centrees_reduites, graph = FALSE)

# Afficher les résultats de l'ACP
print(resultat_acp)
**Results for the Principal Component Analysis (PCA)**
The analysis was performed on 41 individuals, described by 12 variables
*The results are available in the following objects:

   name               description                          
1  "$eig"             "eigenvalues"                        
2  "$var"             "results for the variables"          
3  "$var$coord"       "coord. for the variables"           
4  "$var$cor"         "correlations variables - dimensions"
5  "$var$cos2"        "cos2 for the variables"             
6  "$var$contrib"     "contributions of the variables"     
7  "$ind"             "results for the individuals"        
8  "$ind$coord"       "coord. for the individuals"         
9  "$ind$cos2"        "cos2 for the individuals"           
10 "$ind$contrib"     "contributions of the individuals"   
11 "$call"            "summary statistics"                 
12 "$call$centre"     "mean of the variables"              
13 "$call$ecart.type" "standard error of the variables"    
14 "$call$row.w"      "weights for the individuals"        
15 "$call$col.w"      "weights for the variables"          

Choix du nombre d’axe factoriel

valeurspropres <- resultat_acp$eig
valeurspropres
          eigenvalue percentage of variance cumulative percentage of variance
comp 1  4.758790e+00           3.965659e+01                          39.65659
comp 2  1.740146e+00           1.450122e+01                          54.15780
comp 3  1.414902e+00           1.179085e+01                          65.94866
comp 4  1.131778e+00           9.431483e+00                          75.38014
comp 5  8.619423e-01           7.182852e+00                          82.56299
comp 6  6.073189e-01           5.060991e+00                          87.62398
comp 7  5.104506e-01           4.253755e+00                          91.87774
comp 8  4.110845e-01           3.425704e+00                          95.30344
comp 9  2.352087e-01           1.960072e+00                          97.26351
comp 10 1.873636e-01           1.561364e+00                          98.82488
comp 11 1.409606e-01           1.174671e+00                          99.99955
comp 12 5.402403e-05           4.502002e-04                         100.00000
barplot(valeurspropres[, 2], names.arg=1:nrow(valeurspropres), 
       main = "Pourcentage de la variance expliquée par chaque composante",
       xlab = "Composantes principales",
       ylab = "Pourcentage de variance expliquée",
       col ="steelblue")
# Add connected line segments to the plot
lines(x = 1:nrow(valeurspropres), valeurspropres[, 2], 
      type="b", pch=19, col = "red")

#Utilisation du package factoextra
# Créer le graphique des valeurs propres
fviz_eig(resultat_acp, addlabels = TRUE)
Warning in geom_bar(stat = "identity", fill = barfill, color = barcolor, :
Ignoring empty aesthetic: `width`.

Représentation du cercle de corrélation

# Créer le graphique du cercle de corrélation
fviz_pca_var(resultat_acp, 
             col.var = "cos2", # Utiliser la qualité de représentation (cos2) pour la couleur
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), # Palette de couleurs
             repel = TRUE, # Éviter le chevauchement des étiquettes
             title = "Cercle de Corrélation des Variables")
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
ℹ The deprecated feature was likely used in the ggpubr package.
  Please report the issue at <https://github.com/kassambara/ggpubr/issues>.

# Créer le graphique du cercle de corrélation
# Créer le graphique du cercle de corrélation
fviz_pca_var(resultat_acp, 
             col.var = "contrib", # Utiliser la contribution
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), # Palette de couleurs
             repel = TRUE, # Éviter le chevauchement des étiquettes
             title = "Cercle de Corrélation des Variables")

# Coordonnées des individus
head(resultat_acp$ind$coord)
              Dim.1      Dim.2      Dim.3      Dim.4       Dim.5
SEBRLE   1.50509908  0.7038928  0.9418516  1.4300073  0.57877082
CLAY     1.55741711  0.5554568  2.1891163 -0.5335835 -0.78038352
KARPOV   1.59996822  0.4625653  2.0569580 -1.5276391  1.57216651
BERNARD  0.08242073 -0.9779441  0.9724700  2.4695691  0.08487193
YURKOV  -0.03923536  2.0507210 -1.0717485  1.5007847  1.41509091
WARNERS  0.63094174 -1.7190474  0.8258308 -0.3128895  1.15564917
# Cos 2 des individus
head(resultat_acp$ind$cos2)
               Dim.1      Dim.2     Dim.3      Dim.4        Dim.5
SEBRLE  0.2822876661 0.06174116 0.1105418 0.25482276 0.0417421654
CLAY    0.1721144249 0.02189313 0.3400518 0.02020283 0.0432139102
KARPOV  0.1973363095 0.01649417 0.3261633 0.17989779 0.1905378987
BERNARD 0.0007769458 0.10938200 0.1081609 0.69752562 0.0008238458
YURKOV  0.0001547923 0.42287035 0.1154994 0.22648052 0.2013551540
WARNERS 0.0611270308 0.45376449 0.1047218 0.01503269 0.2050722061
#Contribution des individus
head(resultat_acp$ind$contrib)
               Dim.1     Dim.2    Dim.3      Dim.4      Dim.5
SEBRLE  1.1610468554 0.6944540 1.529166  4.4068816 0.94787531
CLAY    1.2431669421 0.4324451 8.260899  0.6135638 1.72327322
KARPOV  1.3120255194 0.2999001 7.293576  5.0291713 6.99415163
BERNARD 0.0034817093 1.3404743 1.630204 13.1430836 0.02038291
YURKOV  0.0007889962 5.8944540 1.980047  4.8539096 5.66639235
WARNERS 0.2040319080 4.1419623 1.175633  0.2109778 3.77911393
# Contributions of variables to PC1"
fviz_contrib(resultat_acp, choice = "var", axes = 1, top = 3)

# Contributions of variables to PC2
fviz_contrib(resultat_acp, choice = "var", axes = 2, top = 10)

# Cosinus carré des variables sur la première composante principale (PC1)
fviz_cos2(resultat_acp, choice = "var", axes = 1, top = 10) +
  ggtitle("Qualité de la représentation des variables sur la PC1 (cos²)")

# Cosinus carré des variables sur la deuxième composante principale (PC2)
fviz_cos2(resultat_acp, choice = "var", axes = 2, top = 10) +
  ggtitle("Qualité de la représentation des variables sur la PC2 (cos²)")

fviz_pca_ind(resultat_acp,  col.ind="cos2") +
scale_color_gradient2(low="blue", mid="white", 
                      high="red", midpoint=0.50)+
  theme_minimal()

# Filtrer les individus avec cos² > 50%
ind_cos2 <- apply(resultat_acp$ind$cos2, 1, max) > 0.5

# Filtrer les variables avec cos² > 50%
var_cos2 <- apply(resultat_acp$var$cos2, 1, max) > 0.5

# Créer un graphique combiné des individus et des variables
fviz_pca_biplot(resultat_acp,
                select.ind = list(cos2 = 0.5), # Sélectionner les individus avec cos² > 50%
                select.var = list(cos2 = 0.5), # Sélectionner les variables avec cos² > 50%
                repel = TRUE, # Éviter le chevauchement des étiquettes
                title = "Biplot des Individus et des Variables (cos² > 50%)",
                col.ind = "blue", # Couleur des individus
                col.var = "red" # Couleur des variables
                )

Ajout des variables supplémentaires

resultat_acp <- PCA(decathlon_data, 
                    quanti.sup = 10,
                    quali.sup = 13, # Numéro de colonne de la variable qualitative
                    graph = TRUE)
Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
increasing max.overlaps

fviz_pca_ind(resultat_acp, habillage = 13,
  addEllipses =TRUE, ellipse.level = 0.68) +
  scale_color_brewer(palette="Dark2") +
  theme_minimal()

# Création du graphique
fviz_pca_ind(resultat_acp, habillage = 13, # Utiliser la 13ème colonne pour le coloriage
             addEllipses = TRUE, ellipse.level = 0.68) +
  scale_color_brewer(palette = "Dark2") + # Palette de couleurs
  theme_minimal() + # Thème minimaliste
  ggtitle("ACP avec R") # Ajouter un titre (assurez-vous que le titre n'est pas NA/NaN)

resultat_acp$quanti.sup
$coord
                  Dim.1    Dim.2     Dim.3     Dim.4     Dim.5
Course1500m -0.08101474 0.124414 0.1151478 0.2692549 0.4492733

$cor
                  Dim.1    Dim.2     Dim.3     Dim.4     Dim.5
Course1500m -0.08101474 0.124414 0.1151478 0.2692549 0.4492733

$cos2
                  Dim.1      Dim.2      Dim.3      Dim.4     Dim.5
Course1500m 0.006563388 0.01547885 0.01325902 0.07249818 0.2018465
res.desc <- dimdesc(resultat_acp, axes = c(4,5), proba = 0.05)
# Description of dimension 1
res.desc
$Dim.4

Link between the variable and the continuous variables (R-square)
=================================================================================
                correlation      p.value
Course100m        0.3606946 2.051769e-02
Classement       -0.3182313 4.258959e-02
LancerDeJavelot  -0.6541163 3.515093e-06

Link between the variable and the categorical variable (1-way anova)
=============================================
                   R2      p.value
Compétition 0.2820765 0.0003533077

Link between variable and the categories of the categorical variables
================================================================
                       Estimate      p.value
Compétition=Decastar  0.5408982 0.0003533077
Compétition=OlympicG -0.5408982 0.0003533077

$Dim.5

Link between the variable and the continuous variables (R-square)
=================================================================================
               correlation     p.value
Course1500m      0.4492733 0.003212199
LancerDeDisque   0.3210000 0.040722336
Course100m      -0.3163774 0.043878419
SautEnHauteur   -0.4464054 0.003438064

Link between the variable and the categorical variable (1-way anova)
=============================================
                   R2     p.value
Compétition 0.1708189 0.007234681

Link between variable and the categories of the categorical variables
================================================================
                       Estimate     p.value
Compétition=OlympicG  0.3870537 0.007234681
Compétition=Decastar -0.3870537 0.007234681

Quiz

  1. Quelle action réaliser en premier parmi les 3 actions suivantes pour mettre en place une ACP?

    • A) Normaliser les données pour avoir une moyenne de zéro et une variance de un.

    • B) Calculer la matrice de covariance des données.

    • C) Sélectionner les composantes principales qui expliquent le plus de variance.

  2. Comment l’introduction de variables supplémentaires est-elle gérée dans l’ACP ?

    • A) Les variables supplémentaires sont intégrées dans le calcul des composantes principales pour modifier la structure de variance.

    • B) Les variables supplémentaires sont utilisées pour interpréter les composantes principales mais ne sont pas intégrées dans le calcul des axes principaux.

    • C) Les variables supplémentaires remplacent les variables initiales si elles expliquent une plus grande part de la variance.