Introduction
L’analyse de données joue un rôle crucial dans la compréhension des problématiques de santé, en particulier dans la prévention et la gestion des maladies chroniques. Le jeu de données “Pima Indians Diabetes Database” offre une opportunité passionnante d’explorer les facteurs liés au diabète chez une population spécifique.
Le diabète est une maladie métabolique complexe qui affecte un nombre croissant de personnes à l’échelle mondiale. Comprendre les variables associées à cette condition peut aider à identifier les risques, à mettre en œuvre des stratégies de prévention et à améliorer les soins de santé.
Au cours de cette étude, nous utiliserons des techniques d’analyse de données pour explorer les relations entre différentes variables présentes dans le jeu de données Pima Indians Diabetes. Nous nous concentrerons sur des méthodes telles que l’Analyse en Composantes Principales (ACF), la classification et l’apprentissage automatique pour déduire des informations significatives sur les facteurs de risque potentiels.
Cette étude est menée dans le cadre d’une SAE dans le domaine de la science des données, avec pour objectif d’appliquer des connaissances analytiques en data mining pour mieux comprendre les relations entre les variables et contribuer à des initiatives de santé préventive.
Présentation du Jeu de Données
Pima indians diabetes database
Le jeu de données détermine la présence ou de l’absence de diabète chez des femmes d’origine amérindienne Pima. Les données ont été recueillies dans le but d’étudier les facteurs de risque associés au diabète.
Le jeu de données contient un total de 768 échantillons, avec 9 variables qui peuvent être utilisées pour prédire la présence ou l’absence de diabète. Les variables sont les suivantes :
- Pregnancies : Le nombre de fois où la patiente a été enceinte.
- Glucose : La concentration plasmatique de glucose après un test oral de tolérance au glucose.
- BloodPressure : La pression artérielle diastolique (mm Hg).
- SkinThickness : L’épaisseur du pli cutané au niveau du triceps (mm).
- Insulin : La concentration sérique d’insuline (mu U/ml).
- BMI : L’indice de masse corporelle (BMI).
- DiabetesPedigreeFunction : Une fonction qui mesure la prédisposition génétique au diabète.
- Age : L’âge de la patiente.
- Outcome : La variable cible, indiquant la présence (1) ou l’absence (0) de diabète.
Objectif de l’étude
L’objectif principal de cette étude est de comprendre comment ces variables interagissent et comment elles peuvent être utilisées pour prédire la probabilité de diabète chez les femmes Pima.
En appliquant des méthodes d’analyse exploratoire et de machine learning, nous chercherons à identifier des tendances, des corrélations et des modèles significatifs.
Cette analyse vise à fournir des informations utiles pour les professionnels de la santé, les chercheurs et les responsables de politiques publiques dans leurs efforts pour prévenir et gérer le diabète au sein de cette communauté particulière.
Nous détaillerons la méthodologie que nous allons suivre, y compris la préparation des données, la classification, l’analyse factorielle des correspondances,l’apprentissage statistique (machine learning) et l’interprétation des résultats obtenus.
Préparation des données
Il est impératif d’importer les données dans PostgreSQL avant de pouvoir les transférer vers R pour commencer l’étude.
Il n’est pas nécessaire de procéder à un nettoyage préalable des données.
Cependant, au cours de l’Analyse Factorielle des Correspondances (AFC), nous ajusterons le type de certaines variables, cela sera détaillé au moment opportun.
library(DBI)
c=dbConnect(RPostgreSQL::PostgreSQL(),dbname="iut2202290") # connexion a la base de données
#dbWriteTable(c, "diabetes",diabetes ,row.names = FALSE) #importation des données a la base de données
query='SELECT * FROM public.diabetes;' #requête sql
diabetes = dbGetQuery(c,query) #récupération des données
Classification / silhouette
La classification, dans le domaine de l’analyse de données, consiste à regrouper des observations similaires dans des catégories distinctes.
C’est une approche cruciale pour détecter des modèles et des relations au sein de données complexes.
Cette méthode s’avère essentielle pour simplifier la prise de décision, réaliser des prédictions et comprendre les liens entre différentes variables.
Dans le cadre de notre étude, la classification sera un outil clé pour identifier des sous-groupes significatifs, notamment en ce qui concerne la présence ou l’absence de diabète.
datascale = scale(diabetes)
cah = hclust(dist(datascale),method="ward.D2")
plot(cah, hang = -1)
Le dendrogramme obtenu nous permet de visualiser la hiérarchie de groupes créée par l’algorithme de classification.
Nous pouvons voir que les individus sont regroupés en deux grands groupes et 5 sous-groupes.
On peut déjà émettre comme hypothèse 2 classes pour nos données.
plot(rev(cah$height)[1:25],type="b")
Avec le graphique du coude, nous observons que notre droite à partir de 2 classes ne suit plus la même trajectoire et a une distance entre son point précédent la plus importante ce qui confirme notre hypothèse du dendrogramme.
Ces classes peuvent être interprétées comme les deux états possibles concernant le diabète, l’une représentant les individus atteints de diabète et l’autre ceux sans diabète.
q=2
plot(cah,hang=-1)
rect.hclust(cah,q)
classif=cutree(cah,q)
Nous enregistrons les données classifiées dans une variable appelée “classif” avec q=2 (le nombre de classes) et procédons ensuite à une évaluation plus approfondie de la qualité de cette classification en utilisant le calcul de la silhouette.
library(cluster)
sil = silhouette(classif, dist(datascale))
rownames(sil) = rownames(datascale)
plot(sil , nmax = 768)
Pour les deux classes discernées, la première, comprenant 265 observations, affiche un score-silhouette de 0,12, signalant une classification relativement modérée.
En revanche, la deuxième classe, constituée de 503 observations, obtient un score-silhouette de 0,25, indiquant une meilleure classification en moyenne.
Lorsque nous calculons la moyenne des scores-silhouettes pour l’ensemble des classes, elle atteint 0,2, fournissant une évaluation globale de la qualité de la classification.
0,2 est assez faible, cela peut s’expliquer par la diffuculté du jeu de données, nous pouvons aussi voir quelle observation a le plus gros score silhouette dans chaque classe afin de déterminer un profile.
tt = data.frame(sil)
diabetes[rownames(tt[tt$sil_width == max(tt$sil_width[tt$cluster == 1]),]),]
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 237 7 181 84 21 192 35.9
## DiabetesPedigreeFunction Age Outcome
## 237 0.586 51 1
diabetes[rownames(tt[tt$sil_width == max(tt$sil_width[tt$cluster == 2]),]),]
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 211 2 81 60 22 0 27.7
## DiabetesPedigreeFunction Age Outcome
## 211 0.29 25 0
On remarque que pour la classe 1 avec le moins bon score-silhouette moyen l’invidu possède le diabète, pour la classe 2 on remarque l’absence de diabète.
Cela explique pourquoi la classe 1 a un score-silhouette moindre car classifier des individus par rapport a une maladie est très complexe.
Cette approche implique le calcul de la variance inter-classes et intra-classes sur diverses classifications générées, le critère de qualité R carré est calculé pour chaque classification, permettant ainsi de déterminer le nombre optimal de classes.
La variance intra-classe évalue la similarité des individus au sein d’une même classe. Une faible variance intra-classe indique une forte similarité entre les observations à l’intérieur de chaque groupe.
D’autre part, la variance inter-classes mesure la distinction entre les classes. Une grande valeur de variance inter-classes indique une classification distincte.
Pour qu’une classification soit considérée comme de bonne qualité, il est essentiel d’avoir une faible variance intra-classe et une grande variance inter-classes.
Ces critères, combinés au critère R carré, sont pris en compte dans cette méthode.
On calcule les deux variances pour plusieurs nombres de classes (jusqu’à 15 classes), puis évalue le R carré.
Cependant, dans le contexte de la classification, un R carré de 1 peut signifier aucune classification réelle si chaque individu est sa propre classe.
Trouver le bon équilibre entre un nombre modéré de classes et un R2 élevé est crucial, nécessitant une décision réfléchie pour garantir une classification significative tout en maximisant la qualité du modèle.
source("https://pmbo-sd.fr/STID/Data_mining/calcul_VInter_VIntra.R")
n = nrow(datascale)
R2 = rep( 0 , 15)
for (q in 2:15) {
cahtest = hclust(dist(datascale), method = "ward.D2")
classiftest=cutree(cahtest,q)
w = calcul_VInter_VIntra(datascale,classiftest)
R2[q] = w[1]/(w[1]+w[2])
}
#R2
plot(1:15, R2 , type="b", main="methode ward.D2")
Examinons le graphique avec le R2 en ordonnées et le nombre de classes en abscisses.
Pour deux classes, le R2 atteint seulement 0,163, ce qui est relativement bas. Un R2 proche de 0,5 est généralement préférable pour une classification robuste.
Cependant, nous avons déjà observé une amélioration significative avec cinq sous-groupes, où le R2 atteint 0,36, presque le double du cas précédent.
Nous allons maintenant calculer le score silhouette pour la classification en cinq classes afin de déterminer le nombre optimal de classes pour notre analyse.
q=5
classif2=cutree(cah,q)
library(cluster)
sil = silhouette(classif2, dist(datascale))
rownames(sil) = rownames(datascale)
plot(sil , nmax = 768)
Lorsque nous examinons les cinq classes, nous constatons que seulement deux d’entre elles présentent un score silhouette moyen supérieur à 0,10, avec un total moyen de 0,16.
En comparaison, la configuration à deux classes affiche un score total moyen de 0,20.
Ces résultats suggèrent que la classification avec deux classes reste la meilleure option, car elle offre un score silhouette plus élevé, indiquant une meilleure séparation entre les clusters.
Suite à nos analyses antérieures qui ont permis de déterminer le nombre optimal de classes pour une classification optimale de nos individus, nous allons maintenant explorer la répartition des caractéristiques au sein de chaque classe.
Pour ce faire, nous calculons la moyenne de chaque variable par classe à partir des données centrées réduites, et représentons ces caractéristiques au moyen du graphique suivant.moyennes_t=aggregate(datascale,list(classif),mean)[,-1]
par(mfrow=c(1,1))
matplot(t(moyennes_t),type="b")
abline(h=0)
abline(h=c(-1,1),lty=2)
text(1:ncol(datascale),max(moyennes_t)*1.1,substr(colnames(datascale),1,12),xpd=NA,srt=-90)
Pour la classe 1, il est observé que les individus ont tendance à présenter des niveaux élevés de glucose et de BMI, et ils sont également plus susceptibles de souffrir de diabète.
En revanche, pour la classe 2, la tendance est inverse, avec des valeurs plus basses de glucose et de BMI, et une moindre prévalence du diabète parmi les individus de cette classe.
Une hypothèse plausible serait que les niveaux de glucose et le BMI (indice de masse corporelle) sont associés à la présence du diabète
Analyse factorielle des correspondances (AFC)
L’analyse factorielle des correspondances (AFC) est un outil puissant pour explorer les relations entre les variables catégorielles dans un ensemble de données.
Cependant, dans le cas spécifique de la prédiction du diabète, où la variable cible est binaire (diabète ou non-diabète), l’AFC peut ne pas fournir des résultats exploitables.
L’AFC est particulièrement adaptée aux situations où l’on cherche à identifier des associations entre différentes catégories, par exemple, entre des catégories socio-professionnelles et des préférences de consommation. Cependant, lorsque la variable à prédire est binaire, comme dans le cas du diabète, l’AFC peut avoir du mal à capturer efficacement les relations.
Ainsi, l’AFC pourrait ne pas être l’outil optimal pour aborder directement la problématique de la prédiction du diabète, et d’autres méthodes plus spécifiques à la classification, comme les arbres de décision qui pourraient être plus adaptées.
Auparavant nous avons observé une corrélation entre le BMI et le diabète, nous pouvons désormais explorer d’avantage ces relations en examinant les tranches d’âge qui présentent les valeurs de BMI les plus élevées.
Cette approche nous permettra de mieux comprendre quelles catégories d’âge sont potentiellement plus exposées au diabète en raison de niveaux plus élevés de BMI.
dataafc = diabetes
dataafc = na.omit(diabetes)
dataafc$Outcome[dataafc$Outcome== 1] = "Oui"
dataafc$Outcome[dataafc$Outcome== 0] = "Non"
intervalles_age <- c(20, 30, 40, 50, 60, Inf)
dataafc$Age <- cut(dataafc$Age, breaks = intervalles_age, labels = c("20-29", "30-39", "40-49", "50-59", "60+"), include.lowest = TRUE)
dataafc$BMI <- cut(dataafc$BMI, breaks = intervalles_age, labels = c("20-29 BMI", "30-39 BMI", "40-49 BMI", "50-59 BMI", "60+ BMI"), include.lowest = TRUE)
X = dataafc[,c(8,6)]
#source("https://pmbo-sd.fr/STID/Data_mining/AFC_RStudio.R")
Nous choisison 2 axes car le graphique des contribution nous dit que 88% des informations sont disponible en 2 axes, le tableau d’interpretation va nous permettre d’étudier les tendances voici les informations fournies :
Catégorie ou Groupe : Chaque ligne représente une catégorie ou un groupe de la variable étudiée (par exemple, des tranches d’âge ou des classes BMI). Poids Relatif : Indique la contribution relative de chaque catégorie à l’Axe 1. C’est un indicateur de l’importance de la catégorie dans la construction de l’AFC. CTR (Contributions) : Mesure la contribution de chaque catégorie à l’Axe 1. Plus la valeur de CTR est élevée, plus la catégorie a une influence importante sur cet axe. Inertie : Mesure l’inertie ou la variance expliquée par chaque catégorie sur l’Axe 1. Plus l’inertie est élevée, plus la catégorie contribue à l’axe.
Il suffit de relever les contributions fortes (CTR) avec cosinus carré (COS2) > 0.5 car un cosinus carré > 0.5 équivaut à un cosinus > 0.70 en valeur absolue
Axe 1:
Tranche d’âge 20-29 ans : Forte contribution (CTR : 15.8) avec un cosinus carré (COS2) de 0.74. Les individus de cette tranche d’âge sont associés positivement à l’Axe 1.
Tranche d’âge 60+ : Forte contribution (CTR : 15.7) avec un cosinus carré (COS2) de 0.54. Les individus de cette tranche d’âge sont également associés positivement à l’Axe 1.
Tranche d’âge 40-49 ans : Contribution significative (CTR : 67.9) avec un cosinus carré (COS2) de 1. Les individus de cette tranche d’âge sont associés négativement à l’Axe 1.
20-29 BMI : Contribution significative (CTR : 53.6) avec un cosinus carré (COS2) de 0.99. Les individus de cette tranche d’âge et BMI sont fortement associés positivement à l’Axe 1.
30-39 BMI : Contribution significative (CTR : 26.2) avec un cosinus carré (COS2) de 0.92. Les individus de cette tranche d’âge et BMI sont fortement associés négativement à l’Axe 1.
Sur-effectif de la tranche d’âge 20-29 ans et 60+ pour la tranche de BMI 20-29. Cela suggère que ces groupes d’âge ont une prévalence plus élevée d’individus avec un BMI considéré comme normal, ce qui pourrait être associé à un risque potentiellement moindre de diabète.
Sur-effectif de la tranche d’âge 40-49 ans pour la tranche de BMI 30-39 car les deux axes sont négatifs donc s’annule et deviennent positives. Cela indique que cette tranche d’âge a une fréquence plus élevée d’individus avec un BMI légèrement élevé, ce qui pourrait être associé à un risque potentiellement accru de diabète.
Axe 2:
Tranche d’âge 50-59 ans : Forte contribution (CTR : 28.3) avec un cosinus carré (COS2) de 1. Les individus de cette tranche d’âge sont associés positivement à l’Axe 2.
40-49 BMI : Contribution significative (CTR : 45.7) avec un cosinus carré (COS2) de 0.51. Les individus de cette tranche d’âge et BMI sont associés négativement à l’Axe 2.
50-59 BMI : Contribution significative (CTR : 35.9) avec un cosinus carré (COS2) de 0.58. Les individus de cette tranche d’âge et BMI sont associés négativement à l’Axe 2.
Sous-effectif de la tranche d’âge 50-59 pour la tranche de BMI 40-59. Cela peut indiquer que, dans cette tranche d’âge, il y a moins d’individus ayant un BMI élevé, ce qui pourrait être associé à un risque potentiellement moindre de diabète.
En considérant les BMI, les associations et contributions varient selon les tranches d’âge, mettant en lumière des nuances importantes dans la relation entre l’âge, le BMI et les axes de l’AFC.
Machine learning
Notre objectif est de mettre en place une procédure de machine learning qui peut anticiper la présence ou l’absence de diabète en fonction des activités personnelles des individus.
Dans cette démarche, nous commençons par éliminer les valeurs non annotées pour assurer la robustesse de notre modèle de machine learning. Nous concentrons notre attention sur la sélection de la variable cible Y, représentant la présence ou l’absence de diabète, ainsi que sur les variables explicatives X qui seront utilisées pour entraîner notre modèle.
learning = diabetes
learning = na.omit(diabetes)
X=learning[,1:8]
Y=as.factor(learning[,9])
L’objectif de la validation croisée est de réaliser des tirages aléatoires d’individus (ici 5), sur lesquels nous appliquons une méthode de machine learning. En parallèle, nous conservons les individus non sélectionnés et vérifions si les connaissances acquises par notre méthode permettent une prédiction précise de notre variable cible Y.
Nous calculons ensuite le taux d’erreur de notre méthode.
Afin de garantir la stabilité des résultats, nous fixons une seed aléatoire.
set.seed(2202290)
K=5
ech=sample(1:K,nrow(learning),replace = T)
TauxErreurCrossValidation=rep(0,K)
for (iter in 1:K){
X_train=X[ech == iter,]
Y_train=Y[ech == iter]
X_test=X[ech != iter,]
Y_test=Y[ech != iter]
library(rpart)
model = rpart(Y_train~.,data=data.frame(X_train),method="class")
predictions=predict(model,data.frame(X_test),type="class")
Y_predit=predictions
w=table(Y_predit,Y_test)
TauxErreurGlobale = 1 - sum(diag(w))/sum(w)
TauxErreurCrossValidation[iter]=TauxErreurGlobale
}
TauxErreurCrossValidation
## [1] 0.2888514 0.2572816 0.3042789 0.3311475 0.3542673
Ces taux d’erreur représentent la proportion d’individus mal classés par rapport au total des individus.
En d’autres termes, ils mesurent la performance du modèle de machine learning. Plus le taux d’erreur est bas, meilleure est la performance du modèle.
En analysant ces valeurs, nous pouvons constater que les résultats varient légèrement et sont correct.
Le modèle semble mieux performer avec un taux d’erreur plus faible autour de la deuxième itération (0.2573).
Cependant, il est important de noter que les taux d’erreur restent relativement proches les uns des autres, indiquant une stabilité globale du modèle.
Cela signifie que, en moyenne, le modèle a réussi à prédire correctement la qualification au diabète pour environ 74.27% des individus.
Un taux d’erreur inférieur à 0.3 est généralement considéré comme acceptable, ce qui renforce la qualité de la prédiction dans le contexte de cette étude sur le diabète.
Arbre de décision
library(rpart)
model = rpart(Y~.,data=data.frame(X),method="class")
plot(model,branch=1,uniform=T,xpd=NA)
text(model,fancy=F,all=T,use.n=T,cex=0.75,xpd=NA)
Le fichier d’apprentissage contenait 500+268= 768 patientes. Il suffit de remonter au début de l’arbre, on voit Glucose < 127.5, Glucause est donc la variable la plus discriminante au sens de l’indice de Gini avec comme seuil 127.5 On remarque 500/268 en dessous avec la modalité “0” cela signifie que 500 n’ont pas de diabete contre 268 Le fichier peut être partagé en deux sous-fichiers qui séparent au mieux la variable-cible (“0”/“1”).
On trouve alors - à gauche (Glucose < 127.5 VRAI) contenant 391 “0” et 94 “1” - à droite ( Glucose >= 127.5) contenant 109 “0” et 174 “1” Le sous-fichier de est alors partagé suivant sa variable et son seuil les plus discriminants ainsi de suite.
Au bout du compte, le fichier initial est “classé” en 16 classes (les 16 feuilles finales de l’arbre de décision). Les fréquences de “0”/“1” dans ces feuilles peuvent être utilisées comme des estimations de probabilités à priori par un module de prédiction.
Exemple : -Pour une nouvelle patiente dont les analyses ont donné les résultats suivants : Glucose = 115 ; Age = 22 cette patiente se classe dans la 1ère feuille en partant de la gauche car sont taux de Glucose est bien inférieur a 127.5 et son age a 28.5 : “0 248/23” signifie que 248 patientes n’ont pas le diabète, et seules 23 ont le diabète.
Entre autre la patiente présente des caractéristiques similaires à 271 patientes de la base de données dont nous disposons 23 d’entre elles ont le diabète, ce qui donne donc une probabilté faible d’avoir le diabéte.
-Si la patiente a un taux de Glucause >= 127.5, un BMI >= 29.95 et un taux de Glucause >= 157.5, la patiente se trouve dans la dernière feuille avec 12 non diabétique et 80 diabétique ce qui explique une grande partie de nos données car nous avons 268 diabétique de base, on pourrait alors dire que si une patiente a un BMI supérieur a 30 et un taux de glucause supérieur a 157, la probabilté qu’elle sois diabétique est forte.
Conclusion
Notre étude statistique a eu plusieurs étapes cruciales:
-Analyse des Classes et Silhouette: Une approche de classification a été utilisée pour identifier des sous-groupes significatifs au sein de la population étudiée. Le dendrogramme a révélé une division en deux classes principales, correspondant potentiellement aux individus diabétiques et non diabétiques. L’analyse de silhouette a confirmé la qualité modérée de la classification, avec des scores plus élevés pour la classe des individus non diabétiques.
-Analyse Factorielle des Correspondances (AFC): L’AFC a été utilisée pour explorer les relations entre les tranches d’âge, les tranches de BMI, et le diabète. Les résultats ont mis en évidence des associations significatives, notamment : Un sur-effectif de la tranche d’âge 20-29 ans et 60+ pour la tranche de BMI 20-29, suggérant une prévalence plus élevée d’individus avec un BMI considéré comme normal, associé à un risque potentiellement moindre de diabète. Un sur-effectif de la tranche d’âge 40-49 ans pour la tranche de BMI 30-39, indiquant une fréquence plus élevée d’individus avec un BMI légèrement élevé, associé à un risque potentiellement accru de diabète.
-Machine Learning - Arbre de Décision: Un modèle a été construit pour prédire la présence ou l’absence de diabète en utilisant des variables explicatives. La validation croisée a montré une stabilité globale du modèle avec un taux d’erreur moyen d’environ 25%, indiquant une performance acceptable. L’arbre de décision a mis en lumière l’importance de la variable Glucose comme facteur discriminant majeur dans la prédiction du diabète. Les feuilles finales de l’arbre ont permis de dégager des profils de patients avec des probabilités estimées de diabète.
Cette étude a contribué à une meilleure compréhension des facteurs associés au diabète chez les femmes d’origine amérindienne Pima. Les résultats mettent en évidence l’importance de variables telles que le Glucose, le BMI, l’âge, dans la prédiction du diabète.
Ces informations peuvent être précieuses pour les professionnels de la santé, les chercheurs et les responsables de politiques publiques dans le développement de stratégies de prévention et de gestion du diabète au sein de cette population spécifique.
En conclusion, cette analyse multidimensionnelle des données offre des perspectives intéressantes pour la compréhension et la lutte contre le diabète au sein de la communauté amérindienne Pima.