Représenter graphiquement les résultats d’une analyse factorielle avec R
Par Anton Perdoncin et Pierre Mercklé1
L’objectif de ce tutoriel est de montrer comment produire avec le logiciel R des représentations graphiques lisibles et démonstratives des résultats d’une analyse géométrique des données (analyse des correspondances multiples, analyse en composantes principales…). C’est en effet l’un des avantages considérables de R par rapport aux autres logiciels de traitement de données quantitatives (SAS, SPSS, Stata, notamment) que de fournir des outils graphiques performants, permettant de produire de manière relativement aisée des présentations agréables.
Les méthodes d’analyse géométrique des données permettent de fournir le meilleur résumé possible de la structure d’un ensemble d’observations effectuées sur un échantillon et enregistrées dans une table de données. Sans entrer ici dans le détail de l’exposé des principes de cette famille de méthodes2, il suffit de dire que l’objectif est de résumer le mieux possible l’information contenue dans la totalité des nombreuses variables d’origine par un nombre réduits de « facteurs » (qu’on représentera ensuite graphiquement par des « axes ») qui correspondent à des combinaisons de ces variables. La dimension graphique fait partie intégrante de ces méthodes et en constitue l’un des instruments de démonstration et d’argumentation les plus forts, puisqu’elle permet d’appréhender rapidement une grande quantité d’information. A condition, évidemment, de mener correctement l’interprétation statistique des axes factoriels… et de produire des graphiques qui soient aisément lisibles ! C’était déjà l’objectif de la macro ACM pour Excel qu’avait développée Olivier Godechot, et c’est un objectif similaire que nous voulons poursuivre ici avec R3.
Nous nous concentrerons ici sur une technique particulière au sein de la famille de l’analyse géométrique des données : l’analyse des correspondances multiples (ACM). Cette technique permet d’analyser un nombre important de variables dites « qualitatives », autrement dit, de variables discrètes qui peuvent prendre un nombre délimité de valeurs possibles : le sexe, la catégorie socioprofessionnelle, le genre musical préféré, etc. ; mais aussi n’importe quelle variable « quantitative », comme l’âge, le revenu, le temps passé devant la télévision, à condition qu’elle soit recodée en tranches.
Dans ce qui suit, nous allons utiliser un exemple délibérément simple, réduit à quelques variables, pour montrer quelques opérations faciles permettant de construire des graphiques d’analyse des correspondances multiple sur-mesure avec R.
1. Réaliser une ACM avec FactoMineR
Le package FactoMineR est l’outil idéal pour mener une analyse géométrique des données avec le logiciel R. Nous nous contenterons, dans ce tutoriel, d’expliquer rapidement comment réaliser une analyse des correspondances multiples (ACM) et comment représenter graphiquement ses résultats. Si vous souhaitez aller plus loin et avoir plus d’informations sur FactoMineR4 et ses diverses fonctionnalités, rendez-vous sur le site internet qui lui est dédié : http://factominer.free.fr.
A. Installer et charger le package FactoMineR
Une première remarque avant de commencer : avant même d’installer FactoMineR, il faut bien sûr d’abord installer R5, ainsi éventuellement qu’une interface graphique permettant d’en rendre l’usage plus aisé. Nous recommandons particulièrement l’interface RStudio6 (logiciel libre et multi-plateformes, tout comme R), qui facilite l’écriture des scripts ainsi que le traitement des sorties graphiques, mais qui nécessite d’écrire les lignes de commande. L’interface RCommander7, elle, propose menus déroulants ou cases à cocher pour activer certaines des fonctionnalités de R, dont celles dédiées à l’ACM ; elle affiche aussi les lignes de commande correspondantes.
Pour toute la suite, vous pouvez évidemment retaper dans R les lignes d’instructions qui jalonnent ce tutoriel, ou bien les “copier-coller”. Mais pour plus de simplicité, nous vous proposons d’utiliser le script d’accompagnement, qui reproduit toutes ces lignes d’instructions. Il se trouve ici, il ne vous reste plus qu’à le télécharger , le décompresser et l’ouvrir dans R (par exemple en double-cliquant dessus) :
http://quanti.hypotheses.org/files/2014/05/quanti-acm-avec-R.zip
L’installation du package FactoMineR vient juste après. Elle ne doit être réalisée qu’une seule fois. La commande library() doit en revanche être exécutée à l’ouverture de chaque nouvelle session de travail :
> install.packages(“FactoMineR”)
> library(FactoMineR)
B. Télécharger et préparer les données
Pour illustrer ce tutoriel, nous allons utiliser l’extrait de données de l’enquête « Histoires de vie » (HDV) réalisée par l’INSEE en 2003, et qui est inclus dans le package questionr8. Il faut donc également installer et charger ce package :
> install.packages(“questionr”)
> library(questionr)
Ensuite, pour charger les données de l’enquête HDV, il suffit d’utiliser la fonction data(), puis d’en faire une copie dans l’objet DONNEES :
> data(hdv2003)
> SOURCE <- hdv2003
La fonction str() vous permet d’avoir un aperçu des variables contenues dans la table DONNEES :
> str(SOURCE)
‘data.frame’: 2000 obs. of 20 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10 …
$ age : int 28 23 59 34 71 35 60 47 20 28 …
$ sexe : Factor w/ 2 levels “Homme”,”Femme”: 2 2 1 1 2 2 2 1 2 1 …
$ nivetud : Factor w/ 8 levels “N’a jamais fait d’etudes”,..: 8 NA 3 8 3 6 3 6 NA 7 …
$ poids : num 2634 9738 3994 5732 4329 …
$ occup : Factor w/ 7 levels “Exerce une profession”,..: 1 3 1 1 4 1 6 1 3 1 …
$ qualif : Factor w/ 7 levels “Ouvrier specialise”,..: 6 NA 3 3 6 6 2 2 NA 7 …
$ freres.soeurs: int 8 2 2 1 0 5 1 5 4 2 …
$ clso : Factor w/ 3 levels “Oui”,”Non”,”Ne sait pas”: 1 1 2 2 1 2 1 2 1 2 …
$ relig : Factor w/ 6 levels “Pratiquant regulier”,..: 4 4 4 3 1 4 3 4 3 2 …
$ trav.imp : Factor w/ 4 levels “Le plus important”,..: 4 NA 2 3 NA 1 NA 4 NA 3 …
$ trav.satisf : Factor w/ 3 levels “Satisfaction”,..: 2 NA 3 1 NA 3 NA 2 NA 1 …
$ hard.rock : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 1 1 1 1 1 1 1 …
$ lecture.bd : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 1 1 1 1 1 1 1 …
$ peche.chasse : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 1 1 1 2 2 1 1 …
$ cuisine : Factor w/ 2 levels “Non”,”Oui”: 2 1 1 2 1 1 2 2 1 1 …
$ bricol : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 2 1 1 1 2 1 1 …
$ cinema : Factor w/ 2 levels “Non”,”Oui”: 1 2 1 2 1 2 1 1 2 2 …
$ sport : Factor w/ 2 levels “Non”,”Oui”: 1 2 2 2 1 2 1 1 1 2 …
$ heures.tv : num 0 1 0 2 3 2 2.9 1 2 2 …
Le jeu de données comporte 2000 individus, et 20 variables parmi lesquelles : d’une part des variables décrivant les caractéristiques socio-démographiques des individus (age, sexe, nivetud, etc.), et d’autre part des variables décrivant leurs pratiques de loisirs (hard.rock, lecture.bd, peche.chasse, etc.). Ces dernières sont bien des variables « qualitatives », toutes de type « Factor » (indispensable pour mener l’ACM9), et comportant deux modalités : « Oui » ou « Non » selon que l’activité est pratiquée ou non.
Pour l’analyse qui suit, on ne conserve que les 7 variables qui décrivent les loisirs, qui vont être les variables « actives » de l’ACM, et 3 variables socio-démographiques, qui vont être les variables « supplémentaires » ou « illustratives » :
> DONNEES <- subset(SOURCE, select=c(“hard.rock”, “lecture.bd”, “peche.chasse”, “cuisine”, “bricol”, “cinema”, “sport”, “age”, “sexe”, “qualif”))
On a vu dans le préambule que l’analyse des correspondances multiples s’appliquait aux variables qualitatives. C’est le cas de presque toutes les variables que nous avons sélectionnées, sauf de l’âge. Nous allons donc recoder la variable age en 4 tranches d’effectifs à peu près égaux, en utilisant les fonction cut() et quantile() de R :
> DONNEES$age <- cut(DONNEES$age, breaks=quantile(DONNEES$age))
On peut jeter un nouveau un œil à nos données pour vérifier qu’elles se présentent bien comme voulu :
> str(DONNEES)
‘data.frame’: 2000 obs. of 12 variables:
$ hard.rock : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 1 1 1 1 1 1 1 …
$ lecture.bd : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 1 1 1 1 1 1 1 …
$ peche.chasse: Factor w/ 2 levels “Non”,”Oui”: 1 1 1 1 1 1 2 2 1 1 …
$ cuisine : Factor w/ 2 levels “Non”,”Oui”: 2 1 1 2 1 1 2 2 1 1 …
$ bricol : Factor w/ 2 levels “Non”,”Oui”: 1 1 1 2 1 1 1 2 1 1 …
$ cinema : Factor w/ 2 levels “Non”,”Oui”: 1 2 1 2 1 2 1 1 2 2 …
$ sport : Factor w/ 2 levels “Non”,”Oui”: 1 2 2 2 1 2 1 1 1 2 …
$ age : Factor w/ 4 levels “(18,35]”,”(35,48]”,..: 1 1 3 1 4 1 3 2 1 1 …
$ sexe : Factor w/ 2 levels “Homme”,”Femme”: 2 2 1 1 2 2 2 1 2 1 …
$ qualif : Factor w/ 7 levels “Ouvrier specialise”,..: 6 NA 3 3 6 6 2 2 NA 7 …
C. Réaliser l’ACM et stocker les résultats
On réalise l’ACM grâce à la fonction MCA() du package FactoMineR. On stocke les résultats de l’ACM dans un objet que l’on appelle resultats :
resultats <- MCA(DONNEES, ncp=5, quali.sup=8:10, graph=FALSE)
Dans l’instruction ci-dessus, on a précisé trois arguments pour la fonction MCA :
- ncp=5 : nombre d’axes pour lesquels on conserve l’information
- quali.sup=8:10 : on précise que les variables 8 à 10 (age à qualif) de l’objet DONNEES doivent être considérées comme des variables qualitatives supplémentaires, autrement dit elles ne contribuent pas au calcul des facteurs ni donc à la formation des axes. Mais on pourra tout de même les représenter graphiquement, en les « projetant » sur les plans formés par les axes factoriels calculés à partir des seules variables « actives » (ici donc, les 7 variables décrivant les loisirs, de hard.rock à sport).
- graph=FALSE : on ne souhaite pas que les graphiques soient produits. Par défaut, la fonction MCA génère une série de graphiques, souvent illisibles et dont l’interprétation peut être très trompeuse car le tri n’y est pas fait entre modalités contributives et non contributives (voir infra pour la visualisation des graphiques par défaut de FactoMineR).
Qu’y a-t-il dans l’objet resultats ?
> print(resultats)
**Results of the Multiple Correspondence Analysis (MCA)**
The analysis was performed on 2000 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. of the categories”
4 “$var$cos2” “cos2 for the categories”
5 “$var$contrib” “contributions of the categories”
6 “$var$v.test” “v-test for the categories”
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 “$quali.sup” “results for the supplementary categorical variables”
12 “$quali.sup$coord” “coord. for the supplementary categories”
13 “$quali.sup$cos2” “cos2 for the supplementary categories”
14 “$quali.sup$v.test” “v-test for the supplementary categories”
15 “$call” “intermediate results”
16 “$call$marge.col” “weights of columns”
17 “$call$marge.li” “weights of rows”
Nous allons nous intéresser principalement aux objets 1 (valeurs propres), 3 (coordonnées des modalités actives), 5 (contributions des modalités actives), 8 (coordonnées des individus), et 12 (coordonnées des modalités qualitatives supplémentaires). On peut avoir du reste un premier aperçu des contenus de ces différents objets avec la classique commande summary(resultats).
Commençons par les valeurs propres. Tout le propos de l’analyse des correspondances multiples consiste à résumer un nombre élevé de variables (ici, les 7 variables décrivant les loisirs) par un nombre plus faible de « facteurs ». On parle aussi de dimensions ou d’axes.
Pour comprendre comment sont calculés ces facteurs, il faut se faire une idée, même approximative, de la logique de l’algorithme de l’ACM, autrement dit de la logique de ce que l’on appelle la « décomposition factorielle » : le premier facteur calculé par l’algorithme de l’ACM est toujours celui qui permet de conserver la plus grande part possible des variations de l’information contenue dans le tableau des variables actives. Une fois ce premier facteur trouvé, on recalcule le tableau des variables actives en n’y conservant que le reste, autrement dit que la part des variations qui n’a pas été expliquée par le premier facteur. Le deuxième facteur est ensuite calculé de la même façon sur ce reste, donc de telle façon qu’il conserve la plus grande part possible des variations de l’information contenue dans ce « reste »… Et ainsi de suite, jusqu’à ce que l’on ait absorbé la totalité des variations à expliquer. Dans le cas où les variables actives sont dichotomiques comme ici (elles ne peuvent prendre que les valeurs « Oui » ou « Non »), le nombre de facteurs ainsi calculés sera nécessairement inférieur ou égal au nombre de variables (dans le cas général, il sera toujours inférieur à nombre de modalités actives – nombre de variables actives).
2. Combien de facteurs faut-il retenir ? L’histogramme des valeurs propres
Dans notre exemple, on va donc obtenir au maximum 7 facteurs, classés du plus important au moins important (ou du plus explicatif au moins explicatif) et à chacun de ces 7 facteurs va être associée une « valeur propre » qui traduit la quantité d’information expliquée par le facteur :
> print(resultats$eig)
eigenvalue percentage of variance cumulative percentage of variance
dim 1 0.2121854 21.21854 21.21854
dim 2 0.1542803 15.42803 36.64657
dim 3 0.1468192 14.68192 51.32849
dim 4 0.1387719 13.87719 65.20568
dim 5 0.1349671 13.49671 78.70239
dim 6 0.1192865 11.92865 90.63104
dim 7 0.0936896 9.36896 100.00000
On traduit en général cette information sous la forme d’un « pourcentage d’inertie », contenu ici dans la deuxième colonne de resultat$eig, et correspondant donc à la proportion des variations totales des variables originales expliquées par chaque facteur.
Faut-il analyser tous les facteurs ? Non, évidemment, puisque le but de la démarche est de rendre compte de la plus grande partie possible de l’information originale, avec le nombre le plus petit possible de « variables ». Combien en retenir ? C’est l’examen de l’histogramme des valeurs propres qui va permettre de choisir. On trace cet histogramme de la façon suivante, avec la fonction barplot(), en y faisant figurer le pourcentage d’inertie en ordonnée :
> barplot(resultats$eig[, 2], main=”Histogramme des valeurs propres”, names.arg=rownames(resultats$eig), xlab=”Axes”, ylab=”Pourcentage d’inertie”, cex.axis=0.8, font.lab=3, col=”orange”)
A chaque fois que l’on rajoute un facteur à l’analyse on gagne en inertie totale expliquée, mais on perd en parcimonie. L’idée est donc de n’ajouter des facteurs à l’analyse que si le gain en inertie reste avantageux par rapport à la perte en parcimonie. On peut utiliser l’histogramme des valeurs propres pour effectuer visuellement cet arbitrage à l’aide du critère du « coude » : ici, on observe un décrochement (coude), suivi d’une décroissance régulière, entre le premier et le deuxième facteur, ce qui pourrait inciter à n’examiner que le premier facteur. Mais ce n’est pas la seule règle possible : un autre critère de choix (appelé « critère de Kaiser ») suggère de garder tous les facteurs dont la valeur propre est supérieure à la valeur propre moyenne (qui vaut par définition 1 divisé par le nombre de facteurs). Ici, le critère de Kaiser incite à retenir les facteurs dont le pourcentage d’inertie est supérieur à (100/7=) 14,3%, autrement dit à retenir les trois premiers facteurs. Pour les besoins de la démonstration d’aujourd’hui, on coupera la poire en deux, et on se contentera d’analyser les deux premiers facteurs, qui cumulent presque 37% de l’inertie totale (21,2% pour le premier facteur et 15,4% pour le deuxième facteur).
3. Essayer les fonctionnalités graphiques du package FactoMineR
Par défaut, sauf si l’on a ajouté l’argument plot=FALSE comme précédemment, l’exécution de la fonction MCA() entraîne la production d’un certain nombre de graphiques : ensemble des modalités actives et supplémentaires, individus, variables seules.
On peut également demander à FactoMineR de tracer des graphiques plus spécifiques, grâce à la fonction plot.MCA. Les différents graphiques (variables, modalités actives, modalités supplémentaires, individus) peuvent être obtenus en jouant avec les valeurs possibles des arguments choix (pour définir le type de graphique) ou invisible (pour définir ce qu’on veut enlever de la représentation graphique). Dans l’exemple ci-dessous, on représente ces quatre graphiques ensemble :
> # Définir la répartition : 2×2
> par(mfrow=c(2, 2))
> # Variables actives et supplémentaires, avec l’argument choix=”var”
> plot.MCA(resultats, choix=”var”, title=”Variables actives et supplémentaires”, axes=c(1, 2))
> # Modalités actives
> plot.MCA(resultats, invisible=c(“ind”, “quali.sup”), title=”Modalités actives”, axes=c(1, 2))
> # Modalités supplémentaires
> plot.MCA(resultats, invisible=c(“ind”, “var”), title=”Modalités supplémentaires”, axes=c(1, 2))
> # Individus
> plot.MCA(resultats, invisible=c(“quali.sup”, “var”), title=”Nuage des individus”, axes=c(1, 2))
Ces graphiques de base peuvent rapidement devenir illisibles, si le nombre de modalités est important (ce qui est fréquent). De plus, ils ne permettent pas de distinguer entre les modalités qui contribuent le plus fortement et celles qui ne contribuent pas aux axes représentés, ce qui peut induire le sociologue et son lecteur en erreur.
Le module graphique de FactoMineR a été récemment amélioré afin de répondre à ces problèmes. De nombreuses options peuvent ainsi être spécifiées dans la fonction plot.MCA, que l’on trouvera aisément en exécutant ?plot.MCA. Il est notamment possible de sélectionner les modalités que l’on souhaite représenter ou omettre selon certains critères, d’augmenter ou de diminuer la taille des points, de modifier les couleurs, etc.
Pour une présentation synthétique des diverses fonctionnalités graphiques de FactoMineR, des vidéos ont été réalisées par François Husson, l’un des créateurs du package, et sont disponibles sur internet. Voyez notamment la vidéo consacrée à l’ACM et au module graphique de FactoMineR, à cette adresse : http://goo.gl/Pfymh0.
4. Réaliser soi-même un graphique sur-mesure
Malgré ces améliorations très appréciables et utiles du module graphique de FactoMineR, certains utilisateurs peuvent souhaiter réaliser eux-mêmes leurs graphiques afin de sélectionner à leur guise les points représentés, choisir les symboles, les couleurs, établir une légende lisible… Tout cela est possible, et même assez facile en se servant des fonctions graphiques habituelles de R…
A. Quelles modalités représenter ?
La première étape est de déterminer quelles sont les modalités actives que l’on souhaite représenter sur le graphique. Dans le cas où elles sont peu nombreuses, on peut choisir de toutes les représenter. Dans le cas où elles sont très nombreuses, on peut se servir de leur contribution aux facteurs représentés pour sélectionner celles qui ont justement les contributions les plus importantes. Un critère possible est de ne retenir que les modalités dont la contribution est supérieure à deux fois la contribution moyenne (Cibois, 1986, 1997). Ce seuil est évidemment arbitraire, et rien n’empêche de retenir un seuil plus élevé ou plus faible, suivant le nombre de modalités qu’on veut représenter. Dans notre cas, le nombre de modalités actives étant faible, on peut garder celles dont la contribution à l’un ou l’autre des deux premiers facteurs est simplement supérieure à la contribution moyenne.
La contribution moyenne est l’inverse du nombre de modalités actives. Dans notre cas, les 7 variables actives se décomposent en un total de 14 modalités. La contribution moyenne est donc égale à 100/14 = 7.1%). On ne retiendra donc dans l’interprétation des deux premiers axes de notre ACM que les modalités dont la contribution est supérieure à 7,1%. Pour savoir quelles sont ces modalités, on peut examiner le tableau des contributions des modalités actives aux deux premiers facteurs :
> round(resultats$var$contrib[,1:2], 1)
Ce qui donne le résultat suivant :
Dim 1 Dim 2
hard.rock_Non 0.0 0.0
hard.rock_Oui 1.0 0.1
lecture.bd_Non 0.1 0.0
lecture.bd_Oui 3.2 1.1
peche.chasse_Non 0.1 7.1
peche.chasse_Oui 0.7 56.2
cuisine_Non 4.2 0.8
cuisine_Oui 5.3 1.0
bricol_Non 6.9 8.9
bricol_Oui 9.3 12.0
cinema_Non 14.0 4.4
cinema_Oui 19.9 6.3
sport_Non 12.8 0.7
sport_Oui 22.6 1.3
On peut voir que les contributions les plus fortes à l’axe 1 viennent du cinéma et du sport, puis du bricolage (modalités actives 9 à 14), et que sur l’axe 2 elles sont dues essentiellement à ceux qui pratiquent la pêche et la chasse (6) puis également au bricolage. On peut donc retenir toutes ces modalités actives qui contribuent le plus fortement à l’un ou l’autre des deux premiers axes, qui sont ceux que nous avons retenus.
On crée ensuite un vecteur moda qui stocke les numéros de ces modalités, afin de pouvoir les appeler automatiquement dans les graphiques. On peut le faire « à la main » en indiquant les numéros de ces modalités. En l’occurrence, elles sont donc placées dans les positions suivantes : 6, 9, 10, 11, 12, 13 et 14:
> moda <- c(6, 9 :14)
Pour les plus habiles avec R et ses multiples fonctions, on aurait aussi pu écrire une petite condition qui sélectionne automatiquement les numéros des modalités dont la contribution est supérieure à la contribution moyenne :
> seuil <- 100/nrow(resultats$var$contrib)
> moda <- which(resultats$var$contrib[, 1]>seuil | resultats$var$contrib[, 2]>seuil)
On peut alors visualiser les coordonnées des modalités sélectionnées, sur les deux premiers axes :
> round(resultats$var$coord[moda, 1:2], 2)
Dim 1 Dim 2
peche.chasse_Oui 0.31 2.33
bricol_Non -0.42 -0.41
bricol_Oui 0.57 0.55
cinema_Non -0.60 0.29
cinema_Oui 0.85 -0.41
sport_Non -0.55 0.11
sport_Oui 0.96 -0.20
B. Le graphique des modalités pas à pas
Le principe est le suivant : on trace un graphique simple, on sélectionne les modalités que l’on souhaite représenter, on définit le style et la taille des symboles, on nomme les labels des points, et on précise leurs positions.
Les fonctions graphiques utilisées sont les suivantes :
- plot : fonction graphique de base dans R, pour tracer le cadre et l’arrière-fond du graphique ;
- abline : pour ajouter des lignes verticales et horizontales ;
- points : pour tracer les points, leur donner une couleur, une forme… ;
- text : pour donner des labels aux points et les positionner
- lines : pour relier des points entre eux
- legend : pour configurer et positionner la légende du graphique.
a. Créer le cadre et l’arrière-plan du graphique
C’est le point de départ : il s’agit de créer la fenêtre graphique adaptée pour représenter les modalités sélectionnées.
> windows(7, 10)
> par(mfrow=c(1,1))
> plot(resultats$var$coord[moda, 1:2]*1.2, type=”n”, xlab=paste0(“Axe 1 (“, round(resultats$eig[1,2], 1), “%)”), ylab=paste0(“Axe 2 (“, round(resultats$eig[2,2], 1), “%)”), main=”Premier plan factoriel”, cex.main=1, cex.axis=0.8, cex.lab=0.7, font.lab=3)
> abline(h=0, v=0, col=”grey”, lty=3, lwd=1)
La fonction windows() permet d’ouvrir une nouvelle fenêtre graphique, dont on a indiqué ici la largeur et la hauteur en pouces. Attention, cette fonction ne fonctionnera que sous Windows, sous Linux il faudra utiliser x11(), et quartz() sous OSX.. L’instruction par(mfrow=c(1,1)) permet d’afficher un seul graphique (une seule ligne, une seule colonne) dans la totalité de la fenêtre ouverte. En suite, dans la fonction plot(), on commence par préciser l’objet à partir duquel le graphique est construit. Ici, il s’agit des coordonnées des modalités actives pour les axes 1 et 2. Le principe est d’ajuster une fenêtre graphique un peu plus grande que les données (x1.2), afin de ne pas avoir de marges blanches inutilement grandes, mais en évitant de tronquer les libellés des modalités qui seront sur les bords du graphique. La multiplication par 1.2 permet d’avoir une marge de 20% autour des modalités les plus marginales.
Puis on spécifie un certain nombre d’arguments :
- type=”n” signifie que rien n’est tracé dans le graphique (on tracera les points séparément dans un second temps).
- xlab et ylab permettent de donner un nom aux axes x et y. Ici on y ajoute entre parenthèses les pourcentages d’inertie conservés par chacun des axes.
- main permet de donner un titre au graphique.
- cex.main, cex.axis et cex.lab permettent de fixer la taille de la police respectivement du titre, des graduations sur les axes et des labels des axes : 1 est la valeur par défaut, une valeur supérieure à 1 augmente la taille, une valeur inférieure à la diminue
- font.lab permet de déterminer le style de police (1 : normal ; 2 : gras ; 3 : italiques ; 4 : gras italiques).
La fonction abline permet d’ajouter des lignes sur un graphique. Elle prend également des arguments :
- h=a coordonnée de la ligne horizontale.
- v=b coordonnée de la ligne verticale.
- col : couleur du trait, avec une infinité ou presque de couleurs possibles, qu’on peut désigner soit par leur nom en anglais, soit avec la fonction colors() et des numéros de code, par exemple colors()[8] donnera « aquamarine » : voir ici la charte des couleurs de R).
- lty : type de trait (1=plein, 2=tirets courts, 3=points, 4=tirets+points, 5=tirets longs, 6=deux tirets).
- ltw : épaisseur du trait. Comme pour les arguments de type cex une valeur supérieure à 1 augmente l’épaisseur, une valeur inférieure à la diminue.
On obtient donc un graphique vide, mais de la bonne taille pour accueillir nos données (cliquer sur l’image pour la voir en taille réelle) :
b. Représenter les points et les étiquettes des modalités actives
C’est la seconde étape importante : il s’agit de faire en sorte que dans l’ensemble le graphique soit lisible, tout en utilisant les fonctionnalités graphiques de R pour représenter visuellement toutes les informations importantes pour l’analyse. Commençons par dessiner les points des modalités actives :
> points(resultats$var$coord[moda, 1:2], col=”black”, pch=c(15, 16, 16, 17, 17, 6, 6), cex=1.5)
Dans cet exemple, on ne va representer que les modalités actives qui contribuent plus que la moyenne, avec la condition [moda, 1:2] (1:2 pour sélectionner les coordonnées sur les deux premiers axes) ; l’argument pch permet de choisir la forme du point10, etc. L’argument cex fixe la taille des points : pour des raisons de lisibilité du graphique, on multiplie par 1.5 la taille par défaut. Il serait également possible de proportionner la taille des points à la contribution de chaque modalité, en affectant à cex la moyenne des contributions sur les deux premiers axes par exemple…
On positionne ensuite les étiquettes des modalités actives. Pour récupérer ces étiquettes, on peut utiliser rownames(resultats$var$coord) par exemple :
> etiquettes <- rownames(resultats$var$coord)
> print(etiquettes)
[1] “hard.rock_Non” “hard.rock_Oui” “lecture.bd_Non” “lecture.bd_Oui” “peche.chasse_Non”
[6] “peche.chasse_Oui” “cuisine_Non” “cuisine_Oui” “bricol_Non” “bricol_Oui”
[11] “cinema_Non” “cinema_Oui” “sport_Non” “sport_Oui”
Si l’on indexe le vecteur lab avec les valeurs de moda, on obtient automatiquement les labels des dix modalités actives les plus contributives, qu’on va afficher avec la fonction text() :
> text(resultats$var$coord[moda,1:2], labels=etiquettes[moda], col=”black”, cex=1, pos=4)
La fonction text() prend tout d’abord deux valeurs x et y qui permettent de positionner le texte. Ici, on fournit pour x les coordonnées de nos modalités sur le premier axe, et pour y les coordonnées de nos modalités sur le deuxième axe. L’argument labels permet de préciser le texte à écrire : ici, les noms des modalités actives, avec les mêmes couleurs que pour les points. L’argument pos permet de fixer la position du label par rapport à sa coordonnée afin de faire en sorte que les labels ne se chevauchent pas : 1/ dessous ; 2/ à gauche ; 3/ dessus ; 4/ à droite. Ici, on a choisi de les afficher à droite des points.
c. Ajout des modalités supplémentaires
On s’intéresse désormais à l’objet resultats$quali.sup$coord, qui stocke les coordonnées des variables qualitatives supplémentaires. On se rappelle qu’on a ajouté 5 variables supplémentaires dans le modèle : age (groupé en quartiles), sexe, nivetud et qualif. Les coordonnées des modalités de ces variables supplémentaires, qui correspondent aux « centres de gravité » des individus qui portent les propriétés correspondantes, peuvent être utilisées pour « projeter » ces modalités sur le plan factoriel structuré par les variables actives.
> print(resultats$quali.sup$coord[, 1:2])
Pour y parvenir, on va cette fois utiliser seulement la fonction text(), pour alléger le graphique et distinguer encore plus clairement les modalités supplémentaires des modalités actives.
> text(resultats$quali.sup$coord[c(1:4, 6:7, 9:13), 1:2]*1.2, labels=rownames(resultats$quali.sup$coord[c(1:4, 6:7, 9:13), ]), cex=0.8, col=”blue”, font=3)
On remarquera dans l’instruction ci-dessus qu’on a multiplié les coordonnées des variables supplémentaires par un coefficient de 1.2, ce qui permet de dilater un peu leur représentation pour en faciliter la lecture. Cette pratique, qui peut prêter à discussion, doit être signalée en légende du graphique : on indiquera par exemple ici que « les coordonnées des modalités supplémentaires ont été éloignées du centre du graphique dans un rapport de 120% pour faciliter la lecture ».
Enfin, il peut être utile de relier les points d’une même variable entre eux afin de mieux mettre en évidence l’ordonnancement de ses modalités sur l’un ou l’autre des axes, en particulier dans le cas de variables ordinales (dont les modalités peuvent être hiérarchisées). C’est le cas ici des tranches d’âge, qu’on va donc relier par une ligne bleue :
> lines(resultats$quali.sup$coord[1:4,1:2]*1.2, col=”blue”, lty=4)
La fonction lines() prend comme deux premiers arguments les coordonnées des points à relier. Ici, on a relié les points de la variable d’âge, soit les quatre premières modalités de l’objet resultats$quali.sup$coord pour le premier et le second axe. L’argument lty permet de définir le type de ligne, ici des pointillés.
Et voici le résultat :
d. Ajout d’une légende avec les noms des variables.
On peut enfin souhaiter ajouter une légende qui synthétise les noms des variables représentées sur le graphique, en reprenant le code de couleurs et de symboles. On utilise pour cela la fonction legend :
legend(“topleft”, legend=c(“Pêche et chasse”, “Bricolage”, “Cinéma”, “Sport”, “Supplémentaires”), bty=”y”, bg=”white”, text.col=c(1,1,1,1,”blue”), col=c(1,1,1,1,”blue”), pch=c(15,16,17,6,0), cex=0.8, pt.cex=c(1,1,1,1,0))
Explication des arguments :
- Le premier argument positionne la légende dans le graphique ; d’autres positions sont possibles : “”top”, “topright”, “right”, bottomright”, “bottom”, “bottomleft”, “left”, “center”.
- L’argument legend spécifie ce qu’il s’agit d’écrire dans la légende.
- bty précise si un cadre doit être tracé (bty=”o”) ou non (bty=”n”).
- bg précise la couleur de fond de la légende.
- Les arguments text.col, col et pch reprennent les couleurs et les symboles utilisés dans le graphique afin de les affecter non plus aux modalités mais aux types de variables.
- cex et pt.cex permet d’indiquer la taille du texte et des points. Ici, 0 permet de ne pas afficher de points pour la légende des « modalités supplémentaires ».
C. Le nuage des individus pas à pas
Il est souvent très instructif d’observer le nuage des individus. La fonction plot.MCA du package FactoMineR, avec l’argument invisible=c(“var”, “quali.sup”), est la plupart du temps suffisante. L’argument habillage permet également de colorer les points des individus selon leur modalité de réponse à telle ou telle question.
Mais dans les cas où le jeu de données comporte un grand nombre d’individus, il arrive que la mémoire du logiciel R soit insuffisante, et qu’il soit impossible de générer un graphique via la fonction plot.MCA. Il arrive également que la légende créée automatiquement ne soit pas bien positionnée et cache en partie le nuage de points. C’est pourquoi on va de nouveau avoir recours aux fonctions graphiques habituelles de R…
a. Représenter le nuage des individus.
On s’intéresse ici à l’objet resultats$ind$coord, qui stocke cette fois les coordonnées des individus sur les différents axes. On représente ici tout simplement les points des individus sur les deux premiers axes avec la fonction points(), après avoir créé un cadre vide comme on a appris à le faire à l’étape précédente :
> windows(7, 10)
> par(mfrow=c(1,1))
> plot(resultats$ind$coord[, 1:2], type=”n”, xlab=paste0(“Axe 1 (“, round(resultats$eig[1,2], 1), “%)”), ylab=paste0(“Axe 2 (“, round(resultats$eig[2,2], 1), “%)”), main=”Nuage des individus”, cex.main=1, cex.axis=0.8, cex.lab=0.8, font.lab=3)
> abline(h=0, v=0, col=”grey”, lty=3, lwd=1)
> points(resultats$ind$coord[, 1:2], col = rgb(0, 0, 0, 0.1), pch = 19)
On remarquera que dans l’instruction points() de la dernière ligne ci-dessus, on a utilisé l’argument col=rgb() pour définir la couleur noire des points : le dernier paramètre à 0.1 nous permet de définir une forte transparence des points, ce qui fait qu’en cas de superposition, la nuance de gris obtenue par superposition donnera une idée du nombre de points superposés…
b. Habiller le nuage des individus en fonction du sexe
Si on veut habiller le nuage des individus en fonction du sexe, il suffit de colorer les points avec un vecteur numérique qui prend autant de valeurs qu’il y a de modalités à DONNEES$sexe :
> windows(7, 10)
> par(mfrow=c(1,1))
> plot(resultats$ind$coord[, 1:2], type=”n”, xlab=paste0(“Axe 1 (“, round(resultats$eig[1,2], 1), “%)”), ylab=paste0(“Axe 2 (“, round(resultats$eig[2,2], 1), “%)”), main=”Nuage des individus selon le sexe”, cex.main=1, cex.axis=0.8, cex.lab=0.8, font.lab=3)
> abline(h=0, v=0, col=”grey”, lty=3, lwd=1)
> points(resultats$ind$coord[,1:2], col=as.numeric(DONNEES$sexe), pch=19)
> legend(“topright”, legend=levels(DONNEES$sexe), bty=”o”, text.col=1:2, col=1:2, pch=19, cex=0.8)
Le résultat obtenu permet une identification complémentaire non seulement de la position des individus dans l’espace des loisirs en fonction du genre, mais également de la dispersion plus ou moins grande de chacun des genres dans cet espace. D’autres techniques peuvent évidemment servir à représenter ainsi la localisation et la dispersion, comme le traçage d’ellipses : on se reportera à ce sujet au tutoriel de Claire Lemercier déjà cité plus haut.
c. Pondérer le nuage des individus
Arrivés à ce point du tutoriel, vous savez l’essentiel de ce qu’il faut savoir à propos de l’élaboration avec R de représentations graphiques d’analyses des correspondances multiples. Vous pouvez parfaitement vous arrêter là ! Mais si vous voulez aller plus loin, vous pouvez poursuivre en explorant à la fois les possibilités graphiques presque illimitées offertes par R11, et en explorant également celles offertes par les capacités du logiciel en matière de manipulation des données et de calcul.
Si vous voulez un aperçu d’une utilisation un peu plus complexe de ces capacités, vous pouvez lire ce qui suit, mais c’est sans obligation… On essaie, pour finir ce tutoriel, de résoudre un problème posé par l’analyse du nuage des individus produit ci-dessus. On voit facilement sur les graphiques précédents que le nombre de points représentés est probablement inférieur à une centaine, soit beaucoup moins que les 2000 individus présents dans notre table de données. Cela est dû au fait qu’en raison du faible nombre de modalités actives, de nombreux individus possèdent exactement le même profil de loisirs, et donc occupent exactement la même position dans le plan factoriel. Leurs points, tracés par R les uns après les autres dans l’ordre de la base de données, se superposent donc, et il est impossible de savoir combien il y en a sur chaque position. En outre, sur le dernier graphique, celui du nuage des individus selon le sexe, la couleur des points correspond sur chaque position à la couleur du dernier point tracé par R, et donc rien ne garantit la fiabilité de l’analyse de la distribution des hommes et des femmes dans le premier plan factoriel qui serait faite à partir de ce graphique.
Pour résoudre ce problème, on va dans un premier temps construire un tableau ayant autant de lignes que de couples différents de coordonnées, et dont les colonnes comporteront les informations suivantes : abscisse, ordonnée, nombre d’hommes sur cette position, nombre de femmes sur cette position, nombre total d’individus sur cette position. On calculera enfin une dernière colonne, qui sera égale à 1 si le nombre d’hommes est supérieur au nombre de femmes sur cette position, et à 2 si c’est le contraire. Ce tableau est obtenu avec le script suivant :
> # Choisir la variable split
> split <- DONNEES$sexe
> # Calculer les tableaux du nombre d’invididus par position pour chaque modalité du split
> t <- by(resultats$ind$coord[, 1:2], split, table)
> # Transformer les tableaux en dataframes
> t <- lapply(t, as.data.frame, stringsAsFactors=FALSE)
> # Fusionner les tableaux dans un seul tableau avec autant de colonnes que de modalités de split, contenant le nombre d’individus par position pour chaque modalité du split
> tableau <- data.frame(list(Dim.1=””, Dim.2=””))[-1,]
> for (i in 1:length(t)) {tableau <- merge(tableau, t[[i]], by=c(“Dim.1”, “Dim.2”), suffixes=paste0(“.”, (i-1):i), all=TRUE)}
> # Ajouter au tableau une variable size calculant le nombre total d’individus par position
> tableau$size <- apply(tableau[, -(1:2)], 1, sum, na.rm=TRUE)
> # Ne garder que les positions sur lesquelles le nombre d’individus est supérieur à 0
> tableau <- tableau[tableau$size>0, ]
> # Chercher ligne par ligne la modalité qui a le plus d’effectifs sur chaque position
> tableau$col <- apply(tableau[,3:(2+length(t))], 1, function(x){which(x==max(x, na.rm=TRUE))[1]})
On remarquera que ce petit script fonctionne pour n’importe quelle variable de notre base de données : il suffit d’en changer la première ligne pour ranger dans l’objet split la variable avec laquelle on veut « habiller » le nuage pondéré des positions individuelles. Ensuite, il ne reste plus qu’à tracer le graphique de la façon habituelle :
> windows(7, 10)
> par(mfrow=c(1,1))
> plot(tableau[, 1:2], type=”n”, xlab=paste0(“Axe 1 (“, round(resultats$eig[1,2], 1), “%)”), ylab=paste0(“Axe 2 (“, round(resultats$eig[2,2], 1), “%)”), main=”Nuage pondéré des individus selon la CSP”, cex.main=1, cex.axis=0.8, cex.lab=0.8, font.lab=3)
> abline(h=0, v=0, col=”grey”, lty=3, lwd=1) # lignes horizontales et verticales
> # Représenter le nuage des individus
> points(tableau[, 1:2], pch=19, cex=1+tableau$size*10/max(tableau$size), col=tableau$col)
> legend(“topright”, legend=levels(split), bty=”o”, text.col=1:length(t), col=1:length(t), pch=20, pt.cex=1.5, inset=-0.01, y.intersp=0.7, cex=0.7)
Et voici le résultat pour le sexe, puis pour la catégorie socioprofessionnelle (qualif) :
On pourrait objecter qu’en choisissant les couleurs en fonction de simples différences d’effectifs, on « écrase » les catégories peu nombreuses. Les employés sont nombreux dans notre base de données, et c’est la raison pour laquelle ils sont si visibles sur le graphique ci-dessus, même si sur certaines positions qui leur sont ainsi attribuées, les ouvriers ou au contraire les cadres, moins nombreux, pourraient pourtant être plus nombreux qu’attendu (c’est-à-dire si ces positions dans l’espace des loisirs leur étaient attribuées au hasard). Il faut également être conscient du fait qu’un point de grande taille ne veut pas forcément dire que la modalité représentée soit corrélée à l’axe. Ainsi, la variable « sexe » n’est, comme l’indique le graphique des modalités supplémentaires, pas corrélée à l’axe 1 : les modalités « homme » et « femme » étant projetées très proches du barycentre. On peut d’ailleurs facilement corriger cela, par exemple en divisant les effectifs de chacun par l’effectif total de leur catégorie avant de voir qui est – cette fois proportionnellement à sa catégorie – le plus sur-représenté sur chaque position. Cela étant dit, notre façon très simple de faire ici permet de traduire une réalité sensible du monde social : elle montre qui, à chaque endroit ici de l’espace des loisirs, se sent majoritaire, entouré d’un grand nombre (en valeur absolue donc) d’individus socialement semblables : du côté du cinéma, ce seront indéniablement les cadres.
Conclusion
Pour terminer, il faut redire ce que tutoriel fait, et ce qu’il ne fait pas :
- Ce qu’il fait : il peut vous aider assez utilement (nous espérons) à construire avec R des représentations graphiques d’analyses factorielles présentables, et visuellement efficaces pour explorer vos données et présenter les résultats de vos enquêtes. Ce faisant, il s’inscrit pleinement, il nous semble, dans la vocation de l’analyse factorielle, qui est justement de permettre au chercheur de s’appuyer sur l’imagination graphique pour rendre compte de façon condensée de la plus grande quantité d’information possible.
- Ce qu’il ne fait pas : notre propos n’était ni d’expliquer les fondements mathématiques de l’analyse factorielle, ni de fournir une aide détaillée pour l’analyse et l’interprétation des résultats de vos analyses des correspondances multiples. Pour tout cela, encore une fois, nous vous renvoyons à la lecture par exemple des travaux de Philippe Cibois, et en particulier de ses Méthodes d’analyse d’enquêtes (2014), que nous venons de rééditer dans la Bibliothèque idéale des sciences sociales, et qui y sont en accès libre en texte intégral. Pour une aide détaillée à l’interprétation d’une analyse des correspondances multiples, vous pouvez également vous reporter à ce billet de Quanti : « Trideux (2) : Réaliser une analyse factorielle » (Cibois et Mercklé, 2008).
Même si le propos n’était pas de montrer comment analyser et interpréter une analyse des correspondances multiples sur des données réelles, mais de montrer comment la représenter graphiquement, cela ne nous empêche pas, pour conclure, de dire quand même un mot d’analyse de l’exemple que nous avons utilisé tout au long de ce tutoriel. Qu’aurait-il fallu dire des loisirs des Français, au vu de ces données extraites de l’enquête « Histoires de vie » réalisée par l’INSEE en 2003 ? Les quelques indications énumérées ci-dessous vous aideront peut-être pour lire vos propres ACM…
- L’analyse des contributions des modalités actives montre que le premier facteur oppose dans l’ensemble les pratiquants aux non-pratiquants, ce qui permet de considérer que le premier axe qui structure l’espace des loisirs est celui de la participation, qui augmente quand on se déplace de la gauche vers la droite du premier plan factoriel.
- Le deuxième facteur, représenté par l’axe des ordonnées du premier plan factoriel, oppose plutôt deux catégories de pratiques, avec d’un côté les pêcheurs et chasseurs (ces pratiquent expliquent plus de la moitié de l’inertie représentée sur l’axe vertical), qui sont aussi les bricoleurs, et de l’autre les amateurs de sport et de cinéma.
- La projection des modalités supplémentaires et l’analyse du nuages des individus montre que le premier axe, celui de la participation culturelle, correspond très nettement à l’âge : celui-ci augmente quand on se déplace de la droite vers la gauche, et témoigne donc d’un retrait des plus âgés hors de l’espace des loisirs ; quant au second axe, il semble associé à une combinaison du sexe et du milieu social, avec les hommes et les classes populaire du côté de la chasse, la pêche et le bricolage, et les femmes et les cadres du côté du sport et du cinéma.
Et maintenant, à vous de jouer !…
Références bibliographiques
Barnier Julien, 2009, « R pour les sociologues : une introduction au fameux logiciel libre d’analyse des données », Quanti, mis en ligne le 26/01/2009, consulté le 28/03/2014, http://quanti.hypotheses.org/217/.
Barnier Julien, 2013, Introduction à R, Centre Max Weber, https://github.com/juba/intro-r/blob/master/intro.pdf.
Cibois Philippe, 1986, « L’analyse des correspondances : l’indispensable retour aux données », Histoire & Mesure, vol. 1, n° 3-4, pp. 239-247., http://www.persee.fr/web/revues/home/prescript/article/hism_0982-1783_1986_num_1_3_1540.
Cibois Philippe, 1997, « Les pièges de l’analyse des correspondances », Histoire & Mesure, 12 (3/4), pp. 299-320, http://perso.orange.fr/cibois/H&M.pdf.
Cibois Philippe, 2014, Les méthodes d’analyse d’enquête, Lyon, ENS Editions, coll. « Bibliothèque idéale des sciences sociales », préf. Pierre Mercklé, https://books.openedition.org/enseditions/1443.
Cibois Philippe et Mercklé Pierre, 2008, « Trideux (2) : Réaliser une analyse factorielle », Quanti, mis en ligne le 27/11/2008, consulté le 01/04/2014, http://quanti.hypotheses.org/146/.
Escoffier et Pagès, 2008, Analyses factorielles simples et multiples. Objectifs, méthodes et interprétation, PAris, Dunod.
Husson François, 2009, Analyse des données avec R, Rennes, Presses universitaires de Rennes.
Lê Sébastien, Josse Julie et Husson François, 2008, « FactoMineR: An R Package for Multivariate Analysis », Journal of Statistical Software, Volume 25, Issue 1, March, http://factominer.free.fr/docs/article_FactoMineR.pdf.
- Ce texte a bénéficié des relectures attentives des étudiants du séminaire « Méthode quantitatives en sciences sociales de l’ENS de Lyon », et en particulier de Salomé Fournet-Fayas, Margot de Groot van Emden, Marie Helluin, Lucie Jégat et Quentin Zimmermann. Il a bénéficié également des éclairages de Philippe Cibois, Baptiste Coulmont, Frédéric Lebaron et Claire Lemercier. Le script pour R qui l’accompagne a été corrigé dans le détail par Julien Barnier. [↩]
- Pour cela, il faut lire le livre que la Bibliothèque idéale des sciences sociales (Bi2S) vient de rééditer, et qui est disponible en ligne en texte intégral : Cibois Philippe, 2014, Les méthodes d’analyse d’enquête, Lyon, ENS Editions (Bibliothèque idéale des sciences sociales), [en ligne] [URL : https://books.openedition.org/enseditions/1443]. Voir également l’ouvrage rédigé par les créateur du package FactoMineR : Husson et al., 2009, Analyse des données avec R, Rennes, PUR ; ainsi que Jérôme Escoffier et Brigitte Pagès, 2008, Analyses factorielles simples et multiples. Objectifs, méthodes et interprétation, Paris, Dunod. Les travaux de Brigitte Le Roux et Henry Rouanet ont aussi beaucoup contribué au développement et à la diffusion de la méthode, notamment dans sa dimension géométrique : 1993, Analyse des données multidimensionnelles. Statistique en science humaines, Paris, Dunod ; 2009, Multiple Correspondence Analysis, Los Angeles, Sage Publications (Quantitative Applications in the Social Sciences), n˚ 163 ; 2014, Analyse géométrique des données multidimensionnelles, Paris, Dunod. [↩]
- Les utilisateurs avertis de R pourront également utiliser les fonctions créées par Joël Gombin, qui permettent de créer des graphs d’ACM selon la logique graphique du package ggplot2 : https://github.com/joelgombin/ggplot.acm. [↩]
- Lê Sébastien, Josse Julie et Husson François, 2008, « FactoMineR: An R Package for Multivariate Analysis », Journal of Statistical Software, Volume 25, Issue 1, March, http://factominer.free.fr/docs/article_FactoMineR.pdf. [↩]
- Si vous n’êtes pas familier avec le logiciel R, vous pouvez consulter ce tutoriel d’introduction, qui permet de comprendre rapidement comment installer R et réaliser les opérations les plus simples : Barnier Julien, 2009, « R pour les sociologues : une introduction au fameux logiciel libre d’analyse des données », Quanti, mis en ligne le 26/01/2009, consulté le 28/03/2014, http://quanti.hypotheses.org/217/. Pour des usages plus avancés, voir Barnier Julien, 2013, Introduction à R, Centre Max Weber, https://github.com/juba/intro-r/blob/master/intro.pdf. De manière générale, toute question trouve réponse sur les forums dédiés à R… Le charme des logiciels libres… [↩]
- Entre autres avantages que nous n’avons pas la possibilité de détailler ici. Pour plus d’informations, et pour télécharger RStudio : https://www.rstudio.com. [↩]
- Pour installer l’interface R-Commander, voir http://www.rcommander.com/. Pour utiliser FactoMineR avec R-Commander, voir le tutoriel de Claire Lemercier : http://www.quanti.ihmc.ens.fr/IMG/pdf/Tutoriel_FactomineR_ACM.pdf. [↩]
- Sur les nombreuses fonctions du package questionr qui peuvent être très utiles pour les sociologues, voir à nouveau le manuel d’introduction à R de Julien Barnier : Barnier Julien, 2013, Introduction à R, Centre Max Weber, https://github.com/juba/intro-r/blob/master/intro.pdf. [↩]
- Si les variables qu’on souhaite utiliser ne sont pas reconnues comme des facteurs par R, alors il faudra les « factoriser », en utilisant simplement la fonction factor(). [↩]
- Pour voir les codes des différentes formes de points : http://www.endmemo.com/program/R/pchsymbols.php. [↩]
- Pour une présentation plus détaillée des fonctions graphiques de R, voir par exemple le billet d’Arthur Charpentier, « La base des graphiques avec R » ; pour plus d’informations sur l’ajout d’éléments à un graphiques, voir http://www.duclert.org/Aide-memoire-R/Graphiques/Rajout-d-elements.php. [↩]
OpenEdition vous propose de citer ce billet de la manière suivante :
Anton Perdoncin (2 mai 2014). Représenter graphiquement les résultats d’une analyse factorielle avec R. QUANTI / Sciences sociales. Consulté le 9 octobre 2024 à l’adresse https://doi.org/10.58079/t4b8
Très utile tutoriel, qui de plus a le mérite de rentrer dans les détails des données représentées. Merci d’avoir cité la fonction que j’avais développé pour pouvoir représenter des analyses factorielles dans le cadre de ggplot2. Pour information, quelqu’un a aussi développé l’équivalent pour les ACP : https://github.com/jiho/autoplot. Il faudrait sans doute un jour faire un package unifié pour rassembler tous ces bouts de code qui se baladent !
Merci aux auteurs pour cet article très didactique, très utile pour les débutants comme moi.
Bonjour,
Merci pour cet article et merci pour le blog aussi.
Pascal Vallet
Trois petites remarques (tardives, puisque le tuto a été mis en ligne il y a plusieurs mois) :
1/ le jeu de données présenté n’est pas totalement convaincant : sa multidimentionnalité est assez limitée
2/ il existe désormais un package R pour FactoMiner dédié à l’analyse géométrique des données : “GDAtools”, développé par Nicolas Robette (UVSQ). Sa mise en ligne a peut-être été postérieure à celle du tuto.
3/Le Que-sais-je de Philippe Cibois est certes utile, mais n’offre pas réellement de présentation “géométrique” de l’analyse des données. Pourquoi ne pas mentionner les travaux de Brigitte Le Roux et d’Henry Rouanet ?
Bien cordialement,
François Denord
Bonjour,
Merci pour ce commentaire. Quelques éléments de réponse :
1/ Le caractère simpliste du jeu de données est délibéré, afin de ne pas trop complexifier le code.
2/ GDATools est en effet très utile. Ce package permet notamment (fonction speMCA) de réaliser des ACM spécifiques (i.e. de faire en sorte que certaines modalités des variables actives ne contribuent pas aux axes), et de projeter aisément des variables illustratives sur les graphs (fonction varsup). L’ACM spécifique a également été codée par N. Robette pour le package FactoMineR (fonction spMCA), mais il est alors impossible de projeter des variables illustratives. La documentation de GDATools est disponible ici : http://cran.r-project.org/web/packages/GDAtools/index.html
3/ Merci pour le rappel des travaux de Le Roux et Rouanet. C’est un oubli de notre part (qui vient d’être réparé : voir note 2). L’objet de ce tuto n’est toutefois pas d’entrer dans les détails techniques de la méthode. Il faudrait sans doute consacrer un autre tuto à l’analyse géométrique des nuages de point, et notamment à la décomposition de la variance…
Et bien merci beaucoup pour ce tutoriel, ceci m’a permit de réaliser un graphique beaucoup plus lisible que le graphique de base de Factomine R !
Des explications claires qui permettent de comprendre les codes, j’ai appris beaucoup de choses !
Ce tutoriel est indispensable à mon avis pour réaliser une ACM sur R avec le package FactoMineR.
Merci aux auteurs du tutoriel.
Mille merci à vous, ça me sauve la mise vu que je travaille actuellement sur des données d’enquete
Merci beaucoup pour ce tutoriel ! Un réel soulagement de tomber dessus durant mes analyses. J’aurais une question supplémentaire, peut-être naive, n’étant pas un fin codeur sous R.
Disons que je me place à la fin de votre paragraphe 4. B. C. je voudrais savoir s’il est possible de dessiner des ellipses de confiance pour les modalités de variables apparaissant sur le graph ? Je souhaiterais obtenir les mêmes ellipses que celles renvoyées par la fonction >plotellipses() mais sur le graph juste créé et non pas les graph spécifiques à chaque variable que donne la fonction. Savez vous si cela est possible et si oui, auriez-vous des pistes pour m’aider à réaliser ça ? En espérant avoir été suffisamment clair dans mes explications.
Merci beaucoup
Une possibilité pour les ellipses, mais aussi pour une exploration un peu plus interactive des résultats d’ACP/ACM, est de jeter un coup d’oeil du côté du package explor, présenté ici :
https://quanti.hypotheses.org/1171/
Depuis la rédaction de cet article, quelques évolutions permettent de construire des graphiques d’analyse factorielle, et notamment d’ACM, plus facilement.
Le package Factoshiny, permet de paramétrer les méthodes d’analyses factorielles, mais aussi de sélectionner les modalités et individus à afficher en fonction de leur qualité de projection ou de leur contribution. Les graphes sont mis à jour de façon interactive, ce qui permet de travailler un graphe jusqu’à ce que celui-ci soit lisible. Il est alors possible de récupérer la ligne de code pour refaire le graphe dans R. Voir une vidéo présentant Factoshiny ici : https://www.youtube.com/watch?v=4T9tDX4aVS4