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…
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.
library(FactoMineR)
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.
body.light <- read.table("body_light.csv",
header=TRUE, sep=";", dec=",", row.names=1)
dim(body.light)
## [1] 20 5
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 ; )…
Pour un premier aperçu des données, la fonction summary
est intéressante.
summary(body.light)
## shoulder.g chest.g waist.g weight
## Min. : 91.9 Min. : 78.10 Min. :57.90 Min. :48.60
## 1st Qu.:103.1 1st Qu.: 90.88 1st Qu.:70.88 1st Qu.:66.20
## Median :107.3 Median : 94.75 Median :77.65 Median :71.80
## Mean :108.1 Mean : 94.19 Mean :75.35 Mean :70.58
## 3rd Qu.:112.0 3rd Qu.: 97.20 3rd Qu.:80.10 3rd Qu.:77.20
## Max. :123.5 Max. :106.90 Max. :86.00 Max. :86.40
## height
## Min. :157.5
## 1st Qu.:164.2
## Median :174.5
## Mean :174.4
## 3rd Qu.:184.0
## Max. :193.5
On y verrait par exemple la *présence de données manquantes** (tournure de phrase un peu contradictoire…)
Graphiquement, quelques boxplots sont sympathiques aussi.
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…
Réalisons maintenant une analyse en composantes principales. D’abord avec le package FactoMineR
puis avec les fonctions R de base pour voir.
Un petit coup d’oeil à l’aide des fonctions ne fait jamais de mal…
?PCA
?plot.PCA
… puis on se jette à l’eau.
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.
res.PCA.body.light <- PCA(body.light, graph = FALSE)
L’aurions-nous vexé ? Il ne dit plus rien. Allons voir de plus près.
res.PCA.body.light
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 20 individuals, described by 5 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
summary(res.PCA.body.light)
##
## Call:
## PCA(X = body.light, graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Variance 3.656 0.783 0.338 0.156 0.068
## % of var. 73.110 15.668 6.756 3.112 1.353
## Cumulative % of var. 73.110 88.779 95.535 98.647 100.000
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
## I1 | 1.132 | -0.999 1.366 0.779 | 0.462 1.362 0.166 | 0.158
## I2 | 0.785 | 0.687 0.646 0.766 | -0.240 0.367 0.093 | -0.131
## I3 | 2.671 | 2.413 7.966 0.817 | 0.631 2.538 0.056 | 0.924
## I4 | 1.418 | 0.747 0.762 0.277 | 0.272 0.473 0.037 | 0.860
## I5 | 1.783 | 1.454 2.891 0.665 | 0.146 0.136 0.007 | 0.915
## I6 | 2.191 | 2.046 5.725 0.872 | 0.177 0.199 0.006 | -0.427
## I7 | 3.616 | 3.503 16.783 0.938 | 0.094 0.056 0.001 | -0.810
## I8 | 2.462 | 2.241 6.869 0.829 | 0.710 3.221 0.083 | -0.683
## I9 | 1.516 | -0.961 1.262 0.402 | 1.032 6.794 0.463 | -0.477
## I10 | 2.123 | 1.676 3.843 0.624 | 0.823 4.324 0.150 | 0.160
## ctr cos2
## I1 0.368 0.019 |
## I2 0.253 0.028 |
## I3 12.635 0.120 |
## I4 10.959 0.368 |
## I5 12.404 0.264 |
## I6 2.694 0.038 |
## I7 9.704 0.050 |
## I8 6.912 0.077 |
## I9 3.371 0.099 |
## I10 0.378 0.006 |
##
## Variables
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr cos2
## shoulder.g | 0.853 19.891 0.727 | 0.355 16.083 0.126 | -0.330 32.207 0.109
## chest.g | 0.906 22.457 0.821 | -0.182 4.243 0.033 | -0.266 20.953 0.071
## waist.g | 0.825 18.620 0.681 | -0.507 32.801 0.257 | 0.192 10.925 0.037
## weight | 0.943 24.320 0.889 | -0.157 3.162 0.025 | 0.137 5.531 0.019
## height | 0.733 14.711 0.538 | 0.585 43.710 0.342 | 0.320 30.384 0.103
##
## shoulder.g |
## chest.g |
## waist.g |
## weight |
## height |
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.
names(res.PCA.body.light)
## [1] "eig" "var" "ind" "svd" "call"
On peut ensuite regarder les éléments séparément si on le souhaite.
res.PCA.body.light$eig
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 3.65552473 73.110495 73.11049
## comp 2 0.78341795 15.668359 88.77885
## comp 3 0.33778275 6.755655 95.53451
## comp 4 0.15560651 3.112130 98.64664
## comp 5 0.06766806 1.353361 100.00000
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.
res.PCA.body.light$var
## $coord
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## shoulder.g 0.8527202 0.3549636 -0.3298329 -0.171120672 0.09379239
## chest.g 0.9060558 -0.1823183 -0.2660360 0.264797061 -0.07021602
## waist.g 0.8250111 -0.5069206 0.1920988 -0.003256275 0.15961080
## weight 0.9428858 -0.1574010 0.1366895 -0.198105920 -0.16811104
## height 0.7333341 0.5851797 0.3203621 0.130192861 0.01427696
##
## $cor
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## shoulder.g 0.8527202 0.3549636 -0.3298329 -0.171120672 0.09379239
## chest.g 0.9060558 -0.1823183 -0.2660360 0.264797061 -0.07021602
## waist.g 0.8250111 -0.5069206 0.1920988 -0.003256275 0.15961080
## weight 0.9428858 -0.1574010 0.1366895 -0.198105920 -0.16811104
## height 0.7333341 0.5851797 0.3203621 0.130192861 0.01427696
##
## $cos2
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## shoulder.g 0.7271318 0.12599919 0.10878975 2.928228e-02 0.0087970131
## chest.g 0.8209371 0.03323996 0.07077517 7.011748e-02 0.0049302898
## waist.g 0.6806434 0.25696847 0.03690195 1.060333e-05 0.0254756076
## weight 0.8890336 0.02477509 0.01868402 3.924596e-02 0.0282613208
## height 0.5377789 0.34243524 0.10263186 1.695018e-02 0.0002038317
##
## $contrib
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## shoulder.g 19.89131 16.083266 32.207019 18.818161667 13.0002437
## chest.g 22.45744 4.242941 20.952866 45.060765577 7.2859922
## waist.g 18.61958 32.800942 10.924759 0.006814193 37.6479043
## weight 24.32027 3.162436 5.531372 25.221281568 41.7646369
## height 14.71140 43.710415 30.383984 10.892976995 0.3012229
res.PCA.body.light$ind
## $coord
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## I1 -0.9994124 0.46187796 0.15762659 -0.157932800 0.14347452
## I2 0.6872141 -0.23967969 -0.13081837 0.142564783 0.22190284
## I3 2.4133542 0.63058129 0.92389440 0.040818341 0.23635283
## I4 0.7465567 0.27218036 0.86043169 0.784535982 -0.14898687
## I5 1.4538186 0.14572658 0.91541721 0.354593417 -0.28355125
## I6 2.0458496 0.17663098 -0.42664632 -0.001248843 0.63376767
## I7 3.5028948 0.09366715 -0.80965404 0.023091369 -0.37903362
## I8 2.2409129 0.71044495 -0.68333901 0.162466482 -0.20224920
## I9 -0.9607277 1.03171951 -0.47723971 -0.010802100 0.28814669
## I10 1.6763028 0.82307005 0.15969697 -0.996349614 -0.00551424
## I11 -1.2004884 0.11881324 0.06691581 -0.389698193 -0.05999007
## I12 -0.4482664 -1.76619675 0.11279708 -0.332399600 -0.40125281
## I13 -0.7975526 -0.59893554 0.85894864 0.175247564 0.13987932
## I14 -1.1033800 -0.22755924 -1.33240350 0.477010903 -0.06159849
## I15 0.2393917 -2.33791626 -0.05071202 -0.551281871 0.16848119
## I16 -0.3617861 0.66372638 0.04733402 -0.279675714 -0.43422067
## I17 -2.9655153 0.43102341 -0.35201670 0.226048977 -0.10025560
## I18 -4.9688543 0.73868926 0.22700235 -0.140110968 -0.03516636
## I19 -0.7513536 0.38477673 0.04118958 -0.094208686 0.12490310
## I20 -0.4489587 -1.51264037 -0.10842469 0.567330571 0.15491101
##
## $cos2
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## I1 0.778792654 0.1663362413 0.0193727540 1.944810e-02 1.605026e-02
## I2 0.766177726 0.0931982728 0.0277640530 3.297387e-02 7.988608e-02
## I3 0.816523396 0.0557453531 0.1196661123 2.335808e-04 7.831557e-03
## I4 0.277360783 0.0368665925 0.3684276562 3.062987e-01 1.104626e-02
## I5 0.664869740 0.0066802653 0.2636053986 3.955282e-02 2.529177e-02
## I6 0.871908595 0.0064991610 0.0379192339 3.248920e-07 8.367269e-02
## I7 0.938181344 0.0006708219 0.0501223684 4.076918e-05 1.098470e-02
## I8 0.828569540 0.0832798354 0.0770462352 4.355184e-03 6.749205e-03
## I9 0.401592164 0.4631353501 0.0990963779 5.076929e-05 3.612534e-02
## I10 0.623655060 0.1503533540 0.0056602142 2.203246e-01 6.748555e-06
## I11 0.892239635 0.0087396735 0.0027721905 9.402045e-02 2.228047e-03
## I12 0.055746035 0.8654059119 0.0035296968 3.065227e-02 4.466608e-02
## I13 0.356775810 0.2012041528 0.4138197072 1.722585e-02 1.097448e-02
## I14 0.371641682 0.0158074981 0.5419331712 6.945937e-02 1.158282e-03
## I15 0.009782878 0.9330529714 0.0004390057 5.187950e-02 4.845641e-03
## I16 0.155740999 0.5241763172 0.0026659134 9.306979e-02 2.243470e-01
## I17 0.959537250 0.0202704415 0.0135203529 5.575279e-03 1.096677e-03
## I18 0.975578075 0.0215612070 0.0020361520 7.757000e-04 4.886573e-05
## I19 0.764163929 0.2004081716 0.0022965323 1.201378e-02 2.111759e-02
## I20 0.070792197 0.8036073861 0.0041288483 1.130433e-01 8.428244e-03
##
## $contrib
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## I1 1.3661856 1.36154176 0.36778287 8.014694e-01 1.521023099
## I2 0.6459582 0.36663925 0.25332031 6.530806e-01 3.638412809
## I3 7.9664054 2.53780733 12.63505722 5.353687e-02 4.127697759
## I4 0.7623351 0.47281371 10.95885900 1.977734e+01 1.640145119
## I5 2.8909508 0.13553581 12.40425516 4.040207e+00 5.940860877
## I6 5.7248973 0.19911787 2.69444023 5.011385e-05 29.678805962
## I7 16.7831879 0.05599524 9.70356930 1.713332e-02 10.615530809
## I8 6.8686320 3.22134583 6.91201973 8.481444e-01 3.022455242
## I9 1.2624694 6.79359693 3.37136427 3.749373e-03 6.134985507
## I10 3.8434851 4.32364557 0.37750776 3.189817e+01 0.002246764
## I11 1.9712251 0.09009613 0.06628115 4.879766e+00 0.265916320
## I12 0.2748480 19.90923846 0.18833379 3.550285e+00 11.896588377
## I13 0.8700394 2.28947895 10.92111393 9.868388e-01 1.445750313
## I14 1.6652157 0.33049540 26.27871177 7.311372e+00 0.280366673
## I15 0.0783860 34.88465170 0.03806750 9.765392e+00 2.097437805
## I16 0.1790292 2.81160716 0.03316495 2.513343e+00 13.931800256
## I17 12.0287534 1.18570922 1.83425230 1.641902e+00 0.742683070
## I18 33.7701358 3.48257160 0.76276936 6.307925e-01 0.091377903
## I19 0.7721630 0.94491790 0.02511350 2.851833e-01 1.152743520
## I20 0.2756977 14.60319416 0.17401589 1.034224e+01 1.773171813
##
## $dist
## I1 I2 I3 I4 I5 I6 I7 I8
## 1.1324885 0.7851042 2.6707716 1.4175562 1.7829613 2.1909791 3.6164602 2.4618439
## I9 I10 I11 I12 I13 I14 I15 I16
## 1.5160296 2.1226590 1.2709171 1.8985811 1.3352470 1.8099347 2.4203368 0.9167489
## I17 I18 I19 I20
## 3.0273961 5.0306633 0.8595103 1.6873832
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.
plot(res.PCA.body.light, choix="ind")
plot(res.PCA.body.light, choix="var")
On voit que …
Le traditionnel coup d’oeil à l’aide de la fonction que l’on va utiliser.
?prcomp
On peut noter au passage une option scale.=FALSE
…
res.prcomp.body.light <- prcomp(body.light)
res.prcomp.body.light
## Standard deviations (1, .., p=5):
## [1] 15.989241 7.757795 4.846040 2.933938 2.002735
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## shoulder.g 0.4510211 -0.1607983 0.7795273 -0.1832817 0.35981775
## chest.g 0.3227778 0.2513743 0.2624192 0.7213856 -0.49331972
## waist.g 0.3361956 0.5318767 -0.3338707 0.2373719 0.66050328
## weight 0.5351247 0.3625794 -0.1745548 -0.6008788 -0.43663838
## height 0.5413026 -0.7046973 -0.4260684 0.1691444 0.01578585
summary(res.prcomp.body.light)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 15.9892 7.7578 4.84604 2.93394 2.0027
## Proportion of Variance 0.7264 0.1710 0.06673 0.02446 0.0114
## Cumulative Proportion 0.7264 0.8974 0.96414 0.98860 1.0000
plot(res.prcomp.body.light)
biplot(res.prcomp.body.light)
Vous pouvez maintenant rejouer la même partition avec un autre jeu de données.
body.full <- read.table("body_full.csv",
header=TRUE, sep=";", dec=",")
dim(body.full)
## [1] 507 25
summary(body.full)
## biacromial pelvic.breadth bitrochanteric chest.depth
## Min. :32.40 Min. :18.70 Min. :24.70 Min. :14.30
## 1st Qu.:36.20 1st Qu.:26.50 1st Qu.:30.60 1st Qu.:17.30
## Median :38.70 Median :28.00 Median :32.00 Median :19.00
## Mean :38.81 Mean :27.83 Mean :31.98 Mean :19.23
## 3rd Qu.:41.15 3rd Qu.:29.25 3rd Qu.:33.35 3rd Qu.:20.90
## Max. :47.40 Max. :34.70 Max. :38.00 Max. :27.50
## chest.diam elbow.diam wrist.diam knee.diam
## Min. :22.20 Min. : 9.90 Min. : 8.10 Min. :15.70
## 1st Qu.:25.65 1st Qu.:12.40 1st Qu.: 9.80 1st Qu.:17.90
## Median :27.80 Median :13.30 Median :10.50 Median :18.70
## Mean :27.97 Mean :13.39 Mean :10.54 Mean :18.81
## 3rd Qu.:29.95 3rd Qu.:14.40 3rd Qu.:11.20 3rd Qu.:19.60
## Max. :35.60 Max. :16.70 Max. :13.30 Max. :24.30
## ankle.diam shoulder.girth chest.girth waist.girth
## Min. : 9.90 Min. : 85.90 Min. : 72.60 Min. : 57.90
## 1st Qu.:13.00 1st Qu.: 99.45 1st Qu.: 85.30 1st Qu.: 68.00
## Median :13.80 Median :108.20 Median : 91.60 Median : 75.80
## Mean :13.86 Mean :108.20 Mean : 93.33 Mean : 76.98
## 3rd Qu.:14.80 3rd Qu.:116.55 3rd Qu.:101.15 3rd Qu.: 84.50
## Max. :17.20 Max. :134.80 Max. :118.70 Max. :113.20
## navel.girth hip.girth thigh.girth bicep.girth
## Min. : 64.00 Min. : 78.80 Min. :46.30 Min. :22.40
## 1st Qu.: 78.85 1st Qu.: 92.00 1st Qu.:53.70 1st Qu.:27.60
## Median : 84.60 Median : 96.00 Median :56.30 Median :31.00
## Mean : 85.65 Mean : 96.68 Mean :56.86 Mean :31.17
## 3rd Qu.: 91.60 3rd Qu.:101.00 3rd Qu.:59.50 3rd Qu.:34.45
## Max. :121.10 Max. :128.30 Max. :75.70 Max. :42.40
## forearm.girth knee.girth calf.girth ankle.girth wrist.girth
## Min. :19.60 Min. :29.00 Min. :28.40 Min. :16.40 Min. :13.0
## 1st Qu.:23.60 1st Qu.:34.40 1st Qu.:34.10 1st Qu.:21.00 1st Qu.:15.0
## Median :25.80 Median :36.00 Median :36.00 Median :22.00 Median :16.1
## Mean :25.94 Mean :36.20 Mean :36.08 Mean :22.16 Mean :16.1
## 3rd Qu.:28.40 3rd Qu.:37.95 3rd Qu.:38.00 3rd Qu.:23.30 3rd Qu.:17.1
## Max. :32.50 Max. :49.00 Max. :47.70 Max. :29.30 Max. :19.6
## age weight height gender
## Min. :18.00 Min. : 42.00 Min. :147.2 Length:507
## 1st Qu.:23.00 1st Qu.: 58.40 1st Qu.:163.8 Class :character
## Median :27.00 Median : 68.20 Median :170.3 Mode :character
## Mean :30.16 Mean : 69.15 Mean :171.1
## 3rd Qu.:36.00 3rd Qu.: 78.85 3rd Qu.:177.8
## Max. :67.00 Max. :116.40 Max. :198.1
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…
boxplot(body.full[,-25], las=3, cex.axis=0.65)
… ainsi que dans l’ACP. Ce que la fonction PCA
de FactoMineR permet très simplement avec l’option quali.sup
.
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.
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…
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 / …
sessionInfo()
## R version 4.0.4 (2021-02-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3
##
## locale:
## [1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8
## [5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
## [7] LC_PAPER=fr_FR.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] FactoMineR_2.3
##
## loaded via a namespace (and not attached):
## [1] Rcpp_1.0.4.6 pillar_1.4.4 compiler_4.0.4
## [4] tools_4.0.4 digest_0.6.25 evaluate_0.14
## [7] lifecycle_0.2.0 tibble_3.0.1 gtable_0.3.0
## [10] lattice_0.20-41 pkgconfig_2.0.3 rlang_0.4.6
## [13] ggrepel_0.8.2 yaml_2.2.1 xfun_0.20
## [16] stringr_1.4.0 dplyr_1.0.0 knitr_1.28
## [19] cluster_2.1.1 generics_0.0.2 vctrs_0.3.0
## [22] flashClust_1.01-2 grid_4.0.4 tidyselect_1.1.0
## [25] scatterplot3d_0.3-41 glue_1.4.0 R6_2.4.1
## [28] rmarkdown_2.6 farver_2.0.3 ggplot2_3.3.1
## [31] purrr_0.3.4 magrittr_1.5 scales_1.1.1
## [34] ellipsis_0.3.0 htmltools_0.4.0 leaps_3.1
## [37] MASS_7.3-53.1 colorspace_1.4-1 labeling_0.3
## [40] stringi_1.4.6 munsell_0.5.0 crayon_1.3.4