INTRODUCTION

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.

Dans le cadre de la formation de master professionnel en Statistique-Econométrie-Data Sciences, à l’INSSEDS (Institut Supérieur de Statistique d’Econométrie et de Data Science), l’une des exigences conditionnant la validation des différents crédits est la réalisation d’un mini-projet à la fin de chaque module de la formation.

C’est dans ce cadre académique que s’inscrit la présente étude. En tant qu’auteur, nous n’avons pas la prétention d’avoir abordé tous les contours nécessaires pour y revêtir le caractère d’une véritable étude thématique.

Également, toutes les conclusions développées dans ce présent rapport relèvent uniquement de l’auteur et n’engagent ni autrui, ni l’INSSEDS ” (Institut Supérieur de Statistique d’Econométrie et de Data Science)

PARTIE I : TRAITEMENT DES DONNEES BRUTES

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.

Dictionnaire des données de l’analyse

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)

Importation du jeu de donées

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.

Traitement des valeurs manquantes dans les données

Cette section va servir à afficher les observations qui contiennent des valeurs manquantes. Elle srvira également à réaliser tout le traitement qui y convient.

Proportion des valeurs manquantes dans les données

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)

Imputation de données manquantes par les K plus proches voisins

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.

library(DMwR2)
# vérifier les variables quanti
ind.qt <- sapply(Multidim, is.numeric)
# vérifier les variables quali
ind.qual <- sapply(Multidim,is.factor)
# Extraction Variable quanti
dQT <- Multidim[,ind.qt]
#Extraction Variable quali
dataQL <- Multidim[,ind.qual]
# Imputation des valeurs manquantes
dQT <- knnImputation(dQT, k = 100, scale = TRUE, meth = "weighAvg")
#Résumé des données sans valeurs manquantes
summary(dQT)
##   nb_grossesse       glucose        pression_art       triceps     
##  Min.   : 1.000   Min.   : 44.00   Min.   : 24.00   Min.   : 7.00  
##  1st Qu.: 2.000   1st Qu.: 99.75   1st Qu.: 64.00   1st Qu.:23.00  
##  Median : 3.651   Median :117.00   Median : 72.00   Median :29.02  
##  Mean   : 4.346   Mean   :121.67   Mean   : 72.27   Mean   :28.95  
##  3rd Qu.: 6.000   3rd Qu.:140.25   3rd Qu.: 80.00   3rd Qu.:33.13  
##  Max.   :17.000   Max.   :199.00   Max.   :122.00   Max.   :99.00  
##     insuline           imc           pedigree           age       
##  Min.   : 14.00   Min.   :18.20   Min.   :0.0780   Min.   :21.00  
##  1st Qu.: 99.53   1st Qu.:27.50   1st Qu.:0.2437   1st Qu.:24.00  
##  Median :139.78   Median :32.15   Median :0.3725   Median :29.00  
##  Mean   :152.48   Mean   :32.44   Mean   :0.4719   Mean   :33.24  
##  3rd Qu.:183.37   3rd Qu.:36.60   3rd Qu.:0.6262   3rd Qu.:41.00  
##  Max.   :846.00   Max.   :67.10   Max.   :2.4200   Max.   :81.00

Traitement des valeurs aberrantes et extrêmes

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.

Détection visuelle des valeurs aberrantes et extrêmes

library(rpart)
par(mfrow=c(2,4), mar=c(3,3,3,3))
boxplot(dQT$nb_grossesse)# graph
boxplot(dQT$glucose)
boxplot(dQT$pression_art)
boxplot(dQT$triceps)
boxplot(dQT$insuline)
boxplot(dQT$imc)
boxplot(dQT$pedigree)
boxplot(dQT$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.

Technique d’imputation de données abérrantes par winzorisation

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)

dQT$nb_grossesse <- Winsorize(dQT$nb_grossesse)
dQT$glucose<- Winsorize(dQT$glucose)
dQT$pression_art<- Winsorize(dQT$pression_art)
dQT$triceps<- Winsorize(dQT$triceps)
dQT$insuline<- Winsorize(dQT$insuline)
dQT$imc<- Winsorize(dQT$imc)
dQT$pedigree<- Winsorize(dQT$pedigree)
dQT$age<- Winsorize(dQT$age)

par(mfrow=c(2,4), mar=c(3,3,3,3))
boxplot(dQT$nb_grossesse)# graph
boxplot(dQT$glucose)
boxplot(dQT$pression_art)
boxplot(dQT$triceps)
boxplot(dQT$insuline)
boxplot(dQT$imc)
boxplot(dQT$pedigree)
boxplot(dQT$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.

PARTIE II : ANALYSE EN COMPOSANTES PRINCIPALES (ACP)

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.

Préalable à l’ACP

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.

Visualisation de la distribution des données

plot_histogram(dQT) 

plot_qq(dQT)

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”.

Correlations des variables

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(dQT, cor_args = list("use" = "pairwise.complete.obs")) 

library(corrplot)
cor <- cor(dQT)
corrplot(cor)

library(GGally)
library(ggplot2)
ggpairs(dQT)

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.

Analyse en composante principale ACP

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.

Réalisation de l’ACP

library(FactoMineR)
res.pca<-PCA(dQT)

summary(res.pca)
## 
## Call:
## PCA(X = dQT) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
## Variance               2.842   1.401   1.103   0.934   0.713   0.383   0.340
## % of var.             35.528  17.507  13.791  11.672   8.917   4.793   4.254
## Cumulative % of var.  35.528  53.035  66.827  78.499  87.416  92.209  96.463
##                        Dim.8
## Variance               0.283
## % of var.              3.537
## Cumulative % of var. 100.000
## 
## Individuals (the 10 first)
##                  Dist    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3
## 1            |  2.348 |  1.985  0.180  0.714 | -0.506  0.024  0.046 |  0.524
## 2            |  2.290 | -1.935  0.171  0.713 |  0.127  0.002  0.003 | -0.523
## 3            |  3.158 |  0.824  0.031  0.068 | -1.077  0.108  0.116 |  2.096
## 4            |  2.640 | -2.450  0.275  0.861 |  0.277  0.007  0.011 | -0.346
## 5            |  3.706 |  0.872  0.035  0.055 |  2.100  0.410  0.321 |  1.112
## 6            |  1.695 | -0.968  0.043  0.326 | -1.066  0.106  0.396 | -0.162
## 7            |  2.828 | -2.026  0.188  0.513 |  0.585  0.032  0.043 | -0.794
## 8            |  2.485 |  0.706  0.023  0.081 | -0.743  0.051  0.089 | -1.185
## 9            |  4.337 |  2.664  0.325  0.377 | -0.021  0.000  0.000 |  1.417
## 10           |  3.096 |  2.128  0.207  0.472 | -1.785  0.296  0.332 | -1.098
##                 ctr   cos2  
## 1             0.032  0.050 |
## 2             0.032  0.052 |
## 3             0.519  0.441 |
## 4             0.014  0.017 |
## 5             0.146  0.090 |
## 6             0.003  0.009 |
## 7             0.074  0.079 |
## 8             0.166  0.227 |
## 9             0.237  0.107 |
## 10            0.142  0.126 |
## 
## Variables
##                 Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr
## nb_grossesse |  0.560 11.029  0.313 | -0.583 24.245  0.340 | -0.252  5.768
## glucose      |  0.666 15.606  0.444 |  0.015  0.015  0.000 |  0.571 29.500
## pression_art |  0.581 11.865  0.337 | -0.132  1.247  0.017 | -0.333 10.038
## triceps      |  0.647 14.723  0.418 |  0.472 15.906  0.223 | -0.374 12.711
## insuline     |  0.728 18.662  0.530 |  0.054  0.209  0.003 |  0.498 22.456
## imc          |  0.614 13.255  0.377 |  0.606 26.200  0.367 | -0.309  8.628
## pedigree     |  0.207  1.508  0.043 |  0.269  5.154  0.072 |  0.338 10.385
## age          |  0.616 13.352  0.380 | -0.615 27.023  0.378 | -0.075  0.515
##                cos2  
## nb_grossesse  0.064 |
## glucose       0.325 |
## pression_art  0.111 |
## triceps       0.140 |
## insuline      0.248 |
## imc           0.095 |
## pedigree      0.115 |
## 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.

Visualisation de la distribution de l’inertie des axes

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.

plot_prcomp((dQT), 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.

Description des plans

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)

Visualisation de la qualité de la représentation des variables

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. 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.

Visualisation de la contribution des variables aux axes

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) 

Visualisation de la qualité de la représentation des observations

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
             )

PARTIE II : LA CLASSIFICATION DES DONNEES

Détermination de l’échantillon

Présentons un échantillon de 50 enregistrements à partir du jeu de données afin que le graphe ne soit pas Surchargé.

idx <- sample(1:dim(dQT)[1], 50)
dQTsample <- dQT[idx,]

Classification des données

Le résumé statistique nous montre que l’échelle sur toutes les colonnes est la même donc nous n’avons pas besoin de normaliser les données. Il est important de toujours vérifier l’échelle des différentes variables avant de procéder à la segmentation car la plupart des algorithmes de Clustering se base sur le calcul de la distance entre des points. De ce fait, si les valeurs ne sont pas à la même échelle le calcul sera biaisé et on aura pas un résultat exploitable.

Faisabilité de l’analyse de clustering

De plus il faut vérifier la faisabilité de l’analyse de clustering en calculant la statistique Hopkins.

#Calcul de la statistique Hopkins
get_clust_tendency(dQT, graph = FALSE, n = 50, seed = 123)
## $hopkins_stat
## [1] 0.6423777
## 
## $plot
## NULL

La statistique Hopkins est entre 0 et 1. Une valeur de Hopkins plus proche de 1 indique des structures aléatoires dans l’ensemble de données. Ici, la statistique Hopkins est égale à 0,064 donc très proche de 0. Donc il existe des clusters valides dans l’ensemble de nos données.

Détermination du nombre optimal de clusters

hc <- hclust(dist(dQTsample), method="average")

FactoMiner nous suggere d’utiliser la partition ayant la plus grande perte relative d’inertie. Nous allons calculer cet indicateur avec best.cutree. L’extension JLutils propose une fonction best.cutree qui permet de calculer cette indicateur à partir de n’importe quel dendrogramme calculé avec hclust ou agnes. Par défaut, best.cutree regarde quelle serait la meilleure partition entre 3 et 20 classes.

Nombre optimal de cluster

En l’occurence il s’agirait d’une partition en 3 classes.

src<- source(url("https://raw.githubusercontent.com/larmarange/JLutils/master/R/clustering.R"))
best<-best.cutree(hc)
best
## [1] 3

Visualisation de la classification

library(dendextend)
plot(hc, main = "Partion en 3 classes", xlab = "", ylab = "", sub = "", axes = FALSE,  hang = -1)
rect.hclust(hc, k=best, border="red")

Affectation des individus à chaque classe

groups <- cutree(hc, k=best)
groups
##  36 559 628 136 694 562 367 714 720 753  68 215 141 509 417 683 192 407 595 370 
##   1   1   1   1   1   2   1   2   1   1   1   1   1   1   1   1   1   1   2   1 
## 499 429 716 195  98 746 468 262 648 148 690 489 721 475 547  74  21 688 123 494 
##   3   1   2   1   1   1   1   1   3   1   3   1   1   1   3   2   2   1   1   1 
## 710 210 231 395 147  45 269 614 299 211 
##   1   3   3   3   1   3   1   1   1   1

###Implémentation de l’algorithme K-means avec k = best

Nous pouvons à présent implémenter l’algorithme k-means à l’ensemble de nos données en considérant Best comme nombre de clusters optimal.

set.seed(123)
#Exécutation de l'algorithme k-means avec k = 3
kmeans_out <- kmeans(dQT, centers = best, nstart = 50)
kmeans_out
## K-means clustering with 3 clusters of sizes 310, 124, 334
## 
## Cluster means:
##   nb_grossesse  glucose pression_art  triceps  insuline      imc  pedigree
## 1     5.072178 128.9212     74.29183 30.55889 163.91634 33.34021 0.4727434
## 2     4.694091 158.4677     75.29813 32.06794 249.83892 35.83415 0.5212456
## 3     3.306697 101.2270     68.73851 25.92166  90.30948 30.04652 0.4190117
##        age
## 1 36.90645
## 2 36.47581
## 3 27.97305
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   1   3   1   3   1   3   3   1   2   1   1   2   1   2   1   3   2   3   3   3 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   2   1   2   1   1   3   1   1   3   1   1   2   3   3   1   1   1   1   3   1 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   3   1   1   2   1   2   1   3   1   3   3   3   3   2   2   3   2   3   1   1 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   3   1   3   1   1   3   1   1   3   3   3   1   1   2   3   3   3   3   1   3 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   3   3   3   3   1   3   1   3   3   3   3   1   3   1   3   2   3   3   3   2 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   2   1   3   3   3   1   3   1   3   3   1   2   3   3   1   1   1   3   3   3 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   3   1   3   1   3   3   1   3   1   1   1   1   2   3   3   1   3   3   1   2 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   1   1   3   1   2   3   3   3   2   3   1   3   1   2   2   2   3   1   3   1 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   1   3   2   3   1   1   1   1   3   3   3   1   3   3   3   1   3   1   1   1 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   3   3   3   3   1   2   2   3   3   1   3   3   1   1   3   2   3   3   3   2 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   3   1   3   3   1   3   2   2   3   2   3   1   2   1   1   2   3   3   3   1 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 
##   2   2   1   1   3   3   3   1   2   3   1   2   3   1   3   2   1   2   1   3 
## 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 
##   3   3   1   1   1   2   1   2   2   3   1   1   3   3   2   3   3   3   2   1 
## 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 
##   1   1   3   1   1   3   1   1   3   1   1   3   3   3   1   3   3   3   1   2 
## 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 
##   1   1   1   1   1   1   2   2   3   3   3   3   1   1   2   1   2   2   1   1 
## 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 
##   2   1   3   1   1   3   1   1   1   1   3   1   3   3   1   3   3   2   1   2 
## 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 
##   2   3   1   3   1   1   1   2   3   3   1   3   2   1   3   2   1   1   1   2 
## 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 
##   3   3   1   1   1   3   3   3   3   1   3   1   3   3   3   1   1   1   3   2 
## 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 
##   2   2   1   2   2   3   1   3   3   1   2   3   3   3   1   2   3   3   2   3 
## 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 
##   3   3   1   3   3   3   1   1   2   3   1   2   2   3   1   2   3   1   3   2 
## 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 
##   3   1   3   3   2   1   1   3   2   2   1   1   2   3   1   2   3   1   3   3 
## 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 
##   1   3   3   3   2   2   3   1   1   1   3   3   3   1   3   1   1   1   3   1 
## 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 
##   2   3   3   1   3   3   3   3   3   3   3   1   1   1   3   1   1   3   2   3 
## 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 
##   3   3   3   3   1   3   3   3   1   1   1   1   1   1   3   1   1   3   3   1 
## 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 
##   2   1   3   3   2   2   2   2   3   2   3   3   3   3   3   2   3   3   1   1 
## 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 
##   3   3   1   3   1   3   3   1   3   1   1   2   1   3   3   3   1   1   3   2 
## 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 
##   3   1   3   1   1   3   3   3   1   3   3   1   3   3   3   1   1   3   1   1 
## 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 
##   1   1   1   3   3   2   2   1   3   2   3   3   1   3   3   2   3   1   1   3 
## 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 
##   1   2   3   3   3   3   3   3   1   1   3   1   3   3   2   3   3   1   1   2 
## 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 
##   2   3   1   1   2   3   1   3   1   3   1   1   1   3   2   1   3   3   2   3 
## 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 
##   3   3   1   1   2   1   2   3   2   1   1   1   2   3   1   3   1   3   1   1 
## 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 
##   1   3   2   3   3   3   3   1   1   3   1   3   3   1   3   1   1   3   3   3 
## 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 
##   3   1   1   3   1   2   1   1   1   3   3   3   3   3   1   2   3   1   1   3 
## 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 
##   1   2   2   1   1   1   1   1   1   3   1   3   3   2   1   2   1   3   1   2 
## 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 
##   3   2   3   1   1   1   3   3   1   1   1   1   3   1   3   2   1   3   1   1 
## 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 
##   1   1   2   1   3   3   1   2   1   1   2   3   1   2   3   2   1   1   1   1 
## 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 
##   3   1   1   3   1   1   1   1   1   3   3   1   1   1   3   3   3   3   1   1 
## 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 
##   1   3   3   1   1   3   1   3   2   1   1   3   3   2   1   3   1   1   3   2 
## 761 762 763 764 765 766 767 768 
##   3   2   3   1   1   3   1   3 
## 
## Within cluster sum of squares by cluster:
## [1] 390004.6 272862.8 396612.7
##  (between_SS / total_SS =  72.7 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Évidemment, trois clusters sont formés et cela est conforme à notre paramètre k qui a été transmis à l’algorithme. Nous voyons que le premier groupe contient 310 observations, le deuxième groupe contient 124 observations et le troisième groupe contient 334 observations. Chacune des observations de notre ensemble des données est affectée à l’un de ces trois groupes (1, 2 ou 3).

Visualisation des résultats avec Kmeans

# Visualisation des résultats
fviz_cluster(kmeans_out, data = dQT)

Visualisation du clustering par le dendogramme

library(factoextra)
fviz_dend(hc, k=best, show_labels = FALSE, rect = TRUE)

Qualité de la segmentation

En Apprentissage supervisé, on dispose de données étiquettées ce qui permet de comparer les prédictions du modèle aux réelles observations. En apprentissage non-supervisé, comme c’est le cas ici, cette comparaison ne peut se faire car les données ne sont pas étiquettées. Comment mesurer alors la qualité de notre partitionnement ?

L’objectif du clustering est d’obtenir des clusters de bonne qualité. Le clustering est de haute qualité si la distance dans les observations (intra-cluster) d’un cluster donné est minimale et la distance séparant les clusters eux-mêmes (inter-cluster) est maximale. Malheureusement, il n’y aucune valeur seuil (ou valeur de référence) pour dire la distance intra-cluster est minimale ou si la distance inter-cluster est maximale.

Pour mesurer la qualité du clustering, on peut calculer le coefficient de Silhouette pour chacun des trois groupes. L’indice Silhouette est calculé en utilisant la distance intra-cluster moyenne, a, et la distance moyenne du cluster le plus proche, b, pour chacune des observations participant à l’exercice de clustering. Pour une observation, l’indice Silhouette est donné par la formule : (b - a)/max(a, b).

#Calcul de l'indice Silhouette
library("cluster")
si<-silhouette(kmeans_out$cluster, dist(dQT, "euclidean"))
summary(si)
## Silhouette of 768 units in 3 clusters from silhouette.default(x = kmeans_out$cluster, dist = dist(dQT, "euclidean")) :
##  Cluster sizes and average silhouette widths:
##       310       124       334 
## 0.3663232 0.3426397 0.4643995 
## Individual silhouette widths:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -0.0840  0.2720  0.4537  0.4052  0.5483  0.6425

Calcul de l’indice Silhouette si<- silhouette(kmeans_out$cluster, dist(dQT, “euclidean”)) summary(si)

La largeur de silhouette moyenne de chaque cluster est positive 0.3663232, 0.3426397 et 0.4643995 et plus proche de 1 plutôt que de -1. Donc, on peut dire que ce clustering est de bonne qualité

Centre de gravité de chaque cluster

#Centre de gravité de chaque cluster
centroide <- kmeans_out$centers
centroide
##   nb_grossesse  glucose pression_art  triceps  insuline      imc  pedigree
## 1     5.072178 128.9212     74.29183 30.55889 163.91634 33.34021 0.4727434
## 2     4.694091 158.4677     75.29813 32.06794 249.83892 35.83415 0.5212456
## 3     3.306697 101.2270     68.73851 25.92166  90.30948 30.04652 0.4190117
##        age
## 1 36.90645
## 2 36.47581
## 3 27.97305

Indice moyen observé chez les patients pour chaque groupe

#Indice moyen observé chez les patients pour chaque groupe
for (i in 1:3) {
  print(sum(centroide[i, ]))
}
## [1] 473.4798
## [1] 593.198
## [1] 347.9419

En ayant les caractériques de chaque centre de gravité, nous pouvons tirer des informations pour chacun des groupes qui permettront d’avoir une meilleure classification des causes de la survenue du diabète.

Le groupe 3 a une plus faible exposition au diabete.

Le groupe 2 a une plus forte exposition au diabete.

Le groupe 1 a une exposition moyenne au diabete.

Si par exemple, l’objectif est de faire davantage de sensibilisation des patients, l’on peut déployer une campagne de prévention auprès des clients du groupe 2 dont les valeurs pour chaque variable sont inférieures à celles du centroïde du groupe 2.

Catégorisation par classification ascendante hierarchique

library(FactoMineR)
res<-PCA(dQT)

res.hcpc<-HCPC(res,nb.clust=best,graph=TRUE)

names(res.hcpc)
## [1] "data.clust" "desc.var"   "desc.axes"  "desc.ind"   "call"
# AFFECTATION DE CHAQUE INDIVIDU A UNE CLASSE (CLUSTER)
cluster = res.hcpc$data.clust 
head(cluster)
##   nb_grossesse glucose pression_art  triceps  insuline  imc pedigree age clust
## 1     6.000000     148           72 35.00000 202.62859 33.6  0.62700  50     3
## 2     1.000000      85           66 29.00000  87.22341 26.6  0.35100  31     1
## 3     8.000000     181           64 28.18980 191.38619 23.3  0.67200  32     3
## 4     1.000000      89           66 23.00000  94.00000 28.1  0.16700  21     1
## 5     3.644169     137           52 35.00000 168.00000 43.1  1.13285  33     2
## 6     5.000000     116           74 23.56553 118.82076 25.6  0.20100  30     1
#extraction des individus par groupe
cluster = res.hcpc$data.clust
groupe_1 = subset(cluster, clust ==1)
groupe_2 = subset(cluster, clust ==2)
groupe_3 = subset(cluster, clust ==3)

CARACTERISATION DES CLUSTERS PAR LES VARIABLES

# CARACTERISATION DES CLUSTERS PAR LES VARIABLES
res.hcpc$desc.var 
## 
## Link between the cluster variable and the quantitative variables
## ================================================================
##                    Eta2       P-value
## age          0.61995040 1.944942e-161
## nb_grossesse 0.56802567 3.653099e-140
## triceps      0.45903491 8.654334e-103
## imc          0.43003132  4.102087e-94
## insuline     0.30367190  7.521848e-61
## glucose      0.20644524  3.874052e-39
## pression_art 0.19750799  2.809144e-37
## pedigree     0.02389019  9.621520e-05
## 
## Description of each cluster by quantitative variables
## =====================================================
## $`1`
##                  v.test Mean in category Overall mean sd in category Overall sd
## pedigree      -3.778286        0.4114659    0.4572068       0.245109  0.2765854
## pression_art -12.037870       66.5169447   72.0391872       9.216936 10.4805865
## glucose      -12.435909      106.0187102  121.6476363      20.926985 28.7125238
## nb_grossesse -12.586464        2.7198077    4.2433327       1.654382  2.7654490
## age          -13.711040       26.3504823   32.9518229       5.868001 10.9997169
## insuline     -15.224995      104.1822052  145.7779424      43.711796 62.4182304
## imc          -15.784309       28.0308236   32.3104645       4.151383  6.1944325
## triceps      -17.779784       22.6318159   28.7858268       5.544904  7.9077249
##                   p.value
## pedigree     1.579113e-04
## pression_art 2.246809e-33
## glucose      1.668315e-35
## nb_grossesse 2.506532e-36
## age          8.719854e-43
## insuline     2.413782e-52
## imc          3.989928e-56
## triceps      1.013694e-70
## 
## $`2`
##                 v.test Mean in category Overall mean sd in category Overall sd
## imc          15.976458       37.8792411   32.3104645      4.4507645  6.1944325
## triceps      14.499318       35.2375673   28.7858268      6.1091079  7.9077249
## insuline      7.163208      170.9371403  145.7779424     63.7455137 62.4182304
## glucose       4.952915      129.6498472  121.6476363     27.5300268 28.7125238
## pression_art  4.196306       74.5139324   72.0391872      9.9875545 10.4805865
## pedigree      3.707075        0.5149018    0.4572068      0.2953911  0.2765854
## age          -7.127566       28.5401786   32.9518229      6.1664553 10.9997169
## nb_grossesse -7.464039        3.0818378    4.2433327      1.5505126  2.7654490
##                   p.value
## imc          1.864429e-57
## triceps      1.223596e-47
## insuline     7.881046e-13
## glucose      7.310993e-07
## pression_art 2.713036e-05
## pedigree     2.096671e-04
## age          1.021596e-12
## nb_grossesse 8.390964e-14
## 
## $`3`
##                 v.test Mean in category Overall mean sd in category Overall sd
## age          21.687521        46.004292    32.951823       8.309722  10.999717
## nb_grossesse 20.819390         7.393509     4.243333       2.219170   2.765449
## insuline      9.174677       177.111049   145.777942      49.852385  62.418230
## pression_art  8.704920        77.030923    72.039187       9.014354  10.480587
## glucose       8.381873       134.815451   121.647636      29.038014  28.712524
## triceps       4.649360        30.797447    28.785827       5.880689   7.907725
##                    p.value
## age          2.691034e-104
## nb_grossesse  2.888368e-96
## insuline      4.529322e-20
## pression_art  3.177994e-18
## glucose       5.209200e-17
## triceps       3.329659e-06

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, imc, insuline, glucose, pression art, pedigree (de la plus extrême à la moins extrême).de faibles valeurs pour les variables nb_grossesse, age (de la plus extrême à la moins extrême).

La classe 3 est composé d’individus partageant : de fortes valeurs pour les variables age,nb_grossesse, insuline, pression_art, glucose et triceps (de la plus extrême à la moins extrême).

CARACTERISATION DES CLUSTERS PAR LES DIMENSIONS (axe)

# CARACTERISATION DES CLUSTERS PAR LES DIMENSIONS (axe)
res.hcpc$desc.axes 
## 
## Link between the cluster variable and the quantitative variables
## ================================================================
##             Eta2       P-value
## Dim.1 0.68688739 1.274865e-193
## Dim.2 0.57126456 2.053243e-141
## Dim.5 0.02992966  8.958484e-06
## Dim.4 0.01595419  2.129897e-03
## Dim.3 0.01553988  2.501985e-03
## 
## Description of each cluster by quantitative variables
## =====================================================
## $`1`
##           v.test Mean in category  Overall mean sd in category Overall sd
## Dim.3   3.435733       0.15796027  3.912783e-15      0.8969214  1.0503844
## Dim.5   2.641819       0.09766518  3.132864e-15      0.8339042  0.8446106
## Dim.1 -22.456424      -1.65711335 -2.085282e-15      0.8454947  1.6858984
##             p.value
## Dim.3  5.909538e-04
## Dim.5  8.246215e-03
## Dim.1 1.107519e-111
## 
## $`2`
##          v.test Mean in category  Overall mean sd in category Overall sd
## Dim.2 18.676664        1.2437423 -6.662617e-15      0.7806448  1.1834593
## Dim.1  7.858475        0.7454996 -2.085282e-15      0.9941327  1.6858984
## Dim.5  1.992687        0.0947051  3.132864e-15      0.8147408  0.8446106
## Dim.4 -2.953799       -0.1606114 -1.354863e-15      1.0075611  0.9663125
##            p.value
## Dim.2 7.666360e-78
## Dim.1 3.888393e-15
## Dim.5 4.629574e-02
## Dim.4 3.138882e-03
## 
## $`3`
##           v.test Mean in category  Overall mean sd in category Overall sd
## Dim.1  16.208865        1.4951517 -2.085282e-15      1.0144388  1.6858984
## Dim.4   2.948541        0.1558928 -1.354863e-15      1.0036382  0.9663125
## Dim.3  -2.154677       -0.1238316  3.912783e-15      1.0689870  1.0503844
## Dim.5  -4.791080       -0.2214069  3.132864e-15      0.8453570  0.8446106
## Dim.2 -16.471799       -1.0665854 -6.662617e-15      0.8418225  1.1834593
##            p.value
## Dim.1 4.365568e-59
## Dim.4 3.192778e-03
## Dim.3 3.118713e-02
## Dim.5 1.658858e-06
## Dim.2 5.850414e-61

IDENTIFICATION DES PARAGONS (individu le plus proche du centre des classes)

# IDENTIFICATION DES PARAGONS (individu le plus proche du centre des classes
res.hcpc$desc.ind 
## $para
## Cluster: 1
##       278        80       164       424         2 
## 0.4323156 0.6540725 0.7101894 0.7522303 0.7870355 
## ------------------------------------------------------------ 
## Cluster: 2
##       127       704       477       214       245 
## 0.6727712 0.8874320 0.9574275 0.9839391 1.0169227 
## ------------------------------------------------------------ 
## Cluster: 3
##        37       755        31       702       615 
## 0.4381690 0.6814548 0.6892297 0.7476769 0.9365314 
## 
## $dist
## Cluster: 1
##       56      618       98      259      386 
## 4.883834 4.771654 4.725095 4.695439 4.694205 
## ------------------------------------------------------------ 
## Cluster: 2
##      607      662      748       46      371 
## 4.973269 4.955987 4.448229 4.448220 4.421774 
## ------------------------------------------------------------ 
## Cluster: 3
##      246      520       13       29       54 
## 4.843615 4.818078 4.621768 4.408619 4.381917

Pour chaque groupe, les 5 meilleurs individus les plus proches du centre du cluster sont affichés. Ces individus sont appelés paragones. La distance entre chaque individu et le centre du groupe est fournie. Par exemple, les individus représentatifs pour le groupe 1 inclus: 278, 80, 633, 445, 164.

CONCLUSION

Notre étude a débuté avec 9 variables que nous avons passé en analyse en composantes principales pour n’en conservé que 4 axes. Ce sont ces 4 dimensions à 79% qui expliquent au mieux les causes de la survenue du diabete chez cette population. Le reste pouvant être considéré comme un bruit dans les données.

Puis nous avons procédé à un clustering. Nous avons déterminé le nombre optimal des classes par l’algorithme, et avons procédé à la vérification de l’existence de groupes similaires distincts dans l’ensemble des données. S’il n’y avait aucune structuration dans les données (données purement aléatoires), il etait donc inutile d’implémenter un algorithme de clustering. La vérification s’est faite par le calcul statistique Hopkins et nous a permi de conclure à la struturation des données donc à la présence de cluster dans les données. Nous avons poursuivi en implémentant l’algorithme K-means. Enfin, après avoir implémenter le K-means, nous avons mesuré la qualité du partitionnement et procédé à la classification ascendante hierarchique pour nous permettre de tirer des informations utiles pourquoi pas pour le lancement de campagnes de sensibilisation au diabete.