class: center, middle, inverse, title-slide # Analyse en composantes principales ## pour visualiser et comprendre des données complexes ### Marie-Pierre Etienne ###
marie-pierre.etienne@agrocampus-ouest.fr
### 2021/12/21 (updated: 2023-09-08) --- name: intro <!-- F1D763 --> <!-- F7A913 --> <!-- C94326 --> <!-- 1F908E --> <!-- 33658A --> # Introduction -- ## L'exemple des caractéristiques du Doubs On a mesuré les caractéristiques physico chimiques sur 30 sites différents le long de la rivière Doubs. .pull-left[ Les 6 premières lignes (parmi 30) du jeu de données doubs.env ``` # A tibble: 30 × 11 das alt pen deb pH dur pho nit amm oxy dbo <dbl> <int> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> 1 0.3 934 48 0.84 7.9 45 0.01 0.2 0 12.2 2.7 2 2.2 932 3 1 8 40 0.02 0.2 0.1 10.3 1.9 3 10.2 914 3.7 1.8 8.3 52 0.05 0.22 0.05 10.5 3.5 4 18.5 854 3.2 2.53 8 72 0.1 0.21 0 11 1.3 5 21.5 849 2.3 2.64 8.1 84 0.38 0.52 0.2 8 6.2 6 32.4 846 3.2 2.86 7.9 60 0.2 0.15 0 10.2 5.3 # … with 24 more rows ``` ] .pull-right[ * das : distance à al source ( `\(km\)` ), * alt : altitude ( `\(m\)` ) * pen : la pente (denivelelé pour 1000m) * deb : le débit () `\(m^3.s^{-1}\)` ) * pH : le pH de l'eau, * dur : la concentration en calcium ( `\(mg.L^{-1}\)` ), * pho : concentration en phosphate ( `\(mg.L^{-1}\)` ), * nit : concentration en nitrate ( `\(mg.L^{-1}\)` ), * amn : concentration en ammonium ( `\(mg.L^{-1}\)` ), * oxy : concentration d'oxygène dissous ( `\(mg.L^{-1}\)` ), * dbo : Demande biologique en oxygène ( `\(mg.L^{-1}\)` ). ] -- <p class="question"> Comment visualiser au mieux ces données pour faire apparaître les liens entre variables et identifier des resemblances entre individus ?</p> --- template: intro ## L'exemple de la morphologie des manchots On a mesuré les caractéristiques morphologiques de divers manchots : .pull-left[ Les 6 premières lignes (parmi 333 ) du jeu de données doubs.env ``` # A tibble: 333 × 4 bill_length_mm bill_depth_mm flipper_length_mm body_mass_g <dbl> <dbl> <int> <int> 1 39.1 18.7 181 3750 2 39.5 17.4 186 3800 3 40.3 18 195 3250 4 36.7 19.3 193 3450 5 39.3 20.6 190 3650 6 38.9 17.8 181 3625 # … with 327 more rows ``` ] .pull-right[ * bill_length_mm : la longueur du bec, * bill_depth_mm : l'épaisseur du bec, * flipper_length_mm : la longueur de la nageoire, * body_mass_g : le poids du corps. ] -- <p class="question"> Comment visualiser au mieux ces données pour faire apparaître les liens entre variables et identifier des resemblances entre individus ?</p> --- template: intro ## Formalisation * Un individu statistique `\(i\)`, on a mesuré `\(n\)` individus. * Pour chaque individu, on a mesuré `\(p\)` variables différentes. Les données sont rangées dans un tableau à `\(n\)` lignes et `\(p\)` colonnes. .pull-left[ <img src="./acp_data_pres.png" width="80%" height="30%" style="display: block; margin: auto;" /> ] .pull-righ[ On note `\(x_{ik}\)` la valeur mesurée pour la variable `\(k\)` sur l'individu `\(i\)`, et * `\(x_{\bullet k} = \frac{1}{n} \sum_{i=1}^n x_{ik}\)` la valeur moyenne de la variable `\(k\)`, * `\(s_k = \sqrt{\frac{1}{n} \sum_{i=1}^n (x_{ik}-x_{\bullet k})^2}\)` l'écart type de la variable `\(k\)`, ] --- template: intro ## Même question dans des domaines très variés * Analyse sensorielle : note du descripteur `\(k\)` pour le produit `\(i\)` * Economie : valeur de l’indicateur `\(k\)` pour l’année `\(i\)` * Génomique : expression du gène `\(k\)` pour l'e patient'échantilon `\(i\)` * Marketing : valeur d’indice de satisfaction `\(k\)` pour la marque `\(i\)` etc ... -- On a `\(p\)` variables mesurées sur `\(n\)` individus et on souhaite visualiser ces données pour comprendre les liens entre variables et les proximités entre individus. --- template: intro ## Voir c'est comprendre : comment représenter l'information contenue dans ce tableau ? -- Idée 1 : on représente les liens des variables 2 à 2 <img src="acp_files/figure-html/ggpairs-1.png" width="80%" height="80%" style="display: block; margin: auto;" /> --- template: intro ## Voir c'est comprendre : comment représenter l'information contenue dans ce tableau ? Idée 1 : on représente les liens des variables 2 à 2 <img src="acp_files/figure-html/gg_prog-1.png" width="80%" height="80%" style="display: block; margin: auto;" /> -- On perd l'information sur les autres axes --- template: intro ## Voir c'est comprendre : comment représenter l'information contenue dans ce tableau ? Idée 1 : on représente les liens des variables 2 à 2
--- template: intro .rouge[Objectif :] * Représenter sans perdre trop d'information * idéalement des individus éloignés dans le nuage initial, restent éloignés dans la représentation. -- .rouge[Ce qu'il nous faut :] * quantifier l'information perdue dans la représentation * construire la représentation qui perd le moins d'information possible -- .rouge[Précautions :] * pour rendre comparable des variables exprimées dans des unités différentes, on les centre et on les réduit on définit les mesures centrées réduites `$$x_{ik}' = \frac{x_{ik} - x_{\bullet k}}{s_k}$$` dans la suite, on omet le `\(\prime\)` pour alléger l'écriture. --- name: information # Une mesure de la quantité d'information -- ## L'inertie du nuage de points Les données étant centrées, le point `\(O\)` de coordonnées `\((0, \ldots,0)\)` est le centre du nuage de points. .pull-left[
] .pull-right[ l'inertie quantifie l'nformation portée par le nuage `$$I =\frac{1}{n} \sum_{i=1}^n d^2(x_{i}, 0) = \frac{1}{n} \sum_{i=1}^n \sum_{k=1}^p x_{ik}^2$$` .orange[Remarque :] `$$I =\sum_{k=1}^p \left( \frac{1}{n} \sum_{i=1}^n x_{ik}^2 \right) = \sum_{k=1}^p Var(x_{.k})$$` Si les variables sont réduites `$$I = p$$` ] --- template: information ## L'inertie portée par rapport à un axe `\(\Delta\)` passant par `\(O\)`. <img src="acp_files/figure-html/penguins_centre_proj1-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> --- template: information ## L'inertie portée par rapport à un axe `\(\Delta\)` passant par `\(O\)`. <img src="acp_files/figure-html/penguins_centre_proj_unique-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> L'inertie `\(I_{\Delta}\)` quantifie l'nformation préservée sur la droite et `\(I_{\Delta^\perp}= I - I_{\Delta}\)` l'information perdue (merci Pythagore) `$$I_{\Delta} = \frac{1}{n} \sum_{i=1}^n d^2(\class{rouge}{x^{\Delta}_{i}}, 0)$$` `$$I_{\Delta^\perp} =\frac{1}{n} \sum_{i=1}^n d^2( \class{rouge}{x^{\Delta}_{i}}, x_{i})$$` --- name: construction # Déterminer les meilleurs axes -- ## L'intuition ### Situation simplifiée à 2 variables .pull-left[ <img src="acp_files/figure-html/intuition-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> ] -- .pull-right[ `$$\class{rouge}{I_{\Delta} = 1}$$` `$$\class{jaune}{I_{\Delta} = 1}$$` `$$\class{vert}{I_{\Delta} = 1.89}$$` ] L'inertie mesure la quatité d'information contenue dans les données * Si on ne s'intéresse qu'à la variable poids du corps, on a 1 d'inertie. * Si on ne s'intéresse qu'à la variable longueur des ailes, on a 1 d'inertie. * Si on s'intéresse à la nouvelle variable (compromis entre le poids du corps et la longueur des ailes), on a 1.89. AVec une seule variable bien choisie, on représente presque toute l'information du jeu de données --- template: construction <img src="acp_files/figure-html/concret-1.png" width="70%" height="30%" style="display: block; margin: auto;" /> --- template: construction <img src="acp_files/figure-html/concret_bis-1.png" width="50%" height="30%" style="display: block; margin: auto;" /> -- Les .rouge[composantes principales] sont des combinaisons linéaires des variables initiales Bien sûr ça n'a pas d'intérêt dans le cas de deux variables --- template: construction ## ACP sur l'exemple des manchots ```r library(FactoMineR) dta <- penguins %>% select(bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g) penguins.PCA <- PCA(X = dta, ncp = 4, graph = FALSE) penguins.PCA$eig ``` ``` eigenvalue percentage of variance cumulative percentage of variance comp 1 2.7453557 68.633893 68.63389 comp 2 0.7781172 19.452929 88.08682 comp 3 0.3686425 9.216063 97.30289 comp 4 0.1078846 2.697115 100.00000 ``` --- template: construction ## ACP sur l'exemple des manchots <img src="acp_files/figure-html/PCA_manchots_plot-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> Il s'agit de la représentation en 2 dimensions qui déforment le moins possible le nuage global des points A l'aide de 2 dimensions seulement, on représente 68.63 + 19.45 de l'inertie totale. --- name: interprétation # Interprétation -- ## Quelle information peut on extraire ? ### Sur l'exemple des manchots simplifiés (2var) <img src="acp_files/figure-html/ancienne_nouvel-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> Comment représenter le lien entre les anciennes et les nouvelles variables ? --- template: interprétation ## Qualité de la représentation des variables On regarde l'angle entre les composantes principales et les variables .pull-left[ Les `\(cos^2\)` des variables : ``` Dim.1 Dim.2 Plan.12 1 0.8294881 4.549411e-03 0.8340375 2 0.5652466 2.803042e-01 0.8455508 3 0.9134542 2.606919e-05 0.9134803 4 0.4371669 4.932375e-01 0.9304044 ``` ] -- Une représentation graphique : Le cercle des corrélations ```r plot(penguins.PCA, choix = "var") ``` <img src="acp_files/figure-html/var_proj_quality-1.png" width="60%" height="40%" style="display: block; margin: auto;" /> --- template: interprétation ## Qualité de la représentation des individus .pull-lefts[ <img src="./cos2_ind.png" width="40%" height="30%" style="display: block; margin: auto;" /> ] -- .pull-rightb[ * Le cosinus (au carré pour éviter les questions de signe) de l'angle entre la composante principale est le vecteur `\(\vec{Ox_{i}}\)` nous informe de la qualité de la représentation de l'individu. * Pour mesurer la qualité de la représentation d'un individu sur le plan CP1, CP2, on additionne la qualité de la représentation sur chaque axe. * On ne peut pas discuter des individus mal représentés ] <img src="acp_files/figure-html/acp_penguins_rep-1.png" width="50%" height="30%" style="display: block; margin: auto;" /> --- template: interprétation ## Visualisation conjointe individus et variables sur le premier plan principal 1-2 <img src="acp_files/figure-html/conjoint-1.png" width="90%" height="30%" style="display: block; margin: auto;" /> --- template: interprétation ## Visualisation conjointe individus et variables sur le premier plan principal 3-4 <img src="acp_files/figure-html/conjoint_bis-1.png" width="90%" height="30%" style="display: block; margin: auto;" /> --- name: exemple # Une analyse complète : les caractéristiques du Doubs -- ## La projection sur le premier plan principal ```r doubs.PCA <- PCA(doubs.env, graph = FALSE, ncp = 10) p1 <- plot(doubs.PCA, axes = c(1,2)) p2 <- plot(doubs.PCA, choix = "var", axes = c(1, 2) ) ggpubr::ggarrange(nrow = 1, plotlist = list(p1,p2), ncol = 2) ``` <img src="acp_files/figure-html/doubs_PCA-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> --- template: exemple -- ## Faut-il aller voir les autres composantes principales <img src="acp_files/figure-html/eigen_values-1.png" width="60%" height="30%" style="display: block; margin: auto;" /> --- name: fin # Pour finir en beauté -- ```r library(Factoshiny) PCAshiny(penguins) ``` --- # Ce qu'il faut retenir du cours * L'inertie mesure la quantité d'information. * La valeur propre associée à une composante principale est l'inertie du nuage de points limités à cet axe (nuage projeté sur l'axe). * L'ACP est un changement de repère pour projeter de façon pertinente donc les composantes principales sont des combinaisons linéaires des variables d'origine. * On perd de l'information en projetant, malgré toutes nos précautions. * Vérifier la qualité de la représentation des variables et des individus avant toute interprétation. * Deux variables orthogonales, sont des variables ayant un coefficient de corrélation de 0. * On peut interpréter plus que 2 axes.