11  Comparer des groupes et décrire des gradients sociaux

ImportantQuestion de départ

Comment décrire des écarts entre groupes sociaux sans confondre pourcentages, composition, association statistique et causalité ?

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

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

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

Afficher le code R
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")
)
Niveau de diplôme % en emploi au sein du diplôme % du diplôme parmi les personnes en emploi
Inférieur au bac 58,3% 43,9%
Bac 60,6% 19,9%
Bac+2 60,9% 15,6%
Supérieur long 64,7% 20,5%
AvertissementLe 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.

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

Afficher le code R
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"))
Niveau de diplôme En emploi IC 95 %
Inférieur au bac Inférieur au bac 57,2% [54,6% ; 59,8%]
Bac Bac 59,1% [55,3% ; 62,9%]
Bac+2 Bac+2 59,8% [54,6% ; 65,0%]
Supérieur long Supérieur long 64,9% [61,5% ; 68,3%]

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.

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

Afficher le code R
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

Afficher le code R
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
Indicateur Inférieur au bac
N = 1 6231
Bac
N = 6941
Bac+2
N = 5431
Supérieur long
N = 6681
Sport au moins hebdomadaire 20% 34% 43% 50%
Revenu mensuel net (€) 1 950 (1 500, 2 450) 2 150 (1 650, 2 650) 2 400 (1 850, 2 850) 2 850 (2 300, 3 300)
Livres lus en 12 mois 2,16 (1,58) 3,26 (1,95) 4,39 (2,23) 6,31 (2,84)
Confiance dans la science (1–5) 3,27 (0,91) 3,60 (0,85) 3,83 (0,82) 4,05 (0,84)
Télévision (heures/jour) 2,64 (1,34) 2,17 (1,32) 2,03 (1,31) 1,70 (1,22)
1
NoteUn 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.

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

Afficher le code R
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))

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.

11.6 Lire un gradient plutôt qu’une succession de cellules

Le contraste entre les deux extrêmes est substantiel sur plusieurs dimensions : la pratique sportive régulière passe d’environ 19,6% à 50,0% ; le revenu mensuel moyen d’environ 1 941 € à 2 773 € ; le nombre de livres lus de 2,2 à 6,4. La confiance dans la science augmente également, tandis que le temps quotidien de télévision diminue de 2,6 à 1,7 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.

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

AvertissementCe 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 ».

11.7 Quantitative × qualitative : la moyenne n’est qu’une entrée

Prenons la satisfaction de vie selon le diplôme.

Afficher le code R
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"))
Niveau de diplôme Moyenne IC 95 %
Inférieur au bac Inférieur au bac 6,62 [6,54 ; 6,70]
Bac Bac 6,86 [6,75 ; 6,97]
Bac+2 Bac+2 7,00 [6,87 ; 7,13]
Supérieur long Supérieur long 7,05 [6,92 ; 7,17]

L’écart entre les deux extrêmes est d’environ 0,42 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.

11.8 Quantitative × quantitative : résumer sans écraser la forme

Exemple : âge et temps de télévision.

Afficher le code R
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"))
Relation Corrélation pondérée
Âge ↔︎ temps de télévision 0,37

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.

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

Afficher le code R
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"))
Classe d’âge Inférieur au bac Bac Bac+2 Supérieur long
18-29 38,0% 47,7% 61,9% 68,2%
30-44 28,2% 44,9% 46,8% 53,8%
45-59 17,8% 28,8% 33,4% 37,1%
60-79 7,2% 16,0% 21,5% 31,8%

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.

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

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

11.11 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 ?

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.

11.12 Exercice de synthèse

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

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

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

11.13 À 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.

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