---
title: "Analyse des données NHANES"
subtitle: "Étude de l'impact de l'âge et de l'IMC sur le diabète"
author: "Lina BOUALLEGUE"
date: today
format:
html:
code-tools: true
code-fold: show
lang: fr
toc: true
toc-location: left
theme: cosmo
embed-resources: true
css: custom.css
number-sections: true
execute:
echo: true
warning: false
message: false
---
```{r setup, include=FALSE}
library(haven)
library(dplyr)
#library(janitor)
library(ggplot2)
library(knitr)
library(forcats)
# Augmenter le temps de téléchargement (évite les timeouts)
options(timeout = 300)
# Chargement des données NHANES
demo <- read_xpt("Data/DEMO_J.xpt")
bmx <- read_xpt("Data/BMX_J.xpt")
diq <- read_xpt("Data/DIQ_J.xpt")
glu <- read_xpt("Data/GLU_J.xpt")
# Fusion des tables par l'identifiant unique SEQN
df <- demo %>%
left_join(bmx, by = "SEQN") %>%
left_join(diq, by = "SEQN") %>%
left_join(glu, by = "SEQN")
# Nettoyage et transformation des variables
df_clean <- df %>%
select(
SEQN,
age = RIDAGEYR,
sex = RIAGENDR,
bmi = BMXBMI,
diabetes = DIQ010,
glucose = LBXGLU
) %>%
mutate(
# Recodage du diabète : 1 = Oui (Diabétique), 0 = Non (Sain)
diabetes_bin = case_when(
diabetes == 1 ~ 1,
diabetes == 2 ~ 0,
TRUE ~ NA_real_
),
# Recodage du genre
sex_label = case_when(
sex == 1 ~ "Masculin",
sex == 2 ~ "Féminin",
TRUE ~ NA_character_
),
# Sexe pour le modèle (Label anglais pour cohérence avec le notebook)
sex = case_when(
sex == 1 ~ "Male",
sex == 2 ~ "Female",
TRUE ~ NA_character_
)
)
```
# Introduction {#sec-intro}
## Contexte de l'étude NHANES
Le National Health and Nutrition Examination Survey (NHANES) est un programme d'études conçu pour évaluer l'état de santé et de nutrition des adultes et des enfants aux États-Unis. Cette enquête est unique car elle combine des entretiens et des examens physiques.
## Objectifs de l'analyse
Dans ce projet, nous explorons les liens entre plusieurs facteurs physiologiques et le diabète. Nos objectifs sont :
- **Fusionner** les différents modules de l'enquête (démographie, mesures anthropométriques, questionnaires et biologie).
- **Analyser** la distribution de l'Indice de Masse Corporelle (IMC) et de l'âge dans la population.
- **Évaluer** l'association entre l'âge, l'obésité (via l'IMC) et la prévalence du diabète déclaré.
# Inspection des données {#sec-inspection}
## Structure du jeu de données final
Après fusion des modules `DEMO_J`, `BMX_J`, `DIQ_J` et `GLU_J`, nous obtenons un jeu de données consolidé.
```{r}
str(df_clean)
# Vérifier l'absence de doublons sur l'ID
anyDuplicated(df_clean$SEQN)
# Aperçu des valeurs manquantes par variable
colSums(is.na(df_clean))
```
## Aperçu des variables sélectionnées
Nous nous concentrons sur les variables clés : l'identifiant (`SEQN`), l'âge, le sexe, l'IMC, le statut du diabète et la glycémie à jeun.
```{r}
#| label: data-head
head(df_clean, 10) %>% kable()
```
# Analyses descriptives {#sec-descriptives}
## Caractéristiques démographiques
### Distribution de l'âge et du sexe
Le tableau suivant présente la répartition par sexe dans notre échantillon nettoyé.
```{r}
df_clean %>%
count(sex_label) %>%
mutate(pourcentage = round(n / sum(n) * 100, 1)) %>%
kable(col.names = c("Sexe", "Effectif", "Pourcentage (%)"))
```
### Statistiques de l'âge
```{r}
#| label: age-stats
age_stats <- data.frame(
Statistique = c("Minimum", "1er quartile", "Médiane", "Moyenne", "3e quartile", "Maximum"),
Valeur = round(as.numeric(summary(df_clean$age)), 1)
)
knitr::kable(age_stats, caption = "Résumé statistique de l'âge")
```
## Caractéristiques de santé (IMC et Diabète)
### Prévalence du diabète déclaré
```{r}
#| label: diabetes-prevalence
# Répartition du diabète (binaire)
diabetes_stats <- df_clean %>%
filter(!is.na(diabetes_bin)) %>%
group_by(diabetes_bin) %>%
summarise(n = n()) %>%
mutate(
Label = ifelse(diabetes_bin == 1, "Diabétique", "Non-diabétique"),
pourcentage = round(n / sum(n) * 100, 1)
) %>%
select(Label, n, pourcentage)
diabetes_stats %>% kable(col.names = c("Statut Diabète", "Nombre", "Proportion (%)"))
```
**Analyse de la prévalence** : Environ `r diabetes_stats$pourcentage[diabetes_stats$Label == "Diabétique"]`% de la population étudiée se déclare diabétique. Ce chiffre, bien que significatif, pourrait être une sous-estimation de la réalité biologique en raison de l'auto-déclaration (biais de rappel ou cas non diagnostiqués).
# Visualisations et Analyses Croisées {#sec-visualisation}
## Distribution de l'IMC selon le statut diabétique
L'une des hypothèses classiques est que le diabète est fortement corrélé à un IMC élevé.
```{r}
#| label: fig-bmi-hist
#| fig-cap: "Comparaison des distributions de l'IMC entre les individus diabétiques et non-diabétiques."
#| fig-width: 10
#| fig-height: 6
ggplot(df_clean %>% filter(!is.na(diabetes_bin)), aes(x = bmi, fill = factor(diabetes_bin))) +
geom_histogram(alpha = 0.6, bins = 35, position = "identity", color = "white") +
scale_fill_manual(
values = c("1" = "#e74c3c", "0" = "#4a90e2"),
labels = c("1" = "Diabétique", "0" = "Non-diabétique")
) +
labs(
title = "Distribution de l'IMC par statut diabétique",
x = "Indice de Masse Corporelle (kg/m²)",
y = "Fréquence / Nombre de cas",
fill = "Statut"
) +
theme_minimal(base_size = 14) +
theme(legend.position = "top")
```
**Interprétation biologique** : On observe visuellement que la distribution des individus diabétiques (en rouge) est nettement décalée vers les hautes valeurs d'IMC. Ce résultat corrobore la littérature médicale identifiant l'adiposité excessive comme un facteur majeur d'insulinorésistance, précurseur direct du diabète de type 2.
## Âge et Diabète : Une progression évidente
Est-ce que le diabète touche plus les personnes âgées dans cet échantillon ?
```{r}
#| label: fig-age-box
#| fig-cap: "Boxplot de l'âge selon le statut diabétique."
ggplot(df_clean %>% filter(!is.na(diabetes_bin)), aes(x = factor(diabetes_bin), y = age, fill = factor(diabetes_bin))) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(
values = c("1" = "#e74c3c", "0" = "#4a90e2"),
labels = c("1" = "Diabétique", "0" = "Non-diabétique")
) +
scale_x_discrete(labels = c("0" = "Non-diabétique", "1" = "Diabétique")) +
labs(
title = "Comparaison de l'âge moyen selon le diabète",
x = "Diabète déclaré",
y = "Âge (Années)"
) +
theme_minimal() +
guides(fill = "none")
```
**Discussion sur l'âge** : L'âge médian des individus diabétiques est de `r median(df_clean$age[df_clean$diabetes_bin == 1], na.rm = TRUE)` ans, contre `r median(df_clean$age[df_clean$diabetes_bin == 0], na.rm = TRUE)` ans pour le groupe sain. Cette progression marquée suggère que le vieillissement physiologique, associé à l'usure des cellules bêta du pancréas, est un facteur de susceptibilité critique.
## Relation entre IMC et âge
Il est aussi intéressant de voir si l'IMC et l'âge sont corrélés. Un nuage de points avec une ligne de tendance peut nous aider à visualiser cette relation.
```{r}
#| label: fig-age-bmi-scatter
#| fig-cap: "Nuage de points entre IMC et âge avec une ligne de tendance."
# Nuage de points entre IMC et âge avec une ligne de tendance
ggplot(df_clean, aes(x = age, y = bmi)) +
geom_point(alpha = 0.6, color = "#3498db") +
geom_smooth(method = "lm", color = "red", se = FALSE) +
labs(
title = "Relation entre l'IMC et l'âge",
x = "Âge (Années)",
y = "Indice de Masse Corporelle (kg/m²)"
) +
theme_minimal(base_size = 14)
```
**Nuage de points** : Le nuage de points avec une ligne de régression montre une relation positive entre l'âge et l'IMC. Autrement dit, à mesure que l'on vieillit, l'IMC tend à augmenter, ce qui est attendu puisque le métabolisme ralentit avec l'âge, entraînant souvent une prise de poids.
## Répartition par sexe selon le statut diabétique
Pour mieux comprendre la distribution du sexe entre les groupes diabétiques et non-diabétiques, nous allons utiliser un diagramme à barres.
```{r}
#| label: fig-sex-bar
#| fig-cap: "Répartition du sexe selon le statut diabétique."
# Diagramme à barres du sexe selon le statut diabétique
ggplot(df_clean %>% filter(!is.na(diabetes_bin)), aes(x = sex, fill = factor(diabetes_bin))) +
geom_bar(position = "fill", alpha = 0.6) +
scale_fill_manual(
values = c("1" = "#e74c3c", "0" = "#4a90e2"),
labels = c("1" = "Diabétique", "0" = "Non-diabétique")
) +
labs(
title = "Répartition du sexe selon le statut diabétique",
x = "Sexe",
y = "Proportion",
fill = "Statut"
) +
theme_minimal(base_size = 14) +
theme(legend.position = "top")
```
**Diagramme à barres** : Le graphique montre la répartition des sexes parmi les diabétiques et non-diabétiques. On peut observer que les hommes ont une proportion plus élevée de diabète par rapport aux femmes dans cet échantillon, ce qui est cohérent avec les études épidémiologiques indiquant un risque accru de diabète chez les hommes.
## Proportions par tranche d'âge
Une autre façon d'analyser les données est de diviser la population en tranches d'âge et de calculer la proportion de diabétiques et non diabétiques dans chaque tranche. Cela peut être réalisé par un graphique à barres empilées.
```{r}
#| label: fig-age-group-bar
#| fig-cap: "Proportions de diabétiques et non diabétiques par tranche d'âge."
# Création des tranches d'âge
df_clean$age_group <- cut(df_clean$age, breaks = c(20, 30, 40, 50, 60, 70, 80, 90, 100),
labels = c("20-29", "30-39", "40-49", "50-59", "60-69", "70-79", "80-89", "90+"))
# Diagramme à barres empilées
ggplot(df_clean %>% filter(!is.na(diabetes_bin)), aes(x = age_group, fill = factor(diabetes_bin))) +
geom_bar(position = "fill", alpha = 0.7) +
scale_fill_manual(
values = c("1" = "#e74c3c", "0" = "#4a90e2"),
labels = c("1" = "Diabétique", "0" = "Non-diabétique")
) +
labs(
title = "Proportions de diabétiques et non diabétiques par tranche d'âge",
x = "Tranche d'âge",
y = "Proportion",
fill = "Statut"
) +
theme_minimal(base_size = 14) +
theme(legend.position = "top")
```
**Graphique à barres empilées** : Ce graphique nous montre comment le diabète est réparti par tranche d'âge. On peut voir que la proportion de diabétiques augmente dans les tranches d'âge plus âgées, ce qui est une tendance bien connue dans les études épidémiologiques.
# Conclusion {#sec-conclusion}
## Synthèse des résultats
Ces visualisations renforcent les conclusions générales de l'analyse des données :
- **IMC et diabète** : Les individus diabétiques ont en moyenne un IMC plus élevé que les non-diabétiques.
- **Âge et diabète** : L'incidence du diabète augmente avec l'âge, ce qui souligne l'importance de surveiller la santé métabolique avec l'âge.
- **Sexe et diabète** : Les hommes ont un risque plus élevé de diabète dans cet échantillon.
- **Tranches d'âge** : Les diabétiques sont plus nombreux dans les tranches d'âge plus avancées, ce qui est cohérent avec la notion que le diabète de type 2 est une maladie liée à l'âge et aux facteurs de risque cumulatifs.
## Implications de santé publique
Ces observations soulignent l'importance de la surveillance métabolique dès 45 ans, particulièrement chez les individus présentant un IMC supérieur à 25 kg/m². La prévention primaire via le contrôle du poids reste le levier le plus efficace.
- **Auto-déclaration** : Le statut de diabète utilisé ici est basé sur une réponse à un questionnaire (`DIQ010`), ce qui peut sous-estimer la prévalence réelle (diabétiques non diagnostiqués).
- **Glycémie biologique** : Une analyse future pourrait croiser ces résultats avec la variable `lbxglu` (glycémie à jeun) pour identifier les cas de pré-diabète ou de diabète non déclaré.
---
**Source des données** : NHANES 2017-2018 (Cycle J)
**Rapport généré le** : `r format(Sys.Date(), "%d %B %Y")`
---