---
title: "Décrire une variable : du fichier à un portrait interprétable"
---
```{r}
#| label: setup-analyse
#| include: false
source("R/04-initialiser-analyse.R")
```
::: {.callout-important title="Question de départ"}
Comment transformer une colonne en information substantielle, tout en distinguant ce qui décrit les répondants de ce qui estime une caractéristique de la population ?
:::
## Objectifs d'apprentissage
À la fin de ce chapitre, vous saurez :
- choisir un résumé adapté à une variable nominale, ordinale, quantitative ou de comptage ;
- distinguer **effectif brut**, **pourcentage brut** et **estimation pondérée** ;
- décrire conjointement position, dispersion, forme et valeurs manquantes ;
- utiliser `svymean()` et `svyquantile()` avec un plan d'enquête ;
- construire un petit tableau descriptif qui sépare clairement **N observé** et **paramètre estimé** ;
- rédiger un résultat descriptif complet plutôt qu'énumérer des sorties R ;
- commencer à construire un **portrait sociologique** sans transformer une description en explication causale.
## Décrire n'est pas « demander une moyenne »
Une description statistique répond à trois questions successives :
1. **Que représente la variable ?** catégorie, ordre, quantité, compte, score ?
2. **Quel aspect de sa distribution est pertinent ?** fréquence, centre, dispersion, asymétrie, valeurs extrêmes ?
3. **Quel est l'objet de la description ?** les lignes observées ou une population visée par le plan d'enquête ?
| Variable | Nature | Résumés de départ |
|---|---|---|
| `sexe_f` | nominale | effectifs, proportions |
| `diplome_4` | catégorielle ordonnée | distribution des modalités |
| `age` | quantitative | moyenne, médiane, quantiles, dispersion |
| `revenu_mensuel` | quantitative asymétrique possible | médiane, quartiles, moyenne |
| `livres_12m` | comptage | zéros, médiane, moyenne, dispersion |
| `satisfaction_vie` | échelle 0–10 | distribution, moyenne, médiane |
::: {.callout-note title="Une statistique n'est jamais auto-interprétable"}
Une moyenne n'est informative que si l'on connaît l'unité, l'univers de la question, le traitement des valeurs manquantes et la population à laquelle elle se rapporte.
:::
## Un premier portrait : ce qui est observé et ce qui est estimé
Avant de détailler chaque cas, construisons un tableau très compact. L'objectif n'est pas d'afficher tout ce que R sait calculer, mais de rendre visibles quatre informations : **combien de réponses sont disponibles, combien manquent, quel est le résumé brut et quelle est l'estimation pondérée**.
```{r}
#| label: tab-ch10-portrait
est_age <- survey::svymean(~age, design, na.rm = TRUE)
est_revenu <- survey::svymean(~revenu_mensuel, design, na.rm = TRUE)
est_sat <- survey::svymean(~satisfaction_vie, design, na.rm = TRUE)
est_sport <- survey::svymean(~sport_regulier, design, na.rm = TRUE)
portrait <- tibble::tibble(
Variable = c(
"Âge (ans)",
"Revenu mensuel net (€)",
"Satisfaction de vie (0–10)",
"Sport au moins hebdomadaire"
),
`N disponible` = c(
sum(!is.na(enqueter$age)),
sum(!is.na(enqueter$revenu_mensuel)),
sum(!is.na(enqueter$satisfaction_vie)),
sum(!is.na(enqueter$sport_regulier))
),
`Valeurs manquantes` = c(
sum(is.na(enqueter$age)),
sum(is.na(enqueter$revenu_mensuel)),
sum(is.na(enqueter$satisfaction_vie)),
sum(is.na(enqueter$sport_regulier))
),
`Résumé brut` = c(
paste0(fmt_num(mean(enqueter$age, na.rm = TRUE), .1), " ans"),
fmt_euro(mean(enqueter$revenu_mensuel, na.rm = TRUE), 1),
fmt_num(mean(enqueter$satisfaction_vie, na.rm = TRUE), .1),
fmt_pct(mean(enqueter$sport_regulier, na.rm = TRUE), .1)
),
`Estimation pondérée` = c(
paste0(fmt_num(coef(est_age)[1], .1), " ans"),
fmt_euro(coef(est_revenu)[1], 1),
fmt_num(coef(est_sat)[1], .1),
fmt_pct(coef(est_sport)[1], .1)
)
)
knitr::kable(portrait, align = c("l", "r", "r", "r", "r"))
```
Ce tableau permet déjà deux lectures. D'une part, les estimations brutes et pondérées sont ici relativement proches pour plusieurs variables ; d'autre part, le nombre de valeurs disponibles varie selon l'indicateur. **Une faible différence brut/pondéré n'autorise pas à oublier le design** : elle indique seulement que, pour ce paramètre précis et ce jeu de données, la correction de composition modifie peu le point estimé.
## Variable quantitative : centre, dispersion et précision
### L'âge : décrire les personnes puis estimer une moyenne
```{r}
#| label: tab-ch10-age-brut
age_brut <- enqueter |>
summarise(
`N disponible` = sum(!is.na(age)),
Moyenne = mean(age, na.rm = TRUE),
Médiane = median(age, na.rm = TRUE),
`Écart-type` = sd(age, na.rm = TRUE),
Q1 = quantile(age, .25, na.rm = TRUE),
Q3 = quantile(age, .75, na.rm = TRUE),
Minimum = min(age, na.rm = TRUE),
Maximum = max(age, na.rm = TRUE)
) |>
mutate(across(where(is.numeric), ~round(.x, 1)))
knitr::kable(age_brut)
```
La moyenne et la médiane renseignent le centre, mais pas la même propriété. L'écart-type décrit la dispersion autour de la moyenne ; l'intervalle interquartile décrit la moitié centrale de la distribution. Lorsque ces résumés racontent des histoires très différentes, la forme de la distribution doit être examinée avant de rédiger.
Passons à l'estimation issue du plan :
```{r}
#| label: tab-ch10-age-pondere
ci_age <- confint(est_age)
tibble::tibble(
Estimation = as.numeric(coef(est_age)[1]),
`Erreur standard` = as.numeric(SE(est_age)[1]),
`IC 95 % — bas` = ci_age[1, 1],
`IC 95 % — haut` = ci_age[1, 2]
) |>
mutate(across(everything(), ~round(.x, 2))) |>
knitr::kable()
```
```{r}
#| label: ch10-age-texte
#| include: false
age_pond <- as.numeric(coef(est_age)[1])
age_low <- as.numeric(ci_age[1, 1])
age_high <- as.numeric(ci_age[1, 2])
```
Une formulation de résultat est alors : **dans la population représentée par le dispositif synthétique, l'âge moyen pondéré est estimé à `r fmt_num(age_pond, 0.1)` ans (IC 95 % : `r fmt_num(age_low, 0.1)`–`r fmt_num(age_high, 0.1)`)**.
La phrase précise le paramètre visé et son incertitude. Elle est plus informative que « l'âge moyen vaut X ».
## Variable catégorielle : faire apparaître le dénominateur
Pour le diplôme, une bonne table réunit les effectifs observés et les proportions pondérées plutôt que de juxtaposer deux sorties difficiles à comparer.
```{r}
#| label: tab-ch10-diplome
brut_diplome <- enqueter |>
filter(!is.na(diplome_4)) |>
count(diplome_4) |>
mutate(part_brute = n / sum(n))
est_diplome <- survey::svymean(~diplome_4, design, na.rm = TRUE)
ci_diplome <- confint(est_diplome)
pond_diplome <- tibble::tibble(
diplome_4 = levels(enqueter$diplome_4),
proportion_ponderee = as.numeric(coef(est_diplome)),
bas = ci_diplome[, 1],
haut = ci_diplome[, 2]
)
tab_diplome <- brut_diplome |>
left_join(pond_diplome, by = "diplome_4") |>
transmute(
`Niveau de diplôme` = diplome_4,
`N observé` = n,
`Part brute` = fmt_pct(part_brute, .1),
`Part pondérée` = fmt_pct(proportion_ponderee, .1),
`IC 95 %` = paste0(fmt_pct(bas, .1), " – ", fmt_pct(haut, .1))
)
knitr::kable(tab_diplome, align = c("l", "r", "r", "r", "r"))
```
::: {.callout-tip title="Réflexe de rédaction"}
Écrivez « **dans l'échantillon** » lorsque vous décrivez les lignes observées et « **estimation pondérée** » ou « **dans la population représentée par le plan** » lorsque vous utilisez l'objet `design`.
:::
L'effectif brut reste indispensable : il indique la quantité d'information réellement observée. La proportion pondérée répond à une autre question : elle repondère cette information selon le plan. **Un poids ne crée pas des observations supplémentaires.**
## Variable quantitative asymétrique : moyenne et médiane ne sont pas concurrentes
Le revenu constitue un bon exemple. La moyenne décrit une moyenne arithmétique sensible à la partie haute de la distribution ; la médiane localise l'individu situé au centre. Les deux peuvent être utiles, mais elles ne doivent pas être présentées comme deux estimations interchangeables d'une même chose.
```{r}
#| label: tab-ch10-revenu
revenu_brut <- enqueter |>
summarise(
`N disponible` = sum(!is.na(revenu_mensuel)),
`Taux manquant` = mean(is.na(revenu_mensuel)),
Moyenne = mean(revenu_mensuel, na.rm = TRUE),
Médiane = median(revenu_mensuel, na.rm = TRUE),
Q1 = quantile(revenu_mensuel, .25, na.rm = TRUE),
Q3 = quantile(revenu_mensuel, .75, na.rm = TRUE)
)
q_revenu <- survey::svyquantile(
~revenu_mensuel,
design,
quantiles = c(.25, .5, .75),
na.rm = TRUE,
ci = TRUE
)
revenu_brut |>
transmute(
`N disponible`,
`Taux manquant` = fmt_pct(`Taux manquant`, .1),
`Moyenne brute` = fmt_euro(Moyenne, 1),
`Médiane brute` = fmt_euro(Médiane, 1),
`Q1 brut` = fmt_euro(Q1, 1),
`Q3 brut` = fmt_euro(Q3, 1)
) |>
knitr::kable()
```
L'objet `q_revenu` contient les quantiles pondérés et leur incertitude. Pour un rapport, on afficherait uniquement les quantiles nécessaires au message, pas l'ensemble de l'objet R.
```{r}
#| label: ch10-revenu-quantiles
q_revenu
```
Le taux de non-réponse sur le revenu doit être annoncé : une statistique très précise en apparence peut reposer sur un sous-ensemble sélectionné des répondants. Le traitement de ce problème sera approfondi au chapitre 21.
## Une proportion est une moyenne d'indicateur
La pratique sportive régulière a été définie comme une pratique au moins hebdomadaire (`sport_freq` égal à 3 ou 4). Pour une variable 0/1, la moyenne correspond à la proportion de 1.
```{r}
#| label: tab-ch10-sport
ci_sport <- confint(est_sport)
sport_p <- as.numeric(coef(est_sport)[1])
sport_low <- as.numeric(ci_sport[1, 1])
sport_high <- as.numeric(ci_sport[1, 2])
tibble::tibble(
`N observé` = sum(!is.na(enqueter$sport_regulier)),
`Part brute` = fmt_pct(mean(enqueter$sport_regulier, na.rm = TRUE), .1),
`Part pondérée` = fmt_pct(sport_p, .1),
`IC 95 %` = paste0(fmt_pct(sport_low, .1), " – ", fmt_pct(sport_high, .1))
) |>
knitr::kable()
```
Dans le dispositif synthétique, la proportion pondérée de pratique sportive au moins hebdomadaire est estimée à **`r fmt_pct(sport_p, 0.1)`** (IC 95 % : `r fmt_pct(sport_low, 0.1)`–`r fmt_pct(sport_high, 0.1)`).
## Décrire une distribution, pas seulement un centre
Une même moyenne peut résumer des distributions très différentes. Pour une variable quantitative, une description solide combine généralement :
- l'effectif effectivement analysé ;
- une mesure de centre ;
- une mesure de dispersion ;
- l'étendue ou quelques quantiles ;
- une information sur les valeurs manquantes ;
- une visualisation lorsque la forme importe.
Pour une variable catégorielle, elle combine :
- les catégories et leur ordre éventuel ;
- les effectifs non pondérés ;
- les proportions pertinentes ;
- le dénominateur ;
- la présence de valeurs manquantes.
La règle n'est pas « toujours afficher davantage ». Il faut plutôt **afficher ce qui permet au lecteur de comprendre ce que le résumé cache**.
## Première lecture sociologique du fil rouge
Une description univariée n'est pas encore une analyse de stratification. Elle permet néanmoins d'identifier les dimensions qui méritent d'être mises en relation : structure d'âge, niveau de diplôme, ressources économiques, santé, pratiques sportives, consommation culturelle et confiance institutionnelle.
::: {.callout-note title="Lecture sociologique"}
Le premier geste sociologique consiste ici à repérer **la structure des distributions** : quelles ressources sont rares ou concentrées ? quelles pratiques concernent une minorité ou une majorité ? quelles variables sont suffisamment hétérogènes pour que des comparaisons aient un sens ? Le chapitre suivant passera des distributions aux gradients entre groupes.
:::
::: {.callout-warning title="Ce que nous ne pouvons pas conclure"}
`enqueter` est synthétique. Ses ordres de grandeur ne décrivent pas la France. Même avec une enquête réelle, une description univariée ne permettrait pas d'attribuer une distribution à un mécanisme causal ni d'expliquer pourquoi certains groupes occupent davantage certaines positions.
:::
## De la sortie R à une phrase de résultat
Une phrase descriptive de qualité contient au minimum **l'indicateur, la population ou l'échantillon, l'estimation et, lorsque pertinent, l'incertitude**.
Éviter :
> L'âge est de 46,2.
Préférer :
> L'âge moyen pondéré est estimé à `r fmt_num(age_pond, 0.1)` ans dans la population représentée par le plan d'enquête ; l'IC à 95 % s'étend de `r fmt_num(age_low, 0.1)` à `r fmt_num(age_high, 0.1)` ans.
Éviter également :
> 31,9 % font du sport.
Préférer :
> La pratique sportive au moins hebdomadaire est estimée à `r fmt_pct(sport_p, 0.1)` parmi la population représentée par le plan ; l'incertitude d'échantillonnage est donnée par l'IC à 95 % [`r fmt_pct(sport_low, .1)` ; `r fmt_pct(sport_high, .1)`].
Cette manière d'écrire prépare les chapitres d'inférence : le chiffre n'est jamais séparé de ce qu'il estime.
## Mini-exercice
Pour `revenu_mensuel`, calculez moyenne, médiane, quartiles, nombre de réponses disponibles et taux de valeurs manquantes. Rédigez ensuite deux phrases : l'une destinée à une note descriptive, l'autre à une légende de tableau.
::: {.callout-caution collapse="true" title="Correction"}
Une bonne réponse ne choisit pas automatiquement la moyenne ou la médiane. Elle décrit la forme et explicite le nombre de valeurs disponibles. Si la distribution est asymétrique, médiane et quartiles sont particulièrement utiles ; la moyenne peut rester pertinente pour certaines questions.
:::
## Exercice de synthèse
### Niveau A — Appliquer
Décrivez `sexe_f`, `diplome_4`, `age`, `revenu_mensuel` et `satisfaction_vie` avec des indicateurs adaptés.
### Niveau B — Choisir
Pour chaque variable, indiquez ce que vous publieriez dans :
1. une fiche descriptive de l'échantillon ;
2. un tableau estimant la population cible.
### Niveau C — Analyser
Comparez brut et pondéré pour l'âge, le diplôme et l'emploi. Rédigez un paragraphe expliquant les écarts **sans utiliser la valeur-p** : l'objectif reste descriptif. Distinguez explicitement ce qui relève de la composition de l'échantillon de ce qui relève du paramètre pondéré.
## À retenir
- Le type conceptuel de la variable guide le résumé.
- Décrire signifie combiner centre, dispersion, forme, valeurs manquantes et dénominateur.
- Un effectif brut et une proportion pondérée peuvent apparaître ensemble, à condition d'être clairement distingués.
- Un poids modifie la contribution d'une observation ; il n'augmente pas le nombre de personnes effectivement observées.
- `svymean()` et `svyquantile()` utilisent le plan d'enquête pour l'estimation et l'incertitude [@survey2026; @lumley2010].
- Une phrase statistique doit dire **ce qui est estimé** et **pour qui**.
- La description constitue le point de départ d'une interprétation sociologique, pas son aboutissement.
## Pour aller plus loin
Le chapitre suivant passe de la description d'une variable à l'étude des **relations entre variables**. Nous y utiliserons le même fil rouge pour montrer comment se construisent des gradients sociaux avant tout test ou modèle.