---
title: "Comparer des groupes et décrire des gradients sociaux"
---
```{r}
#| label: setup-analyse
#| include: false
source("R/04-initialiser-analyse.R")
suppressPackageStartupMessages(library(gtsummary))
```
::: {.callout-important title="Question de départ"}
Comment décrire des écarts entre groupes sociaux sans confondre pourcentages, composition, association statistique et causalité ?
:::
## Objectifs d'apprentissage
À la fin de ce chapitre, vous saurez :
- choisir une comparaison selon le type des deux variables ;
- rendre explicite le dénominateur d'un tableau croisé ;
- produire des comparaisons brutes et pondérées ;
- décrire un **gradient** plutôt que commenter des cellules isolées ;
- stratifier une relation par une troisième variable avant de modéliser ;
- distinguer description, test, ajustement et causalité ;
- rédiger une première lecture sociologique d'un ensemble cohérent de résultats.
## Trois configurations de base
| Variable A | Variable B | Question descriptive | Outils |
|---|---|---|---|
| catégorielle | catégorielle | comment se répartissent les proportions ? | tableau croisé, proportions |
| quantitative | catégorielle | le niveau ou la distribution diffère-t-il entre groupes ? | moyenne/médiane, quantiles, distribution |
| quantitative | quantitative | les deux dimensions évoluent-elles ensemble ? | nuage de points, corrélation, lissage |
Le choix de l'outil dépend surtout de la **question**. Deux variables peuvent être les mêmes mais le dénominateur pertinent changer.
## Qualitative × qualitative : le dénominateur fait le résultat
Prenons le niveau de diplôme et l'emploi. Deux pourcentages construits à partir des mêmes cases répondent à deux questions différentes :
- **au sein de chaque diplôme**, quelle part est en emploi ?
- **parmi les personnes en emploi**, comment se répartissent les diplômes ?
Plutôt que d'imprimer deux matrices, réunissons ces deux lectures dans un tableau compact.
```{r}
#| label: ch11-denominateur
emploi_ligne <- enqueter |>
dplyr::filter(!is.na(diplome_4), !is.na(en_emploi)) |>
dplyr::group_by(diplome_4) |>
dplyr::summarise(`En emploi dans le groupe` = mean(en_emploi), .groups = "drop")
emploi_colonne <- enqueter |>
dplyr::filter(en_emploi == 1, !is.na(diplome_4)) |>
dplyr::count(diplome_4) |>
dplyr::mutate(`Part parmi les personnes en emploi` = n / sum(n)) |>
dplyr::select(-n)
tab_denominateur <- dplyr::left_join(emploi_ligne, emploi_colonne, by = "diplome_4") |>
dplyr::mutate(
`En emploi dans le groupe` = fmt_pct(`En emploi dans le groupe`, .1),
`Part parmi les personnes en emploi` = fmt_pct(`Part parmi les personnes en emploi`, .1)
)
knitr::kable(
tab_denominateur,
col.names = c(
"Niveau de diplôme",
"% en emploi au sein du diplôme",
"% du diplôme parmi les personnes en emploi"
),
align = c("l", "r", "r")
)
```
::: {.callout-warning title="Le pourcentage sans dénominateur est une information incomplète"}
Dire « 64 % sont diplômés » n'a de sens que si l'on sait **64 % de quoi**. Dans un tableau croisé, le choix entre pourcentages en ligne, en colonne ou par cellule est une décision analytique, pas un détail de présentation.
:::
## Version pondérée : raisonner avec le plan
Pour représenter la population synthétique visée, nous revenons au design. Cette fois, l'estimation est accompagnée de son intervalle de confiance.
```{r}
#| label: ch11-emploi-pondere
emploi_pondere <- survey::svyby(
~en_emploi,
~diplome_4,
design,
survey::svymean,
na.rm = TRUE,
vartype = "ci"
)
emploi_pondere_df <- svyby_ci_df(emploi_pondere, "en_emploi") |>
dplyr::transmute(
`Niveau de diplôme` = diplome_4,
`En emploi` = fmt_pct(estimation, .1),
`IC 95 %` = paste0("[", fmt_pct(bas, .1), " ; ", fmt_pct(haut, .1), "]")
)
knitr::kable(emploi_pondere_df, align = c("l", "r", "c"))
```
Le passage au pondéré ne change pas seulement les pourcentages. Il change aussi la manière dont l'incertitude est calculée, puisque les strates et les PSU sont désormais intégrées.
## Un fil rouge sociologique : le diplôme et plusieurs dimensions de la vie sociale
Pour comprendre ce qu'apporte une analyse bivariée, examinons plusieurs variables ensemble. Le jeu pédagogique a été construit pour faire apparaître un gradient scolaire sur des ressources et pratiques différentes.
```{r}
#| label: ch11-gradients
est_gradients <- survey::svyby(
~sport_regulier + revenu_mensuel + livres_12m + confiance_science + heures_tv,
~diplome_4,
design,
survey::svymean,
na.rm = TRUE
)
```
Une table de communication rend le même résultat plus lisible :
**Tableau 11.1. Gradient scolaire de ressources et de pratiques**
```{r}
#| label: ch11-table-gradient
tbl_gradients <- design |>
tbl_svysummary(
by = diplome_4,
include = c(
sport_regulier,
revenu_mensuel,
livres_12m,
confiance_science,
heures_tv
),
statistic = list(
sport_regulier ~ "{p}%",
revenu_mensuel ~ "{median} ({p25}, {p75})",
livres_12m ~ "{mean} ({sd})",
confiance_science ~ "{mean} ({sd})",
heures_tv ~ "{mean} ({sd})"
),
type = list(
sport_regulier ~ "dichotomous",
confiance_science ~ "continuous"
),
label = list(
sport_regulier ~ "Sport au moins hebdomadaire",
revenu_mensuel ~ "Revenu mensuel net (€)",
livres_12m ~ "Livres lus en 12 mois",
confiance_science ~ "Confiance dans la science (1–5)",
heures_tv ~ "Télévision (heures/jour)"
),
missing = "no"
) |>
modify_header(label ~ "**Indicateur**") |>
bold_labels()
tbl_gradients
```
::: {.callout-note title="Un choix statistique explicite : résumer une échelle ordinale par une moyenne"}
`confiance_science` comporte cinq modalités ordonnées. Ici, nous la résumons par **moyenne (écart-type)** pour rendre le gradient lisible dans une table compacte. Cela revient à traiter l'échelle 1–5 comme approximativement métrique. Ce choix doit être annoncé ; une distribution complète ou un modèle ordinal seraient d'autres options défendables. Le chapitre 20 reviendra sur cette distinction.
:::
### Une figure pour voir la forme des gradients
Le tableau donne les niveaux. La figure suivante répond à une autre question : **les quatre catégories de diplôme dessinent-elles une progression régulière ou seulement une différence entre deux groupes ?** Les échelles sont volontairement libres ; il faut comparer les **formes**, pas la hauteur d'un panneau à l'autre.
```{r}
#| label: plot-ch11-gradients
#| fig-alt: "Cinq petits graphiques montrent des gradients selon le diplôme : sport, revenu, livres et confiance augmentent, tandis que le temps de télévision diminue."
faire_gradient <- function(variable, libelle, multiplicateur = 1) {
x <- survey::svyby(
stats::as.formula(paste0("~", variable)),
~diplome_4,
design,
survey::svymean,
na.rm = TRUE,
vartype = "ci"
)
x <- svyby_ci_df(x, variable)
tibble::tibble(
diplome_4 = x$diplome_4,
valeur = x$estimation * multiplicateur,
bas = x$bas * multiplicateur,
haut = x$haut * multiplicateur,
Indicateur = libelle
)
}
gradients_plot <- dplyr::bind_rows(
faire_gradient("sport_regulier", "Sport régulier (%)", 100),
faire_gradient("revenu_mensuel", "Revenu mensuel (€)"),
faire_gradient("livres_12m", "Livres lus en 12 mois"),
faire_gradient("confiance_science", "Confiance dans la science (1–5)"),
faire_gradient("heures_tv", "Télévision (heures/jour)")
)
ggplot(gradients_plot, aes(x = diplome_4, y = valeur, group = 1)) +
geom_errorbar(aes(ymin = bas, ymax = haut), width = .10,
colour = couleurs_enqueter[["gris"]], linewidth = .55) +
geom_line(colour = couleurs_enqueter[["secondaire"]], linewidth = .75) +
geom_point(colour = couleurs_enqueter[["principal"]], size = 2.5) +
facet_wrap(~Indicateur, scales = "free_y", ncol = 3) +
labs(
x = NULL, y = NULL,
title = "Le gradient scolaire ne concerne pas une seule dimension",
subtitle = "Estimations pondérées ; intervalles de confiance à 95 % ; échelles propres à chaque panneau",
caption = "Données synthétiques EnquêteR. Les panneaux servent à comparer la direction et la régularité des gradients."
) +
theme_enqueter() +
theme(axis.text.x = element_text(angle = 25, hjust = 1))
```
## Lire un gradient plutôt qu'une succession de cellules
```{r}
#| label: ch11-objets-texte
#| include: false
grad_df <- as.data.frame(est_gradients)
low <- grad_df[grad_df$diplome_4 == "Inférieur au bac", ]
high <- grad_df[grad_df$diplome_4 == "Supérieur long", ]
```
Le contraste entre les deux extrêmes est substantiel sur plusieurs dimensions : la pratique sportive régulière passe d'environ **`r fmt_pct(low$sport_regulier, 0.1)`** à **`r fmt_pct(high$sport_regulier, 0.1)`** ; le revenu mensuel moyen d'environ **`r fmt_euro(low$revenu_mensuel, 1)`** à **`r fmt_euro(high$revenu_mensuel, 1)`** ; le nombre de livres lus de **`r fmt_num(low$livres_12m, .1)`** à **`r fmt_num(high$livres_12m, .1)`**. La confiance dans la science augmente également, tandis que le temps quotidien de télévision diminue de **`r fmt_num(low$heures_tv, .1)`** à **`r fmt_num(high$heures_tv, .1)`** heures.
Ce qui mérite l'attention n'est donc pas une cellule « significative », mais la **cohérence d'un faisceau de différences**. Dans le jeu pédagogique, plusieurs ressources et pratiques se distribuent dans le même ordre scolaire, alors que la satisfaction de vie, étudiée juste après, varie beaucoup moins. Cette différence d'amplitude est elle-même informative.
::: {.callout-note title="Lecture sociologique"}
Dans une enquête réelle, un tel ensemble de résultats conduirait à interroger la **stratification des ressources et des pratiques** : ressources économiques, capital scolaire et culturel, socialisations, styles de vie, contraintes temporelles, environnement résidentiel ou professionnel. Une analyse quantitative ne choisit pas automatiquement entre ces mécanismes ; elle permet d'abord d'établir leur compatibilité avec les régularités observées.
:::
::: {.callout-warning title="Ce que ce tableau ne démontre pas"}
Le diplôme n'est pas assigné aléatoirement. Les groupes diffèrent aussi par l'âge, la santé, les trajectoires familiales, le revenu et de nombreuses caractéristiques non observées. Le tableau décrit un gradient ; il ne mesure pas « l'effet causal du diplôme ».
:::
## Quantitative × qualitative : la moyenne n'est qu'une entrée
Prenons la satisfaction de vie selon le diplôme.
```{r}
#| label: ch11-satisfaction-diplome
sat_diplome <- survey::svyby(
~satisfaction_vie,
~diplome_4,
design,
survey::svymean,
na.rm = TRUE,
vartype = "ci"
)
sat_diplome_df <- svyby_ci_df(sat_diplome, "satisfaction_vie") |>
dplyr::transmute(
`Niveau de diplôme` = diplome_4,
`Moyenne` = fmt_num(estimation, .01),
`IC 95 %` = paste0("[", fmt_num(bas, .01), " ; ", fmt_num(haut, .01), "]")
)
knitr::kable(sat_diplome_df, align = c("l", "r", "c"))
```
L'écart entre les deux extrêmes est d'environ **`r fmt_num(max(sat_diplome$satisfaction_vie) - min(sat_diplome$satisfaction_vie), .01)` point** sur une échelle 0–10 : nettement moins que les gradients observés pour le sport ou le revenu. Toutes les dimensions de la vie sociale ne sont donc pas structurées avec la même intensité par le niveau scolaire.
## Quantitative × quantitative : résumer sans écraser la forme
Exemple : âge et temps de télévision.
```{r}
#| label: ch11-correlation
var_age_tv <- survey::svyvar(~age + heures_tv, design, na.rm = TRUE)
r_age_tv <- stats::cov2cor(as.matrix(var_age_tv))["age", "heures_tv"]
tibble::tibble(
Relation = "Âge ↔ temps de télévision",
`Corrélation pondérée` = fmt_num(r_age_tv, .01)
) |>
knitr::kable(align = c("l", "r"))
```
La corrélation pondérée est ici un résumé de la relation linéaire dans la population représentée par le design. Elle ne montre ni une courbure, ni des sous-groupes, ni la distribution des observations. Le chapitre 12 montrera pourquoi le graphique doit précéder l'interprétation d'un coefficient de corrélation.
## Introduire une troisième variable sans se précipiter vers la régression
Le gradient de pratique sportive selon l'âge est très marqué. Nous pouvons donc croiser âge et diplôme avant tout modèle.
```{r}
#| label: ch11-sport-age-diplome
tab_sport_age_diplome <- survey::svyby(
~sport_regulier,
~age_classe + diplome_4,
design,
survey::svymean,
na.rm = TRUE,
vartype = "se"
)
tab_sport_age_compact <- tab_sport_age_diplome |>
dplyr::transmute(
`Classe d'âge` = age_classe,
Diplôme = diplome_4,
`Sport régulier` = fmt_pct(sport_regulier, 0.1)
) |>
tidyr::pivot_wider(
names_from = Diplôme,
values_from = `Sport régulier`
)
knitr::kable(tab_sport_age_compact, align = c("l", "r", "r", "r", "r"))
```
Cette stratification montre deux régularités simultanées : la pratique sportive diminue avec l'âge et, à âge comparable, reste plus élevée dans les catégories de diplôme supérieures. Nous ne savons pas encore si ces gradients sont indépendants l'un de l'autre ni comment les résumer dans un modèle ; mais la structure de la question est désormais visible.
::: {.callout-tip title="Pourquoi stratifier avant de modéliser ?"}
Une table stratifiée ou une figure peut révéler une non-linéarité, un changement de signe, une catégorie trop petite ou une interaction plausible. Ces informations évitent de traiter la régression comme une boîte noire.
:::
## Association, explication et causalité
Trois niveaux doivent rester distincts :
- **description** : les groupes ont des distributions différentes ;
- **association ajustée** : l'écart reste visible lorsque certaines variables observées sont maintenues constantes dans un modèle ;
- **effet causal** : une variation de l'exposition produirait une variation du résultat sous un ensemble d'hypothèses d'identification.
Dans ce livre, la plupart des exemples appartiennent aux deux premiers niveaux.
## Mini-exercice
Vous souhaitez répondre à : « Au sein de chaque niveau de diplôme, quelle proportion pratique un sport au moins une fois par semaine ? » Le diplôme étant placé en lignes, faut-il des pourcentages en ligne ou en colonne ?
::: {.callout-caution collapse="true" title="Correction"}
Des pourcentages en ligne : chaque ligne de diplôme doit définir son propre dénominateur. Si l'objectif était au contraire de décrire la composition scolaire des personnes sportives, le dénominateur serait différent.
:::
## Exercice de synthèse
### Niveau A — Appliquer
1. Comparez `sport_regulier` selon `sexe_f`.
2. Comparez `revenu_mensuel` selon `diplome_4`.
3. Comparez `confiance_science` selon `diplome_4`.
4. Calculez une corrélation âge–télévision.
### Niveau B — Choisir
Pour chaque comparaison, précisez : variable de groupe, indicateur, dénominateur, brut ou pondéré, et type de phrase que vous écririez.
### Niveau C — Analyser
Choisissez un gradient du Tableau 11.1. Proposez **deux mécanismes sociologiques plausibles**, puis **deux variables de confusion ou de composition** qui pourraient expliquer une partie de l'association. Aucune des quatre propositions ne doit être présentée comme démontrée.
## À retenir
- Un tableau croisé n'est interprétable qu'avec un dénominateur explicite.
- Une comparaison peut porter sur des proportions, des centres, des distributions ou une forme d'association.
- Les estimations pondérées sont à privilégier pour décrire la population représentée par le plan.
- Un gradient cohérent sur plusieurs indicateurs peut constituer un résultat substantiel plus riche qu'une cellule « significative ».
- La stratification descriptive prépare utilement l'ajustement et l'étude des interactions.
- Une association descriptive ou ajustée n'est pas automatiquement un effet causal.
## Pour aller plus loin
Le chapitre suivant traduira ces comparaisons en **figures de qualité publication**. L'objectif ne sera pas de décorer les résultats, mais de rendre visibles leurs ordres de grandeur, leurs distributions et leur incertitude.