Introduction à l’ACP

Lorsque les données sont constituées de \(n\) individus décrits par \(d >3\) variables il devient impossible d’effectuer une représentation graphique, comme cela peut être le cas pour \(d=2\) et \(d=3\). L’ACP est une méthode exploratoire (i.e., descriptive) qui permet de décrire un jeu de données multivarié, de le résumer, d’en réduire la dimensionnalité.

Une ACP consiste donc en la transformation des \(d\) variables originelles, fortement liées entre elles, en nouvelles variables décorrélées les unes des autres par construction. Ces nouvelles variables sont nommées composantes principales, ou plus simplement axes.

\[C_j = \alpha_{j,1} X_1 + \alpha_{j,2} X_p + \ldots + \alpha_{j,p}X_p \quad j=1,\ldots,p\]

Le nuage de points construit à partir des premières composantes contient généralement une information relativement fidèle du nuage de points originel à \(d\) dimensions.

Si nous avons plusieurs variables qualitatives nous pouvons réaliser une ACM (Analyse des Correspondances Multiples).

Pour plus de details voir la site : http://factominer.free.fr/classical-methods/index_fr.html

Les données

Nous traitons le jeu de données décathlon du package . Ces données contient les performances réalisées par 41 athlètes lors de deux compétitions (Jeux Olympiques de 2004 ou Décastar 2004). Nous disposons de 13 variables : 12 de type quantitatives continues et une de type qualitative. Plus précisement :

Source : http://factominer.free.fr/classical-methods/analyse-en-composantes-principales.html

library(FactoMineR)
data(decathlon)
colnames(decathlon)
##  [1] "100m"        "Long.jump"   "Shot.put"    "High.jump"   "400m"       
##  [6] "110m.hurdle" "Discus"      "Pole.vault"  "Javeline"    "1500m"      
## [11] "Rank"        "Points"      "Competition"
glimpse(decathlon)
## Observations: 41
## Variables: 13
## $ `100m`        <dbl> 11.04, 10.76, 11.02, 11.02, 11.34, 11.11, 11.13,...
## $ Long.jump     <dbl> 7.58, 7.40, 7.30, 7.23, 7.09, 7.60, 7.30, 7.31, ...
## $ Shot.put      <dbl> 14.83, 14.26, 14.77, 14.25, 15.19, 14.31, 13.48,...
## $ High.jump     <dbl> 2.07, 1.86, 2.04, 1.92, 2.10, 1.98, 2.01, 2.13, ...
## $ `400m`        <dbl> 49.81, 49.37, 48.37, 48.93, 50.42, 48.68, 48.62,...
## $ `110m.hurdle` <dbl> 14.69, 14.05, 14.09, 14.99, 15.31, 14.23, 14.17,...
## $ Discus        <dbl> 43.75, 50.72, 48.95, 40.87, 46.26, 41.10, 45.67,...
## $ Pole.vault    <dbl> 5.02, 4.92, 4.92, 5.32, 4.72, 4.92, 4.42, 4.42, ...
## $ Javeline      <dbl> 63.19, 60.15, 50.31, 62.77, 63.44, 51.77, 55.37,...
## $ `1500m`       <dbl> 291.70, 301.50, 300.20, 280.10, 276.40, 278.10, ...
## $ Rank          <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2,...
## $ Points        <int> 8217, 8122, 8099, 8067, 8036, 8030, 8004, 7995, ...
## $ Competition   <fctr> Decastar, Decastar, Decastar, Decastar, Decasta...

Nous povons éventuellement calculer la matrice de corrélation des variables initiales

cor(decathlon[,1:12])
##                    100m   Long.jump    Shot.put   High.jump         400m
## 100m         1.00000000 -0.59867767 -0.35648227 -0.24625292  0.520298155
## Long.jump   -0.59867767  1.00000000  0.18330436  0.29464444 -0.602062618
## Shot.put    -0.35648227  0.18330436  1.00000000  0.48921153 -0.138432919
## High.jump   -0.24625292  0.29464444  0.48921153  1.00000000 -0.187956928
## 400m         0.52029815 -0.60206262 -0.13843292 -0.18795693  1.000000000
## 110m.hurdle  0.57988893 -0.50541009 -0.25161571 -0.28328909  0.547987756
## Discus      -0.22170757  0.19431009  0.61576810  0.36921834 -0.117879365
## Pole.vault  -0.08253683  0.20401411  0.06118185 -0.15618074 -0.079292469
## Javeline    -0.15774645  0.11975893  0.37495551  0.17188009  0.004232096
## 1500m       -0.06054645 -0.03368613  0.11580306 -0.04490252  0.408106432
## Rank         0.29670366 -0.60405452 -0.36996958 -0.49276873  0.562118543
## Points      -0.68427243  0.72513490  0.62738936  0.57670316 -0.666939955
##              110m.hurdle     Discus   Pole.vault     Javeline       1500m
## 100m         0.579888931 -0.2217076 -0.082536834 -0.157746452 -0.06054645
## Long.jump   -0.505410086  0.1943101  0.204014112  0.119758933 -0.03368613
## Shot.put    -0.251615714  0.6157681  0.061181853  0.374955509  0.11580306
## High.jump   -0.283289090  0.3692183 -0.156180742  0.171880092 -0.04490252
## 400m         0.547987756 -0.1178794 -0.079292469  0.004232096  0.40810643
## 110m.hurdle  1.000000000 -0.3262010 -0.002703885  0.008743251  0.03754024
## Discus      -0.326200961  1.0000000 -0.150072400  0.157889799  0.25817510
## Pole.vault  -0.002703885 -0.1500724  1.000000000 -0.030000603  0.24744778
## Javeline     0.008743251  0.1578898 -0.030000603  1.000000000 -0.18039313
## 1500m        0.037540240  0.2581751  0.247447780 -0.180393128  1.00000000
## Rank         0.439102281 -0.3891251 -0.320379567 -0.208094646  0.08989781
## Points      -0.644460200  0.4841830  0.197436342  0.422393176 -0.19434860
##                    Rank     Points
## 100m         0.29670366 -0.6842724
## Long.jump   -0.60405452  0.7251349
## Shot.put    -0.36996958  0.6273894
## High.jump   -0.49276873  0.5767032
## 400m         0.56211854 -0.6669400
## 110m.hurdle  0.43910228 -0.6444602
## Discus      -0.38912515  0.4841830
## Pole.vault  -0.32037957  0.1974363
## Javeline    -0.20809465  0.4223932
## 1500m        0.08989781 -0.1943486
## Rank         1.00000000 -0.7391835
## Points      -0.73918347  1.0000000

Identifier rapidement quelques paires de variables fortement corrélées, et quelques paires de variables quasiment décorrélées.

l’ACP

Nous pouvons directament faire l’ACP à l’aide de la focntion PCA. Les arguments de cette fonction sont les suivans :

Réaliser l’ACP sur tous les individus avec les dix premières variables actives.

res.pca=PCA(decathlon[,1:10], scale.unit=TRUE, ncp=2, graph=F)
res.pca
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 41 individuals, described by 10 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"

Nous allons analyser le nuage des variables. Sur le cercle des corrélations (1,2), les principes de lecture sont les suivants :

Quelles sont les variables qui semblent bien représentées? Quelles sont les variables moins bien représentées? Y a-t-il des similarités entre les individus pour toutes les variables ?

Nous allons analyser le nuage des individus. Regarder le nuage des individus. Des groupes semblent-ils se former ? Peut-on établir des profils d’athlètes ?

A l’issue de cette première approche, on peut diviser le premier plan factoriel en quatre parties : les athlètes rapides et puissants (comme Sebrle), les athlètes lents (comme Casarsa), les athlètes rapides mais faibles (comme Warners) et les ahtlètes ni forts ni rapides, relativement parlant (comme Lorenzo).

  1. Afficher les valeurs propres qui permermettent de donner les contributions des axes factoriels. Egalement, affichos les variances en porcentage et les varances cumulées
round(res.pca$eig,2)
##         eigenvalue percentage of variance
## comp 1        3.27                  32.72
## comp 2        1.74                  17.37
## comp 3        1.40                  14.05
## comp 4        1.06                  10.57
## comp 5        0.68                   6.85
## comp 6        0.60                   5.99
## comp 7        0.45                   4.51
## comp 8        0.40                   3.97
## comp 9        0.21                   2.15
## comp 10       0.18                   1.82
##         cumulative percentage of variance
## comp 1                              32.72
## comp 2                              50.09
## comp 3                              64.14
## comp 4                              74.71
## comp 5                              81.56
## comp 6                              87.55
## comp 7                              92.06
## comp 8                              96.03
## comp 9                              98.18
## comp 10                            100.00

Les deux premières axes traduisent \(50.09\) % de l’inertie totale.

inertie=res.pca$eig[,2]
barplot(inertie,ylab="% d'inertie",names.arg=round(inertie,2))
title("valeurs propres (inerties ou variances de chaque composante) en %")

  1. Visualiser les coordonnées des individus dans le plan factoriel
res.pca$ind$coord[,1:2]
##                    Dim.1       Dim.2
## SEBRLE       0.791627717  0.77161120
## CLAY         1.234990563  0.57457807
## KARPOV       1.358214936  0.48402090
## BERNARD     -0.609515083 -0.87462853
## YURKOV      -0.585968338  2.13095422
## WARNERS      0.356889530 -1.68495667
## ZSIVOCZKY    0.271774781 -1.09377558
## McMULLEN     0.587516189  0.23072991
## MARTINEAU   -1.995359298  0.56099598
## HERNU       -1.546076462  0.48838301
## BARRAS      -1.341652727 -0.31091157
## NOOL        -2.344973806 -1.96637500
## BOURGUIGNON -3.979041865  0.19986019
## Sebrle       4.038448501  1.36582606
## Clay         3.919365157  0.83696136
## Karpov       4.619987275  0.03999523
## Macey        2.233460566  1.04176620
## Warners      2.168396445 -1.80320025
## Zsivoczky    0.925132183  1.16865180
## Hernu        0.889037852 -0.61842522
## Nool         0.295305667 -1.54561667
## Bernard      1.906334368 -0.08580429
## Schwarzl     0.081078659 -1.35345710
## Pogorelov    0.539677028  0.77075099
## Schoenbeck   0.114430985 -0.03985061
## Barras       0.002145203  0.36033768
## Smith        0.870310570  1.05932552
## Averyanov    0.349155138 -1.55864999
## Ojaniemi     0.380113999 -0.77244734
## Smirnov     -0.484514213 -1.06066118
## Qi          -0.434466691 -0.32614690
## Drews       -0.248684024 -3.08167683
## Parkhomenko -1.069429104  2.09318218
## Terek       -0.681953059  0.53561440
## Gomez       -0.289889208 -1.19671611
## Turi        -1.541813056  0.42716773
## Lorenzo     -2.408509980 -1.58292969
## Karlivans   -1.994368727 -0.29418240
## Korkizoglou -0.957829813  2.06638554
## Uldal       -2.562259591  0.24546871
## Casarsa     -2.857088268  3.79784505
  1. Tracer les grafiques de la fonction PCA. Que peut-on en conclure ?
res.pca=PCA(decathlon[,1:10], scale.unit=TRUE, ncp=2, graph=T)

res.pca=PCA(decathlon, quanti.sup=11:12, quali.sup=13)

graph.var (res.pca, draw=c("var","Points"), label=c("Long.jump","Points"), lim.cos2.var=0.5, new.plot=TRUE)

Maintenant n’afficher, sur le cercle de corrélation, que les variables dont la qualité de représentation est supérieure à un seuil donné compris entre 0 et 1 (avec l’option cos2 du plot). La figure ci-dessous montre un graphe d’ACP obtenu en coloriant les individus en fonction d’une variable qualitative à 2 modalités (athlètes participant à un décathlon lors d’un Decastar ou lors de Jeux Olympiques). Seuls les individus ayant une bonne qualité de représentation dans le plan (cosinus carré sup érieur à 0.6) sont coloriés, les autres individus sont positionnés mais dessinés avec une certaine transparence.

plot(res.pca,habillage="Competition",select="cos2 0.6")

concat.data <- cbind.data.frame(decathlon[,13],res.pca$ind$coord)
ellipse.coord <- coord.ellipse(concat.data,bary=TRUE)
plot.PCA(res.pca,habillage=13,ellipse=ellipse.coord,cex=0.8)

#decathlon: le tableau de données utilisé #scale.unit: pour choisir de réduire ou non les variables #ncp: le nombre de dimensions à garder dans les résultats #quanti.sup: vecteur des index des variables continues illustratives #graph: pour choisir de faire apparaître les graphiques ou non

L’Analyse Factorielle Multiple (AFM)

L’Analyse Factorielle Multiple est dédiée aux tableaux de données où les variables sont structurées en groupes. Plusieurs jeux de variables (continues ou qualitatives) sont ainsi étudiées simultanément

Les données

On dispose d’un échantillon de 21 vins rouges de la Vallée de Loire provenant de 3 régions différentes.

On veut caractériser les vins. On cherche une typologie des vins. La méthode appropriée pour caractériser les vins par des variables continues est l’ACP. Cependant, le tableau de données est structuré en différents groupes de variables :

Nous disposons dont 31 variables.

De nouveaux objectifs apparaissent comme comparer les groupes de variables (deux groupes de variables sont proches si deux vins proches l’un de l’autre du point de vue du premier groupe de variables le sont aussi du point de vue du deuxième) et mettre en évidence une typologie des groupes ou comparer de façon simultanée les typologies des vins vus par chaque groupe de variables pris un par un.

Source : http://factominer.free.fr/advanced-methods/analyse-factorielle-multiple.html

data(wine)
colnames(wine)
##  [1] "Label"                         "Soil"                         
##  [3] "Odor.Intensity.before.shaking" "Aroma.quality.before.shaking" 
##  [5] "Fruity.before.shaking"         "Flower.before.shaking"        
##  [7] "Spice.before.shaking"          "Visual.intensity"             
##  [9] "Nuance"                        "Surface.feeling"              
## [11] "Odor.Intensity"                "Quality.of.odour"             
## [13] "Fruity"                        "Flower"                       
## [15] "Spice"                         "Plante"                       
## [17] "Phenolic"                      "Aroma.intensity"              
## [19] "Aroma.persistency"             "Aroma.quality"                
## [21] "Attack.intensity"              "Acidity"                      
## [23] "Astringency"                   "Alcohol"                      
## [25] "Balance"                       "Smooth"                       
## [27] "Bitterness"                    "Intensity"                    
## [29] "Harmony"                       "Overall.quality"              
## [31] "Typical"
glimpse(wine)
## Observations: 21
## Variables: 31
## $ Label                         <fctr> Saumur, Saumur, Bourgueuil, Chi...
## $ Soil                          <fctr> Env1, Env1, Env1, Env2, Referen...
## $ Odor.Intensity.before.shaking <dbl> 3.074, 2.964, 2.857, 2.808, 3.60...
## $ Aroma.quality.before.shaking  <dbl> 3.000, 2.821, 2.929, 2.593, 3.42...
## $ Fruity.before.shaking         <dbl> 2.714, 2.375, 2.560, 2.417, 3.15...
## $ Flower.before.shaking         <dbl> 2.280, 2.280, 1.960, 1.913, 2.15...
## $ Spice.before.shaking          <dbl> 1.960, 1.680, 2.077, 2.160, 2.04...
## $ Visual.intensity              <dbl> 4.321, 3.222, 3.536, 2.893, 4.39...
## $ Nuance                        <dbl> 4.000, 3.000, 3.393, 2.786, 4.03...
## $ Surface.feeling               <dbl> 3.269, 2.808, 3.000, 2.538, 3.38...
## $ Odor.Intensity                <dbl> 3.407, 3.370, 3.250, 3.160, 3.53...
## $ Quality.of.odour              <dbl> 3.308, 3.000, 2.929, 2.880, 3.36...
## $ Fruity                        <dbl> 2.885, 2.560, 2.769, 2.391, 3.16...
## $ Flower                        <dbl> 2.320, 2.440, 2.192, 2.083, 2.23...
## $ Spice                         <dbl> 1.840, 1.739, 2.250, 2.167, 2.14...
## $ Plante                        <dbl> 2.000, 2.000, 1.750, 2.304, 1.76...
## $ Phenolic                      <dbl> 1.650, 1.381, 1.250, 1.476, 1.60...
## $ Aroma.intensity               <dbl> 3.259, 2.962, 3.077, 2.542, 3.61...
## $ Aroma.persistency             <dbl> 2.963, 2.808, 2.800, 2.583, 3.29...
## $ Aroma.quality                 <dbl> 3.200, 2.926, 3.077, 2.478, 3.46...
## $ Attack.intensity              <dbl> 2.963, 3.036, 3.222, 2.704, 3.46...
## $ Acidity                       <dbl> 2.107, 2.107, 2.179, 3.179, 2.57...
## $ Astringency                   <dbl> 2.429, 2.179, 2.250, 2.185, 2.53...
## $ Alcohol                       <dbl> 2.500, 2.654, 2.643, 2.500, 2.78...
## $ Balance                       <dbl> 3.250, 2.926, 3.321, 2.333, 3.46...
## $ Smooth                        <dbl> 2.731, 2.500, 2.679, 1.680, 3.03...
## $ Bitterness                    <dbl> 1.926, 1.926, 2.000, 1.963, 2.07...
## $ Intensity                     <dbl> 2.857, 2.893, 3.074, 2.462, 3.64...
## $ Harmony                       <dbl> 3.143, 2.964, 3.143, 2.038, 3.64...
## $ Overall.quality               <dbl> 3.393, 3.214, 3.536, 2.464, 3.74...
## $ Typical                       <dbl> 3.250, 3.036, 3.179, 2.250, 3.44...

L’objectif est :

Nous allons étudier les profils de vins selon l’évaluation sensorielle. On utilisera comme groupes actifs les groupes odor, visual, odor after shaking et taste et comme groupes illustratifs les groupes origin et overall.

res.mfa = MFA(wine, group=c(2,5,3,10,9,2), type=c("n",rep("s",5)), ncp=5, name.group=c("origin","odor","visual","odor.after.shaking", "taste","overall"), num.group.sup=c(1,6))

Ces premiers résultats s’interprètent de la même façon que ceux d’une ACP.

La représentation des variables montre que la plupart des variables sont fortement corrélées à la première dimensions, quel que soit le groupe auquel elles appartiennent. Cette dimension représente “intensité” et “harmonie”, des notions positives communément utilisées en parlant de vins. Les variables les plus corrélées à la deuxième dimension sont Spice before shaking et Odor intensity before shaking du groupe odor, Spice, Plant et Odor intensity du groupe odor after shaking et Bitterness du groupe taste. Cette dimension représente une caractéristique épicée, végétale, essentiellement due à l’olfaction.

Les coordonnées des individus et modalités peuvent être liées à cette interprétation des deux premières composantes principales via l’observation du deuxième graphique. Le vin 1DAM a été évalué comme le plus “intense” et “harmonieux” contrairement aux vins 1VAU et 2ING qui sont les moins “intenses”et “harmonieux”. Le deuxième axe est essentiellement dû aux vins T1 et T2. Ces deux vins étant en fait le même évalué deux fois par les juges, la deuxième dimension sera désignée comme le “cas particulier du vin T”. La plupart des modalités sont proches de l’origine du plan factoriel, ce qui signifie que ces modalités ne sont pas reliées à l’“intensité”, l’“harmonie” ou au “vin T”. La modalité Env4 possède des coordonnées élevées sur le deuxième axe mais uniquement en lien avec T1 et T2. La modalité Reference, a priori en relation avec un sol réputé pour la qualité des vins qu’il produit, possède des coordonnées élevées sur le premier axe et est donc positivement corrélée aux notions “intensit” et “harmonie”, ce qui confirme l’a priori.

Le graphique des individus partiels représente chaque vin vu par chaque groupe et son barycentre. Par défaut, les deux vins avec le plus petite inertie intra-groupe et les deux vins avec la plus grande intertie intra-groupe sont représentés. Pour représenter tous les points partiels, utilisez la ligne de code suivante :

plot(res.mfa,choix="ind",partial="all")

1DAM a été évalué comme particulièrement “intense” et “harmonieux”, notamment par le groupe odor : ses coordonnées sur le premier axe sont plus extrêmes du point de vue de ce groupe que de celui des autres. Du point de vue du groupe odor, 2ING était plus “intense” et “harmonieux” que 1VAU mais du point de vue du groupe taste, 1VAU était plus “intense” et “harmonieux” que 2ING.

Tous les groupes ont à peu près la même vision des modalités sauf pour la modalité Env4, ce qui reprend l’interprétation de la représentation des individus.

Ce graphique montre la qualité de représentation de chaque groupe. Les quatre groupes actifs ont des coordonnées rapprochées sur la première dimension ce qui signifie que leur contribution à la première composante principale est à peu près la même. Cela signifie également que la première composante principale de l’AFM est commune à tous les groupes. Quant à la deuxième dimension, ce sont les groupes d’olfaction qui y ont les coordonnées les plus élevées. Ces deux groupes contribuent le plus à la deuxième composante principale.

Ce graphe est fourni pour l’étude du lien entre les composantes principales de l’AFM et celles de chacun des groupes. A l’exception du groupe origin, la première dimension de chaque groupe est hautement corrélée à celle de l’AFM. La deuxième dimension de l’AFM est essentiellement corrélée à la deuxième dimension des groupes d’olfaction.