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 factorielleslibrary(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) :
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.