#install.packages("ggplot2")
#install.packages("dplyr")
#install.packages("mice")
#install.packages("factoextra")
#install.packages("Amelia")

library(ggplot2)
library(dplyr)
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union
library(mice)
## 
## Attachement du package : 'mice'
## L'objet suivant est masqué depuis 'package:stats':
## 
##     filter
## Les objets suivants sont masqués depuis 'package:base':
## 
##     cbind, rbind
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(Amelia)
## Le chargement a nécessité le package : Rcpp
## ## 
## ## Amelia II: Multiple Imputation
## ## (Version 1.8.2, built: 2024-04-10)
## ## Copyright (C) 2005-2024 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##
#install.packages("knitr")
#install.packages("rmarkdown") 
#install.packages("markdown") 
library(knitr) 
library(rmarkdown) 
library(markdown) 

ETUDE DU DIABÈTE

  1. Prétraitement des données

A l’aide du module missmap de la bibliothèque Amelia, on affiche la carte des données manquantes du fichier .csv :

getwd()
## [1] "C:/Users/guill_wm99bol/Documents/Cours CS/ST4 Big data et santé/DM V2"
data <- read.csv("diabetes.csv", sep=",", stringsAsFactors=FALSE)
head(data)
##   X pregnant glucose pressure triceps insulin mass pedigree age diabetes
## 1 1        6     148       72      35      NA 33.6    0.627  50      pos
## 2 2        1      85       66      29      NA 26.6    0.351  31      neg
## 3 3        8     183       64      NA      NA 23.3    0.672  32      pos
## 4 4        1      89       66      23      94 28.1    0.167  21      neg
## 5 5        0     137       40      35     168 43.1    2.288  33      pos
## 6 6        5     116       74      NA      NA 25.6    0.201  30      neg
# Visualiser les données manquantes
missmap(data, main = "Carte des données manquantes")

On utilise alors la bibliothèque Mice pour imputer les données manquantes :

# Imputation multiple avec MICE
data_impute <- mice(data, method = 'pmm', m = 5, seed = 123)
## 
##  iter imp variable
##   1   1  glucose  pressure  triceps  insulin  mass
##   1   2  glucose  pressure  triceps  insulin  mass
##   1   3  glucose  pressure  triceps  insulin  mass
##   1   4  glucose  pressure  triceps  insulin  mass
##   1   5  glucose  pressure  triceps  insulin  mass
##   2   1  glucose  pressure  triceps  insulin  mass
##   2   2  glucose  pressure  triceps  insulin  mass
##   2   3  glucose  pressure  triceps  insulin  mass
##   2   4  glucose  pressure  triceps  insulin  mass
##   2   5  glucose  pressure  triceps  insulin  mass
##   3   1  glucose  pressure  triceps  insulin  mass
##   3   2  glucose  pressure  triceps  insulin  mass
##   3   3  glucose  pressure  triceps  insulin  mass
##   3   4  glucose  pressure  triceps  insulin  mass
##   3   5  glucose  pressure  triceps  insulin  mass
##   4   1  glucose  pressure  triceps  insulin  mass
##   4   2  glucose  pressure  triceps  insulin  mass
##   4   3  glucose  pressure  triceps  insulin  mass
##   4   4  glucose  pressure  triceps  insulin  mass
##   4   5  glucose  pressure  triceps  insulin  mass
##   5   1  glucose  pressure  triceps  insulin  mass
##   5   2  glucose  pressure  triceps  insulin  mass
##   5   3  glucose  pressure  triceps  insulin  mass
##   5   4  glucose  pressure  triceps  insulin  mass
##   5   5  glucose  pressure  triceps  insulin  mass
## Warning: Number of logged events: 1
data_complet <- complete(data_impute, 1)

On vérifie alors que l’imputation a été effective :

missmap(data_complet, main="Données imputées")

Remarque : on a utilisé la stratégie Predictive Mean Matching (PMM). C’est une approche d’imputation semi-paramétrique. Elle est similaire à la méthode de régression sauf que pour chaque valeur manquante, elle remplit une valeur de manière aléatoire parmi les valeurs d’un donneur observées à partir d’une observation dont les valeurs prédites par la régression sont les plus proches de la valeur prédite par la régression pour la valeur manquante de la méthode de régression.

  1. Analyse exploratoire des données
  1. La variable dépendante est diabete, toutes les autres variables sont explicatives. On extrait donc ces données. On obtient les histogrammes et boxplots suivants pour chaque variable explicative :
# Sélectionner uniquement les variables explicatives
data_explicative <- select(data_complet, pregnant, glucose, pressure, triceps, insulin, mass, pedigree, age)

# Standardiser les données
#data_standard <- scale(data_explicative)

# Boucle pour créer des histogrammes pour chaque variable
variables <- c("pregnant", "glucose", "pressure", "triceps", "insulin", "mass", "pedigree", "age")
for (var in variables) {
  p <- ggplot(data_complet, aes_string(x = var, fill = "diabetes")) +
    geom_histogram(position = "dodge", binwidth = 10, alpha = 0.7) +
    labs(title = paste("Distribution de", var, "par statut diabétique"),
         x = var, y = "Nombre d'observations") +
    scale_fill_brewer(palette = "Set1") +
    theme_minimal()
  print(p)
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Boucle pour créer des boxplots pour chaque variable
for (var in variables) {
  p <- ggplot(data_complet, aes_string(x = "diabetes", y = var, fill = "diabetes")) +
    geom_boxplot(alpha = 0.7) +
    labs(title = paste("Boxplot de", var, "par statut diabétique"),
         x = "Statut Diabétique", y = var) +
    scale_fill_brewer(palette = "Set1") +
    theme_minimal()
  print(p)
}

  1. Il est nécessaire de standardiser les variables explicatives avant de réaliser une Analyse en Composantes Principales (ACP), car l’ACP est sensible aux différences d’échelle entre les variables.
data_standard <- scale(data_explicative)

On obtient les résultats suivants :

# Effectuer l'ACP
resultats_acp <- prcomp(data_standard, scale. = TRUE, center = TRUE)

# Afficher un résumé des résultats de l'ACP
summary(resultats_acp)
## Importance of components:
##                           PC1    PC2    PC3    PC4     PC5     PC6    PC7
## Standard deviation     1.5765 1.2207 1.0952 0.9600 0.86427 0.66400 0.6406
## Proportion of Variance 0.3107 0.1863 0.1499 0.1152 0.09337 0.05511 0.0513
## Cumulative Proportion  0.3107 0.4970 0.6469 0.7621 0.85546 0.91057 0.9619
##                            PC8
## Standard deviation     0.55231
## Proportion of Variance 0.03813
## Cumulative Proportion  1.00000

On ne retient généralement les 3 ou 4 premières composantes principales, car elles capturent 60 à 70% de la variance des données (ici, les 4 premières composantes capturent 76% de la variance). On considère cela suffisant pour obtenir une représentation significative des données.

  1. On réalise un clustering hiérarchique en utilisant les méthodes de Ward et Complete.
# Clustering hiérarchique avec la méthode Ward
matrice_distances <- dist(data_standard)
hc_ward <- hclust(matrice_distances, method = "ward.D2")
# Clustering hiérarchique avec la méthode Complete
hc_complete <- hclust(matrice_distances, method = "complete")

On obtient les dendrogrammes suivants, et on génère les cluster correspondants :

# Visualisation du dendrogramme pour la méthode Ward
fviz_dend(hc_ward, k = 4, cex = 0.5, rect = TRUE, rect_fill = TRUE, rect_border = "jco",
          main = "Dendrogramme avec méthode Ward")
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Visualisation du dendrogramme pour la méthode Complete
fviz_dend(hc_complete, k = 4, cex = 0.5, rect = TRUE, rect_fill = TRUE, rect_border = "jco",
          main = "Dendrogramme avec méthode Complete")

# Découper le dendrogramme en k clusters pour la méthode Ward
clusters_ward <- cutree(hc_ward, k = 4)

# Ajouter les clusters au dataframe original
data_complet$cluster_ward <- as.factor(clusters_ward)

# Afficher les moyennes des variables pour chaque cluster pour la méthode Ward
ward_means <- aggregate(data_explicative, by = list(cluster = clusters_ward), mean)
print(ward_means)
##   cluster pregnant  glucose pressure  triceps  insulin     mass  pedigree
## 1       1 7.748092 121.8244 74.70992 29.73282 142.0687 31.34198 0.3556260
## 2       2 2.470948 108.5107 67.81040 22.03670 101.5076 28.11284 0.4379205
## 3       3 5.074713 154.3506 77.40230 34.39655 294.3448 36.80805 0.5949885
## 4       4 1.816176 110.9485 74.09559 37.97059 126.5809 38.40221 0.5079853
##        age
## 1 46.48092
## 2 27.82875
## 3 37.47701
## 4 28.08088
# Découper le dendrogramme en k clusters pour la méthode Complete
clusters_complete <- cutree(hc_complete, k = 4)

# Ajouter les clusters au dataframe original
data_complet$cluster_complete <- as.factor(clusters_complete)

# Afficher les moyennes des variables pour chaque cluster pour la méthode Complete
complete_means <- aggregate(data_explicative, by = list(cluster = clusters_complete), mean)
print(complete_means)
##   cluster pregnant  glucose pressure  triceps  insulin     mass  pedigree
## 1       1 6.166667 136.6279 78.05039 28.96512 182.2364 32.68953 0.4280659
## 2       2 2.722595 109.3065 67.51678 27.65772 127.7517 31.17897 0.4323154
## 3       3 1.400000 173.4000 67.20000 44.80000 353.2000 43.92000 2.2134000
## 4       4 2.379310 145.0172 83.67241 37.75862 247.3621 40.26724 0.8215172
##        age
## 1 42.23256
## 2 27.99776
## 3 27.80000
## 4 34.12069
# Visualiser les clusters pour la méthode Ward
fviz_cluster(list(data = data_standard, cluster = clusters_ward),
             geom = "point", ellipse.type = "norm", main = "Clusters avec Méthode Ward")

# Visualiser les clusters pour la méthode Complete
fviz_cluster(list(data = data_standard, cluster = clusters_complete),
             geom = "point", ellipse.type = "norm", main = "Clusters avec Méthode Complete")

Le clustering hiérarchique a segmenté les individus en groupes basés sur leurs caractéristiques explicatives. Cette méthode a permis de créer des clusters qui présentent des variations significatives selon les méthodes utilisées. Par exemple, la méthode Ward favorise des groupes plus homogènes en minimisant la variance intra-cluster, ce qui conduit à des clusters compacts et similaires en termes de profil. En revanche, la méthode Complete tend à créer des clusters avec des variations plus larges en minimisant la distance maximale entre les observations de chaque cluster, ce qui peut conduire à des clusters moins homogènes mais plus distincts les uns des autres.

La comparaison entre ces approches démontre comment le choix de la méthode de regroupement peut influencer la structure des clusters obtenus. Ces clusters peuvent être utilisés pour des analyses plus approfondies ou pour orienter des interventions cliniques spécifiques. En identifiant des profils types de patients diabétiques, les professionnels de santé sont en mesure de mieux adapter leurs traitements et leurs interventions, ce qui peut potentiellement améliorer les résultats pour les patients.