--- title: "Initiation to statistics with R - Analyse en Composantes Principales" author: "Sébastien Déjean" date: "`r format(Sys.time(), '%d %B, %Y')`" output: html_document: numbered_sections: yes theme: journal toc: yes toc_float: collapsed: no self_contained: yes --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` > Ce document est un support pour la phase pratique de la formation à l'analyse en composantes principales. Il est vivement conseillé de le personnaliser en y apportant toutes les modifications que vous jugerez pertinentes : supprimer des passages, ajouter vos propres commentaires, insérer de nouvelles lignes de code... ## Chargement des packages Nous allons voir la mise en oeuvre de l'analyse en composantes principales dans R. Le package FactoMineR (parmi d'autres) propose des fonctions permettant sa mise en oeuvre et l'interprétation de ses résultats. Commençons par charger le package FactoMineR, qu'il aura fallu installer préalablement par exemple au moyen de la commande `install.packages("FactoMineR")`, en respectant les majuscules, R étant sensible à la casse. ```{r} library(FactoMineR) ``` ## Données *body_light* ### Importation des données L'importation des données est réalisée avec la fonction `read.table`. Si je veux en savoir plus sur cette fonction, je consulte l'aide `?read.table`. Je pourrais aussi importer les données en utilisant les menus de RStudio, mais c'est moins reproductible comme manipulation. Il est toujours bon de vérifier que la taille du jeu de données importé correspond à ce qui est attendu. ```{r} body.light <- read.table("body_light.csv", header=TRUE, sep=";", dec=",", row.names=1) dim(body.light) ``` Si tout va bien, on continue, sinon on s'interroge sur, par exemple : la présence d'un entête, la présence de noms de lignes dans la première colonne, l'ouverture du fichier csv dans Excel (ce qu'il faut éviter pour ne pas modifier certains codages), le séparateur de colonnes utilisé ( , ou ; )... ### Aperçu Pour un premier aperçu des données, la fonction `summary` est intéressante. ```{r} summary(body.light) ``` On y verrait par exemple la *présence de données manquantes** (tournure de phrase un peu contradictoire...) Graphiquement, quelques boxplots sont sympathiques aussi. ```{r} boxplot(body.light) ``` On voit par exemple que la variable `Taille` est (logiquement) en décalage par rapport aux autres variables. ***Insérer ici vos propres commentaires...*** ### Analyse en composantes principales Réalisons maintenant une analyse en composantes principales. D'abord avec le package `FactoMineR` puis avec les fonctions R de base pour voir. #### Avec FactoMineR Un petit coup d'oeil à l'aide des fonctions ne fait jamais de mal... ```{r} ?PCA ?plot.PCA ``` ... puis on se jette à l'eau. ```{r} res.PCA.body.light <- PCA(body.light) ``` Je n'ai rien demandé, mais il m'a fait des graphiques. Cela dit, le coup d'oeil à l'aide de la fonction `PCA` m'avait prévenu... Si, si, il y a un `graph=TRUE` quelque part dans la rubrique **Usage**. Reprenons en modifiant ce paramètre pour essayer d'y voir plus clair. ```{r} res.PCA.body.light <- PCA(body.light, graph = FALSE) ``` L'aurions-nous vexé ? Il ne dit plus rien. Allons voir de plus près. ```{r} res.PCA.body.light summary(res.PCA.body.light) ``` OK, il a quand même fait plein de choses. Pour savoir ce que le résultat contient, on peut utiliser la fonction `names` et également avoir le détail dans la rubrique **Value** de la fiche d'aide. ```{r} names(res.PCA.body.light) ``` On peut ensuite regarder les éléments séparément si on le souhaite. - Les parts de variance expliquée ```{r} res.PCA.body.light$eig ``` On retrouve ici les pourcentages de variance expliqué présenté dans le support de cours... En fait non, ce ne sont pas tout à fait les mêmes. La raison de cette différence réside dans une option par défaut de la fonction `PCA` : `scale.unit=TRUE` signifie que les données sont centrées-réduites par défaut, ce qui n'est pas le cas de l'exemple montré en cours. - Les coordonnées des variables et d'autres informations relatives aux variables ```{r} res.PCA.body.light$var ``` - Les coordonnées des individus et d'autres informations relatives aux individus ```{r} res.PCA.body.light$ind ``` ***Insérer ici vos propres commentaires ainsi que vos lignes de code pour réaliser une ACP sur les données brutes, c'est à dire et non centrées-réduites...*** On peut ensuite choisir de représenter les graphiques qui n'ont pas été produits par défaut en choisissant de représenter les individus ou les variables. ```{r} plot(res.PCA.body.light, choix="ind") ``` ```{r} plot(res.PCA.body.light, choix="var") ``` On voit que ... #### Sans utiliser FactoMineR Le traditionnel coup d'oeil à l'aide de la fonction que l'on va utiliser. ```{r} ?prcomp ``` On peut noter au passage une option `scale.=FALSE`... ```{r} res.prcomp.body.light <- prcomp(body.light) res.prcomp.body.light summary(res.prcomp.body.light) ``` ```{r} plot(res.prcomp.body.light) ``` ```{r} biplot(res.prcomp.body.light) ``` ## Données *body_full* Vous pouvez maintenant rejouer la même partition avec un autre jeu de données. ### Importation des données ```{r} body.full <- read.table("body_full.csv", header=TRUE, sep=";", dec=",") dim(body.full) ``` ### Aperçu ```{r} summary(body.full) ``` On note au passage que le jeu de données contient une variable qualitative sur la 25ème et dernière colonne et on en tient compte au moment de représenter les boxplots... ```{r} boxplot(body.full[,-25], las=3, cex.axis=0.65) ``` ### Analyse en composantes principales ... ainsi que dans l'ACP. Ce que la fonction `PCA` de FactoMineR permet très simplement avec l'option `quali.sup`. ```{r} res.PCA.body.full <- PCA(body.full, graph = FALSE, quali.sup = 25) ``` Cela est très utile au moment de représenter les individus de façon différenciée selon la catégorie qui les caractérisent. ```{r} plot(res.PCA.body.full, choix = "ind", habillage = 25, label = "none") ``` Ce qui ne change rien au fait que **l'ACP est une méthode non supervisée**. Le facteur `gender` n'est utilisé ici qu'après avoir effectué les calculs, simplement pour colorer les points. On voit que... ## Mes données ### Importation ### Aperçu ### ACP ### ... ## Session information Une bonne habitude à prendre lorsque l'on travaille avec R Markdown. Cela permet parfois de comprendre pourquoi on n'obtient pas les mêmes résultats que : la dernière fois / le collègue qu m'a envoyé le script / dans la publi qui utilise pourtant le même code / ... ```{r sessionInfo} sessionInfo() ```