Étude de l’impact de l’âge et de l’IMC sur le diabète

Auteur·rice

Lina BOUALLEGUE

Date de publication

7 janvier 2026

1 Introduction

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

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

2 Inspection des données

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

Code
str(df_clean)
tibble [9,254 × 8] (S3: tbl_df/tbl/data.frame)
 $ SEQN        : num [1:9254] 93703 93704 93705 93706 93707 ...
  ..- attr(*, "label")= chr "Respondent sequence number"
 $ age         : num [1:9254] 2 2 66 18 13 66 75 0 56 18 ...
  ..- attr(*, "label")= chr "Age in years at screening"
 $ sex         : chr [1:9254] "Female" "Male" "Female" "Male" ...
 $ bmi         : num [1:9254] 17.5 15.7 31.7 21.5 18.1 23.7 38.9 NA 21.3 19.7 ...
  ..- attr(*, "label")= chr "Body Mass Index (kg/m**2)"
 $ diabetes    : num [1:9254] 2 2 2 2 2 3 2 NA 2 2 ...
  ..- attr(*, "label")= chr "Doctor told you have diabetes"
 $ glucose     : num [1:9254] NA NA NA NA NA 122 NA NA 107 NA ...
  ..- attr(*, "label")= chr "Fasting Glucose (mg/dL)"
 $ diabetes_bin: num [1:9254] 0 0 0 0 0 NA 0 NA 0 0 ...
 $ sex_label   : chr [1:9254] "Féminin" "Masculin" "Féminin" "Masculin" ...
Code
# Vérifier l'absence de doublons sur l'ID
anyDuplicated(df_clean$SEQN)
[1] 0
Code
# Aperçu des valeurs manquantes par variable
colSums(is.na(df_clean))
        SEQN          age          sex          bmi     diabetes      glucose 
           0            0            0         1249          357         6363 
diabetes_bin    sex_label 
         545            0 

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

Code
head(df_clean, 10) %>% kable()
SEQN age sex bmi diabetes glucose diabetes_bin sex_label
93703 2 Female 17.5 2 NA 0 Féminin
93704 2 Male 15.7 2 NA 0 Masculin
93705 66 Female 31.7 2 NA 0 Féminin
93706 18 Male 21.5 2 NA 0 Masculin
93707 13 Male 18.1 2 NA 0 Masculin
93708 66 Female 23.7 3 122 NA Féminin
93709 75 Female 38.9 2 NA 0 Féminin
93710 0 Female NA NA NA NA Féminin
93711 56 Male 21.3 2 107 0 Masculin
93712 18 Male 19.7 2 NA 0 Masculin

3 Analyses descriptives

3.1 Caractéristiques démographiques

3.1.1 Distribution de l’âge et du sexe

Le tableau suivant présente la répartition par sexe dans notre échantillon nettoyé.

Code
df_clean %>%
  count(sex_label) %>%
  mutate(pourcentage = round(n / sum(n) * 100, 1)) %>%
  kable(col.names = c("Sexe", "Effectif", "Pourcentage (%)"))
Sexe Effectif Pourcentage (%)
Féminin 4697 50.8
Masculin 4557 49.2

3.1.2 Statistiques de l’âge

Code
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")
Résumé statistique de l’âge
Statistique Valeur
Minimum 0.0
1er quartile 11.0
Médiane 31.0
Moyenne 34.3
3e quartile 58.0
Maximum 80.0

3.2 Caractéristiques de santé (IMC et Diabète)

3.2.1 Prévalence du diabète déclaré

Code
# 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 (%)"))
Statut Diabète Nombre Proportion (%)
Non-diabétique 7816 89.7
Diabétique 893 10.3

Analyse de la prévalence : Environ 10.3% 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).

4 Visualisations et Analyses Croisées

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

Code
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")
Figure 1: Comparaison des distributions de l’IMC entre les individus diabétiques et non-diabétiques.

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.

4.2 Âge et Diabète : Une progression évidente

Est-ce que le diabète touche plus les personnes âgées dans cet échantillon ?

Code
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")
Figure 2: Boxplot de l’âge selon le statut diabétique.

Discussion sur l’âge : L’âge médian des individus diabétiques est de 65 ans, contre 27 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.

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

Code
# 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)
Figure 3: Nuage de points entre IMC et âge avec une ligne de tendance.

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.

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

Code
# 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")
Figure 4: Répartition du sexe selon le statut diabétique.

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.

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

Code
# 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")
Figure 5: Proportions de diabétiques et non diabétiques par tranche d’âge.

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.

5 Conclusion

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

5.2 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 : 07 janvier 2026