# Charger les packages nécessaires
library(tidyverse)
# Importer les données
patients <- read_csv("data/patients_diabete.csv")
# Explorer la structure
str(patients)
head(patients)
dim(patients)Module 1
Introduction à la biostatistique
Concepts fondamentaux et statistiques descriptives
2h Débutant Prérequis : Aucun
1 Objectifs du TP
- Importer et explorer un jeu de données biomédicales
- Calculer des statistiques descriptives avec R et SPSS
- Identifier les types de variables dans un contexte réel
- Interpréter les résultats dans un contexte médical
2 Jeu de données
Le fichier patients_diabete.csv contient les données de 50 patients d’une consultation de diabétologie dans un hôpital de Yaoundé. Les variables sont :
| Variable | Description | Type |
|---|---|---|
id |
Identifiant du patient | - |
age |
Âge en années | Quantitative continue |
sexe |
Sexe (M/F) | Qualitative nominale |
poids |
Poids en kg | Quantitative continue |
taille |
Taille en cm | Quantitative continue |
glycemie |
Glycémie à jeun (g/L) | Quantitative continue |
hba1c |
Hémoglobine glyquée (%) | Quantitative continue |
type_diabete |
Type de diabète (1/2) | Qualitative nominale |
nb_consultations |
Nombre de consultations/an | Quantitative discrète |
niveau_activite |
Niveau d’activité physique (Sédentaire/Modéré/Actif) | Qualitative ordinale |
3 Partie 1 : Importation et exploration des données
3.1 Exercice 1.1 : Importation avec R
Questions :
- Combien de lignes et de colonnes contient le jeu de données ?
- Quels sont les types de données détectés par R pour chaque variable ?
- Y a-t-il des valeurs manquantes ?
# Vérifier les valeurs manquantes
colSums(is.na(patients))3.2 Exercice 1.2 : Importation avec SPSS
- Fichier > Ouvrir > Données
- Sélectionner le fichier CSV, choisir Virgule comme séparateur
- Vérifier les types de variables dans la Vue Variables
- Ajuster les niveaux de mesure : Échelle pour les quantitatives, Nominal ou Ordinal selon le cas
Syntaxe :
GET DATA /TYPE=TXT
/FILE='data/patients_diabete.csv'
/DELIMITERS=","
/FIRSTCASE=2
/VARIABLES=
id F3
age F2
sexe A1
poids F5.1
taille F5.1
glycemie F4.2
hba1c F4.1
type_diabete F1
nb_consultations F2
niveau_activite A12.
4 Partie 2 : Statistiques descriptives des variables quantitatives
4.1 Exercice 2.1 : Mesures de tendance centrale
Calculer la moyenne, la médiane et le mode pour les variables age, poids, glycemie et hba1c.
4.1.1 Avec R
# Moyenne et médiane
patients %>%
summarise(
age_moy = mean(age, na.rm = TRUE),
age_med = median(age, na.rm = TRUE),
poids_moy = mean(poids, na.rm = TRUE),
poids_med = median(poids, na.rm = TRUE),
glyc_moy = mean(glycemie, na.rm = TRUE),
glyc_med = median(glycemie, na.rm = TRUE),
hba1c_moy = mean(hba1c, na.rm = TRUE),
hba1c_med = median(hba1c, na.rm = TRUE)
)DESCRIPTIVES VARIABLES=age poids glycemie hba1c
/STATISTICS=MEAN MEDIAN.
Questions :
- La moyenne et la médiane sont-elles proches pour chaque variable ? Qu’est-ce que cela indique sur la distribution ?
- Pour quelle variable la différence moyenne-médiane est-elle la plus grande ? Que peut-on en déduire ?
4.2 Exercice 2.2 : Mesures de dispersion
# Tableau récapitulatif complet
patients %>%
summarise(across(
c(age, poids, glycemie, hba1c),
list(
moy = ~mean(.x, na.rm = TRUE),
med = ~median(.x, na.rm = TRUE),
et = ~sd(.x, na.rm = TRUE),
min = ~min(.x, na.rm = TRUE),
max = ~max(.x, na.rm = TRUE),
cv = ~(sd(.x, na.rm = TRUE) / mean(.x, na.rm = TRUE)) * 100
)
)) %>%
pivot_longer(everything()) %>%
separate(name, into = c("variable", "stat"), sep = "_(?=[^_]+$)") %>%
pivot_wider(names_from = stat, values_from = value) %>%
mutate(across(where(is.numeric), ~round(.x, 2)))DESCRIPTIVES VARIABLES=age poids glycemie hba1c
/STATISTICS=MEAN STDDEV VARIANCE MIN MAX.
Questions :
- Quelle variable présente la plus grande variabilité relative (CV) ?
- Les données de glycémie sont-elles homogènes ou hétérogènes ?
5 Partie 3 : Statistiques descriptives des variables qualitatives
5.1 Exercice 3.1 : Tableaux de fréquences
# Tableau de fréquences pour le sexe
table(patients$sexe)
prop.table(table(patients$sexe)) * 100
# Tableau de fréquences pour le niveau d'activité
table(patients$niveau_activite)
prop.table(table(patients$niveau_activite)) * 100
# Tableau croisé sexe x type de diabète
table(patients$sexe, patients$type_diabete)FREQUENCIES VARIABLES=sexe type_diabete niveau_activite
/ORDER=ANALYSIS.
CROSSTABS /TABLES=sexe BY type_diabete
/CELLS=COUNT ROW COLUMN.
Questions :
- Quelle est la répartition hommes/femmes dans l’échantillon ?
- Quel type de diabète est le plus fréquent ?
- Le mode de la variable
niveau_activiteest-il le même chez les hommes et les femmes ?
6 Partie 4 : Statistiques descriptives par groupe
6.1 Exercice 4.1 : Comparaison par sexe
patients %>%
group_by(sexe) %>%
summarise(
n = n(),
age_moy = mean(age, na.rm = TRUE),
age_et = sd(age, na.rm = TRUE),
poids_moy = mean(poids, na.rm = TRUE),
glyc_moy = mean(glycemie, na.rm = TRUE),
hba1c_moy = mean(hba1c, na.rm = TRUE)
)MEANS TABLES=age poids glycemie hba1c BY sexe
/CELLS=COUNT MEAN STDDEV.
6.2 Exercice 4.2 : Comparaison par type de diabète
patients %>%
group_by(type_diabete) %>%
summarise(
n = n(),
age_moy = mean(age, na.rm = TRUE),
glyc_moy = mean(glycemie, na.rm = TRUE),
glyc_et = sd(glycemie, na.rm = TRUE),
hba1c_moy = mean(hba1c, na.rm = TRUE),
hba1c_et = sd(hba1c, na.rm = TRUE)
)Questions :
- Quelles différences observez-vous entre les deux types de diabète ?
- Ces différences vous paraissent-elles cliniquement pertinentes ?
7 Partie 5 : Exercice de synthèse
7.1 Exercice 5.1 : Rapport descriptif
Rédigez un court paragraphe (5-8 lignes) résumant les caractéristiques de l’échantillon, comme on le retrouverait dans la section “Caractéristiques de l’échantillon” d’un article scientifique.
Utilisez le format suivant : moyenne ± écart-type pour les variables quantitatives et n (%) pour les variables qualitatives.
Modèle : “L’échantillon était composé de N patients, dont X% de femmes. L’âge moyen était de X ± X ans…”
7.2 Exercice 5.2 : Tableau 1
Créez un “Tableau 1” professionnel avec le package gtsummary :
library(gtsummary)
patients %>%
select(age, sexe, poids, glycemie, hba1c, type_diabete, niveau_activite) %>%
tbl_summary(
by = type_diabete,
statistic = list(
all_continuous() ~ "{mean} ({sd})",
all_categorical() ~ "{n} ({p}%)"
),
label = list(
age ~ "Âge (années)",
sexe ~ "Sexe",
poids ~ "Poids (kg)",
glycemie ~ "Glycémie à jeun (g/L)",
hba1c ~ "HbA1c (%)",
niveau_activite ~ "Niveau d'activité physique"
)
) %>%
add_overall() %>%
bold_labels()8 Corrigé des questions
Exercice 2.1 :
- Si la moyenne et la médiane sont proches, la distribution est approximativement symétrique. Si la moyenne > médiane, la distribution est étalée à droite (asymétrie positive).
- La glycémie présente souvent la plus grande différence car quelques patients peuvent avoir des valeurs très élevées (distribution asymétrique à droite).
Exercice 2.2 :
- Le CV le plus élevé indique la variable la plus dispersée relativement à sa moyenne.
- Si CV > 30%, les données sont hétérogènes, ce qui est fréquent pour la glycémie dans une population diabétique.
Exercice 3.1 :
- Voir la sortie du tableau de fréquences.
- Le diabète de type 2 est généralement le plus fréquent (environ 90% des cas).
- Les sédentaires sont souvent le mode, mais cela peut varier selon le sexe.