Réduire la dimension des données,
en conservant le plus d'information possible.
...
En lignes : $n$ "individus"
En colonnes : $m$ "variables" numériques
Temps de réaction | Distance de freinage | |
---|---|---|
Conducteur 1 | 1.3s | 40m |
Conducteur 2 | 1.8s | 70m |
Conducteur 3 | 2s | 50m |
... | ... | ... |
Première ligne = en-tête, "header"
Name, 100m, Long.jump, ...
Lignes suivantes : individus
Sebrle, 11.04, 7.58, ... Clay, 10.76, 7.4, ...
En R :
data = read.csv("decathlon.csv")
Données toujours centrées.
Données "standardisées" si échelles différentes.
FactoMineR le fait par défaut.
$\Rightarrow$ Pas de calculs à faire.
Ressemblances / différences entre individus ?
Corrélations entre variables ?
Résumer les variables par un petit nombre de "variables synthétiques"
Sous contrainte : $v_i$ orthogonal à $v_1, \dots, v_{i-1}$.
$I(v_i)$ = "inertie projetée" = somme des carrés des distances projetées sur l'axe.
Concernant les détails mathématiques (résumés), voir par exemple la section 3 de cet article.
# Noms des variables
> names(data)
[1] "Name" "X100m" "Long.jump" "Shot.put" "High.jump"
[6] "X400m" "X110m.hurdle" "Discus" "Pole.vault" "Javeline"
[11] "X1500m" "Rank" "Points" "Competition"
# Chargement du package FactoMineR
# install.packages("FactoMineR")
> library(FactoMineR)
# Calcul de l'ACP
> res.pca = PCA(data[,-1], quanti.sup=11:12, quali.sup=13)
Les colonnes 1, 12, 13 et 14 sont exclues : on ne regarde que les performances par discipline.
Individus projetés sur les premiers axes $v_1$, $v_2$.
Parfois aussi $v_3$ et $v_4$, voire au-delà.
# Affichage du nuage des individus, colorés
# selon leur performance au lancer de disque.
plot(res.pca, choix="ind", habillage=7)
res.pca$ind$cos2
donne le $\cos^2$ de l'angle formé par chacun des axes et le vecteur pointant sur chaque individu.
Plus cet angle se rapproche de 0 (et donc le cosinus de 1), mieux l'individu est représenté le long d'un axe.
# Limitation aux 10 individus les mieux représentés.
plot(res.pca, choix="ind", select="cos2 10")
En général les individus extrêmes dans un plan donné sont les mieux représentés. En effet ce sont les points ayant le plus contribué à la construction des axes.
On considère les coordonnées des individus sur les axes comme des variables :
# Vecteurs colonnes de dimension n :
> res.pca$ind$coord[1:3,]
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
1 0.7916277 0.7716112 0.8268412 1.1746274 0.7071590
2 1.2349906 0.5745781 2.1412470 -0.3548448 -1.9745714
3 1.3582149 0.4840209 1.9562580 -1.8565241 0.7952147
4 ... ... ... ... ...
Le cosinus de l'angle formé par les variables initiales et ces variables synthétiques donne la corrélation.
Corrélations inter-variables.
Flèche proche du bord $\Rightarrow$ bonne représentation.
# Affichage du cercle des corrélations.
# On y voit aussi les variables supplémentaires.
> plot(res.pca, choix="var")
La visualisation aide mais ne suffit pas toujours.
> correlations = cor(data[,-c(1,12:14)]) ; correlations
X100m Long.jump Shot.put High.jump X400m
X100m 1.00000000 -0.59867767 -0.35648227 -0.24625292 0.520298155
Long.jump -0.59867767 1.00000000 0.18330436 0.29464444 -0.602062618
... ... ... ... ... ...
> library(corrplot) ; corrplot(correlations)
Autre façon de vérifier l'interprétation : observer les caractéristiques des individus loin de l'origine.
> data[c(13:16,40),
c("Name","Rank","Points")]
Name Rank Points
13 BOURGUIGNON 13 7313
14 Sebrle 1 8893
15 Clay 2 8820
16 Karpov 3 8725
40 Uldal 27 7495
# Pourcentage d'information cumulée :
> res.pca$eig[,3]
comp 1 comp 2 comp 3 comp 4 comp 5 comp 6 comp 7
32.71906 50.09037 64.13953 74.70804 81.55577 87.54846 ...
Pour disposer de +85% de l'information totale,
il faut garder au moins 6 axes ici.
# Pour tracer dans le plan 3-4 :
plot(res.pca, axes=c(3, 4))
# Et pour avoir 6 axes :
res.pca = PCA(data, ncp=6, ...)
Lancez R, installez FactoMineR, puis chargez decathlon.csv
Regardez l'aide des fonctions : "?plot.PCA" par exemple.
Changez un peu les arguments,
observez $-$ et comprenez ! $-$ les effets.
Récupérez le jeu de données "pizzas"
Effectuez une ACP et analysez le résultat.
Récupérez le jeu de données "jeux vidéos"
Effectuez une ACP et analysez le résultat.