Des données d’enquête aux premiers résultats

Une initiation à l’utilisation de R/RStudio à partir de l’enquête Envie

Claire Kersuzan (PUD-Bx, MSH-Bx/Univ. de Bordeaux, LifeObs/Ined)
Capucine Rauch (PUD-S, MISHA/Univ. de Strasbourg, LifeObs/Ined)
Maude Crouzet (SAGE/Univ. de Strasbourg)

Quatrième partie

Exercice de reproduction autonome

Reproduire une figure scientifique à partir des données Envie

Comment mobiliser les outils vus précédemment pour reproduire un résultat publié ?

Objectif de l’exercice


À partir des données de l’enquête Envie, vous allez reproduire une figure issue du même article scientifique :

Bergström, M., Maillochon, F., et l’équipe Envie, (2024). Couples, histoires d’un soir, « sexfriends » : diversité des relations intimes des moins de 30 ans. Population & Sociétés, 623(6), 1-4. https://doi.org/10.3917/popsoc.623.0001.

Cet exercice mobilise notamment :

  • l’exploration des variables ;
  • le recodage ;
  • les tableaux croisés ;
  • les pourcentages ;
  • la pondération ;
  • et la réalisation graphique.

L’objectif est de réutiliser les outils vus précédemment dans une situation proche d’un vrai travail de recherche.

La figure à reproduire

Figure 1 : Cadres de rencontre selon le type relationnel

Première étape : observer la figure

Avant de commencer le code :

prenez quelques minutes pour lire attentivement le graphique.

Questions

  • Que compare la figure ?
  • Quels groupes semblent distingués ?
  • Que représentent les couleurs ?
  • Les résultats sont-ils exprimés en effectifs ou en pourcentages ?
  • Quel type de pourcentage semble utilisé ?

Comprendre une figure est une étape essentielle avant sa reproduction.

Deuxième étape : retrouver les variables utiles

À l’aide :

  • du questionnaire ;
  • du dictionnaire des variables ;
  • de la note méthodologique ;

essayez d’identifier :

  • les variables nécessaires ;
  • les éventuels filtres ;
  • la variable de pondération ;
  • les catégories à regrouper.

Quelques conseils avant de commencer

  • Travaillez étape par étape ;
  • vérifiez régulièrement vos tableaux ;
  • soyez attentif·ve aux filtres et aux NA ;
  • réfléchissez au type de pourcentage utilisé ;
  • comparez vos résultats à ceux de l’article.

L’objectif n’est pas d’obtenir exactement les mêmes chiffres, mais de comprendre la logique de construction de la figure.

Les grandes étapes de la correction


Pour reproduire la figure, nous allons :

  • charger les packages ;
  • importer les données ;
  • sélectionner les variables utiles ;
  • examiner les variables ;
  • recoder les cadres de rencontre ;
  • construire une base par type relationnel ;
  • calculer des proportions pondérées ;
  • organiser les résultats pour le graphique ;
  • produire la figure finale.

Étape 1 — Charger les packages

On commence par charger les packages nécessaires :

library(readr)
library(questionr)
library(tidyverse)
library(esquisse)

Ces packages permettent notamment :

  • d’importer les données ;
  • de sélectionner et transformer les variables ;
  • de calculer des tableaux pondérés ;
  • de produire un graphique.

Les lignes library() sont placées au début du script pour rendre l’analyse reproductible.

Étape 2 — Importer les données

On importe le fichier pédagogique anonymisé de l’enquête Envie :

ENVIE <- read_csv("data/Envie_FPA.csv")

Cette commande :

  • lit le fichier .csv ;
  • crée un objet appelé ENVIE ;
  • rend les données disponibles dans R.

À vérifier

  • L’objet ENVIE apparaît-il dans l’onglet Environment ?
  • Le chemin du fichier est-il correct ?

Étape 3 — Identifier les variables utiles

Pour reproduire la figure, il faut utiliser :

  • le cadre de rencontre du couple : r1_cadre;
  • le cadre de rencontre de l’histoire d’un soir : r2_cadre ;
  • le cadre de rencontre de la relation suivie : r3_cadre ;
  • les variables permettant d’identifier les types de relation : couple12M, r2, r3 ;
  • la variable de pondération : poidscal.

Avant de coder, il faut toujours identifier les variables nécessaires dans la documentation (et regarder leurs conditions de production).

Étape 4 — Sélectionner les variables utiles

On crée une base de travail plus légère grâce à la fonction select() :

ENVIE2 <- ENVIE |>
  select(
    r1_cadre,
    r2_cadre,
    r3_cadre,
    couple12M,
    r2,
    r3,
    poidscal
  )

Cette étape permet :

  • de garder uniquement les variables nécessaires ;
  • de simplifier le travail et de rendre le script plus lisible.

Étape 5 — Comprendre les trois variables de cadres de rencontre

La figure compare les cadres de rencontre selon trois types relationnels

On utilise donc trois variables différentes :

Variable Ce qu’elle décrit
r1_cadre cadre de rencontre du couple
r2_cadre cadre de rencontre de l’histoire d’un soir
r3_cadre cadre de rencontre de la relation suivie

Point important

Les informations ne sont pas toutes stockées dans une seule variable.

Il faut reconstruire une base de résultats à partir de plusieurs variables du questionnaire.

Étape 6 — Examiner les cadres de rencontre

Avant de recoder, on regarde la répartition des modalités des variables :

table(ENVIE2$r1_cadre, useNA = "always")
table(ENVIE2$r2_cadre, useNA = "always")
table(ENVIE2$r3_cadre, useNA = "always")


Questions

  • Quelles modalités apparaissent ?
  • Y a-t-il beaucoup de valeurs manquantes ?
  • Les modalités correspondent-elles directement à celles de la figure ?

Examiner les variables avant recodage évite de transformer les données à l’aveugle.

Étape 7 — Identifier les types relationnels

La figure distingue trois types relationnels :

  • couple ;
  • histoire d’un soir ;
  • relation suivie.

Pour les identifier, on utilise :

Type relationnel Variable utilisée
Couple couple12M
Histoire d’un soir r2
Relation suivie r3

Nous devons donc observer la distribution de ces variables avant de filtrer.

table(ENVIE2$couple12M, useNA = "always")
table(ENVIE2$r2, useNA = "always")
table(ENVIE2$r3, useNA = "always")

Étape 8 — Créer une base de travail

On crée une nouvelle base à partir de ENVIE2 :

ENVIE3 <- ENVIE2

Pourquoi créer une nouvelle base ?

  • pour conserver ENVIE2 intacte ;
  • pour ajouter progressivement les variables recodées ;
  • pour garder une trace claire des transformations.

Créer des objets intermédiaires permet de travailler étape par étape.

Étape 9a — Recoder les cadres de rencontre


Les modalités d’origine des variables cadres de rencontres doivent être regroupées pour correspondre aux catégories de la figure :

  • Histoire d’un soir
  • Relation suivie
  • Couple


Pour faciliter le recodage, nous pouvons utiliser l’interface :
irec() du package questionr.

Étape 9b — Recoder les cadres de rencontre

Exemple pour le cadre de rencontre du couple :

irec()

ENVIE3$r1_cadre_rec <- ENVIE3$r1_cadre |>
  as.character() |>
  fct_recode(
    "Lieux d'étude ou de travail" = "1",
    "Lieux d'étude ou de travail" = "2",
    "Fête ou soirée entre ami·es" = "3",
    "Chez un particulier ou par la famille" = "4",
    "Applications de rencontres" = "5",
    "Réseaux sociaux ou jeux en ligne" = "6",
    "Lieux publics" = "9",
    "Autre cadre" = "10") |>
  as.character()
  • fct_recode() permet de renommer et regrouper des modalités ;
  • plusieurs codes peuvent être regroupés sous une même catégorie ;
  • la nouvelle variable créée est stockée au format caractère (character).

Étape 10 — Recoder les autres cadres de rencontre

Le même principe doit être appliqué :

  • au cadre de rencontre de l’histoire d’un soir r2_cadre;
  • au cadre de rencontre de la relation suivie r3_cadre.

Nous créons donc de la même manière

r2_cadre_rec

et

r3_cadre_rec

Étape 11 — Construire la population « couple »

La figure porte sur :

les personnes ayant été en couple au cours des 12 derniers mois.

Nous filtrons donc les personnes concernées :

couple <- ENVIE3 |>
  filter(couple12M == 1 | couple12M == 2)

Question

Pourquoi conserve-t-on ici les modalités 1 et 2 ?

Car la :
> modalité 1 identifie les personnes En couple toute l’année
> et la modalité 2 : En couple une partie de l’année

Étape 12 — Construire la population « histoire d’un soir »

Même logique pour les histoires d’un soir :

histoire <- ENVIE3 |>
  filter(r2 == 1)


Cette base contient uniquement :

les personnes ayant connu au moins une histoire d’un soir au cours de l’année.

Étape 13 — Construire la population « relation suivie »

Nous créons maintenant une troisième base ne contenant que les personnes ayant connu au moins une relation suivie :

relation_suivie <- ENVIE3 |>
  filter(r3 == 1)


Nous avons maintenant :

  • une base couple ;
  • une base histoire d’un soir ;
  • une base relation suivie.

Chaque sous-population correspond à une partie différente du questionnaire.

Étape 14 — Vérifier les valeurs manquantes

Avant de calculer des proportions, il faut examiner les valeurs manquantes :

table(couple$r1_cadre_rec, useNA = "always")
table(histoire$r2_cadre_rec, useNA = "always")
table(relation_suivie$r3_cadre_rec, useNA = "always")

Questions

  • Observe-t-on des NA ?
  • Ces valeurs manquantes semblent-elles importantes ?
  • Peut-on les ignorer sans réfléchir ?

Étape 15 — Supprimer les cadres manquants

Comme elles sont peu nombreuses, nous retirons ensuite les observations sans information sur le cadre de rencontre :

couple <- couple |>
  filter(complete.cases(r1_cadre_rec))

Même logique pour r2_cadre_rec et r3_cadre_rec

histoire <- histoire |>
  filter(complete.cases(r2_cadre_rec))

relation_suivie <- relation_suivie |>
  filter(complete.cases(r3_cadre_rec))

Étape 16a — Calculer des proportions pondérées

Nous pouvons maintenant calculer la répartition des différents cadres de rencontre pour chaque type relationnel en utilisant la pondération

On utilise la fonction wtd.table() avec l’argument weights

Exemple pour les couples :

tab_couple <- wtd.table(
  couple$r1_cadre_rec,
  weights = couple$poidscal
) |>
  proportions() * 100
  • wtd.table() calcule un tableau pondéré ;
  • weights = poidscal applique la pondération ;
  • proportions() transforme les effectifs en pourcentages.

Étape 16b — Calculer des proportions pondérées


On fait la même chose pour les bases :

  • histoire, pour construire tab_histoire ;
  • relation_suivie, pour construire tab_relation_suivie.

Étape 17 — Pourquoi utiliser des pourcentages ?


La figure publiée présente des proportions.

Les pourcentages permettent :

  • de comparer des groupes ;
  • de lire plus facilement les écarts ;
  • d’interpréter les distributions.


Question

Quel est ici le dénominateur du pourcentage ?

Chaque type relationnel totalise 100 %.

Étape 18 — Transformer les résultats en data.frame

Les tableaux produits doivent être transformés en data.frame pour construire le graphique.


On utilise la fonction as.data.frame()

bdd_couple <- as.data.frame(tab_couple)
bdd_histoire <- as.data.frame(tab_histoire)
bdd_relation_suivie <- as.data.frame(tab_relation_suivie)


Pourquoi ?

Parce que ggplot2 (et donc l’interface Esquisse) fonctionne plus facilement.

Étape 19 — Renommer les variables

Les noms générés automatiquement par wtd.table ne sont pas toujours très lisibles.

On peut donc renommer ces noms grâce à la fonction rename()

bdd_couple <- bdd_couple |>
  rename(
    cadre = Var1,
    proportion = Freq
  )

Cette étape permet :

  • d’obtenir des noms plus explicites ;
  • de rendre le script plus compréhensible et de faciliter la construction du graphique.

On renomme les variables de la même manière (en utilisant des libellés identiques) pour les bases bdd_relation_suivie et bdd_histoire

Étape 20 — Identifier le type relationnel

Chaque base correspond à un type relationnel différent.

Nous ajoutons donc à chaque base (bdd_couple, bdd_relation_suivie, bdd_histoire) une nouvelle variable type_relationnel indiquant si les proportions calculées concernent les :

  • Couples (Couple);
  • Histoires d’un soir (Histoire d'un soir);
  • ou les Relations suivies (Relation suivie).
bdd_couple$type_relationnel <- "Couple"
bdd_histoire$type_relationnel <- "Histoire d'un soir"
bdd_relation_suivie$type_relationnel <- "Relation suivie"

Étape 21 — Réunir les résultats

On crée le nouvel objet bdd_graphique en fusionnant les trois bases de résultats grâce à la fonction bind_rows() :

bdd_graphique <- bind_rows(
  bdd_histoire,
  bdd_relation_suivie,
  bdd_couple
)

La nouvelle base contient :

  • les cadres de rencontre ;
  • les proportions ;
  • le type relationnel.

Une seule base est plus pratique pour construire un graphique.

Étape 22 — Vérifier la structure de la base finale

Avant de produire le graphique, il est important d’examiner la base finale :

head(bdd_graphique)


Questions

  • Que représente chaque ligne ?
  • Quelles variables sont disponibles ?
  • Les proportions semblent-elles cohérentes ?

Vérifier les données avant visualisation permet de repérer d’éventuelles erreurs (et de les corriger).

Étape 23 — Pourquoi ordonner les catégories ?

Par défaut, R affiche souvent les catégories par ordre alphabétique.

Or, dans la figure publiée :

  • les cadres de rencontre apparaissent dans un ordre précis ;
  • les types relationnels aussi.

Nous devons donc :

définir explicitement l’ordre des catégories.

Étape 24 — Ordonner les cadres de rencontre

Pour créer un ordre dans les modalités, il faut :

  • transformer la variable cadre en facteur grâce à la fonction factor(),
  • puis associer des labels à chacun des codes de la variable selon un ordre déterminé grâce à l’argument levels:
bdd_graphique$cadre <- factor(
  bdd_graphique$cadre,
  levels = c(
    "Autre cadre",
    "Fête ou soirée entre ami·es",
    "Réseaux sociaux ou jeux en ligne",
    "Chez un particulier ou par la famille",
    "Applications de rencontres",
    "Lieux publics",
    "Lieux d'étude ou de travail"
  )
)

Étape 25 — Ordonner les types relationnels

On fait ensuite la même chose mais cette fois-ci pour ordonner les différents types relationnels dans la légende du graphique :

bdd_graphique$type_relationnel <- factor(
  bdd_graphique$type_relationnel,
  levels = c(
    "Histoire d'un soir",
    "Relation suivie",
    "Couple"
  )
)

Cette étape permet :

  • d’obtenir le bon ordre dans la légende ;
  • de reproduire plus fidèlement la figure publiée.

Étape 26 — Construire un graphique avec Esquisse

Le package Esquisse permet de construire un graphique de manière interactive.

Pour l’ouvrir :

esquisser()

Questions

  • Quelle variable placer sur l’axe des x ?
  • Quelle variable utiliser pour les couleurs ?
  • Quelle variable contient les pourcentages ?

Étape 27 — Construire le graphique avec ggplot2

Le code du graphique final produit avec ggplot2 grâce à l’interface esquisse est le suivant :

ggplot(bdd_graphique) +
  aes(
    x = cadre,
    y = proportion,
    fill = type_relationnel
  ) +
  geom_col(position = "dodge")
  • x = cadre place les catégories sur l’axe ;
  • y = proportion correspond aux pourcentages ;
  • fill = type_relationnel distingue les groupes ;
  • geom_col() produit les barres.

Étape 28 — Pourquoi utiliser position = "dodge" ?

Cette option permet d’afficher les barres côte à côte.

Sans cette option :

  • les barres seraient empilées ;
  • la comparaison entre groupes serait plus difficile.

Étape 29 — Pourquoi utiliser coord_flip() ?

La figure publiée utilise des barres horizontales.

Pour obtenir cet affichage :

coord_flip()

Cette transformation :

  • inverse les axes ;
  • améliore souvent la lisibilité des catégories longues.

Le choix de la mise en forme participe aussi à l’interprétation des résultats

Étape 30 — Titre et légendes des axes

Le titre et la légende des axes s’ajoutent avec l’argument labs()

Étape 31 — Choix des couleurs et limite d’axe

  • Les couleurs sont définies avec l’argument scale_fill_manual()
scale_fill_manual(
    values = c(
      "Histoire d'un soir" = "#B5121B",
      "Relation suivie" = "grey80",
      "Couple" = "black"
    )
    )
  • Les limites de l’axe des pourcentages sont définies avec l’argument ylim(). (Même s’ils sont affichés sur l’axe horizontal car on a pivoté le graphique avec coord_flip, il faut indiquer les limites de l’axe y)
ylim(0, 35)

Étape 32 — Mise en forme

La mise en forme est définie avec les arguments theme_minimal() et theme().

  • theme_minimal() permet de définir l’apparance générale
  • theme() permet de préciser la taille du texte, la position de la légende
theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    plot.caption = element_text(face = "italic", hjust = 0),
    plot.caption.position = "plot"
  )

Étape 33 — Graphique final

ggplot(bdd_graphique) +
  aes(x = cadre, y = proportion, fill = type_relationnel) +
  geom_col(position = "dodge") +
  scale_fill_manual(
    values = c(
      "Histoire d'un soir" = "#B5121B",
      "Relation suivie" = "grey80",
      "Couple" = "black"
    )
  ) +
  labs(
    x = NULL,
    y = "%",
    fill = NULL,
    title = "Cadres de rencontre selon le type relationnel (%)",
    caption = "M. Bergström, F. Maillochon, l’équipe Envie, Population & Sociétés, n° 623, mai 2024, Ined.\nLecture : parmi les personnes ayant été en couple au cours des 12 derniers mois, 34 % ont connu leur partenaire dans le cadre des études ou du travail.\nSource : Enquête Envie, Ined, 2023. Données pondérées."
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    plot.caption = element_text(face = "italic", hjust = 0),
    plot.caption.position = "plot"
  ) +
  ylim(0, 35)