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)
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é ?
À 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’objectif est de réutiliser les outils vus précédemment dans une situation proche d’un vrai travail de recherche.
Figure 1 : Cadres de rencontre selon le type relationnel
Avant de commencer le code :
prenez quelques minutes pour lire attentivement le graphique.
Questions
Comprendre une figure est une étape essentielle avant sa reproduction.
À l’aide :
essayez d’identifier :
NA ;L’objectif n’est pas d’obtenir exactement les mêmes chiffres, mais de comprendre la logique de construction de la figure.
Pour reproduire la figure, nous allons :
On commence par charger les packages nécessaires :
Ces packages permettent notamment :
Les lignes
library()sont placées au début du script pour rendre l’analyse reproductible.
On importe le fichier pédagogique anonymisé de l’enquête Envie :
Cette commande :
.csv ;ENVIE ;À vérifier
ENVIE apparaît-il dans l’onglet Environment ?Pour reproduire la figure, il faut utiliser :
r1_cadre;r2_cadre ;r3_cadre ;couple12M, r2, r3 ;poidscal.Avant de coder, il faut toujours identifier les variables nécessaires dans la documentation (et regarder leurs conditions de production).
On crée une base de travail plus légère grâce à la fonction select() :
Cette étape permet :
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.
Avant de recoder, on regarde la répartition des modalités des variables :
Questions
Examiner les variables avant recodage évite de transformer les données à l’aveugle.
La figure distingue trois types relationnels :
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.
On crée une nouvelle base à partir de ENVIE2 :
Pourquoi créer une nouvelle base ?
ENVIE2 intacte ;Créer des objets intermédiaires permet de travailler étape par étape.
Les modalités d’origine des variables cadres de rencontres doivent être regroupées pour correspondre aux catégories de la figure :
Pour faciliter le recodage, nous pouvons utiliser l’interface :
irec() du package questionr.
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 ;character).Le même principe doit être appliqué :
r2_cadre;r3_cadre.Nous créons donc de la même manière
r2_cadre_rec
et
r3_cadre_rec
La figure porte sur :
les personnes ayant été en couple au cours des 12 derniers mois.
Nous filtrons donc les personnes concernées :
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
Même logique pour les histoires d’un soir :
Cette base contient uniquement :
les personnes ayant connu au moins une histoire d’un soir au cours de l’année.
Nous créons maintenant une troisième base ne contenant que les personnes ayant connu au moins une relation suivie :
Nous avons maintenant :
Chaque sous-population correspond à une partie différente du questionnaire.
Avant de calculer des proportions, il faut examiner les valeurs manquantes :
Questions
NA ?Comme elles sont peu nombreuses, nous retirons ensuite les observations sans information sur le cadre de rencontre :
Même logique pour r2_cadre_rec et r3_cadre_rec
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’argumentweights
Exemple pour les couples :
wtd.table() calcule un tableau pondéré ;weights = poidscal applique la pondération ;proportions() transforme les effectifs en pourcentages.On fait la même chose pour les bases :
histoire, pour construire tab_histoire ;relation_suivie, pour construire tab_relation_suivie.La figure publiée présente des proportions.
Les pourcentages permettent :
Question
Quel est ici le dénominateur du pourcentage ?
Chaque type relationnel totalise 100 %.
Les tableaux produits doivent être transformés en data.frame pour construire le graphique.
On utilise la fonction as.data.frame()
Pourquoi ?
Parce que ggplot2 (et donc l’interface Esquisse) fonctionne plus facilement.
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()
Cette étape permet :
On renomme les variables de la même manière (en utilisant des libellés identiques) pour les bases
bdd_relation_suivieetbdd_histoire
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 :
Couple);Histoire d'un soir);Relation suivie).On crée le nouvel objet bdd_graphique en fusionnant les trois bases de résultats grâce à la fonction bind_rows() :
La nouvelle base contient :
Une seule base est plus pratique pour construire un graphique.
Avant de produire le graphique, il est important d’examiner la base finale :
Questions
Vérifier les données avant visualisation permet de repérer d’éventuelles erreurs (et de les corriger).
Par défaut, R affiche souvent les catégories par ordre alphabétique.
Or, dans la figure publiée :
Nous devons donc :
définir explicitement l’ordre des catégories.
Pour créer un ordre dans les modalités, il faut :
cadre en facteur grâce à la fonction factor(),levels:On fait ensuite la même chose mais cette fois-ci pour ordonner les différents types relationnels dans la légende du graphique :
Cette étape permet :
Le package Esquisse permet de construire un graphique de manière interactive.
Pour l’ouvrir :
Questions
Le code du graphique final produit avec ggplot2 grâce à l’interface esquisse est le suivant :
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.position = "dodge" ?Cette option permet d’afficher les barres côte à côte.
Sans cette option :
coord_flip() ?La figure publiée utilise des barres horizontales.
Pour obtenir cet affichage :
Cette transformation :
Le choix de la mise en forme participe aussi à l’interprétation des résultats
Le titre et la légende des axes s’ajoutent avec l’argument labs()
scale_fill_manual()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)La mise en forme est définie avec les arguments theme_minimal() et theme().
theme_minimal() permet de définir l’apparance généraletheme() permet de préciser la taille du texte, la position de la légendeggplot(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)