#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
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.
# 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)
}
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.
# 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.