Académique Documents
Professionnel Documents
Culture Documents
L'analyse en composante principale (ACP ou PCA en anglais) permet de réduire le nombre de dimensions d'un jeu de données multidimensionnel.
Cette page explique comment réaliser une ACP avec R mais aussi comment visualiser les résultats.
Si en revanche, l'ACP ne donne pas des résultats satisfaisants, il existe d'autres solutions ! Les plus basiques sont expliquées dans cette page.
Si vous voulez être formé (en Aquitaine) aux autres solutions, plus performantes, n'hésitez-pas à demander un devis !
L'analyse en composantes principales permet, d'après Wikipedia (septembre 2017) de transformer des variables liées entre elles (dites « corrélées »
en statistique) en nouvelles variables décorrélées les unes des autres. Ces nouvelles variables sont nommées « composantes principales », ou axes
principaux. Elle permet à l'analyste de réduire le nombre de variables et de rendre l'information moins redondante.
Cette page s'intéresse ici non pas à l'ACP en elle-même (présentation succincte rubrique 1) mais à la représentation graphiques des composantes
dans le cadre d'une étude ou d'une publication.
L'analyse des données dans le cadre des statistiques multivariées se fait par
plusieurs méthodes dont l'ACP (Analyse en Composantes Principales).
Réaliser une ACP (exemple d'ACP pas à pas avec R par défaut ou les librairies ade4 et FactoMineR)
Ouverture des données - données cancers.txt Dans cet exemple, on ouvre des données simulées
1) La commande par défaut prcomp() (installé sur R par défaut), renvoie une acp dont la description est délicate à obtenir
2) ade4 (dudi.pca()) permet d'obtenir facilement une acp et sa description. On peut facilement voir un diagramme de Pareto pour sélectionner les
composantes qui ont du poids
3) factomineR (PCA()) est un package très performant qui permet d'aller bien au-delà de l'ACP.
Méthode par défaut de R (prcomp()) Avec la librairie ade4 Avec la librairie FactoMineR
Le principe de Pareto suppose que la variabilité globale se concentre sur les premières composantes.
Afin de pouvoir travailler sur seulement quelques composantes, il faut s'assurer que ce principe de Pareto est respecté.
Il est possible de contrôler la pertinence de l'ACP, non déformation du nuage en s'assurant que les composantes retenues couvrent bien 95%,
97.5% ou plus selon son choix de la variabilité du nuage.
Dans cet exemple, comme les 2 premières composantes couvrent 95% de la variabilité, on peut
réduire ainsi le nombre de dimensions des données à seulement 2 au lieu de 10.
Étape 4 - Afficher les données en 2 dimensions - Ex : Axe1 = Composante 1 & Axe2 = Composante2
Une fois que l'on sait sur quelles composantes s'attarder, la première envie est de voir comment vont se répartir les points sur un nombre réduit
de dimensions.
Chaque librairie possède ses propres outils de visualisations. Tous sont très limités dans la mise en forme.
Vous trouverez sur ce site une page dédiée aux représentations graphiques avec ade4 (commande s.label()) ou FactoMineR.
Courbe sur les composantes 1 et 2 (on peut aussi bien représenter d'autres composantes
en remplaçant les 1 et 2 par 3 et 4 dans axeX et axeY
Tracer le graphique
plot(axeX,axeY,pch=16);grid()
text(axeX,axeY,rownames(x))
Étape 5 - (Optionnelle) - Visualiser la corrélation et l'influence des différentes variables avec les composantes (diagramme
circulaire, radial, en radiant)
Il est utile pour comprendre le lien entre variables et va donner des résultats
équivalents à un clustering sur variables.
B) Optionnel : filtrer les variables pour n'afficher que celles qui ont un poids suffisant
#OPTIONNEL
poids_var_global <- sqrt(poids_var_x^2+poids_var_y^2)
barplot(poids_var_global,names.arg=vecnames)
# FILTRER : Ex : les variables dont le poids est > 0.25
seuil = 0.25 ; abline(h=seuil,col="red",lwd=2)
poids_var_x <- poids_var_x[poids_var_global>seuil]
poids_var_y <-poids_var_y[poids_var_global>seuil]
vecnames <- vecnames[poids_var_global>seuil]
C) Tracer le diagramme
Étape 6 - Combiner les étapes 4 et 5 pour visualiser la distributions des résultats selon 2 composantes et superposer la
projection de chaque variable. (biplot)
par(new = T)
biplot(prcomp(dataframe))
Si les catégories ne sont pas encore définies, on peut réaliser un clustering pour identifier ces
catégories (knn, k-means, clustering hiérarchique ascendant (CAH)...).
Sinon, on peut les colorer ou les entourer directement avec une ellipse.
Voici des résultats obtenus par différents étudiants n'ayant pas tous le même bac. On essaye de
voir s'il y a un résultats aux examens et type de bac.
Regrouper des points pour définir des catégories : appliquons un clustering hiérarchique. cf. aide - clustering hiérarchique.
mydi = dist(data_bac[,-c(1,2)])
mytree = cutree((hclust(mydi)), k=5) # 3 catégories ; print(mytree)
Colorer les groupes de points par catégorie - Si les catégories sont déjà définies dans une autre liste : voir aussi ce lien.
Entourer les points dans une ellipse de confiance - cf. aide - tracer des ellipses
2.0. Prenons un nouvel exemple plus complexe qui justifierait une meilleure interaction
Voici des résultats obtenus par différents étudiants n'ayant pas tous le même bac. On essaye de
voir s'il y a un résultats aux examens et type de bac.
2.1. Visualiser les résultats en 3D ou établir le lien des composantes avec une autre variable
Illustrer 3 composantes en 3D, entourer d'un ellipsoïde les points correspondant à une
catégorie. C'est possible !
# Début du graphique
# Installer la librairie 3D nécessaire à la visualisation
install.packages("rgl") ; library(rgl) # installer puis lancer la
librairie
# Tracer le graphique 3D (les bac S)
plot3d(acp$li[,1][data_bac$bac=="S"],acp$li[,2]
[data_bac$bac=="S"],acp$li[,3][data_bac$bac=="S"],
col="green",type="p",xlab="Dim1",ylab="Dim2",zlab="Dim3")
# Fin du graphique
# Colorer et ajouter d'autres catégories de bacs
points3d(acp$li[,1][data_bac$bac=="STAV"],acp$li[,2][data_bac$bac=="STAV"],acp$li[,3]
[data_bac$bac=="STAV"],col="red",radius=0.02)
points3d(acp$li[,1][data_bac$bac=="ST2S"],acp$li[,2][data_bac$bac=="ST2S"],acp$li[,3]
[data_bac$bac=="ST2S"],col="blue",radius=0.02)
spheres3d(acp$li[,1][data_bac$bac=="STL"],acp$li[,2][data_bac$bac=="STL"],acp$li[,3]
[data_bac$bac=="STL"],col="black",radius=0.02)
# Tracer un ellipsoïde noir pour le bac STL
x = acp$li[,1][data_bac$bac=="STL"] ; y = acp$li[,2][data_bac$bac=="STL"] ; z = acp$li[,3][data_bac$bac=="STL"]
ellipse <- ellipse3d(cov(cbind(x,y,z)), centre=c(mean(x), mean(y), mean(z)), level = 0.95)
plot3d(ellipse, col = "black", alpha = 0.1, add = TRUE, type="shade")
# Tracer un ellipsoïde rouge pour le bac STAV
x = acp$li[,1][data_bac$bac=="STAV"] ; y = acp$li[,2][data_bac$bac=="STAV"] ;z = acp$li[,3][data_bac$bac=="STAV"]
ellipse <- ellipse3d(cov(cbind(x,y,z)), centre=c(mean(x), mean(y), mean(z)), level = 0.95)
plot3d(ellipse, col = "red", alpha = 0.1, add = TRUE, type="shade")
# Réaliser une série de 90 images pour faire un gif animé avec un logiciel comme GIMP, photofiltre, Easy GIF
Animator ou gif animator ou Photoscape.
for (i in 1:90) { rgl.viewpoint(i, 20) ;
filename <- paste("pic", formatC(i, digits = 1, flag = "0"), ".png", sep = "")
rgl.snapshot(filename) } ;getwd()
Étape B - Régression 3D couplée au graphique pour mettre en relation une variable y avec les composantes x1 et x2
cf. L'utilisation de la librairie plotly. Régression 3D, nappes et graphiques 3D interactifs : faire appel à plotly !!!
2.2. Construire sa propre interface pour cliquer sur les points pour les identifier, etc.
Développer une interface pour pouvoir afficher la légende d'un point en cliquant dessus.
Il est relativement simple de reprendre le script disponible aux liens ci-dessous pour développer une interface pour lire ses données d'ACP par
interaction avec les graphiques.
# à partir d'une acp faite avec ade4 # à partir d'une acp faite avec ade4
plot(acp$li[,1],acp$li[,2],pch=16, col="#AA1256") plot_id_point(acp$li[,1],acp$li[,2],pch=16,
loc_punct(acp$li[,1],acp$li[,2]) col="#12AA56",col_point="red",labels=c(1:100))
La commande loc_punt n'est pas installée sous R, il faut aller La commande plot_id_point n'est pas installée sous R, il faut aller
récupérer son code : récupérer son code :
cf. La commande de localisation d'un point par simple click. cf. Commande interactive pour cliquer sur chaque point de l'ACP pour
afficher ses coordonnées et caractéristiques
2.3. Utiliser la librairie plotly pour créer automatiquement des graphiques html interactifs
cf. Le lien suivant. plotly permet aussi de rendre les ggplot interactif.
Mise en forme des données avec la librairie ade4 Mise en forme des données avec la librairie performante de
factoextra
Simple pour réaliser des ACP, la librairie ade4 ne permet pas de faire
de belles mise en forme.
La librairie FactoMineR semble offrir des fonctionnalités équivalentes à factoextra (cf. présentation) avec des intérêts notoires en particulier pour
gérer les données manquantes avec missData. Une aide hybride entre factoextra et FactoMineR est disponible ici.
Mise en forme des données de façon performante mais complexe avec ggplot2 et plotly
Cette rubrique reste à rédiger. ggplot et plotly ont un peu le propre langage au sein du langage R mais sont très performants pour réaliser tous les
types de graphiques automatiquement (croisement de paramètres, régressions, 3D, nappes, ellipses, interactifs...)
La rotation varimax pour essayer de faire coller aux mieux les variables aux composantes (utilisé en psychologie)
le but recherché de cette rotation est une facilitation de l'interprétation. on voit ici
qu'il sera possible de définir les personnes selon 2 axes (motivation/enthousiasme
versus rigueur/connaissances/savoir-faire). (Exemple artificiel)
Lorsque l'ACP ne donne pas des résultats satisfaisants, ce n'est pas toujours de la faute des résultats. L'ACP consiste à réduire les dimensions en
écrasant un nuage de points.
Comme si on écrasait une mouche, si on s'y prend bien, on conserve 2 composantes principales sur la mouche : la longueur et la largeur.
Mais si on l'écrase de travers ? Le résultat d'ACP peut devenir incompréhensible, comme si la tête se retrouvait au niveau des pattes.
Ou encore, si la variabilité semble plus forte au sein d'une catégorie identifiée qu'entre des catégories ?
Il existe alors d'autres méthodes, le cmdscale qui repose sur la distance, la projection de Fisher (fonction LDA()) pour créer une distance entre les
catégories...
En dernier lieu, si vous n'obtenez toujours pas des résultats satisfaisants, n'hésitez pas à faire appel à nous pour être formés à d'autres outils non
disponibles sur ce site ! Demande de devis gratuit.
L'ACM
Sorte d'ACP pour des données non-numériques (qualitatives), l'ACM (Analyse en Composante Multiple) se fait de la façon suivante :
library(ade4)
acm <- dudi.acm(data)
Aide à l'utilisation du logiciel R - site réalisé par Antoine Massé - ingénieur en biotechnologies - enseignant PrAg à l'IUT de Bordeaux - Université de Bordeaux
- Site de Périgueux - département Génie Biologique
Commentaire - Problème à signaler - ou dire Merci - Cliquer-ici - Besoin d'être formé à R (cours personnalisés) - Données à faire traiter ?