In [1]:
library(FactoMineR)
data(decathlon)
# Rang, Points : variables quantitatives supplémentaires
# Compétition : variable qualitative supplémentaire.
res_pca <- PCA(decathlon, quanti.sup=c(11,12), quali.sup=13)

Exercice 2 - interprétation

1) Quelle est la part d'inertie associée aux deux premiers axes factoriels ?

In [2]:
res_pca$eig[2,3]
50.0903656109007
In [3]:
# Ou, au début de l'affichage de
summary(res_pca)
# "Cumulative % of var." Dim.2
Call:
PCA(X = decathlon, quanti.sup = c(11, 12), quali.sup = 13) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
Variance               3.272   1.737   1.405   1.057   0.685   0.599   0.451
% of var.             32.719  17.371  14.049  10.569   6.848   5.993   4.512
Cumulative % of var.  32.719  50.090  64.140  74.708  81.556  87.548  92.061
                       Dim.8   Dim.9  Dim.10
Variance               0.397   0.215   0.182
% of var.              3.969   2.148   1.822
Cumulative % of var.  96.030  98.178 100.000

Individuals (the 10 first)
                Dist    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3
SEBRLE      |  2.369 |  0.792  0.467  0.112 |  0.772  0.836  0.106 |  0.827
CLAY        |  3.507 |  1.235  1.137  0.124 |  0.575  0.464  0.027 |  2.141
KARPOV      |  3.396 |  1.358  1.375  0.160 |  0.484  0.329  0.020 |  1.956
BERNARD     |  2.763 | -0.610  0.277  0.049 | -0.875  1.074  0.100 |  0.890
YURKOV      |  3.018 | -0.586  0.256  0.038 |  2.131  6.376  0.499 | -1.225
WARNERS     |  2.428 |  0.357  0.095  0.022 | -1.685  3.986  0.482 |  0.767
ZSIVOCZKY   |  2.563 |  0.272  0.055  0.011 | -1.094  1.680  0.182 | -1.283
McMULLEN    |  2.561 |  0.588  0.257  0.053 |  0.231  0.075  0.008 | -0.418
MARTINEAU   |  3.742 | -1.995  2.968  0.284 |  0.561  0.442  0.022 | -0.730
HERNU       |  2.794 | -1.546  1.782  0.306 |  0.488  0.335  0.031 |  0.841
               ctr   cos2  
SEBRLE       1.187  0.122 |
CLAY         7.960  0.373 |
KARPOV       6.644  0.332 |
BERNARD      1.375  0.104 |
YURKOV       2.606  0.165 |
WARNERS      1.020  0.100 |
ZSIVOCZKY    2.857  0.250 |
McMULLEN     0.303  0.027 |
MARTINEAU    0.925  0.038 |
HERNU        1.227  0.091 |

Variables
               Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr
100m        | -0.775 18.344  0.600 |  0.187  2.016  0.035 | -0.184  2.420
Long.jump   |  0.742 16.822  0.550 | -0.345  6.869  0.119 |  0.182  2.363
Shot.put    |  0.623 11.844  0.388 |  0.598 20.607  0.358 | -0.023  0.039
High.jump   |  0.572  9.998  0.327 |  0.350  7.064  0.123 | -0.260  4.794
400m        | -0.680 14.116  0.462 |  0.569 18.666  0.324 |  0.131  1.230
110m.hurdle | -0.746 17.020  0.557 |  0.229  3.013  0.052 | -0.093  0.611
Discus      |  0.552  9.328  0.305 |  0.606 21.162  0.368 |  0.043  0.131
Pole.vault  |  0.050  0.077  0.003 | -0.180  1.873  0.033 |  0.692 34.061
Javeline    |  0.277  2.347  0.077 |  0.317  5.784  0.100 | -0.390 10.807
1500m       | -0.058  0.103  0.003 |  0.474 12.946  0.225 |  0.782 43.543
              cos2  
100m         0.034 |
Long.jump    0.033 |
Shot.put     0.001 |
High.jump    0.067 |
400m         0.017 |
110m.hurdle  0.009 |
Discus       0.002 |
Pole.vault   0.479 |
Javeline     0.152 |
1500m        0.612 |

Supplementary continuous variables
               Dim.1   cos2    Dim.2   cos2    Dim.3   cos2  
Rank        | -0.671  0.450 |  0.051  0.003 | -0.058  0.003 |
Points      |  0.956  0.914 | -0.017  0.000 | -0.066  0.004 |

Supplementary categories
                Dist    Dim.1   cos2 v.test    Dim.2   cos2 v.test    Dim.3
Decastar    |  0.946 | -0.600  0.403 -1.430 | -0.038  0.002 -0.123 |  0.289
OlympicG    |  0.439 |  0.279  0.403  1.430 |  0.017  0.002  0.123 | -0.134
              cos2 v.test  
Decastar     0.093  1.050 |
OlympicG     0.093 -1.050 |

2) Étudier le graphique des individus. Dans le plan des deux premières composantes principales axes=c(1,2), que pouvez vous dire de

In [4]:
# Affichage des individus sur les 2 premiers axes, ainsi que leur qualité de représentation.
plot(res_pca, choix="ind", habillage="cos2")
# NOTE : les individus "proches du centre" sont mals voire très mal projetés,
# on ne peut donc pas conclure qu'ils sont proches du centre de gravité.
In [5]:
# Bourguignon et Karpov ?

# Bien représentés et très éloignés le long de l'axe 1 => individus très différents.
decathlon[rownames(decathlon) %in% c("BOURGUIGNON","Karpov"),]
# En effet hormis au saut à la perche, Karpov est nettement meilleur.
A data.frame: 2 × 13
100mLong.jumpShot.putHigh.jump400m110m.hurdleDiscusPole.vaultJaveline1500mRankPointsCompetition
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><int><int><fct>
BOURGUIGNON11.366.8013.461.8651.1615.6740.495.0254.68291.70137313Decastar
Karpov10.507.8115.932.0946.8113.9751.654.6055.54278.11 38725OlympicG
In [6]:
# Barras et Qi ?

# Qi étant très mal projeté, mais Barras plutôt bien,
# on en déduit que ces deux individus sont éloignés le long d'un autre axe.
decathlon[rownames(decathlon) %in% c("Barras","Qi"),]
# Ce n'est pas flagrant numériquement : l'axe en question capte sans doute un faible pourcentage d'inertie.
A data.frame: 2 × 13
100mLong.jumpShot.putHigh.jump400m110m.hurdleDiscusPole.vaultJaveline1500mRankPointsCompetition
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><int><int><fct>
Barras11.146.9914.911.9449.4114.3744.834.664.55267.09138067OlympicG
Qi11.067.3413.551.9749.6514.7845.134.560.79272.63187934OlympicG
In [7]:
# Casarsa ?

# Individu atypique différent de tous les autres.
rbind(
  decathlon[rownames(decathlon) == "Casarsa",1:10],
  "moyenne"=colMeans(decathlon[,1:10])
)
# On constate en effet des performances loin de la moyenne en longueur, 400m, 110H, disque et 1500m
A data.frame: 2 × 10
100mLong.jumpShot.putHigh.jump400m110m.hurdleDiscusPole.vaultJaveline1500m
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Casarsa11.360006.6814.920001.94000053.2000015.3900048.660004.40000058.62000296.1200
moyenne10.998057.2614.477071.97682949.6163414.6058544.325614.76243958.31659279.0249
In [8]:
# Serble et Clay ?

# Relativement mal projetés, donc on ne peut rien dire : peut-être proches, peut-être très différents.
decathlon[rownames(decathlon) %in% c("SEBRLE","Clay"),]
# Performances plutôt différentes en lancer de disque et javelot.
A data.frame: 2 × 13
100mLong.jumpShot.putHigh.jump400m110m.hurdleDiscusPole.vaultJaveline1500mRankPointsCompetition
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><int><int><fct>
SEBRLE11.047.5814.832.0749.8114.6943.755.0263.19291.718217Decastar
Clay10.447.9615.232.0649.1914.1350.114.9069.71282.028820OlympicG

3) Comment interpréter ces deux premières composantes principales axes=c(1,2).

In [9]:
# D'après la comparaison Karpov vs. BOURGUIGNON, le premier axe représenterait la performance globale :
# de plus en plus performant de gauche à droite.

# Concernant le second axe, comparons deux individus extrêmes aux performances comparables :
decathlon[rownames(decathlon) %in% c("Casarsa","NOOL"),]
# Différences notables au niveau du saut en longueur, lancers de poids et disque, 400m et 1500m :
# NOOL est moins bon en lancers, mais court plus vite et saute plus loin.
# L'axe 2 serait donc positivement corrélé à la performance aux lancers,
# et négativement corrélé à la perf. en sauts et courses.
A data.frame: 2 × 13
100mLong.jumpShot.putHigh.jump400m110m.hurdleDiscusPole.vaultJaveline1500mRankPointsCompetition
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><int><int><fct>
NOOL11.337.2712.681.9849.215.2937.924.6257.44266.60127651Decastar
Casarsa11.366.6814.921.9453.215.3948.664.4058.62296.12287404OlympicG
In [10]:
# Vérification : coefficients de la seconde variable =
cbind(names(decathlon)[1:10], res_pca$svd$V[,2])
# L'interprétation ci-dessus n'est donc pas tout à fait vraie (cf. 400m en particulier).
A matrix: 10 × 2 of type chr
100m 0.141989085307934
Long.jump -0.262079359255704
Shot.put 0.453946973594398
High.jump 0.265776099920727
400m 0.432045998092903
110m.hurdle0.173590958188873
Discus 0.460024404730282
Pole.vault -0.136841051072668
Javeline 0.240507147012548
1500m 0.359804863471422

4) Étudier le graphique des variables. Savez vous justifier pourquoi le cercle est centré sur l’origine 0 et de rayon 1 ?

In [11]:
plot(res_pca, choix="var")

Première dimension = points (logiquement inversement corrélé au rang), d'après le cercle des corrélations. Le cercle est centré sur l'origine et de rayon 1 car on observe des corrélations dans l'intervalle [-1,1]. Concernant l'axe 2, on note une légère corrélation positive avec le temps réalisé au 1500m (donc corrélation négative avec la performance) : plus un athlète progresse sur cet axe, plus il court le 1500m lentement. La corrélation valant à peine 0.5, ce n'est toutefois qu'une tendance, pas une règle.

5) Que peut-on dire sur les scores des épreuves du 110m haie et les épreuves du 100m.

Les flèches correspondantes sur le cercle des corrélations forment un angle très faible, et touchent presque le bord : on en déduit que ces variables sont très corrélées. C'est assez logique.

6) Quid de ces scores par rapport au saut en longueur ?

Ces scores semblent négativement corrélés avec la variables saut en longueur : plus un athlète court vite, moins il a tendance à sauter loin.

7) Que peut-on dire sur les scores de l'épreuve du javelot ou du saut à la perche ?

Ces deux variables étant très mal projetées, on ne peut pas en dire grand chose dans ce plan factoriel.

8) Qu'est ce que le 3ème axe factoriel semble représenter ?

In [12]:
plot(res_pca, axes=c(1,3), choix="var")
# Nette corrélation positive avec le temps au 1500m, et la hauteur de saut à la perche.
# Les athlètes ayant une grande coordonnée sur l'axe 3 auraient tendance à être lent au 1500m
# mais performants au saut à la perche.
In [13]:
# Vérification : coefficients de la troisième variable =
cbind(names(decathlon)[1:10], res_pca$svd$V[,3])
# L'interprétation ci-dessus est donc vérifiée, et complétée par une
# légère corrélation négative avec la performance au javelot (-0.32).
A matrix: 10 × 2 of type chr
100m -0.155579526698449
Long.jump 0.15372674487613
Shot.put -0.0197237820067168
High.jump -0.218943491873027
400m 0.110917579244567
110m.hurdle-0.0781557577546053
Discus 0.0362377033063219
Pole.vault 0.583617171136612
Javeline -0.328742173963282
1500m 0.659873621375849

9) Combien d'axes factoriels conserveriez vous ?

In [14]:
# Affichage de la variance cumulée :
t(as.matrix(res_pca$eig[,3]))
# Pour capter au moins 85% de l'information, on garde 6 axes.
# Pour capter au moins 90% de l'information, on en conserve 7.
# Cela semble élevé : en pratique on se contenterait sans doute des 4 premiers
# (environ 75% de variance expliquée).
A matrix: 1 × 10 of type dbl
comp 1comp 2comp 3comp 4comp 5comp 6comp 7comp 8comp 9comp 10
32.7190650.0903764.1395374.7080481.5557787.5484692.0608196.0295898.17773100

10) Ajoutez au jeu de données initial les scores de Kevin Mayer réalisés lors du championnat du monde 2017 de décathlon, réalisez l'ACP avec cette performance comme individu supplémentaire et interpréter vos résultats.

In [15]:
# Kevin Mayer 
Mayer <- c(10.70, 7.52, 17.72, 2.08, 48.26, 13.75, 47.14, 5.10, 66.10, 276.73, 1, 8768, NA)
decathlon2 <- decathlon
levels(decathlon2[, 13]) <- c(levels(decathlon[, 13]), "London")  
decathlon2 <- rbind(decathlon2, Mayer)
rownames(decathlon2)[42] <- "Mayer"
decathlon2[42, 13] <- "London"
In [16]:
res_pca2 <- PCA(decathlon2, quanti.sup=c(11,12), quali.sup=13)
In [17]:
# Kevin Mayer contribue largement à l'optimisation de l'axe 1,
# et dans une proportion non négligeable à celui de l'axe 2 :
res_pca2$ind$coord[40:42,]
res_pca2$ind$contrib[40:42,]
A matrix: 3 × 5 of type dbl
Dim.1Dim.2Dim.3Dim.4Dim.5
Uldal-2.6110400.2939917-0.41093768 0.02046917-1.2384424
Casarsa-2.9692573.7505159-0.24004411-0.70461239-0.7273543
Mayer 4.1479201.0974527-0.01343858 1.56236619 0.4405572
A matrix: 3 × 5 of type dbl
Dim.1Dim.2Dim.3Dim.4Dim.5
Uldal 4.692045 0.12554320.29299585670.00094052955.5177574
Casarsa 6.06779120.43172710.09997505761.11448071951.9032814
Mayer11.841198 1.74942240.00031334045.47945896500.6982575
In [18]:
# On en déduit que le premier plan factoriel doit s'en trouver affecté. En effet,
plot(res_pca2, choix="var")
# Les flèches 100m et 110H sont encore plus proches, donc encore plus corrélées qu'en première analyse.
# De plus, la variable 1500m obtient une corrélation cette-fois supérieure à 0.5 sur le second axe.
In [19]:
# vérification : calcul des matrices des corrélations entre variables
cor(decathlon[,1:6]) #corrélation 100m - 110H = 0.58
cor(decathlon2[,1:6]) #corrélation 100m - 110H = 0.60
A matrix: 6 × 6 of type dbl
100mLong.jumpShot.putHigh.jump400m110m.hurdle
100m 1.0000000-0.5986777-0.3564823-0.2462529 0.5202982 0.5798889
Long.jump-0.5986777 1.0000000 0.1833044 0.2946444-0.6020626-0.5054101
Shot.put-0.3564823 0.1833044 1.0000000 0.4892115-0.1384329-0.2516157
High.jump-0.2462529 0.2946444 0.4892115 1.0000000-0.1879569-0.2832891
400m 0.5202982-0.6020626-0.1384329-0.1879569 1.0000000 0.5479878
110m.hurdle 0.5798889-0.5054101-0.2516157-0.2832891 0.5479878 1.0000000
A matrix: 6 × 6 of type dbl
100mLong.jumpShot.putHigh.jump400m110m.hurdle
100m 1.0000000-0.6069088-0.3903329-0.2696763 0.5353951 0.5969038
Long.jump-0.6069088 1.0000000 0.2215656 0.3102652-0.6103396-0.5170197
Shot.put-0.3903329 0.2215656 1.0000000 0.5034720-0.2105961-0.3490019
High.jump-0.2696763 0.3102652 0.5034720 1.0000000-0.2141147-0.3168010
400m 0.5353951-0.6103396-0.2105961-0.2141147 1.0000000 0.5678110
110m.hurdle 0.5969038-0.5170197-0.3490019-0.3168010 0.5678110 1.0000000

11) À l’aide des commandes ci-après, interprétez l’ajout de la variable "Competition" comme variable qualitative illustrative.

In [20]:
plot(res_pca, axes = c(1,2), habillage=13)
# Le décathlon "OlympicG" semble d'un légèrement meilleur niveau que "Decastar".
# Cependant en y regardant de plus près ce sont les mêmes athlètes qui ont réalisé de meilleures
# performances à l'occasion des Jeux Olympiques : Karpov <--> KARPOV, Sebrle <--> SEBRLE, Clay <--> CLAY