Exemple d’Analyse en Composantes principales

Auteur·rice

Guillaume Guex

Objectif

Dans cet exemple, nous allons effectuer une Analyse en Composantes principales sur le fichier cantons.csv, qui possède plusieurs variables socioéconomiques sur la cantons suisses. Nous allons utiliser les packages R suivants :

library(tidyverse) # Pour la manipulation de données et la visualisation
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(FactoMineR) # Pour les méthodes factorielles
library(factoextra) # Plusieurs fonctions pour visualiser les résultats de l'ACP
Welcome to factoextra!
Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
library(knitr) # Pour afficher les tableaux de manière plus jolie)

Chargement des données

On commence par charger le fichier de données et on nomme les colonnes avec le nom des cantons (utile pour les graphiques) :

df = read_csv("cantons.csv")
Rows: 26 Columns: 9
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): nom
dbl (8): poperm2013, propdivo, propmari, propchom, propsoc, propnaiss, propd...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df = df %>% 
  column_to_rownames(var="nom")
kable(df)
poperm2013 propdivo propmari propchom propsoc propnaiss propdec croissance
appenzellext 53691 0.0021605 0.0042093 0.0093514 0.0198171 0.0092753 2e-07 1.006947
appenzellint 15778 0.0015211 0.0044999 0.0077164 0.0110280 0.0114083 7e-07 1.004817
argovie 636362 0.0019203 0.0049076 0.0156309 0.0200358 0.0100933 0e+00 1.014009
Balecampagne 278656 0.0020025 0.0045181 0.0142051 0.0258347 0.0085410 0e+00 1.009492
baleville 189335 0.0021760 0.0049595 0.0185051 0.0600893 0.0100034 1e-07 1.006576
berne 1001281 0.0021592 0.0049207 0.0127091 0.0420521 0.0095747 0e+00 1.008127
fribourg 297622 0.0020731 0.0044419 0.0141127 0.0245479 0.0106377 0e+00 1.019337
geneve 469433 0.0026053 0.0048889 0.0272744 0.0533985 0.0110069 0e+00 1.016940
glaris 39593 0.0017427 0.0043442 0.0138913 0.0198520 0.0099007 3e-07 1.005077
grisons 194959 0.0016773 0.0044112 0.0095905 0.0119256 0.0090481 0e+00 1.004755
jura 71738 0.0023279 0.0039170 0.0188615 0.0252865 0.0094789 1e-07 1.009367
lucerne 390349 0.0017190 0.0050083 0.0107092 0.0211785 0.0104138 0e+00 1.010900
neuchatel 176402 0.0028628 0.0042176 0.0264453 0.0717566 0.0097278 1e-07 1.005244
nidwald 41888 0.0017189 0.0051566 0.0056182 0.0090002 0.0093583 2e-07 1.004584
obwald 36507 0.0012874 0.0044923 0.0052227 0.0112033 0.0093133 3e-07 1.008957
saintgall 491699 0.0019056 0.0051617 0.0132822 0.0219403 0.0103966 0e+00 1.008389
Schaffhouse 78783 0.0020055 0.0043157 0.0145897 0.0237996 0.0093167 1e-07 1.008047
schwytz 151396 0.0018164 0.0051983 0.0083297 0.0148551 0.0101852 1e-07 1.009003
soleure 261437 0.0021841 0.0045824 0.0148579 0.0343601 0.0090768 0e+00 1.008729
tessin 346539 0.0020229 0.0045709 0.0209527 0.0237607 0.0082011 0e+00 1.011035
thurgovie 260278 0.0017712 0.0048525 0.0134792 0.0161404 0.0095629 0e+00 1.013274
uri 35865 0.0013105 0.0044333 0.0064896 0.0110972 0.0090618 3e-07 1.003987
valais 327011 0.0019327 0.0046053 0.0200396 0.0165774 0.0096082 0e+00 1.014532
vaud 749373 0.0022966 0.0043890 0.0249844 0.0492585 0.0110412 0e+00 1.016111
zoug 118118 0.0019387 0.0050881 0.0114469 0.0164751 0.0106504 1e-07 1.016687
zurich 1425538 0.0022413 0.0055944 0.0177212 0.0314478 0.0112210 0e+00 1.014602

Faire l’ACP et afficher les scores factoriels

On peut faire l’ACP avec la fonction PCA() du package FactoMineR. Le paramètre graph=F permet de ne pas afficher les graphiques par défaut de la fonction :

ca = PCA(df, graph=F)

Les scores factoriels des individus (les coordonnées des individus dans le plan factoriel) sont disponibles dans ca$ind$coord :

kable(ca$ind$coord)
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
appenzellext -1.2974324 -1.3251109 0.0035801 -0.1306662 0.1233102
appenzellint -3.4189637 0.7866773 3.8309955 0.2477476 0.5947825
argovie 0.8704535 1.2322316 -0.5286337 -0.4237139 0.3681383
Balecampagne -0.2625677 -0.9810930 -1.3675963 -0.0466629 0.1888338
baleville 1.3000129 -0.8506811 0.4431828 1.5160455 -1.0823553
berne 1.3778273 0.4971865 -0.7849313 1.5958596 1.0570470
fribourg 1.0272584 0.6125489 0.3575246 -2.0149456 -0.1416055
geneve 3.7354122 -0.0839449 1.1774013 -0.4685690 -0.6699578
glaris -1.6426986 -0.7964644 0.8077325 0.0969208 0.2079220
grisons -1.7943353 -0.5555723 -1.1016319 0.2390462 0.3688090
jura 0.0382277 -2.1849101 0.3757645 -0.9481634 0.3918952
lucerne -0.1567132 1.4465963 -0.2522506 0.0883131 -0.3299742
neuchatel 2.6580928 -3.4470822 1.0337562 1.1937575 -0.4196754
nidwald -2.4141672 0.7987247 -0.3831231 1.0788375 -0.7466945
obwald -2.9282807 0.3602706 -0.1805348 -0.4851460 0.2132173
saintgall 0.2815895 1.3276595 -0.2493722 0.7920722 -0.2921707
Schaffhouse -0.7066261 -1.2155988 -0.1638047 -0.2763218 0.0266427
schwytz -0.8755765 1.3875098 -0.3202430 0.4109102 -1.0350408
soleure 0.3065025 -1.0309988 -0.7263131 0.3329405 -0.1460053
tessin 0.3663284 -1.1755766 -1.6476810 -0.3674018 0.3946129
thurgovie -0.2565721 0.7173737 -0.8429598 -0.6944549 -0.2932014
uri -3.2568197 -0.2763068 -0.2982186 0.3048621 0.4076941
valais 0.5778219 0.0594595 -0.6044102 -1.2418051 0.1514074
vaud 3.1672961 -0.1602691 1.0694429 -0.8030147 0.7885948
zoug 0.1262809 1.6558621 0.2642039 -1.1050395 -1.1662694
zurich 3.1776490 3.2015085 0.0881200 1.1085920 1.0400431

Que l’on peut représenter avec la fonction fviz_pca_ind() du package factoextra :

fviz_pca_ind(ca)

Les saturations, les communalités et la variance expliquée

Les saturations (les coordonnées des variables dans le plan factoriel) sont disponibles dans ca$var$coord :

kable(ca$var$coord)
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
poperm2013 0.6813584 0.4840403 -0.1368080 0.2311780 0.4776703
propdivo 0.8465081 -0.4022334 0.1104570 0.0831728 -0.0850250
propmari 0.2376893 0.8179796 -0.1543290 0.3764333 -0.2853357
propchom 0.8577445 -0.3731853 0.1158786 -0.1177482 0.0423511
propsoc 0.7787996 -0.4157706 0.2127815 0.3202615 -0.0962258
propnaiss 0.3713733 0.5493724 0.7174376 -0.0612128 -0.0687765
propdec -0.6861138 -0.0079310 0.6763825 0.0552055 0.1381861
croissance 0.6214011 0.4034426 -0.0500083 -0.6520866 -0.0429702

On peut les représenter avec la fonction fviz_pca_var() du package factoextra :

fviz_pca_var(ca)

Les saturations au carré (les cosinus carrés, qui représentent la qualité de représentation des variables dans le plan factoriel) sont disponibles dans ca$var$cos2 :

kable(ca$var$cos2)
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
poperm2013 0.4642493 0.2342950 0.0187164 0.0534433 0.2281689
propdivo 0.7165759 0.1617917 0.0122007 0.0069177 0.0072292
propmari 0.0564962 0.6690906 0.0238174 0.1417021 0.0814164
propchom 0.7357257 0.1392673 0.0134278 0.0138646 0.0017936
propsoc 0.6065288 0.1728652 0.0452759 0.1025674 0.0092594
propnaiss 0.1379182 0.3018100 0.5147167 0.0037470 0.0047302
propdec 0.4707521 0.0000629 0.4574934 0.0030476 0.0190954
croissance 0.3861393 0.1627659 0.0025008 0.4252169 0.0018464

Les communalités (la proportion de variance de chaque variable expliquée par les composantes principales) sont obtenues en faisant la somme des cosinus carrés sur les composantes principales retenues (par exemple, les 2 premières) :

rowSums(ca$var$cos2[, 1:2])
poperm2013   propdivo   propmari   propchom    propsoc  propnaiss    propdec 
 0.6985443  0.8783676  0.7255868  0.8749930  0.7793940  0.4397282  0.4708150 
croissance 
 0.5489052 

La variance expliquée par les composantes principales est disponible dans ca$eig :

kable(ca$eig)
eigenvalue percentage of variance cumulative percentage of variance
comp 1 3.5743854 44.679818 44.67982
comp 2 1.8419487 23.024358 67.70418
comp 3 1.0881493 13.601866 81.30604
comp 4 0.7505067 9.381334 90.68738
comp 5 0.3535397 4.419246 95.10662
comp 6 0.1573412 1.966765 97.07339
comp 7 0.1411729 1.764661 98.83805
comp 8 0.0929562 1.161952 100.00000

On peut les représenter avec la fonction fviz_screeplot() du package factoextra :

fviz_screeplot(ca)

ACP sur la matrice de covariance

Pour faire l’ACP sur la matrice de covariance (sans standardiser les variables), il suffit de mettre le paramètre scale.unit=F dans la fonction PCA() :

ca_cov = PCA(df, graph=F, scale.unit=F)

Les résultats sont assez particulier dans ce cas, car les variables sont sur des échelles très différentes (par exemple, la population et le taux de chômage). Il est donc généralement recommandé de faire l’ACP sur la matrice de corrélation (en standardisant les variables) pour éviter que les variables sur des échelles plus grandes ne dominent l’analyse.

fviz_pca_ind(ca_cov)

fviz_pca_var(ca_cov)

fviz_screeplot(ca_cov)