Rbandeau

[R] Pense-bête: réaliser une ACM en ggplot

Vous souhaitez réaliser une ACM (analyse des correspondances multiples) avec R mais vous souhaitez pouvoir personnaliser cette ACM de la même façon que vos autres graphiques avec R, en utilisant ggplot2.

L’excellent Joël Gombin a développé le package qu’il vous faut: ggplot.acm. Il est encore en version beta, mais il permet déjà pas mal d’améliorations.

Pour bien commencer, il est toujours utile de (re)lire le très pédagogique billet d’Anton Perdoncin, « Représenter graphiquement les résultats d’une analyse factorielle avec R« .


Comment ça marche?

Vous aurez besoin des packages suivants:  devtools, ggplot2FactoMineR, directlabels.

require(devtools)
install.packages(c("ggplot2","ElemStatLearn","mlmRev"))
install.packages("directlabels", repos="http://r-forge.r-project.org")
library(FactoMineR)
library(ggplot2)
library(directlabels)
install_github("ggplot.acm","joelgombin")

require("ggplot.acm")

Après avoir travaillé vos données comme vous l’entendez, vous avez un DataFrame contenant les variables que vous souhaitez afficher dans votre ACM, qu’elles soient actives ou supplémentaires. Evidemment, les données utilisées ici n’ont pas grand intérêt placées en ACM, si ce n’est pour l’exemple.

Commençons:

data(USArrests)
str(USArrests)
summary(USArrests$Murder)
USA<-as.data.frame(USArrests)

USA$Murder[USArrests$Murder <= 4.00]<- "Moins de 4 meurtres/100K hab"
USA$Murder[USArrests$Murder > 4.00 & USArrests$Murder < 7]<- "Entre 4 et 7 meurtres/100K hab"
USA$Murder[USArrests$Murder >= 7.00 & USArrests$Murder < 10]<- "Entre 7 et 10 meurtres/100K hab"
USA$Murder[USArrests$Murder >= 10.00]<- "Plus de 10 meurtres/100K hab"
#vérification
USA$Murder<-as.factor(USA$Murder)
summary(USA$Murder)

summary(USArrests$Assault)
USA$Assault[USArrests$Assault<=100]<-"Moins de 100 agressions/100K hab"
USA$Assault[USArrests$Assault>100 & USArrests$Assault <150]<-"Entre 100 et 150 agressions/100K hab"
USA$Assault[USArrests$Assault>=150 & USArrests$Assault <250]<-"Entre 150 et 250 agressions/100K hab"
USA$Assault[USArrests$Assault>=250]<-"Plus de 250 agressions/100K hab"
#vérification
USA$Assault<-as.factor(USA$Assault)
summary(USA$Assault)

summary(USArrests$UrbanPop)
USA$UrbanPop[USArrests$UrbanPop<=50]<-"Etat rural"
USA$UrbanPop[USArrests$UrbanPop>50 & USArrests$UrbanPop <=66]<-"Etat en cours d'urbanisation"
USA$UrbanPop[USArrests$UrbanPop>66 & USArrests$UrbanPop <=75]<-"Etat plutot urbain"
USA$UrbanPop[USArrests$UrbanPop>75]<-"Etat tres urbain"
#vérification
USA$UrbanPop<-as.factor(USA$UrbanPop)
summary(USA$UrbanPop)

summary(USArrests$Rape)
USA$Rape[USArrests$Rape<=15]<-"Entre 7 et 15 viols/100K hab"
USA$Rape[USArrests$Rape>15 & USArrests$Rape <=20]<-"Entre 15 et 20 viols/100K hab"
USA$Rape[USArrests$Rape>20 & USArrests$Rape <=25]<-"Entre 20 et 25 viols/100K hab"
USA$Rape[USArrests$Rape>25]<-"Plus de 25 viols/100K hab"
USA$Rape<-as.factor(USA$Rape)
summary(USA$Rape)

Attention, prenez soin à ce qu’elles soient toutes des facteurs. Utillisez str() pour vérifier.

str(USA)

'data.frame': 50 obs. of 4 variables:
$ Murder : Factor w/ 4 levels "Entre 4 et 7 meurtres/100K hab",..: 4 4 2 2 2 2 3 1 4 4 ...
$ Assault : Factor w/ 4 levels "Entre 100 et 150 agressions/100K hab",..: 2 4 4 2 4 2 1 2 4 2 ...
$ UrbanPop: Factor w/ 4 levels "Etat en cours d'urbanisation",..: 1 3 4 3 4 4 4 2 4 1 ...
$ Rape : Factor w/ 4 levels "Entre 15 et 20 viols/100K hab",..: 2 4 4 1 4 4 3 1 4 4 ...

Vous réalisez ensuite votre ACM, comme d’habitude, en indiquant les colonnes que vous souhaitez placer en supplémentaires. C’est toujours plus simple d’avoir les actives en premier et les supplémentaires en fin de DataFrame.

USAcrime<-MCA(USA, ncp=2, quali.sup=3, graph=T)

acm_basique

Vous avez ainsi une première ACM qui s’affiche. L’idée est d’en améliorer la présentation.

Encore faut-il savoir ce que l’on souhaite améliorer. La meilleure solution est encore de jouer par vous même avec les différentes possibilités offertes par ce package:

  • mod, pour l’affichage des modalités: TRUE ou FALSE.
  • quali.sup, pour l’affichage des variables qualitatives supplémentaires: T ou F.
  • ind, pour individus supplémentaires: T ou F.
  • axis.plot, pour l’affichage des axes: T ou F.
  • alpha, pour la transparence des individus représentés: va de 0 à 1.
  • point.type, pour la taille des points représentant les individus: "petit" ou "gros".
  • dl.method, pour direct labelling method, indique la façon dont vous souhaitez que les textes soient affichés. Mon conseil est de choisir plutôt smart.grid.
  • labels, pour choisir quelles variables doivent être accompagnées de texte: all, var ou sup.
  • label.size, pour la taille du texte, se trouve par défaut à 5: peut être descendu ou augmenté, selon vos choix.

D’autres éléments peuvent être indiqués, vous les retrouverez en demandant l’aide de ggplot.acm.

En pratique…

On se retrouve donc avec, par exemple:

USAcrime_un<-autoplot(USAcrime, axes=c(1, 2), mod= TRUE, quali.sup=T, ind=T, axis.plot=T, alpha=.1, point.type="gros")

Ce qui donne beaucoup d’informations, un peu trop.

Essayons autre chose.

USAcrime_deux<-autoplot(USAcrime, axes=c(1, 2), mod= TRUE, quali.sup=F, ind=F, axis.plot=T, labels = "var",label.size=6)

Essayons de n’indiquer que les variables supplémentaires.

USAcrime_trois<-autoplot(USAcrime, axes=c(1, 2), mod= F, quali.sup=T, ind=T, axis.plot=T, labels="all" point.type="petit", dl.method = "smart.grid",label.size=3)

ACM_supp

Je vous conseille de triturer ces codes à votre guise afin d’obtenir le résultat que vous souhaitez.

Le gros avantage de ce package est le fait qu’il offre un objet ggplot, qui peut donc être travaillé comme les autres graphiques: thèmes, titres, légendes … Tout peut être retouché.

Pour obtenir un fond blanc, il vous suffit ainsi de rajouter une ligne:

graphsurfondblanc<-USAcrime_deux+theme_bw()

Pour placer votre légende en dessous de l’analyse factorielle et un titre en gras au dessus:
graphsurfondblanc+theme(legend.position="bottom")+ ggtitle("Le crime aux Etats-Unis dans chaque état") + theme(plot.title = element_text(lineheight=.8, face="bold"))

ACM_testL’idée n’était pas ici de présenter les meilleures améliorations possibles avec ce package (encore moins d’expliquer le crime aux Etats-Unis!), mais de présenter l’intérêt de cette version beta et d’encourager les spécialistes à envisager le pistes de développements pour celui-ci. Parmi les améliorations que je serais curieux de connaître (avis aux amateurs):

  • comment changer les couleurs des variables.
  • quel petit hack permettrait de peaufiner le direct labelling en donnant des coordonnées directement aux textes, car, comme vous le voyez, c’est encore le point faible de cette méthode.
  • comment personnaliser les icônes localisant les variables.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *