L’analyse de données multidimensionnelles est une méthode de la statistique descriptive permettant de traiter simultanément un grand nombre de variables. Dans notre étude, nous allons nous intéresser à l’analyse en composantes principales ou ACP. Il s’agit d’une technique de compression et de synthèse de gros volumes d’informations quantitatives pour en dégager l’essentiel. Evidemment ce processus engendre une perte de l’information, mais il s’agit en fait d’une faible quantité d’informations moins significatives. Dans la pratique on va créer des plans de données appellés dimensions et voir les dimensions qui captent l’essentiel des informations sur les individus repartis sur l’ensemble des variables. Cette technique va nous permettre d’éviter la redondance des données. On déterminera la proportion d’informations contenues dans les axes principaux et on laissera les autres en les considérant comme résiduelles. Ces valeurs n’expliquant pas suffisament le phénomène à étudier.
Notre premiere approche sera de choisir les variables à partir desquelles on veut réaliser notre ACP. Dans notre cas, l’on retiendra toutes les variables quantitatives uniquement. Par la suite nous allons dresser une matrice des correlations pour analyser les relations entre ces variables. Et enfin interpreter les correlations variables-facteurs avant de proposer une classification, c’est-à dire un regroupement des informations sur les individus en en formant des groupes homogènes.
Cette partie présente le dictionnaire des données utilisées dans la présente analyse ainsi que les étapes de l’apurement de notre base de données. A cela, il faut ajouter que la méthodologie est basée sur une approche essentiellement descriptive en utilisant le logiciel R pour le traitement et l’analyse des données.
Le jeu de données s’appelera “Petrole”. Il comporte des variables tant quantitatives que qualitatives. Ces variables sont listées dans le tableau de dictionnaire de données ci-dessous :
my_tbl <- tibble::tribble(
~VARIABLE, ~NATURE, ~DESCRIPTION, ~MODALITES,
"nb_grossesse", "Quantitative", " Nombre de grossesses", "Numérique entier",
"glucose", "Quantitative", "Concentration de glucose plasmatique ", " Numérique entier",
"pression_art", "Quantitative", " Pression artérielle diastolique (mm Hg)", "Numérique entier",
"triceps", "Quantitative", "Épaisseur du pli cutané du triceps (mm)", "Numérique entier",
"insuline", "Quantitative", " Insuline sérique(mu U/ml)", "Numérique entier",
"imc ", "Quantitative", "Indice de masse corporelle", "Numérique décimal",
"pedigree", "Quantitative", "Fonction pédigrée du diabète", "Numérique décimal",
"age", "Quantitative", " Âge (années)", "Numérique entier",
"diabete", "Qualitative", " Classe, apparition du diabète dans les cinq ans", "pos\nneg"
)
require(rhandsontable)
rhandsontable(my_tbl, rowHeaders = NULL,
digits = 3, useTypes = FALSE, search = FALSE,
width = NULL, height = NULL)
Nous avons commencé par charger le jeu de données depuis son espace de stockage sur notre ordinateur avant de le lire. Cette base de données sera appelée « Multidim ». Par la suite, nous avons choisi d’en afficher un aperçu. Le jeu de données global contient 768 observations reparties sur 9 variables dont 8 de type quantitatives et 1 de type qualitative avec 2 modalités.
setwd("D:/Insseds/Dataframe") #DOnner le chemin d'acces au jeu de données
Multidim<- read.table("Multidim.csv",header=TRUE,sep=";",check.names=FALSE,stringsAsFactors = TRUE, na.strings = 0) # Lire le jeu de données
head(Multidim)
## nb_grossesse glucose pression_art triceps insuline imc pedigree age diabete
## 1 6 148 72 35 NA 33.6 0.627 50 pos
## 2 1 85 66 29 NA 26.6 0.351 31 neg
## 3 8 183 64 NA NA 23.3 0.672 32 pos
## 4 1 89 66 23 94 28.1 0.167 21 neg
## 5 NA 137 40 35 168 43.1 2.288 33 pos
## 6 5 116 74 NA NA 25.6 0.201 30 neg
str(Multidim)
## 'data.frame': 768 obs. of 9 variables:
## $ nb_grossesse: int 6 1 8 1 NA 5 3 10 2 8 ...
## $ glucose : int 148 85 183 89 137 116 78 115 197 125 ...
## $ pression_art: int 72 66 64 66 40 74 50 NA 70 96 ...
## $ triceps : int 35 29 NA 23 35 NA 32 NA 45 NA ...
## $ insuline : int NA NA NA 94 168 NA 88 NA 543 NA ...
## $ imc : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 NA ...
## $ pedigree : num 0.627 0.351 0.672 0.167 2.288 ...
## $ age : int 50 31 32 21 33 30 26 29 53 54 ...
## $ diabete : Factor w/ 2 levels "neg","pos": 2 1 2 1 2 1 2 1 2 2 ...
summary(Multidim)
## nb_grossesse glucose pression_art triceps
## Min. : 1.000 Min. : 44.0 Min. : 24.00 Min. : 7.00
## 1st Qu.: 2.000 1st Qu.: 99.0 1st Qu.: 64.00 1st Qu.:22.00
## Median : 4.000 Median :117.0 Median : 72.00 Median :29.00
## Mean : 4.495 Mean :121.7 Mean : 72.41 Mean :29.15
## 3rd Qu.: 7.000 3rd Qu.:141.0 3rd Qu.: 80.00 3rd Qu.:36.00
## Max. :17.000 Max. :199.0 Max. :122.00 Max. :99.00
## NA's :111 NA's :5 NA's :35 NA's :227
## insuline imc pedigree age diabete
## Min. : 14.00 Min. :18.20 Min. :0.0780 Min. :21.00 neg:500
## 1st Qu.: 76.25 1st Qu.:27.50 1st Qu.:0.2437 1st Qu.:24.00 pos:268
## Median :125.00 Median :32.30 Median :0.3725 Median :29.00
## Mean :155.55 Mean :32.46 Mean :0.4719 Mean :33.24
## 3rd Qu.:190.00 3rd Qu.:36.60 3rd Qu.:0.6262 3rd Qu.:41.00
## Max. :846.00 Max. :67.10 Max. :2.4200 Max. :81.00
## NA's :374 NA's :11
Le résumé sommaire de ce jeu de données permet de détecter qu’il existe des données manquantes matérialisées par des valeurs NAs. Ces valeurs doivent passer par une étape de traitement.
Cette section va servir à afficher les observations qui contiennent des valeurs manquantes. Elle srvira également à réaliser tout le traitement qui y convient.
Elles permettent toutes les trois d’obtenir des informations sur la structure de données, c’est-à-dire leurs dimensions, les class (ou types de variables), la présence de données manquantes. Il existe 432 valeurs manquantes sur l’ensemble des données. Et le taux global de valeurs manquantes est de 56%.
nrow(Multidim[!complete.cases(Multidim),]) # Determiner le nombre de valeurs manquantes
## [1] 432
nrow(Multidim[!complete.cases(Multidim),])/nrow(Multidim)# déterminer le taux de valeurs manquantes
## [1] 0.5625
Notre jeu de données a une capacité de 36,3Kb. En le visualisant, l’on se rend compte qu’en moyenne c’est 11% de données manquantes sur chacune des variables. la variable «insuline» contient à elle seule 49% des données manquantes. Nous pouvons donc suspecté que cette variable est n’est pas assez importante pour la compréhension des phénomènes étudiés. Seulement, plusieurs données manquantes sont partagées simultanément par plusieurs variables. Ce constat montre que, la perte des données sur chaque individu est très importante et assez significative dans l’ensemble pour ne pas nous donner le luxe de les supprimer.
Et puisque la technique de l’ACP ne tolère pas les données manquantes, il convient donc de procéder au traitement de ces valeurs pour leur imputation, plutôt que de les supprimer de notre base de données.
library(visdat)
vis_miss(Multidim)# Visulaiser le jeu de données entier avec les valeurs manquantes en pourcentage de NA pour chaque variable et global
vis_dat(Multidim)# Visualiser la position des données manquantes
library(naniar)
naniar::gg_miss_upset(Multidim)# savoir si les valeurs ne sont pas correllées
library("DataExplorer")
introduce(Multidim)
## rows columns discrete_columns continuous_columns all_missing_columns
## 1 768 9 1 8 0
## total_missing_values complete_rows total_observations memory_usage
## 1 763 336 6912 37160
plot_intro(Multidim)
plot_str(Multidim)
plot_missing(Multidim)
Nous avons d’abord dupliqué le jeu de données en le renommant “Multidim1” puis avons procédé à l’annulation de la variable qualitative puisque nous sommes dans un ACP.
Pour l’imputation des valeurs manquantes parmi les variables quantitatives, nous avons avons utilisé la technique des K plus proches voisins consistant à remplir les valeurs manquantes en explorant les similitudes entre les cas. Ceci du fait que nous essayons de trouver les valeurs les plus probables pour chacune de ces inconnues. Pour mesurer donc cette proximité entre les observations, nous avons opté pour l’application d’une fonction de similarité reposant sur un calcul de distance. Cette fonction qui calcule la distance entre deux observations estime l’affinité entre les observations comme ceci : « Plus deux points sont proches l’un de l’autre, plus ils sont similaires. » Nous avons donc conservé les 50 observations du jeu de données qui sont les plus « proches » des observations à prédire. Par la suite nous nous sommes évertué à retrouver à quelle famille appartient les nouvelles données, en cherchant la famille sinon la classe majoritaire parmi les k données. Et nous avons retourné la valeur calculée comme étant la valeur qui a été prédite pour l’observation en entrée qui était inconnue.
Ci-dessous un bref aperçu des nouvelles données quantitatives après imputation des valeurs manquantes.
setwd("D:/Insseds/Dataframe") #DOnner le chemin d'acces au jeu de données
Multidim1<- read.table("Multidim1.csv",header=TRUE,sep=";",check.names=FALSE,stringsAsFactors = TRUE, na.strings = 0) # Lire le jeu de données
library(DMwR2)
Multidim1$diabete = NULL
head(Multidim1)
## nb_grossesse glucose pression_art triceps insuline imc pedigree age
## 1 6 148 72 35 NA 33.6 0.627 50
## 2 1 85 66 29 NA 26.6 0.351 31
## 3 8 183 64 NA NA 23.3 0.672 32
## 4 1 89 66 23 94 28.1 0.167 21
## 5 NA 137 40 35 168 43.1 2.288 33
## 6 5 116 74 NA NA 25.6 0.201 30
Multidim1 <- knnImputation(Multidim1, k = 50, scale = TRUE, meth = "weighAvg")
summary(Multidim1)
## nb_grossesse glucose pression_art triceps
## Min. : 1.000 Min. : 44.00 Min. : 24.00 Min. : 7
## 1st Qu.: 2.000 1st Qu.: 99.75 1st Qu.: 64.00 1st Qu.:23
## Median : 3.434 Median :117.00 Median : 72.00 Median :29
## Mean : 4.330 Mean :121.66 Mean : 72.28 Mean :29
## 3rd Qu.: 6.000 3rd Qu.:140.25 3rd Qu.: 80.00 3rd Qu.:34
## Max. :17.000 Max. :199.00 Max. :122.00 Max. :99
## insuline imc pedigree age
## Min. : 14.00 Min. :18.20 Min. :0.0780 Min. :21.00
## 1st Qu.: 94.97 1st Qu.:27.50 1st Qu.:0.2437 1st Qu.:24.00
## Median :140.00 Median :32.15 Median :0.3725 Median :29.00
## Mean :153.07 Mean :32.43 Mean :0.4719 Mean :33.24
## 3rd Qu.:186.40 3rd Qu.:36.60 3rd Qu.:0.6262 3rd Qu.:41.00
## Max. :846.00 Max. :67.10 Max. :2.4200 Max. :81.00
head(Multidim1)
## nb_grossesse glucose pression_art triceps insuline imc pedigree age
## 1 6.000000 148 72 35.00000 213.38695 33.6 0.627 50
## 2 1.000000 85 66 29.00000 80.95096 26.6 0.351 31
## 3 8.000000 183 64 28.33078 202.59702 23.3 0.672 32
## 4 1.000000 89 66 23.00000 94.00000 28.1 0.167 21
## 5 3.584322 137 40 35.00000 168.00000 43.1 2.288 33
## 6 5.000000 116 74 23.95933 112.09898 25.6 0.201 30
Une seconde étape de l’exploration des données disponibles nous a conduit à traiter les valeurs aberrantes et extrêmes sur les variables quantitatives. Nous appelons valeur aberrante une valeur ou une observation qui est « distante » des autres observations effectuées sur le même phénomène, c’est-à-dire qu’elle contraste grandement avec les valeurs « normalement » mesurées. Leur présence dans les données peut conduire à des estimateurs de paramètres biaisés et, suite à la réalisation de tests statistiques, à une interprétation des résultats erronée. Pouvant être dû à plusieurs facteurs, nous avons pensé utile dans un premier temps de les detecter, puis de les imputer si elles existaient dans notre base de données. La détection desdites données est perceptible comme l’on peut le voir sur notre graphe. Nous avons utilisé les boite à moustache afin de visualiser les débordements observés.
library(rpart)
par(mfrow=c(2,4), mar=c(3,3,3,3))
boxplot(Multidim1$nb_grossesse)# graph
boxplot(Multidim1$glucose)
boxplot(Multidim1$pression_art)
boxplot(Multidim1$triceps)
boxplot(Multidim1$insuline)
boxplot(Multidim1$imc)
boxplot(Multidim1$pedigree)
boxplot(Multidim1$age)
par(mfrow=c(1,1), mar=c(0,0,0,0))
Tous les graphiques présentant des points au-dessus ou en dessous de la boite sont des valeurs aberrantes. Seule la variable “glucose” ne présentent pas de valeurs aberrantes. Les autres variables qui présentent des données abérrantes seront retraitées.
Pour le traitement des données extrêmes nous avons utilisé la technique de Winzorisation en les ramenant dans les limites des bornes (inférieure et supérieure) des moutâches.
library(DescTools)
Multidim1$nb_grossesse <- Winsorize(Multidim1$nb_grossesse)
Multidim1$glucose<- Winsorize(Multidim1$glucose)
Multidim1$pression_art<- Winsorize(Multidim1$pression_art)
Multidim1$triceps<- Winsorize(Multidim1$triceps)
Multidim1$insuline<- Winsorize(Multidim1$insuline)
Multidim1$imc<- Winsorize(Multidim1$imc)
Multidim1$pedigree<- Winsorize(Multidim1$pedigree)
Multidim1$age<- Winsorize(Multidim1$age)
par(mfrow=c(2,4), mar=c(3,3,3,3))
boxplot(Multidim1$nb_grossesse)# graph
boxplot(Multidim1$glucose)
boxplot(Multidim1$pression_art)
boxplot(Multidim1$triceps)
boxplot(Multidim1$insuline)
boxplot(Multidim1$imc)
boxplot(Multidim1$pedigree)
boxplot(Multidim1$age)
par(mfrow=c(1,1), mar=c(0,0,0,0))
Toutes les valeurs abérrantes et extremes ont été traitées comme le montre les graphiques ci-dessus.
Le jeu de données retraité sera utilisé pour toutes les analyses de notre ACP. Il convient de le stocker en dur sur un espace et en faire une sauvegarde en déhors de notre environnement R.
NOus avons décidé d’exporter les données vers un espace en local au regard de sa capacité de 36 Kb.
head(Multidim1)
## nb_grossesse glucose pression_art triceps insuline imc pedigree age
## 1 6.000000 148 72 35.00000 213.38695 33.6 0.62700 50
## 2 1.000000 85 66 29.00000 80.95096 26.6 0.35100 31
## 3 8.000000 181 64 28.33078 202.59702 23.3 0.67200 32
## 4 1.000000 89 66 23.00000 94.00000 28.1 0.16700 21
## 5 3.584322 137 52 35.00000 168.00000 43.1 1.13285 33
## 6 5.000000 116 74 23.95933 112.09898 25.6 0.20100 30
# exporter le tableau statistique PB dans Excel
write.csv(Multidim1,"D:/Insseds/Export Rxls/Multidim_def.csv", row.names=TRUE, sep=";" ,dec=",")
Nous pouvons visualiser l’ensemble du jeu de données sous forme graphique.
boxplot(Multidim1)
Dans cette partie nous allons réaliser l’ACP. Mais avant, nous avons souhaité baliser notre étude avec quelques visualisations préalables afin de justifier notre démarche.
Nous avons décidé de visualiser le sens de la distribution de nos données. Cette étape nous donnera la possibilité de normaliser les données au besoin.
plot_histogram(Multidim1)
plot_qq(Multidim1)
Les variables glucose, imc, pression_art et triceps nous font soupconner des distributions normales. La visualisation de l’ensemble du jeu de données retraitées nous fait comprendre que toutes les données ne sont pas exprimées sur un même échelle. Cette visualisation nous fait remarquer que ces données présentent des échelles différentes et ne peuvent être comparables dans leur état brut. Nous allons donc utiliser la technique statistique de normalisation pour les rendre comparables sur une échelle commune. L’idée c’est d’éviter par exemple que les données de la variable “glucose” soient plus pésantes que celles de la variable “âge”.
Parmi les techniques statistiques, nous avons la normalisation z-core et la normalisation de moyenne qui peuvent être utilisées pour les algorithmes qui supposent des données centrées sur le zéro, comme l’analyse en composantes principales (ACP). Nous allons centrer et réduire les données.
library("clusterSim")
Multidim2 <- data.Normalization(Multidim1,type="n1",normalization="column")
head(Multidim2)
## nb_grossesse glucose pression_art triceps insuline imc
## 1 0.6368596 0.9171233 -0.005385271 0.76763142 1.0263777 0.2086626
## 2 -1.1587887 -1.2748657 -0.577432134 0.02010180 -1.0084512 -0.9202355
## 3 1.3551189 2.0653081 -0.768114422 -0.06327556 0.8605946 -1.4524303
## 4 -1.1587887 -1.1356918 -0.577432134 -0.72742781 -0.8079576 -0.6783288
## 5 -0.2306819 0.5343951 -1.912208147 0.76763142 0.3290245 1.7407386
## 6 0.2777300 -0.1962679 0.185297017 -0.60790686 -0.5298736 -1.0815067
## pedigree age
## 1 0.6134911 1.548864802
## 2 -0.3837427 -0.177327453
## 3 0.7760835 -0.086475229
## 4 -1.0485651 -1.085849692
## 5 2.4412109 0.004376995
## 6 -0.9257175 -0.268179677
boxplot(Multidim2)
La visualisation graphique par le boxplot ci-dessus et l’aperçu du jeu de données montrent que les variables ont été normalisées.
La matrice des correlations avec les coefficiants nous indique de fortes correlations positive entre l’age et le nombre de grossesses. Il en est de meme pour la liaison entre l’insuline et le glucose ainsi que entre l’imc et la variable triceps. Ces variables augementent et diminuent ensemble.
library("DataExplorer")
plot_correlation(Multidim2, cor_args = list("use" = "pairwise.complete.obs"))
library(corrplot)
cor <- cor(Multidim2)
corrplot(cor)
library(GGally)
library(ggplot2)
ggpairs(Multidim2)
Le second graphique nous fait suspecter également une correlation positive et significative entre la pression arterielle et l’age des patients. Egalement pour les variables nombre de grossesses et pression artérielle.
Le troisième graphique nous apporte plus de précision sur les coefficiants de correlation et leur significativité entre les variables.
Cette visualisation des variables fortement correlées nous indique qu’il existe une redondance dans les données. En raison donc de cette redondance, l’ACP pourra etre utilisée pour réduire d’origine en un nombre plus petit de nouvelles variables qui expliqueront la grande partie de la variance contenue dans les variables d’origine.
Cette étape va se consacrer à la projection et à la compression des données par ACP pour n’en garder que celles qui portent suffisament d’informations pour expliquer au mieux notre problématique. Comme expliqué précédemment, par défaut, la fonction ‘PCA()’ de ‘FactoMineR’ centre et réduit les variables avant de réaliser l’ACP. Mais il était important pour nous de nous assurer de la normalisation de nos données. Ceci afin que toutes les variables aient le même poids dans la construction des plans de l’ACP.
Nous réalierons l’ACP uniquement sur les 8 variables quantitatives du jeu de données. Les plots des variables et des observations seront générés automatiquement.
library(FactoMineR)
res.pca<-PCA(Multidim2[1:8])
summary(res.pca)
##
## Call:
## PCA(X = Multidim2[1:8])
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
## Variance 2.864 1.409 1.109 0.933 0.717 0.376 0.324
## % of var. 35.803 17.619 13.868 11.657 8.958 4.704 4.045
## Cumulative % of var. 35.803 53.421 67.289 78.947 87.905 92.609 96.654
## Dim.8
## Variance 0.268
## % of var. 3.346
## Cumulative % of var. 100.000
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
## 1 | 2.391 | 2.032 0.188 0.723 | -0.516 0.025 0.047 | 0.579
## 2 | 2.313 | -1.961 0.175 0.719 | 0.121 0.001 0.003 | -0.554
## 3 | 3.189 | 0.886 0.036 0.077 | -1.076 0.107 0.114 | 2.155
## 4 | 2.626 | -2.434 0.269 0.859 | 0.286 0.008 0.012 | -0.336
## 5 | 3.701 | 0.862 0.034 0.054 | 2.086 0.402 0.318 | 1.107
## 6 | 1.704 | -0.995 0.045 0.341 | -1.047 0.101 0.378 | -0.224
## 7 | 2.818 | -2.011 0.184 0.509 | 0.579 0.031 0.042 | -0.777
## 8 | 2.501 | 0.766 0.027 0.094 | -0.725 0.049 0.084 | -1.289
## 9 | 4.300 | 2.651 0.320 0.380 | -0.037 0.000 0.000 | 1.391
## 10 | 3.108 | 2.166 0.213 0.485 | -1.739 0.279 0.313 | -1.116
## ctr cos2
## 1 0.039 0.059 |
## 2 0.036 0.057 |
## 3 0.545 0.457 |
## 4 0.013 0.016 |
## 5 0.144 0.089 |
## 6 0.006 0.017 |
## 7 0.071 0.076 |
## 8 0.195 0.265 |
## 9 0.227 0.105 |
## 10 0.146 0.129 |
##
## Variables
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
## nb_grossesse | 0.557 10.813 0.310 | -0.591 24.783 0.349 | -0.252 5.708
## glucose | 0.669 15.609 0.447 | 0.014 0.014 0.000 | 0.571 29.356
## pression_art | 0.577 11.606 0.332 | -0.132 1.237 0.017 | -0.334 10.032
## triceps | 0.653 14.883 0.426 | 0.467 15.499 0.218 | -0.379 12.931
## insuline | 0.736 18.913 0.542 | 0.057 0.231 0.003 | 0.497 22.221
## imc | 0.616 13.258 0.380 | 0.609 26.283 0.370 | -0.311 8.721
## pedigree | 0.210 1.541 0.044 | 0.264 4.938 0.070 | 0.341 10.504
## age | 0.619 13.376 0.383 | -0.617 27.015 0.381 | -0.077 0.528
## cos2
## nb_grossesse 0.063 |
## glucose 0.326 |
## pression_art 0.111 |
## triceps 0.143 |
## insuline 0.247 |
## imc 0.097 |
## pedigree 0.117 |
## age 0.006 |
Ici, on peut voir que l’axe 1 est plutôt expliqué par les variables age, nb grossesse, , alors que l’axe 2 est plutôt expliqué par imc, triceps et insuline. Les variables pedigree et pression_art sont faibles et ne peuvent donc pas s’interpréter.
Les 2 premiers axes de l’ analyse expriment 53.42% de l’inertie totale du jeu de données ; cela signifie que 53.42% de la variabilité totale du nuage des individus (ou des variables) est représentée dans ce plan. C’est un pourcentage assez important, et le premier plan représente donc convenablement la variabilité contenue dans une grande part du jeu de données actif. Cette valeur est nettement supérieure à la valeur référence de 28.92%, la variabilité expliquée par ce plan est donc hautement significative (cette intertie de référence est le quantile 0.95-quantile de la distribution des pourcentages d’inertie obtenue en simulant 5278 jeux de données aléatoires de dimensions comparables sur la base d’une distribution normale).
plot_prcomp((Multidim2), nrow = 2L, ncol = 2L)
Avec cette visualisation, nous pouvons ressortir que les pourcentages
d’inertie nous permettent d’apprécier sur combien de dimensions les
données peuvent être réduites. Ici les données utiles se limiteront à la
quatrieme dimension. Ce sont ces 4 dimensions à 79% qui expliquent au
mieux le phénomene. Cependant, il serait tout de même probablement
préférable de considérer également dans l’analyse la 5e dimension.
La dimension 1 oppose des individus caractérisés par une coordonnée fortement positive sur l’axe (à droite du graphe) à des individus caractérisés par une coordonnée fortement négative sur l’axe (à gauche du graphe).
La dimension 2 oppose des individus caractérisés par une coordonnée fortement positive sur l’axe (en haut du graphe) à des individus caractérisés par une coordonnée fortement négative sur l’axe (en bas du graphe).
La dimension 3 oppose des individus caractérisés par une coordonnée fortement positive sur l’axe (à droite du graphe) à des individus caractérisés par une coordonnée fortement négative sur l’axe (à gauche du graphe).
library(factoextra)
library(corrplot)
fviz_eig(res.pca, addlabels = TRUE)
Les variables libellées sont celles les mieux représentées sur le plan.
res <- get_pca_var(res.pca)
corrplot(res$cos2)
Une estimation du nombre pertinent d’axes à interpréter suggère de restreindre l’analyse à la description des 4 premiers axes. Ces composantes révèlent un taux d’inertie supérieur à celle du quantile 0.95-quantile de distributions aléatoires (67.29% contre 42.21%). Cette observation suggère que seuls ces 4 axes sont porteurs d’une véritable information. En conséquence, la description de l’analyse sera restreinte à ces seuls axes.
fviz_pca_var (res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Évite le chevauchement de texte
)
Les variables nombre de grossesses, age, triceps, imc et insuline sont retenues comme porteuse du plus grand flux d’informations sur les dimensions 1 et 2. La variable pedigree et glucose ne comportent pas suffisament d’informations pour être retenus dans la projections es données.
La variable pedigree contibue le plus à l’axe 4. La dimension 1 présente une contribution homogène des de toutes les variables avec une plus forte contribution des variables insuline, triceps et glucose. L’axe 2 recoit ses fortes contributions des variables nombre de grossesse, imc et age. Ces variables contribuent plus fortement à la dimension 2 qu’à la premiere dimension. Les axes 1 à 3 sont à dominantes de contribution des variables nombre de grossesse, glucose, insuline.
corrplot(res$contrib, is.corr=FALSE)
Les individus libellés sont ceux ayant la plus grande contribution à la construction du plan.
# Visualiser la contribution des individus aux axes
fviz_pca_ind (res.pca, col.ind = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Évite le chevauchement de texte
)
échantillon de 40 enregistrements à partir des données de l’iris, afin que le graphe ne soit pas Surchargé.
idx <- sample(1:dim(Multidim2)[1], 50)
Multidim2sample <- Multidim2[idx,]
appliquons la classification Hiérarchique aux données
hc <- hclust(dist(Multidim2sample), method="average")
library(dendextend)
plot(hc, main = "Partion en 2, 4 et 8 classes", xlab = "", ylab = "", sub = "", axes = FALSE, hang = -1)
rect.hclust(hc, k=4, border="red")
groups <- cutree(hc, k=4)
groups
## 725 213 16 726 7 455 201 593 327 105 370 640 22 469 741 610 367 605 616 672
## 1 2 1 1 3 3 3 1 3 3 1 3 1 1 1 3 1 2 3 3
## 543 440 577 444 52 217 579 31 584 638 279 406 541 138 252 632 679 340 698 612
## 1 1 1 1 3 3 1 1 1 3 1 3 1 3 1 1 3 2 3 2
## 143 86 61 364 164 247 578 256 311 188
## 3 3 3 1 3 1 1 3 1 4
library(ggplot2)
ggplot(color_branches(hc, k = 4))
FactoMiner nous suggere d’utiliser la partition ayant la plus grande perte relative d’inertie. Nous allons calculer cet indicateur avec best.cutree
library(factoextra)
fviz_dend(hc, k=4, show_labels = FALSE, rect = TRUE)
typo <- cutree(hc, k=4)
Freq(typo)
## level freq perc cumfreq cumperc
## 1 [1,1.5] 24 48.0% 24 48.0%
## 2 (1.5,2] 4 8.0% 28 56.0%
## 3 (2,2.5] 0 0.0% 28 56.0%
## 4 (2.5,3] 21 42.0% 49 98.0%
## 5 (3,3.5] 0 0.0% 49 98.0%
## 6 (3.5,4] 1 2.0% 50 100.0%
Figure 5 - Classification Ascendante Hiérachique des individus. La classification réalisée sur les individus fait apparaître 4 classes.
La classe 1 est composé d’individus partageant :
de faibles valeurs pour les variables triceps, imc, insuline, age, pression_art, nb_grossesse, glucose et pedigree (de la plus extrême à la moins extrême). La classe 2 est composé d’individus partageant :
de fortes valeurs pour les variables triceps et imc (de la plus extrême à la moins extrême). de faibles valeurs pour les variables nb_grossesse, age, glucose et insuline (de la plus extrême à la moins extrême). La classe 3 est composé d’individus partageant :
de fortes valeurs pour les variables nb_grossesse, age, pression_art, insuline, triceps et glucose (de la plus extrême à la moins extrême). de faibles valeurs pour la variable imc. La classe 4 est composé d’individus partageant :
de fortes valeurs pour les variables insuline, glucose, imc, triceps, pedigree et pression_art (de la plus extrême à la moins extrême).
You can also embed plots, for example: