logo

Présentation et organisation de la formation

Introduction

Le mouvement en faveur de la science ouverte qui accompagne le développement des plateformes de diffusion de données (telle que Quetelet Progedo-Diffusion) permet l’accès gratuit de la communauté scientifique à un nombre croissant de bases de données publiques, dont de grandes enquêtes quantitatives issues du monde de la recherche. Les données de sondage et d’enquêtes sont également fréquentes dans les associations, les collectivités, les entreprises ou encore les organismes de sondage qui ont très souvent recours à des questionnaires afin de collecter des informations sur différentes thématiques.

L’objectif de cette formation est triple.

  1. Présenter les potentialités pour la recherche en SHS des bases de données publiques et des données des grandes enquêtes diffusées par Quetelet Progedo-Diffusion en prenant l’exemple de l’enquête européenne “Étude des relations familiales et intergénérationelles (ERFI)” réalisée par l’INED (Institut National des Études Démographiques) et par l’INSEE (Institut National de la Statistique et des Études Économiques) en 2005. Cette démonstration vise à promouvoir l’utilisation des données issues du nouveau cycle d’enquêtes ERFI-2 dont la collecte, lancée en 2023, s’inscrit dans le cadre du projet LifeObs coordonné par l’INED. La disponibilité prochaine des données de ERFI-2 via l’application Quetelet Progedo-Diffusion offre de nombreuses perspectives d’analyse pour l’étude des comportements familiaux récents et leurs évolutions depuis le premier cycle d’enquêtes ERFI-1.

  2. Sensibiliser les participants à l’exploitation de données d’enquêtes réelles et à ses particularités à travers la réplication des premiers résultats obtenus à partir des données de l’enquête ERFI-1 publiés dans un article écrit par Arnaud Régnier-Loilier en 2006 dans la revue Population et Sociétés: “À quelle fréquence voit-on ses parents?”. À travers cet exemple d’exploitation, il s’agira notamment d’aborder les pondérations et leur usage, le traitement de la non-réponse et des valeurs manquantes, le recodage et la transformation de variables, le calcul de statistiques descriptives de base, la réalisation de tableaux croisés et de représentations graphiques simples, etc.

  3. Initier les participants à l’utilisation du langage R et de son interface R-Studio pour le traitement statistique de données d’enquêtes, principalement à travers l’écosystème Tidyverse. Il s’agit de présenter les bases de ce langage très puissant et relativement simple afin d’en dédramatiser l’usage, tout en fournissant des éléments permettant de progresser de façon autonome dans son apprentissage.

Déroulé de la formation

La durée de la formation est modulable (6 à 12 heures) en fonction du niveau des étudiants et de l’organisation de la formation (autonomie laissée aux apprenants dans la réalisation du kit, exercices pratiques proposées, nombre et durée des séances de formation).

📝 Exercices pratiques
Pour permettre aux apprenants de s’exercer par eux-mêmes, il est possible de proposer en fin de séance la reproduction du même graphique que celui réalisé pour l’ensemble des femmes et hommes âgées de 30 à 79 ans (Répliquer les premiers résultats de l’article “À quelle fréquence voit-on ses parents?” (Arnaud Régnier-Loilier, 2006)) séparément pour les hommes et/ou pour les femmes.

Pré-requis

Aucun pré-requis n’est nécessaire pour la réalisation de ce kit. Il s’adresse particulièrement aux personnes qui sont peu familières avec le traitement de données d’enquêtes quantitatives.

Documents de la formation

Cette formation s’appuie sur l’utilisation de plusieurs ressources :

  • un jeu de données simplifié et anonymisé à visée pédagogique de l’enquête ERFI-1 préparé par le Service des Enquêtes de l’INED (Institut national d’études démographiques). Il contient une sélection des réponses originales dans l’enquête ERFI-1 dont certaines sont recodées/modifiées en vue de leur anonymisation
  • ce support de formation (conçu sous RStudio avec RMarkdown) mêlant exposés théoriques (description de l’enquête ERFI-1, particularités du traitement de données d’enquête, éléments de formation de base à R) et un cas pratique détaillant les différentes opérations à réaliser (instructions R et résultat de leur exécution) permettant d’obtenir les premiers résultats d’un article écrit par Arnaud Régnier-Loilier en 2006 dans la revue Population et Sociétés: “À quelle fréquence voit-on ses parents?”
  • d’autres documents utiles à la formation: documentations du jeu de données anonymisé et des données de l’enquête originale ERFI-1, article de la revue Population et Sociétés dont certains résultats sont ici répliqués, Dictionnaire des variables du fichier anonymisé ERFI-1, etc.

L’ensemble de ces ressources est directement accessible aux participants à partir du projet RStudio ERFI1 distribué.

⚠️ La procédure d’anonymisation appliquée à certaines des variables du jeu de données de cette formation ne permet pas d’utiliser ce fichier à des fins de recherche. Il ne peut être réutilisé qu’à des fins pédagogiques.

Pourquoi anonymiser les réponses originales des enquêtés?

Le règlement général sur la protection des données (RGPD) vise à encadrer le traitement et la circulation des données à caractère personnel sur le territoire de l’Union Européenne. La pseudonymisation et l’anonymisation constituent deux mesures de modification d’une version originale d’un jeu de données qui sont recommandées par le RGPD pour limiter les risques liés au traitement de données personnelles.

L’anonymisation est une procédure qui vise à supprimer tout caractère identifiant, direct (nom, adresse, numéro de sécurité sociale, …) ou indirect (issu du croisement de plusieurs variables comme par exemple l’âge, la PCS et le nombre d’enfants), d’un jeu de données. L’application de cette procédure à un fichier de données individuelles (ou fichier de microdonnées) peut induire des destructions et des modifications substantielles dans les données collectées : suppression locale d’informations, modification de valeurs, échanges de valeurs entre individus, etc. La conséquence est que les résultats tirés d’un tel fichier de données ne peuvent pas être utilisés à des fins scientifiques. Les microdonnées anonymisées sont des données en accès libre et gratuit, facilement réutilisables par toutes et tous (open data) mais uniquement à des fins pédagogiques. Des détails concernant les procédures d’anonymisation appliquées par le service des enquêtes de l’INED au jeu de données anonymisé de cette formation sont accessibles ici.

La pseudonymisation consiste à remplacer les données directement identifiantes par des données indirectement identifiantes (regroupement de modalités, utilisation d’alias, …), sans induire de perturbation dans les données d’origine. Les microdonnées pseudonymisées offrent donc davantage d’informations que les données anonymisées et peuvent être réutilisées à des fins de recherche scientifique. Toutefois, les données pseudonymisées restent potentiellement réidentifiantes. Leur accès nécessite donc une autorisation administrative auprès du Comité du secret statistique.

Le fichier pseudonymisé de l’enquête ERFI-1 (pouvant être réutilisé à des fins de recherche) est mise à disposition gratuitement de la communauté scientifique via Quetelet-Progedo-Diffusion. Pour obtenir ces données, l’utilisateur doit formuler une demande sur le portail de commande de Quetelet-Progedo Diffusion ; acceptée sous condition de statut, présence d’une adresse e-mail institutionnelle de rattachement et du bref résumé d’un projet de recherche. Si la demande est acceptée, cela conduit à la signature d’un engagement individuel à destination de l’ADISP (Archives des Données Issues de la Statistique Publique), et dans le cas d’un fichier de données pseudonymisées (appelé fichiers de Production et de Recherche-FPR), d’un engagement de confidentialité à destination du Comité du Secret Statistique. La procédure d’habilitation auprès du Comité du secret statistique est gérée par l’intermédiaire des équipes de Quetelet-Progedo-Diffusion. L’accès aux données se fait ensuite depuis l’ordinateur du chercheur sous un délai d’environ deux semaines. Les données du second cycle de l’enquête ERFI (ERFI-2) seront également rendues accessible à la communauté scientifique prochainement via l’application Quetelet-Progedo-Diffusion.


Fichier de données individuelles (ou fichier de microdonnées)
Dans un jeu de données individuel, chaque observation correspond à un individu (ex: microdonnées de recensements ou d’enquêtes). A l’inverse, dans un jeu de données agrégé les observations correspondent à un regroupement de données individuelles à un niveau supérieur qui peut être défini à partir d’un critère géographique (commune, département, …), démographique (âge, sexe, …) ou de tout autre critère d’agrégation.

Quetelet-Progedo-Diffusion
Quetelet-Progedo-Diffusion est un entrepôt et un catalogue de données qui propose en 2024 l’accès à plus de 1500 jeux de données, issues de l’INED et de l’ADISP (Archives des Données Issues de la Statistique Publique). L’application Quetelet-Progedo-Diffusion permet de réaliser une recherche de données par mot clé et/ou selon différents filtres (producteurs, années, thème, couverture géographique, …) et de déposer une demande d’accès aux données.

L’enquête Etude des relations familiales et intergénérationnelles (ERFI)

Présentation générale

L’enquête Etude des relations familiales et intergénérationnelles (ERFI) est la branche française du programme européen Generations and Gender Programme (GGP). Mis en place en 2000 à l’initiative de la Population Activities Unit de la commission économique des Nations Unies pour l’Europe, ce programme vise à collecter des informations afin d’éclairer les évolutions récentes du paysage sociodémographique : vieillissement de la population, baisse de la fécondité, fragilisation des unions, féminisation du marché du travail… Ces informations sont précieuses pour comprendre les enjeux que soulèvent ces transformations, comme la question des solidarités intergénérationnelles ou la redéfinition des rôles des hommes et des femmes dans la société ou au sein des couples.
Des données ont été collectées selon une méthodologie similaire dans 24 pays (principalement en Europe), avec un questionnaire standardisé, permettant une comparaison internationale. Il est ainsi possible de mesurer l’impact des contextes nationaux et des politiques publiques sur les comportements démographiques.
Il s’agit d’un programme d’enquêtes longitudinales, c’est-à-dire qui réinterroge les mêmes individus à plusieurs intervalles de temps (trois vagues en France : 2005, 2008 et 2011). Cela permet de mesurer l’évolution des situations, ou encore les décalages entre intentions et réalisations.

Thématiques de l’enquête

Comme son nom l’indique, le programme GGP porte un intérêt particulier aux problématiques liées au genre et aux relations entre générations. Ces phénomènes peuvent être étudiés à un instant donné, mais également dans le temps grâce à la dimension longitudinale de l’enquête.

A titre d’exemple, voici une sélection d’articles publiés mobilisant les données des enquêtes GGP dans les différents pays participants au programme, pour illustrer la diversité des thèmes que celles-ci permettent de couvrir :

L’ensemble des thématiques abordées ainsi que les questionnaires des enquêtes peuvent être consultés sur le site de l’enquête ERFI-1
La liste des publications réalisées à partir des données des enquêtes GGP à l’international peut être consultée sur le site du programme GGP

Champ

L’enquête porte sur les personnes âgées de 18 à 79 ans: 10 079 personnes âgées de 18 à 79 ans vivant en France métropolitaine ont été interrogées. Ce champ permet de saisir les relations intergénérationnelles dans toute leur diversité, en les mesurant à la fois du point de vue de l’aidant et de celui de l’aidé. Il permet également des comparaisons des comportements familiaux au fil des générations (par exemple le départ du foyer parental, l’entrée dans la vie active, la mise en couple, la première naissance…). Enfin, il offre aussi un focus sur la génération dite “pivot”, c’est-à-dire qui peut apporter de l’aide à la fois à ses enfants qui entrent dans la vie adulte, et à ses parents devenus dépendants.
Il s’agit de la seule enquête longitudinale en Europe qui couvre tous les âges de la vie adulte. C’est également une des rares enquêtes à l’échelle européenne à porter la focale sur les comportements démographiques.

Le programme GGP a été relancé en 2020 avec un nouveau cycle d’enquêtes sur un nouveau panel mais avec un questionnaire très proche de celui du premier cycle et une méthodologie similaire. En France, la collecte de la première vague de ERFI-2 a été lancée en 2023.

Réutilisation de données d’enquête: quelles précautions prendre lors du traitement?

Comprendre le contexte de production de l’enquête : l’importance des métadonnées


Les métadonnées sont les données sur les données. Elles correspondent à l’ensemble de la documentation accompagnant les données d’enquête. Elles permettent de contextualiser une enquête pour une personne qui n’a pas participé à la conception et à la collecte des données.

Les métadonnées comprennent :

  • Des éléments descriptifs : une description générale des objectifs de l’enquête et des thématiques couvertes, le type de données, le nom du ou des organismes producteurs, le champ de l’enquête, la couverture géographique, l’inscription éventuelle dans un programme de recherche…
  • Des éléments méthodologiques : plan de sondage, mode de collecte, traitement de la non-réponse, méthode de calcul des pondérations, description des opérations réalisées sur les bases de données avant leur diffusion (recodages, corrections, calculs de variables…)
  • Des élements sur la qualité des données : taux de réponse, incohérences repérées, circonstances particulières ayant pu affecter la collecte…
  • Le questionnaire de l’enquête ainsi que les documents fournis aux enquêteurs pour la passation
  • Un dictionnaire des codes : il s’agit d’une liste de toutes les variables présentes dans la ou les bases de données de l’enquête, à la fois celles collectées à partir du questionnaire et celles calculées en aval de la collecte.

En amont de la demande d’accès aux données, les métadonnées facilitent l’identification et la localisation des jeux de données pertinents pour la recherche que l’on souhaite mener.
Une fois les jeux de données obtenus, les métadonnées renseignent sur la façon de bien utiliser ces données. Elles informent sur les éventuels biais et précautions à prendre lors de l’exploitation des données et de l’interprétation des résultats.
Enfin, elles facilitent la prise en main du jeu de données.

Plan de sondage

Les enquêtes sont réalisées en interrogeant une fraction seulement de la population cible : un échantillon. Celui-ci doit permettre d’étudier l’ensemble de la population dont il est extrait. Pour cela, la sélection de cet échantillon doit répondre à des règles précises afin d’être représentatif de la population cible. Cette représentativité permet de généraliser les résultats obtenus à partir des informations collectées sur l’échantillon à l’ensemble de la population grâce aux méthodes d’inférence statistique. Le plan de sondage fait référence à la méthodologie utilisée pour sélectionner l’échantillon.

Inférence statistique
L’inférence statistique est l’ensemble des méthodes permettant d’induire les caractéristiques (inconnues) d’une population à partir de celles (connues) d’une fraction de celle-ci. Ces méthodes reposent sur la théorie des probabilités.

Le plan de sondage est dit probabiliste, ou aléatoire lorsque la sélection de l’échantillon se fait par tirage aléatoire parmi une base de sondage répertoriant l’ensemble des individus constituant la population cible. Chaque individu a alors une probabilité connue et non nulle de faire partie de l’échantillon.

Base de sondage
Une base de sondage est une liste actuelle et exhaustive de tous les individus qui composent la population cible. Elle doit en outre comporter les informations nécessaires pour identifier et entrer en contact avec chaque individu de la population cible (ex : nom, adresse…). Cela peut être un registre de population, un registre des logements, un fichier de données fiscales… Une solution alternative est de générer aléatoirement des numéros de téléphone (fixe ou mobile).
On parle de défaut de couverture lorsque certains individus appartenant à la population cible ne font pas partie de la base de sondage, et ont par conséquent une probabilité nulle d’être sélectionnés pour faire partie de l’échantillon.


Exemple : le plan de sondage pour la première vague (2005) de l’enquête ERFI-1

Pour la première vague de l’enquête ERFI-1 en 2005, la base de sondage est l’Echantillon-Maître du recensement 1999. Il s’agit de la liste des logements recensés par l’INSEE en 1999 (recensement le plus récent au moment de la conception de l’enquête ERFI). Les ménages à enquêter ont été tirés selon un plan de sondage aléatoire simple, c’est-à-dire que chaque ménage a la même probabilité d’être sélectionné pour intégrer l’échantillon.
Dans un second temps, au sein de chaque ménage inclus dans l’échantillon, une seule personne parmi tous les membres du ménage correspondant au champ de l’enquête (c’est-à-dire toute personne âgée entre 18 et 79 ans) est sélectionnée aléatoirement pour répondre au questionnaire. Si cette personne refuse de répondre, aucun autre membre du ménage n’est sollicité afin de ne pas compromettre le caractère aléatoire de la sélection.
Au total, 10 079 personnes ont été interrogées.

Données manquantes

On parle de donnée manquante dans une enquête lorsque la valeur associée à la réponse d’un enquêté pour une variable spécifique n’est pas disponible. Il y a plusieurs raisons pour expliquer cette absence :

  • La personne n’était pas concernée par cette partie de l’enquête, la question ne lui a pas été posée (exemple : pour les personnes vivant seules, les variables relatives aux questions sur la répartition des tâches entre conjoints sont associées à des données manquantes)
  • La personne, bien que concernée par la question, n’y a pas répondu
  • La donnée a été perdue ou effacée (ex : réponse illisible dans le cas d’un questionnaire papier, bug informatique dans le cas d’une collecte assistée par ordinateur, réponse considérée incohérente et effacée lors du traitement post-collecte…)

Dans le premier cas, l’absence de donnée est normale et attendue. En revanche, dans les deux derniers cas, elle est davantage problématique et son traitement doit faire l’objet de choix méthodologiques, de la part des concepteurs de l’enquête comme de la part des utilisateurs.

Dans certaines enquêtes, les données manquantes sont corrigées par imputation avant la mise à disposition des données. L’imputation des données manquantes est une procédure qui consiste à remplacer une valeur manquante par une valeur “probable”, extrapolée à partir des réponses données par les individus présentant des caractéristiques proches de l’individu pour qui la donnée est manquante.
Dans d’autres, les données manquantes sont laissées comme telles dans le jeu de données. C’est le cas par exemple dans ERFI-1. La gestion de ces données manquantes appartient alors à l’utilisateur. Il peut décider de procéder lui-même à une imputation selon la méthode de son choix, ou bien, plus simplement, d’exclure de son analyse les individus pour lesquels il manque une donnée.

La gestion des données manquantes et la méthode utilisée pour l’imputation le cas échéant font partie des informations présentes dans les métadonnées.


📝 La fréquence des données manquantes (hors questions soumises à filtre) est un indicateur de la qualité des données. Un fort taux de données manquantes indique une certaine fragilité de la variable et appelle à une interprétation prudente des résultats obtenus à partir de celle-ci.

Les pondérations

La spécificité des données d’enquêtes est que chaque observation représente en réalité un plus grand nombre d’unités statistiques. En effet, chaque individu enquêté représente non seulement lui-même, mais aussi plusieurs autres individus de la population totale, qui auraient le même profil. A chaque individu est associé un poids.

Ce poids permet de :

  • Ramener la taille de l’échantillon à celle de la population réelle : faire la somme des poids de tous les individus interrogés permet de retrouver l’effectif total de la population réelle ;
  • Corriger des biais liés à la non-réponse, lorsque les caractéristiques des non-répondants diffèrent de celles des répondants ;
  • Améliorer la qualité des estimations en rapprochant la structure de l’échantillon interrogée de celle de la population-cible, à partir des caractéristiques connues de celle-ci (ex: sexe, âge, type de ménage…), afin de corriger une éventuelle sur- ou sous-représentation de certains profils d’individus.

📝 Comment sont calculées les pondérations ?

La pondération est d’abord calculée en attribuant à chaque individu un poids de sondage, qui correspond à l’inverse de sa probabilité d’inclusion dans l’échantillon. Ce poids de sondage est ensuite ajusté pour corriger la non-réponse, et caler la structure de l’échantillon sur celle de la population-cible, par une procédure de post-stratification.

On parle de non-réponse lorsqu’une personne sélectionnée pour faire partie de l’échantillon interrogé n’a pas répondu à l’enquête, soit parce qu’il n’a pas été possible de la contacter, soit parce qu’elle a refusé de prendre part à l’enquête. La non-réponse créée un biais dans la représentativité de l’échantillon du fait de son caractère sélectif : certaines catégories de population sont plus difficiles à joindre, ou ont plus tendance à refuser les enquêtes que d’autres. En général, un poids plus important est alors attribué aux enquêtés présentant les caractéristiques des non-répondants, afin de rétablir l’équilibre.

La procédure de post-stratification correspond au redressement de l’échantillon en calant sa structure sur celle de la population-cible, en utilisant une série de variables auxiliaires disponibles grâce à une autre source de données (ex: recensement). On fait en sorte que la distribution de la population enquêtée soit la plus proche possible de celle de la population-cible pour ces variables auxiliaires. Par exemple, si la population-cible compte 48 % d’hommes mais que l’échantillon n’en comporte que 40 %, un poids plus important sera attribué aux répondants hommes, pour se rapprocher de la proportion attendue.

La variable de pondération fournie dans la base de données correspond ainsi au poids de sondage, ajusté après prise en compte de la non-réponse et opérations de post-stratification. Il est important de toujours utiliser la pondération dans les analyses, afin que les résultats produits ne soient pas entâchés de biais d’échantillonnage.

Les pondérations dans ERFI-1

Dans ERFI-1, la pondération a été calculée à partir de six variables, dont la distribution dans la population-cible est connue grâce à l’Enquête Emploi en Continu de 2004 et à l’Enquête Annuelle de Recensement de 2006 :

  • Croisement sexe et groupe d’âge
  • Croisement sexe et nombre d’habitants du ménage
  • Catégorie socioprofessionnelle
  • Nationalité
  • Taille de l’unité urbaine de résidence
  • ZEAT (Zone d’Etudes et d’Aménagement du Territoire) de résidence (unité géographique utilisée par l’INSEE)

Le poids moyen d’un individu interrogé dans ERFI-1 est de 4342.46, ce qui signifie que chaque individu enquêté représente en moyenne un peu plus de 4000 individus de la population totale des 18-79 ans en France métropolitaine.

Structure et mise en forme de l’information pour l’analyse

Les fichiers contenant les données d’enquête respectent certaines normes quant à l’organisation de l’information afin d’en permettre un traitement rapide par les principaux logiciels de traitement statistique. Prenons par exemple le jeu de données anonymisé de ERFI-1 sur lequel nous allons travailler dans la suite de cette formation :

  • Chaque ligne correspond à un individu interrogé, et chaque colonne à une variable.
  • La première ligne du fichier contient les noms des variables. Chaque nom de variable doit être unique, court, et sans espace. Le dictionnaire des codes permet de faire le lien entre les noms de variables utilisés dans la base, et les questions auxquelles ils correspondent.
  • Chaque individu possède un identifiant (il se trouve souvent dans la première colonne, ici “id”). Cet identifiant, qui peut être un numéro d’ordre ou une suite de caractères alphanumériques, est unique pour chaque enquêté. Il permet entre autres de s’assurer que chaque répondant est bien présent une seule fois dans la base de données.

📝 Etant donné le volume important de données collectées par les enquêtes, il est fréquent que l’information soit stockée dans différents fichiers de données (tables). Cela permet d’éviter que les tables soient trop volumineuses et ralentissent les traitements, ou bien de stocker des informations de nature différente (informations relatives aux enquêtés mais aussi aux enfants des enquêtés ou encore aux individus des ménages des enquêtés par exemple). Pour cette formation toutes les données de ERFI-1 fournies sont regroupées dans un seul fichier, mais les données complètes, accessibles via Quételet-Progedo-Diffusion, sont divisées en trois fichiers :
- Un fichier enfant, qui contient les informations concernant les enfants des répondants ;
- Un fichier individu, contient les informations relatives à l’ensemble des personnes résidant dans le ménage enquêté ;
- Un fichier répondant, qui contient les réponses au questionnaire individuel passé auprès de la personne du ménage sélectionnée pour répondre à l’enquête.
L’identifiant individuel du répondant est présent dans chacune des trois bases de données et permet de passer de l’une à l’autre en réalisant des jointures.

Découverte de R et de RStudio

À propos de R

R est un langage de programmation et un logiciel libre principalement destiné à l’analyse statistique et à la science des données.

Il permet:

  • de manipuler des données (nettoyage, construction de variables,etc.) ;
  • d’analyser des données (analyse descriptive, tests d’hypothèses, modèles multivariés,etc.) ;
  • de réaliser une multitude de types de graphiques et de cartes (des plus simples aux plus élaborés) facilement paramétrables ;
  • de générer des rapports automatisés reproductibles statiques ou dynamiques comportant des tableaux de données, des statistiques et des visualisations (disponibles aux formats .pdf, .pptx, .docx, .html, .xlsx, etc. avec R Markdown et Quarto ou sous forme d’applications web avec R Shiny).

Pourquoi utiliser R ?

R est un logiciel:

  • multiplateforme (fonctionne sur des systèmes Linux, Mac OS et Windows) ;
  • libre (développé par ses utilisateurs, diffusable et dont le code source est modifiable par tous) ;
  • gratuit ;
  • très puissant (les fonctionnalités de base peuvent être étendues à l’aide de nombreuses bibliothèques de fonctions appelées “packages”) ;
  • dont le développement est très actif et dont la communauté d’utilisateurs et l’usage ne cessent de s’accroître ;
  • avec d’excellentes capacités graphiques ;
  • qui permet de produire des documents reproductibles facilitant la transparence et le partage des données dans un contexte de science ouverte.

Les principaux inconvénients de R

  • L’interface RStudio, la documentation de référence et les principales ressources sont en anglais ;
  • R est un langage de programmation. Il fonctionne à l’aide de scripts (des petits programmes) édités et exécutés au fur et à mesure de l’analyse. La maîtrise du langage R nécessite un temps d’apprentissage mais son acquisition est largement facilitée par les nombreuses formations et ressources disponibles en ligne ;
  • L’environnement R comprend un ensemble de fonctionnalités de base qui peuvent être étendues grâce à l’installation de nombreux packages externes (ensemble de fonctions documentées créées par la communauté des développeurs visant à la réalisation d’une tâche particulière comme par exemple l’analyse de variance, la manipulation de données, etc.). L’importation de plusieurs packages incluant des fonctions différentes mais avec des noms identiques peut entraîner ce qu’on appelle des “conflits de packages”. Il est possible de les gérer assez facilement sous R mais ces conflits peuvent être parfois déroutants. Pour en limiter l’apparition, il est recommandé d’importer dans son environnement un nombre minimal de packages (uniquement ceux qui couvrent les besoins de l’analyse).

Installer R et RStudio

1. Installation de R
Allez sur la page du CRAN: http://cran.r-project.org/ et téléchargez la dernière version de R (install R for the first time) adaptée à votre ordinateur. Une fois le programme d’installation lancé, installez R avec les options par défaut.

2. Installation de Rstudio
Une fois R correctement installé, allez sur https://posit.co/download/rstudio-desktop/. Choisissez l’installateur correspondant à votre système d’exploitation et suivez les instructions du programme d’installation.

RStudio est un environnement de développement intégré (IDE): une interface qui facilite le travail avec R, en particulier la gestion des projets et l’import des données. Il permet de consulter ses fichiers de script, la ligne de commande R, les rubriques d’aide, les graphiques, etc.

📝 Il faut privilégier l’installation de R et RStudio sur un lecteur sur lequel vous avez des droits de lecture et d’écriture. Sinon, votre capacité à installer des paquets R risque d’être affectée. Par ailleurs, pour mettre à jour R ou RStudio, il faudra les réinstaller en allant sur les sites web mentionnés ci-dessus et cliquer sur réinstaller. Il n’existe pas de fréquence déterminée à laquelle mettre à jour R et RStudio, mais il importe de vérifier régulièrement sur le site du CRAN la sortie de nouvelles versions du logiciel, car certains packages ne s’installeront pas correctement si votre version de R est trop ancienne.

Travailler en mode projet

Ouvrir le projet RStudio de la formation (en double-cliquant sur le fichier .Rproj)

Un projet RStudio sert à organiser son travail et facilite l’accès à tous les fichiers requis pour une analyse (jeu de données, documentation, codes R, …). Dans notre projet RStudio ERFI1, les ressources et supports de la formation ont été organisés dans différents sous-dossiers (créés par l’utilisateur) visibles dans l’onglet Files du quadrant inférieur droit

.

Ces sous-dossiers sont les suivants :

  • data/ : ce répertoire contient un jeu de donnée anonymisé et simplifié de l’enquête ERFI-1 en format .csv
  • doc/ : ce répertoire contient la documentation et les métadonnées associées à l’enquête originale ERFI-1 en particulier le questionnaire et le dictionnaire des variables, le dictionnaire des variables du fichier anonymisé de l’enquête ERFI-1 utilisé ici, l’article d’Arnaud Régnier Loilier en format .pdf publié en 2006 dans la revue Population et Sociétés dont nous cherchons ici à répliquer certains résultats ainsi que d’autres documents utiles pour la formation (au format .pdf pour la plupart)
  • un support de formation en format html réalisé à partir de l’éditeur RMarkdowninclus dans RStudio qui permet de générer des rapports reproductibles au format html (mais aussi pdf, docx, etc.) en mélangeant du texte, du code R et les résultats produits par l’exécution de ce code. Ce support contient l’ensemble détaillé des explications, codes et résultats présentés durant cette formation.

L’utilisation de projets RStudio présente plusieurs avantages :

  • faciliter le travail collaboratif en regroupant dans un même dossier de travail (projet) tous les éléments d’une analyse spécifique (données, codes, réglages, documentations, et sorties) à la racine du projet (maîtrise du lieu de sauvegarde, importations et exportations facilitées) ;/
  • renforcer la portabilité : le répertoire de travail par défaut d’un projet est le répertoire où est enregistré ce projet. Si vous transmettez le projet à un collègue, le fait de lancer un programme ne dépendra pas de l’arborescence de votre machine. Par exemple, si vous avez un code nommé analyse.R dans votre projet, alors son chemin d’accès ne sera pas “chemin/qui/marche/uniquement/sur/mon/poste/analyse.R” mais “./analyse.R”, quel que soit l’endroit où le projet est enregistré sur votre machine.

Comment créer un projet RStudio?

  1. Commencer par ouvrir RStudio en double cliquant sur l’icone sur le bureau ou en tapant “RStudio” dans la fonction de recherche du menu Démarrer (assurez-vous que vous ouvrez bien RStudio et non pas R).

  2. Créer un nouveau projet en cliquant sur File, puis New Project. Le menu suivant s’affiche :

  1. Pour un tout nouveau projet, sélectionnez New Directory, puis New Project. Dans la nouvelle fenêtre qui s’ouvre précisez dans Directory name le nom de votre projet (privilégiez des noms simples et explicites, ne pas utiliser d’espace, d’accent ou de caractères spéciaux) puis dans Create project as subdirectory of indiquez l’endroit où vous souhaitez créer le répertoire de travail du projet sur votre machine (cliquez sur le bouton Browse).

  2. Votre projet RStudio est créé et apparaît dans le quadrant inférieur droit de l’interface RStudio (onglet Files). Il faut maintenant créer les sous-dossiers (data, script, ..) permettant de classer les différents documents de votre projet. Il n’y a pas de régles précises concernant la création de ces sous-dossiers (nombre, nom) mais en général on propose une organisation des données du projet sous cette forme:

.

  1. Pour créer chacun de ces sous-dossiers, il faut cliquer sur le bouton New Folder dans le menu en haut de l’onglet Files du quadrant inférieur gauche:


Une fois l’ensemble des sous-dossiers créés, allez dans le répertoire du dossier de votre projet sur votre machine et déplacer chacun de vos documents dans le sous-dossier correspondant (le jeu de données dans data, les documents dans doc, …)

Après avoir suivi toutes ces étapes, vous avez un dossier de travail et un nouveau projet RStudio qui lui est associé.

📝: Pour ouvrir un projet RStudio existant depuis l’interface RStudio, il suffit de cliquer sur le menu File en haut de l’interface RStudio puis de sélectionner l’option Open project et d’indiquer le chemin du répertoire de travail du projet RStudio sur votre machine. Une nouvelle session RStudio s’ouvre dans laquelle le répertoire de travail (working directory) est le dossier-maître du projet (le dossier dans lequel se situe le fichier .Rproj du projet).
Pour plus d’informations sur la création de projet RStudio, n’hésitez pas à consulter la documentation de l’INSEE consacrée à R utilitR, en particulier cette section

L’environnement RStudio


L’ouverture du projet RStudio ouvre automatiquement une nouvelle session RStudio.

Par défaut, au premier lancement de RStudio, l’interface est organisée en trois grandes zones. Pour ouvrir une quatrième zone en haut à gauche de l’interface de RStudio (la zone 2 Scripts sur l’image), il suffit de sélectionner le menu File, puis New file et R script.

L’interface de RStudio: 4 grandes zones


L’interface de RStudio est maintenant divisée en quatre quadrants :

  • 1 Console (quadrant inférieur gauche)
    C’est la fenêtre de commande : c’est là que les commandes R sont réellement exécutées et que les sorties non graphiques et les messages d’erreur/d’avertissement apparaissent.
    Les instructions données à R (commandes ou fonctions) peuvent être saisies et exécutées directement dans la console R (en validant une instruction par la touche Entrée) mais ces commandes ne pourront pas être enregistrées (contrairement à celles saisies et exécutées à partir d’un script)

  • 2 Scripts (quadrant supérieur gauche)
    C’est un fichier texte (éditeur) où l’on écrit les instructions données à R qui seront ensuite transférées dans la console pour être exécutées. Les scripts peuvent être enregistrés. C’est pourquoi il est préférable d’écrire les commandes R dans un script et de le sauvegarder.
    Enregistrez votre script dans le sous-dossier script du projet RStudio ERFI1 sous le nom ERFI1_Regnier.r (menu File, Save As).
    On peut envoyer les codes de la zone Script vers la zone Console: grâce au bouton (qui exécute la ou les lignes de commande sélectionnée(s)) ou en appuyant simultanément sur les touches clavier Ctrl + Enter pour Windows / Cmd + Enter pour Mac.

  • 3 Environnement (quadrant supérieur droit)
    Ce quadrant offre différentes options :
    - une liste de l’ensemble des objets et datasets (données importées, modifiées ou créées, paramètres définis, …) en mémoire (onglet Environment),
    - un outil d’importation de données (bouton Import Dataset dans l’onglet Environment),
    - un historique de vos commandes R (onglet History).

  • 4 Visualisation, aide (quadrant inférieur droit)
    Ce quadrant permet d’accéder aux:
    - fichiers de votre projet R ou répertoire de travail (onglet Files),
    - graphiques réalisés grâce aux instructions R (onglet Plots),
    - extensions disponibles avec la possibilité de les installer directement depuis l’interface (onglet Packages),
    - documentations et fichiers d’aide en ligne (onglet Help),
    - Viewer utilisé pour visualiser certains résultats (notamment les graphiques) au format web (html).


📝 Utiliser la console ou un script pour taper les instructions données à R ?

Pour répondre, la question essentielle à se poser est : si je dois refaire mon analyse demain, est-ce que j’aurais à nouveau besoin de cette instruction ?
- instructions qui modifient R ou Rstudio, par exemple l’installation de packages ou leur mise à jour-> dans la console
- instructions qui me permettent de savoir où j’en suis dans mon analyse, par exemple visualisation de mes objets -> le plus souvent dans la console
- instructions qui ont pour but de créer des variables/valeurs et/ou qui produisent des résultats statistiques -> dans le script

Les objets


Un objet est l’unité de base dans R : les données sont sauvegardées dans des objets, on manipule et on travaille avec ces objets, et on exécute des opérations sur ces objets. Ces objets peuvent contenir tout types et structures de données. Les données doivent donc être stockées dans un objet pour pouvoir être manipulées (même si les données peuvent apparaitre dans la console, R ne pourra pas travailler dessus si elles ne sont pas stockées dans un objet).

Pour créer un objet dans R (assigner des données à un objet), on utilise le plus souvent l’opérateur d’assignation <- (inférieur à, suivi d’un tiret sans espace entre les deux).
Il s’emploie ainsi : nom_objet <- valeur ou opération. Si aucun objet dont le nom est nom_objet n’existe dans votre environnement de travail, l’objet nom_objet est créé et comprend la valeur ou l’opération affectée ; si un objet de ce nom existe déjà, il disparaît et est remplacé par la nouvelle valeur ou opération affectée.

📝 Si vous modifiez un objet contenant vos données d’origine en créant un nouvel objet du même nom, vous écrasez les données d’origine mais cela ne signifie pas pour autant que vos données initiales sont perdues. Il est toujours possible de revenir en arrière en réimportant les données d’origine dans l’environnement R ou en relancant les lignes précédentes de votre script.

Les noms des objets
Vous pouvez choisir librement le nom des objets mais privilégiez des noms courts et explicites (afin de comprendre ce que votre objet contient). Par ailleurs, il existe 4 régles importantes pour le nom des objets dans R:

  • Ils ne peuvent pas commencer par un chiffre
  • Pas d’accent, pas d’espace, pas de caractères spéciaux : utiliser des underscores (donnees_menages) ou CamelCase (DonneesMenages)
  • R est sensible à la casse (différencie les majuscules des minuscules : A et a sont des objets différents)
  • Ne pas utiliser des abréviations de fonction R (mean, …)


La plupart du temps, les objets sont créés à partir d’un autre objet, de valeurs numériques ou caractères ou encore d’une sortie d’une opération (fonction)

Exemple

# Une simple opération sans création d'objet
2*4

# Création de deux objets (a et b) à partir d'opérations arithmétiques
a <- 2*4
b <- 2*6

# Création de l'objet c à partir des objets a et b
c <- a*b

# Création d'un objet A de mode caractère
A <- "Patate"

# Création d'un objet plus complexe (vecteur) qui contient plusieurs valeurs en utilisant la fonction "c(.,.,.)" qui signifie "combiner" et qui va combiner plusieurs valeurs dans un même vecteur: 

E <- c(1, 2, 4, 5, 6)

Lorsqu’on exécute ces commandes (bouton ou touches clavier Ctrl + Enter pour Windows / Cmd + Enter pour Mac), les objets ne s’affichent pas directement dans la console mais 5 objets (a, b, c, A, E) font désormais partie de notre environnement de travail (onglet Environment du quadrant supérieur droit de Rstudio). Nous pouvons désormais manipuler ces objets.



Affichage ou suppression des objets

Quelques commandes (ou fonctions) utiles à exécuter dans la console ou le script pour afficher ou supprimer un ou des objet(s).

Commande (fonction) Description
ls()
Afficher la liste de tous les objets dans l’environnement R
print (a)

#ou

a
Afficher le contenu de l’objet ‘a’
rm(a)
Supprimer l’objet ‘a’ de l’environnement
rm(a, b)
Supprimer l’objet ‘a’ et ‘b’ de l’environnement
rm(list=ls())
Supprimer tous les objets de l’environnement


Dans R, les objets se différencient par leur mode (c’est à dire par leur contenu) et par leur classe (c’est à dire par la structure des informations qu’ils comportent/la manière dont les informations sont stockées et organisées par R). Cette distinction est importante car la plupart des opérations (fonctions) s’appliquent à une classe d’objet spécifique.

Il existe 3 principaux modes pour les objets R :

  • numeric : des nombres entiers (en anglais integer comme 3, 4, 12, …) ou réels (en anglais double qui correspondent à des nombres décimaux tels que 1.4, 1.0, 12.5, …),
  • character : des chaînes de caractère c’est à dire du texte (que l’on créé à l’aide de guillemets comme “nom”, “ouvrier”, …),
  • logical : des valeurs logiques de type “vrai” ou “faux” (TRUE, FALSE)

Quel que soit le mode d’un objet, les valeurs manquantes sont toujours représentées par NA (qui signifie Not Available).

Le vecteur est la structure de base des objets dans R: tous les objets R sont formés d’un ou plusieurs vecteurs. On distingue les vecteurs simples (1) des vecteurs composites (2)

  1. Les vecteurs simples représentent une liste de données de même type/mode. Ils sont très fréquents : on les utilise pour représenter les données d’une variable statistique comme par exemple la liste des revenus ou encore la liste des noms. Les objets de type “vecteur simple” peuvent être vus comme une colonne ou une ligne de valeurs toutes du même mode dont la structure est la suivante:

Pour connaître la nature d’un objet, on utilise la commande (fonction) class. Par exemple :

# Création du vecteur simple "a" 
a <- c(1,2,5)
# Interroger la classe du vecteur "a"
class(a)
## [1] "numeric"
# Supprimer l'objet "a" de l'environnement
rm(a)
  1. Les vecteurs composites qui sont des assemblages de vecteurs simples et qui ont donc plusieurs dimensions (plusieurs colonnes et plusieurs lignes).
    Il y a plusieurs classes de vecteurs composites mais ici nous allons uniquement nous intéresser à la classe data.frame car la majeure partie des données d’enquête se présente sous la forme de data frame.

La plupart des jeux de données d’enquête (dataset en anglais) se présente sous la forme d’un tableau où chaque ligne correspond à une observation (individu) et chaque colonne à une caractéristique (variable). Dans R, les data frame sont des classes d’objet qui permettent de stocker de tels jeux de données. Les colonnes d’un data frame (variables d’un jeu de données) sont toujours nommées (noms des variables d’un jeu de données). Dans la plupart des cas, chacune de ces colonnes (variables) peut être vue comme un vecteur colonne simple de même longueur (même nombre de lignes). Les lignes d’un data frame sont quant à elles automatiquement numérotées par ordre (1 = première ligne, 2 = deuxième ligne,…).

Organisation des données dans un data frame


Les informations (valeurs) des différentes colonnes d’un data frame peuvent être de différents modes (entier, réel, logique, caractère, …) ce qui correspond dans les faits à la nature des différentes variables d’un jeu de données (quantitatives: classes numeric, integer,… ou qualitatives: classes character, logical, factor,..).


📝 Les variables d’un jeu de données peuvent être classées en deux catégories:

1. Les variables quantitatives qui permettent de mesurer une grandeur (quantité). On distingue les variables quantitatives continues (pour lesquelles il y a un nombre infini de valeurs possibles comme par exemple la taille, le revenu, la surface, etc.) et les variables quantitatives discrètes (pour lesquelles il y a un nombre fini de valeurs comme par exemple le nombre de pièces du logement, le nombre d’enfants, etc.)

2. Les variables qualitatives qui indiquent des caractéristiques qui ne sont pas des quantités. Les différentes valeurs d’une variable qualitative sont appelées des modalités. On distingue les variables qualitatives ordonnées (pour lesquelles il existe un ordre des modalités comme par exemple la satisfaction sur une échelle, etc.) des variables qualitative non ordonnées/nominales (pour lesquelles il n’y pas d’ordre dans les modalités comme par exemple le sexe, la couleur des yeux, etc.). On parle aussi parfois de variable qualitative binaire ou dichotomique (de type oui/non ou vrai/faux).


Exemple de data frame dans R
Utilisation de la commande/fonction head(nom_dataframe) qui permet d’afficher les 10 premières lignes d’un dataframe (ici du data frame nommé df1)

#Utilisation de la fonction head() pour afficher les 6 premières lignes du data frame df1
head(df1)
##   var1 var2  var3
## 1    1    a  TRUE
## 2    2    b FALSE
## 3    3    c  TRUE
## 4    4    d FALSE
## 5    5    e  TRUE
## 6    6    f FALSE
#Interroger la classe de "df1"
class(df1)
## [1] "data.frame"
#Interroger la classe de "var1" du data.frame "df1"
class(df1$var1)
## [1] "integer"

📝 Dans R, on accéde aux variables d’un data frame avec l’opérateur $.
df1$var1 signifie donc la variable var1 du data frame df1.
Par ailleurs, R est sensible à la casse ce qui signifie que si vous tapez df1$Var1 au lieu de df1$var1 alors R enverra un message d’erreur dans la console de type Unknown or uninitialised column: df1$Var1 car il ne connaît pas la variable df1$Var1 .

Exemple
Utilisation de la fonction str(nom_data_frame) qui permet de visualiser la classe de chacune des variables (ou vecteurs) de l’objet data frame nommé nom_data_frame.

str(df1) 
## 'data.frame':    10 obs. of  3 variables:
##  $ var1: int  1 2 3 4 5 6 7 8 9 10
##  $ var2: chr  "a" "b" "c" "d" ...
##  $ var3: logi  TRUE FALSE TRUE FALSE TRUE FALSE ...


Les fonctions


Une autre façon usuelle d’interagir avec R est d’utiliser des fonctions qui permettent d’effectuer des tâches et des opérations. Les fonctions disponibles au sein des bibliothèques (packages) sont des outils qui permettent d’exécuter rapidement des opérations sur des objets sans avoir à écrire toutes les étapes mathématiques ou logiques. On en a déjà utilisé plusieurs dans la partie précédente telles que class(nom_objet) ou encore head(nom_data_frame). Un certain nombre de fonctions de base sont installées avec R (appelées les fonctions base-R), beaucoup d’autres sont disponibles dans des packages à télécharger.

Une fonction R s’écrit avec des parenthèses, entre lesquelles l’utilisateur précise la valeur des argument(s)/paramètre(s), sous cette forme : fonction(argument1, argument2, …). Ces arguments peuvent être obligatoires (la fonction ne peut pas fonctionner si ces arguments ne sont pas fournis par l’utilisateur) ou au contraire optionnels.

Il est très fréquent de ne plus se souvenir quels sont les arguments d’une fonction ou le type de résultat qu’elle produit. Dans ce cas, on peut très facilement accéder à l’aide R décrivant une fonction particulière en tapant help dans la console (quadrant inférieur gauche) ou dans un script (quadrant supérieur gauche):

help(nom_fonction)

#ou

?nom_fonction

Exemple : avec la fonction mean (du package R base)

help(mean)

Une fois la commande exécutée, le fichier d’aide associé à la fonction mean apparait dans le quadrant inférieur droit sous l’onglet Help et fournit ces informations:

Grâce à ce fichier d’aide en anglais, on peut obtenir une description de la fonction et voir qu’il y a trois arguments/paramètres pour la fonction mean:

  • x (argument obligatoire) qui précise la série de valeurs (généralement numériques) sur laquelle est calculée la moyenne
  • trim (argument optionnel avec comme valeur par défaut trim=0) est une fraction entre 0 et 0.5 d’observations à supprimer au début et à la fin de la série de valeurs x pour le calcul de la moyenne
  • na.rm (argument optionnel de type logique TRUE/FALSE avec comme valeur par défaut na.rm=TRUE) qui précise si les valeurs manquantes (notées NA dans R) de la série x doivent être supprimées (na.rm=TRUE) ou conservées (na.rm=FALSE) pour le calcul de la moyenne.

Exemple : calcul de la moyenne de la variable “var1” du data frame “df1” 

mean(x=df1$var1, trim=0, na.rm=TRUE)
## [1] 5.5
# ou avec les arguments par défaut

mean(df1$var1)
## [1] 5.5

On pourra aussi utiliser la fonction apropos("mot clé")qui peut être utile quand on ne connaît pas la fonction nécessaire pour réaliser une opération.

Pour rechercher de l’aide, il est également possible de le faire directement de façon interactive via l’interface RStudio à travers l’onglet Help du quadrant Visualisation, Aide (quadrant inférieur droit).



Les opérateurs

A côté des fonctions, une autre façon d’interagir avec des objets R est d’utiliser des opérateurs. Il y a plusieurs type d’opérateurs dans R : les opérateurs arithmétiques de base (+, -, *, /, ^, …), les opérateurs logiques/relationnels et les opérateurs de comparaison. Ils peuvent par exemple permettre de tester si une déclaration est vraie ou fausse (en comparant deux éléments entre eux), ou encore de définir des conditions multiples sur des opérations/fonctions (par exemple lorsqu’on veut calculer une moyenne sur une variable uniquement si les valeurs d’une autre variable sont inférieures à 30).

Les principaux opérateurs logiques et de comparaison dans R sont les suivants :

Opérateur Rôle Exemple d’utilisation
> Strictement supérieur à
A > 5
>= Supérieur ou égal à
A >= 5
< Strictement inférieur à
A <  5
<= Inférieur ou égal à
A <=  5
== Egal à
A == 5
!= Différent de
A != 5
& ET (l’un et l’autre)
(A < 5) & (B == 5)
| OU (l’un ou l’autre)
(A < 5) | (B == 5)

Exemple d’utilisation des opérateurs

#Utilisation de la fonction head() pour afficher les 6 premières valeurs de la variable var1 du data frame df1
x <- head(df1$var1)
print (x)
## [1] 1 2 3 4 5 6
# Tester la condition selon laquelle les premières valeurs de var1 du data frame df1 sont inférieures ou égales à 4 (renvoie "TRUE" si oui, "FALSE" si non)
y <- head(df1$var1 <= 4)
print (y)
## [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE
# Les opérateurs logiques et de comparaison fonctionnent aussi pour formuler des expressions (conditions) sur les fonctions
z <- mean(df1$var1) 
print (z)
## [1] 5.5
za <- mean((df1$var1 <= 4) & (df1$var3 == "TRUE"))
print (za)
## [1] 0.2

Les packages

Un package est un ensemble de fonctions partageant un objectif similaire (par exemple le calcul de statistiques, la réalisation de graphiques, etc.) développées par des utilisateurs de R, qui améliorent ou étendent les fonctionnalités de base de R (exemple de packages: ggplot2, tidyverse,etc.). Certains packages ont des dépendances (dependencies) c’est à dire qu’il est nécessaire de télécharger d’autres packages pour les faire fonctionner (le téléchargement des dépendances lors de l’installation d’un package dans R est par défaut réalisé automatiquement)

Les packages sont disponibles sur des sites «dépôts» (repositories), le dépôt officiel est le CRAN. Actuellement, il existe à peu près 20 000 packages disponibles sur le CRAN.

Pour utiliser un package R, il est nécessaire de réaliser 2 actions :

  1. Le téléchargement : télécharger le package sur internet, puis l’installer sur l’ordinateur, dans un dossier de R. Il y a 2 solutions pour installer un package:
    • Utiliser l’outil R d’installation des packages (quadrant inférieur droit: “Visualisation, aide”):

      Une fois les packages à installer selectionnés, cliquer sur installer. Les packages seront alors téléchargés dans le repertoire indiqué.

    • Ecrire une ligne de commande (fonction) :

install.packages("nom_du_package", dependencies = TRUE)
 
# Lorsque plusieurs packages doivent être installées, on pourra utiliser l'opérateur c(" ", " ", "...") de cette manière:

install.packages(c("nom_du_package1", "nom_du_package2", "nom_du_package3"))
  1. le chargement du package : indiquer à R que l’on souhaite utiliser le package pour la session en cours. Pour cela, il suffit d’écrire library(nom_du_package) dans votre script :
library(nom_du_package)

Le téléchargement et le chargement du package sont deux actions différentes. Le téléchargement est une opération à réaliser une seule fois : une fois qu’un package a été téléchargé et installé, il est présent sur son ordinateur de façon permanente. En revanche, le chargement ou l’installation d’un package doit être réalisé à chaque fois que vous avez besoin du package dans une session R.

📝 Les packages sont spécifiques à une version minimale de R (s’il y a une mise à jour de R, il pourra aussi être nécessaire de mettre à jour les packages) Pour mettre à jour un package, il suffit de le réinstaller avec la fonction install.packages.

Bonnes pratiques de programmation

Pour faciliter la lecture d’un code R et sa compréhension (afin qu’il puisse être réutilisé ou corrigé par vous-même mais aussi par d’autres personnes), il est important d’adopter de bonnes pratiques de programmation (respecter certaines normes pour créer du “bon code”). Il existe de nombreuses ressources en ligne qui renseignent les bonnes pratiques de programmation dans R comme par exemple en français le “Guide des bonnes pratiques en R” (INSEE, DREES).

Parmi les pratiques recommandées, on trouve notamment les régles suivantes :

  • Travailler en mode “Projet” dans Rstudio (créer un environnement dans lequel on a les données, les scripts, l’historique) ;
  • Écrire dans un script et non dans la console (pour ne pas perdre l’historique de ses actions) ;
  • Aller à la ligne pour chaque nouvelle instruction R et utiliser des espaces avant et après les opérateurs ;
  • Commenter, expliquer son code et documenter les fonctions écrites par l’utilisateur (ce que fait la fonction, les arguments acceptés en entrée, les résultats produits) en utilisant l’opérateur # ;
  • Tester son code régulièrement ;
  • Utiliser des outils de contrôle de version tel que git (permet un suivi des évolutions d’un fichier bloc par bloc et contributeur par contributeur) ;
  • Utiliser l’opérateur « pipe » du package magrittr (noté %>%) pour enchainer les fonctions. Il peut se traduire par “et puis”.

L’opérateur “pipe” du package magrittr (noté %>%)

Quand on manipule des données, il est très fréquent d’enchaîner plusieurs opérations (par exemple calculer la moyenne puis l’arrondir et afficher le résultat ou encore extraire une sous-population, sélectionner des colonnes puis trier selon une variable). Dans ce cas, plusieurs méthodes peuvent être employées.

Prenons un exemple, on souhaite:

  1. Créer un vecteur numérique (en utilisant la fonction c())
  2. Calculer la moyenne de ce vecteur (en utilisant la fonction mean())
  3. Ajouter +1.96 à la valeur de la moyenne calculée
  4. Arrondir la valeur du résultat à un chiffre après la virgule (en utilisant la fonction round(nom_objet, digits=1) où l’argument digits indique le nombre de décimales/le nombre de chiffres après la virgule)
  5. Changer l’opérateur décimal «.» par le format français «,».

Pour réaliser ces différentes opérations, il y a plusieurs méthodes:

  • Effectuer les opérations les unes après les autres, en stockant les résultats intermédiaires dans un objet temporaire.
    Pour notre exemple, le code est le suivant:
#1. Création du vecteur numérique "a"
a <- c(5, 6, 8, 10, 15, 20)

#2. Calculer la moyenne du vecteur en créant l'objet "b"
b <- mean(a, na.rm=FALSE)

#3. Ajouter 1.96 au résultat en créant l'objet "c"
c <- b + 1.96

#4. Arrondir le résultat dans l'objet "d"
d <- round(c, digits=1)

#5. Changer le format de l'opérateur décimal "." en ","
e <- format(d, decimal.mark = ",")
print(e)
## [1] "12,6"

Cette écriture n’est pas du tout optimale, car elle entraîne la création d’un grand nombre de variables intermédiaires (b, c, d) totalement inutiles.

  • Effectuer toutes les opérations en une fois en les “emboîtant”. Pour notre exemple, le code est le suivant:
a <- c(5, 6, 8, 10, 15, 20)
format(round((mean(a) + 1.96), digits = 1), decimal.mark = ",")
## [1] "12,6"

Le résultat est identique mais cette ligne de code qui imbrique plusieurs fonctions les unes dans les autres est peu lisible. Il n’est pas facile de savoir à quelle fonction est rattaché chaque argument.

  • Utiliser le “pipe” (%>%) qui permet de combiner une suite d’instructions R à travers une lecture facile sans avoir à créer des objets intermédiaires inutiles. Pour notre exemple, le code est le suivant :
# Charger le package tidyverse qui inclut dans ses dépendances le package magrittr qui fournit l'opérateur pipe noté %>%
library(tidyverse)


a <- c(5, 6, 8, 10, 15, 20) %>%
mean() %>%
 + 1.96 %>%
round(digits=1) %>%
format(decimal.mark = ",") %>%
print(a)
## [1] "12,6"

Le principe du chaînage (ou pipe en anglais) noté %>% est de passer l’élément situé à sa gauche comme premier argument de la fonction située à sa droite. Il permet ainsi de combiner une suite d’instructions R en évitant d’avoir à répéter le nom des objets (ou de créer des objets intermédiaires) ou encore d’imbriquer des fonctions. Il rend donc le code plus lisible et doit être privilégié pour les manipulations complexes de données.

📝 À partir de la version 4.1 de R, l’opérateur pipe est directement disponible dans les paquets de base de R. Il est noté |>. Les deux opérateurs %>% et |> peuvent être utilisés dans la plupart des cas de manière interchangeable.

Premier travail sur les données

Installer et charger les packages nécessaires à l’analyse

Afin de réaliser l’exercice proposé ici, nous allons utiliser 4 packages:

  • readr : plusieurs fonctions pour importer des fichiers plats (formats .txt, .csv, .tsv) ;
  • tidyverse : ensemble de packages R proposant une syntaxe cohérente qui facilitent l’utilisation de R pour la lecture, la gestion, la manipulation et la visualisation des données ;
  • questionr : fonctions utiles pour le traitement et l’analyse des données d’enquête. Le package propose notamment une interface graphique facilitant le recodage des variables ;
  • esquisse : addin-R qui permet de créer des graphiques ggplot2 de façon interactive, en “cliquer-glisser”.

Addin-R
Un addin-R est une extension de R Studio, qui s’installe comme un package, et qui permet de simplifier certaines manipulations.

Chacun de ces packages doit être téléchargés une seule fois (1), puis chargés à chaque démarrage de R (2).

  1. Pour télécharger ces packages, vous pouvez soit utiliser l’assistant d’installation de package Rstudio déjà présenté auparavant, soit écrire une ligne de commande. C’est cette dernière option que nous employons ici :
install.packages(c("readr", "tidyverse", "questionr", "esquisse"), dependencies = TRUE, repo="http://cran.rstudio.com/")
  1. Le code suivant permet ensuite de charger ces packages dans notre session :
library(readr) ; library(tidyverse) ; library(questionr) ; library(esquisse) 

Importer les données

R offre un grand nombre de fonctions et de packages pour importer des données depuis plusieurs formats qu’ils soient ouverts (.csv, .txt) ou propriétaires (.xlsx, .sasb7dat, .dta, etc). Après avoir réalisé quelques vérifications et modifications sur le fichier de données d’origine, la première étape avant l’importation est de repérer le format des données : données en texte brut (généralement .txt, .csv) ou données dans un format binaire, généralement propres à un logiciel spécifique (R: .RData, SAS : .sasb7dat, STATA : .dta, etc).

⚠️ Vérifications à réaliser sur le fichier de données avant l’importation dans l’environnement R

Il est préférable de réaliser un certain nombre de vérifications, et le cas échéant de modifications, sur le fichier de données d’origine avant de l’importer dans l’environnement R:
- chaque ligne devrait correspondre à une observation et chaque colonne à une variable (“tidy” data) ;
- chaque cellule (croisement entre les colonnes et les lignes) devrait représenter une et une seule valeur (“tidy” data) ;
- le libellé (nom) des variables ne doit pas comporter d’espace, d’accent, ou de caractères spéciaux et il ne doit pas commencer par un chiffre ;
- le libellé de chacune des variables apparaît uniquement sur la première ligne ;
- les données manquantes devraient être notées NA ou vide ;
- pour les dates: dans les fichiers .xlsx, elles devraient suivre le format YYYY-MM-DD et être correctement typée au format “Date”. Pour les fichiers .csv, elles devraient suivre le format YYYY-MM-DD et être de type “Texte”.

Ici notre fichier de données nommé “ERFI1_FPA.csv” présent dans le sous-dossier data de notre projet ERFI1 est au format .csv.

Pour l’importation, nous allons utiliser l’interface RStudio permettant d’importer un fichier de données de manière interactive. Pour y accéder, allez dans l’onglet Environment, cliquez sur le bouton Import Dataset et sélectionnez "From Text (readr)"….



Une nouvelle fenêtre s’affiche. Dans le champ File/URL tout en haut de cette fenêtre, vous devez renseigner l’emplacement du fichier à importer.


Un aperçu s’ouvre ensuite dans la partie Data Preview. Il vous permet de vérifier si l’import est correct (données correctement réparties dans les différentes colonnes, noms des variables sur une ligne, etc.) et de récupérer le code R permettant l’import de vos données. Il vous suffit ensuite de copier ce code, de cliquer sur Cancel dans l’assistant d’importation puis de coller le code d’importation au début de votre script (vous pouvez supprimer la ligne commençant par View).



library(readr)
ERFI1_FPA <- read_csv("data/ERFI1_FPA.csv")


Il est ensuite important de vérifier que l’importation a correctement été réalisée. L’objet dans lequel vous avez stocké les données (ici ERFI1_FPA) doit apparaître dans l’onglet Environment (quadrant supérieur droit). En double cliquant sur le nom de l’objet “ERFI1_FPA” un tableur s’ouvre dans la partie édition (quadrant supérieur gauche), avec des fonctions de filtre et de tri. Vous pouvez aussi taper dans la console la fonction View(ERFI1_FPA)qui permet de visualiser le contenu de votre tableau de données.



📝 Quelle fonction d’importation utiliser en fonction du format du fichier de données?

- Pour les fichiers .RData (format R), on utilise la fonction load()
- Pour les fichiers au format «texte brut» (.csv, .txt), on utilise la famille de fonctions read.. L’utilisation d’une fonction en particulier dépend du format exact des données.
- Pour les autres formats, consulter les packages foreign (fichier dBase), haven (fichier SAS, STATA, SPSS) et readxl (fichier Excel).

Description sommaire des données

Une fois l’importation correctement réalisée, plusieurs fonctions peuvent être utilisées pour inspecter notre jeu de données de classe data frame. Les plus connues sont :

  • dim(): renvoie le nombre de lignes (individus) et de colonnes (variables) d’un data frame ;
  • head(): affiche les 6 premières lignes d’un data frame ;
  • str(): fournit la classe de chacune des variables (numérique, catégorielle/facteur) ;
  • levels(): renseigne sur les modalités des différentes variables qualitatives ;
  • summary(): fournit quelques statistiques descriptives. Pour les variables de type numérique: minimum, premier quartile, médiane, moyenne, troisième quartile, maximum et nombre de valeurs manquante (NA pour Not Available). Pour les variables catégorielles, la fonction renvoie le nombre de données pour chaque modalité et le nombre données manquantes.

Les fonctions str, levels et summary peuvent être appliquées sur un jeu de données entier ou seulement sur une variable spécifique d’un jeu de données.

dim(ERFI1_FPA)
## [1] 10079    86

Notre jeu de données comprend 10 079 lignes et 86 colonnes.


head(ERFI1_FPA)
## # A tibble: 6 × 86
##      id EA_HAB EA_LIT EA_MAL EA_JOUE EA_AID EA_EMM EA_SATTACHE OA_VAISS OA_REPAS
##   <dbl>  <dbl>  <dbl>  <dbl>   <dbl>  <dbl>  <dbl>       <dbl>    <dbl>    <dbl>
## 1     1     NA     NA     NA      NA     NA     NA          NA       NA       NA
## 2     2     NA     NA     NA      NA     NA     NA          NA       NA       NA
## 3     3     NA     NA     NA      NA     NA     NA          NA       NA       NA
## 4     4      8      8      4       3      2      7           8        5        5
## 5     5     NA     NA     NA      NA     NA     NA          NA       NA       NA
## 6     6     NA     NA     NA      NA     NA     NA          NA        3        4
## # ℹ 76 more variables: OA_ALIME <dbl>, OA_LINGE <dbl>, OA_ASPIR <dbl>,
## #   OA_BRICO <dbl>, OA_COMPT <dbl>, OA_INVIT <dbl>, OA_SATREP <dbl>,
## #   OB_DACHQUO <dbl>, OB_DACHEX <dbl>, OB_DEDUC <dbl>, OB_DLOISIR <dbl>,
## #   OB_GESTION <dbl>, OC_SATREL <dbl>, OC_DESTAC <dbl>, VA_MARIDEP <dbl>,
## #   VA_COHAB <dbl>, VA_MARITJS <dbl>, VA_DIVORC <dbl>, VA_FEMENF <dbl>,
## #   VA_HOMENF <dbl>, VA_DEUXPAR <dbl>, VA_MERSEUL <dbl>, VA_EFTAUTO <dbl>,
## #   VA_DROITHOMO <dbl>, VA_GPOCCPE <dbl>, VA_PARAIDENF <dbl>, …


str(ERFI1_FPA)
## spc_tbl_ [10,079 × 86] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id              : num [1:10079] 1 2 3 4 5 6 7 8 9 10 ...
##  $ EA_HAB          : num [1:10079] NA NA NA 8 NA NA NA NA 4 NA ...
##  $ EA_LIT          : num [1:10079] NA NA NA 8 NA NA NA NA 3 NA ...
##  $ EA_MAL          : num [1:10079] NA NA NA 4 NA NA NA NA 5 NA ...
##  $ EA_JOUE         : num [1:10079] NA NA NA 3 NA NA NA NA 4 NA ...
##  $ EA_AID          : num [1:10079] NA NA NA 2 NA NA NA NA 97 NA ...
##  $ EA_EMM          : num [1:10079] NA NA NA 7 NA NA NA NA 5 NA ...
##  $ EA_SATTACHE     : num [1:10079] NA NA NA 8 NA NA NA NA 8 NA ...
##  $ OA_VAISS        : num [1:10079] NA NA NA 5 NA 3 NA 1 3 2 ...
##  $ OA_REPAS        : num [1:10079] NA NA NA 5 NA 4 NA 1 3 2 ...
##  $ OA_ALIME        : num [1:10079] NA NA NA 3 NA 3 NA 1 4 2 ...
##  $ OA_LINGE        : num [1:10079] NA NA NA 5 NA 3 NA 1 2 1 ...
##  $ OA_ASPIR        : num [1:10079] NA NA NA 5 NA 3 NA 1 3 2 ...
##  $ OA_BRICO        : num [1:10079] NA NA NA 1 NA 2 NA 3 1 5 ...
##  $ OA_COMPT        : num [1:10079] NA NA NA 3 NA 1 NA 1 4 3 ...
##  $ OA_INVIT        : num [1:10079] NA NA NA 3 NA 3 NA 1 3 3 ...
##  $ OA_SATREP       : num [1:10079] NA NA NA 8 NA 10 NA 6 7 5 ...
##  $ OB_DACHQUO      : num [1:10079] NA NA NA 5 NA 3 NA 1 3 3 ...
##  $ OB_DACHEX       : num [1:10079] NA NA NA 3 NA 3 NA 3 4 4 ...
##  $ OB_DEDUC        : num [1:10079] NA NA NA 3 NA NA NA NA 4 NA ...
##  $ OB_DLOISIR      : num [1:10079] NA NA NA 3 NA 3 NA 3 3 3 ...
##  $ OB_GESTION      : num [1:10079] NA NA NA 3 NA 6 NA 1 3 4 ...
##  $ OC_SATREL       : num [1:10079] NA NA 10 NA NA NA NA 8 9 8 ...
##  $ OC_DESTAC       : num [1:10079] NA NA 1 1 NA 1 NA 2 2 3 ...
##  $ VA_MARIDEP      : num [1:10079] 3 3 1 1 5 1 2 5 5 2 ...
##  $ VA_COHAB        : num [1:10079] 3 3 1 1 3 1 2 2 1 2 ...
##  $ VA_MARITJS      : num [1:10079] 3 2 5 1 3 5 4 1 2 2 ...
##  $ VA_DIVORC       : num [1:10079] 2 2 1 1 1 1 2 1 2 1 ...
##  $ VA_FEMENF       : num [1:10079] 3 3 5 3 3 5 4 1 1 2 ...
##  $ VA_HOMENF       : num [1:10079] 3 3 2 3 3 5 4 2 1 2 ...
##  $ VA_DEUXPAR      : num [1:10079] 2 2 2 1 3 2 2 2 1 2 ...
##  $ VA_MERSEUL      : num [1:10079] 3 2 2 1 5 1 2 4 3 4 ...
##  $ VA_EFTAUTO      : num [1:10079] 2 2 3 1 1 3 1 4 2 2 ...
##  $ VA_DROITHOMO    : num [1:10079] 3 2 1 1 2 2 1 3 2 4 ...
##  $ VA_GPOCCPE      : num [1:10079] 2 2 4 1 1 5 1 4 2 1 ...
##  $ VA_PARAIDENF    : num [1:10079] 2 2 2 1 1 2 1 2 2 2 ...
##  $ VA_PARENCH      : num [1:10079] 3 2 2 1 1 5 1 4 4 4 ...
##  $ VA_ENRESPAR     : num [1:10079] 2 2 3 1 1 5 2 3 2 2 ...
##  $ VA_ENFCH        : num [1:10079] 3 2 4 5 5 5 2 5 4 4 ...
##  $ VA_FILLEFILS    : num [1:10079] 4 4 5 5 5 5 2 5 4 5 ...
##  $ VA_ENFAIDPAR    : num [1:10079] 2 2 2 1 1 3 2 2 2 3 ...
##  $ VA_ACCPAR       : num [1:10079] 2 2 5 1 1 5 2 2 2 2 ...
##  $ VA_DIFFAGE      : num [1:10079] 3 3 3 5 5 5 3 4 3 5 ...
##  $ VA_REVFE        : num [1:10079] 4 3 5 5 4 5 5 5 5 4 ...
##  $ VA_DEPFE        : num [1:10079] 2 4 1 3 1 1 1 1 3 2 ...
##  $ VA_FOYEPAN      : num [1:10079] 3 2 4 1 1 2 1 2 3 1 ...
##  $ VA_HOMPOL       : num [1:10079] 3 3 5 5 5 5 4 4 3 4 ...
##  $ VA_ENFMERAC     : num [1:10079] 2 3 4 4 1 1 1 1 3 1 ...
##  $ VA_ENFPERAC     : num [1:10079] 2 3 4 5 1 2 3 1 4 2 ...
##  $ VA_DIVGARD      : num [1:10079] 3 2 2 2 5 5 3 1 4 1 ...
##  $ VA_HOMPRIO      : num [1:10079] 5 4 5 5 9 5 4 1 5 5 ...
##  $ VA_PARPRIO      : num [1:10079] 2 4 3 5 2 2 4 1 3 1 ...
##  $ VA_JEUPRIO      : num [1:10079] 3 4 3 1 5 5 3 3 4 2 ...
##  $ VA_QPERSAGE     : num [1:10079] 3 3 2 5 3 4 2 5 3 3 ...
##  $ VA_QENFPS       : num [1:10079] 4 4 4 5 5 5 4 4 4 2 ...
##  $ VA_QENFSCO      : num [1:10079] 3 5 3 5 5 5 5 5 3 3 ...
##  $ VA_QFINPERSA    : num [1:10079] 2 1 2 5 3 3 4 3 1 1 ...
##  $ VA_QFINPAREN    : num [1:10079] 2 2 4 2 3 3 4 3 2 1 ...
##  $ MA_AGEMQ        : num [1:10079] 10 7 4 8 7 10 14 11 8 6 ...
##  $ MC_DIPLOME      : num [1:10079] 8 6 6 4 8 4 8 4 4 5 ...
##  $ PF_PCSM8        : num [1:10079] NA 4 NA NA NA 5 2 NA NA NA ...
##  $ PF_PCSP8        : num [1:10079] 3 1 6 NA NA 2 2 4 6 4 ...
##  $ CA_DIPLOME      : num [1:10079] NA NA NA 1 NA 4 NA 3 5 5 ...
##  $ EA_VERIFC       : num [1:10079] 2 2 2 1 2 1 2 1 1 1 ...
##  $ poids12         : num [1:10079] 3038 2396 3064 3869 3489 ...
##  $ PA_DURMTRA      : num [1:10079] 300 2 135 10 NA 15 NA 450 30 45 ...
##  $ PB_DURMTRA      : num [1:10079] 300 2 135 NA 720 15 NA NA 30 10 ...
##  $ MA_SEXE         : num [1:10079] 1 2 2 1 1 1 1 2 1 2 ...
##  $ AH_CS8          : num [1:10079] 3 5 8 6 4 5 7 8 5 5 ...
##  $ PF_AGEDEPFOY_rec: num [1:10079] 23 30 18 24 8 22 20 20 30 21 ...
##  $ PF_AVECQUI_rec  : num [1:10079] 1 1 1 2 6 1 1 1 1 3 ...
##  $ PE_NBFSV_rec    : num [1:10079] 2 1 1 5 5 NA 1 5 3 3 ...
##  $ PA_VERIFCOH_rec : num [1:10079] 4 4 4 4 4 4 4 4 4 4 ...
##  $ PA_FQAVM_rec    : num [1:10079] 1 2 1 2 NA 1 NA 1 2 1 ...
##  $ PB_FQAVP_rec    : num [1:10079] 1 2 1 NA 1 1 NA NA 2 2 ...
##  $ PA_MEREBV_rec   : num [1:10079] 1 1 1 1 2 1 2 1 1 1 ...
##  $ PB_PEREBV_rec   : num [1:10079] 1 1 1 2 1 1 2 2 1 1 ...
##  $ TYPFAM3_rec     : num [1:10079] 1 1 1 4 1 3 1 3 4 3 ...
##  $ EA_ADULT16_rec  : num [1:10079] 2 2 2 2 2 2 2 2 2 2 ...
##  $ NBENF14_rec     : num [1:10079] 2 2 2 1 2 2 2 2 1 2 ...
##  $ NBENF3_rec      : num [1:10079] 2 2 2 2 2 2 2 2 1 2 ...
##  $ MA_ACT_rec      : num [1:10079] 2 2 2 2 2 2 2 2 2 2 ...
##  $ NBENFTOTM_rec   : num [1:10079] 0 0 0 2 0 0 0 0 2 0 ...
##  $ EA_AUTPERS_rec  : num [1:10079] NA NA NA 1 NA NA NA NA 3 NA ...
##  $ OA_AUTPERS_rec  : num [1:10079] NA NA NA 1 NA 3 NA 3 3 3 ...
##  $ MA_AGEM_rec     : num [1:10079] 48 34 19 36 31 48 66 50 37 28 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   EA_HAB = col_double(),
##   ..   EA_LIT = col_double(),
##   ..   EA_MAL = col_double(),
##   ..   EA_JOUE = col_double(),
##   ..   EA_AID = col_double(),
##   ..   EA_EMM = col_double(),
##   ..   EA_SATTACHE = col_double(),
##   ..   OA_VAISS = col_double(),
##   ..   OA_REPAS = col_double(),
##   ..   OA_ALIME = col_double(),
##   ..   OA_LINGE = col_double(),
##   ..   OA_ASPIR = col_double(),
##   ..   OA_BRICO = col_double(),
##   ..   OA_COMPT = col_double(),
##   ..   OA_INVIT = col_double(),
##   ..   OA_SATREP = col_double(),
##   ..   OB_DACHQUO = col_double(),
##   ..   OB_DACHEX = col_double(),
##   ..   OB_DEDUC = col_double(),
##   ..   OB_DLOISIR = col_double(),
##   ..   OB_GESTION = col_double(),
##   ..   OC_SATREL = col_double(),
##   ..   OC_DESTAC = col_double(),
##   ..   VA_MARIDEP = col_double(),
##   ..   VA_COHAB = col_double(),
##   ..   VA_MARITJS = col_double(),
##   ..   VA_DIVORC = col_double(),
##   ..   VA_FEMENF = col_double(),
##   ..   VA_HOMENF = col_double(),
##   ..   VA_DEUXPAR = col_double(),
##   ..   VA_MERSEUL = col_double(),
##   ..   VA_EFTAUTO = col_double(),
##   ..   VA_DROITHOMO = col_double(),
##   ..   VA_GPOCCPE = col_double(),
##   ..   VA_PARAIDENF = col_double(),
##   ..   VA_PARENCH = col_double(),
##   ..   VA_ENRESPAR = col_double(),
##   ..   VA_ENFCH = col_double(),
##   ..   VA_FILLEFILS = col_double(),
##   ..   VA_ENFAIDPAR = col_double(),
##   ..   VA_ACCPAR = col_double(),
##   ..   VA_DIFFAGE = col_double(),
##   ..   VA_REVFE = col_double(),
##   ..   VA_DEPFE = col_double(),
##   ..   VA_FOYEPAN = col_double(),
##   ..   VA_HOMPOL = col_double(),
##   ..   VA_ENFMERAC = col_double(),
##   ..   VA_ENFPERAC = col_double(),
##   ..   VA_DIVGARD = col_double(),
##   ..   VA_HOMPRIO = col_double(),
##   ..   VA_PARPRIO = col_double(),
##   ..   VA_JEUPRIO = col_double(),
##   ..   VA_QPERSAGE = col_double(),
##   ..   VA_QENFPS = col_double(),
##   ..   VA_QENFSCO = col_double(),
##   ..   VA_QFINPERSA = col_double(),
##   ..   VA_QFINPAREN = col_double(),
##   ..   MA_AGEMQ = col_double(),
##   ..   MC_DIPLOME = col_double(),
##   ..   PF_PCSM8 = col_double(),
##   ..   PF_PCSP8 = col_double(),
##   ..   CA_DIPLOME = col_double(),
##   ..   EA_VERIFC = col_double(),
##   ..   poids12 = col_double(),
##   ..   PA_DURMTRA = col_double(),
##   ..   PB_DURMTRA = col_double(),
##   ..   MA_SEXE = col_double(),
##   ..   AH_CS8 = col_double(),
##   ..   PF_AGEDEPFOY_rec = col_double(),
##   ..   PF_AVECQUI_rec = col_double(),
##   ..   PE_NBFSV_rec = col_double(),
##   ..   PA_VERIFCOH_rec = col_double(),
##   ..   PA_FQAVM_rec = col_double(),
##   ..   PB_FQAVP_rec = col_double(),
##   ..   PA_MEREBV_rec = col_double(),
##   ..   PB_PEREBV_rec = col_double(),
##   ..   TYPFAM3_rec = col_double(),
##   ..   EA_ADULT16_rec = col_double(),
##   ..   NBENF14_rec = col_double(),
##   ..   NBENF3_rec = col_double(),
##   ..   MA_ACT_rec = col_double(),
##   ..   NBENFTOTM_rec = col_double(),
##   ..   EA_AUTPERS_rec = col_double(),
##   ..   OA_AUTPERS_rec = col_double(),
##   ..   MA_AGEM_rec = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>


⚠️ Les variables catégorielles de notre jeu de données (par exemple MC_DIPLOME) qui sont codées avec des numéros pour chaque modalité sont identifiées par R en tant que variables numériques. Cela signifie que R appliquera par défaut sur ces variables, les fonctions et les opérations pour les variables de type numérique et non catégoriel.

Exemple avec la fonction summary qui calcule un certain nombre de statistiques descriptives en fonction du type des variables

summary(ERFI1_FPA$MC_DIPLOME)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   4.000   4.469   7.000   8.000


La famille de fonctions as.*(nom_variable)

On peut convertir un vecteur (colonne/variable) d’un type/mode à un autre grâce la famille de fonctions as.*(nom_variable). Il est par exemple possible d’utiliser la fonction as.character(nom_variable) pour changer un vecteur en mode character, la fonction as.numeric(nom_variable) pour changer un vecteur en mode numeric ou encore as.logical(nom_variable) pour changer un vecteur en mode logique/booléen. Les valeurs qui ne peuvent pas être converties sont automatiquement transformées en NA.

Quelques exemples

Conversion d’une variable numérique en caractère
On utilise la fonction as.character(nom_variable). Chaque valeur numérique de df1$var1 devient alors une chaîne de caractères (1 devient “1”)

class (df1$var1)
## [1] "integer"
print (df1$var1)
##  [1]  1  2  3  4  5  6  7  8  9 10
#Numeric en character
df1$var1 <- as.character(df1$var1)
class(df1$var1)
## [1] "character"

Conversion d’une variable logique en numérique
On utilise la fonction as.numeric(nom_variable). TRUE devient 1, FALSE devient 0.

class (df1$var3)
## [1] "logical"
print (df1$var3)
##  [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
#Logical en numeric
df1$var3 <- as.numeric(df1$var3)
print(df1$var3)
##  [1] 1 0 1 0 1 0 1 0 1 0


Répliquer les premiers résultats de l’article “À quelle fréquence voit-on ses parents?” (Arnaud Régnier-Loilier, 2006)

Objectif

L’objectif de cette partie de la formation est de reproduire le graphique suivant :


Il représente la proportion de personnes qui voient leur mère au moins une fois par semaine, selon l’âge au moment du départ du foyer parental. Il s’agit d’un extrait de la figure 1 de l’article de Population & Sociétés “A quelle fréquence voit-on ses parents ?”, présenté sous forme de diagramme en barre plutôt qu’une courbe afin de simplifier sa réalisation.
Outre la production du graphique, nous y associerons un tableau croisé, sans mise en forme, afin d’aider à l’interprétation, ou pour pouvoir citer certaines valeurs en appui d’un argumentaire.



Pour réaliser les traitements nécessaires à la reproduction du graphique, nous aurons besoin de consulter régulièrement le dictionnaire des codes du fichier de données anonymisées, disponible ici, ainsi que le questionnaire de l’enquête ERFI-1, disponible ici.

Il existe des packages R qui offrent des fonctions permettant de produire des tableaux mis en forme et prêts à être intégrés à des publications, rapports, ou supports de présentation. On peut citer par exemple gtsummary ou sjPlot. Leur usage nécessite d’être un minimum familier avec la programmation dans R, néanmoins de nombreuses ressources dédiées à ces packages sont disponibles sur Internet (en français ou en anglais).
Par exemple, voici le même tableau, produit avec la fonction tab_xtab du package sjPlot :


Ce tableau a été obtenu en exécutant ce code R :

library(sjPlot)
options(OutDec=",") #pour que le marqueur décimal soit une virgule
tab_xtab(var.row = erfi$AGE_DEP, #variable en ligne
         var.col = erfi$FREQ_MERE, #variable en colonne
         weight.by = erfi$poids12, #pondération
         show.summary = FALSE, #ne pas afficher de test statistique
         show.obs = FALSE, #ne pas afficher les effectifs
         show.row.prc = TRUE, #afficher les % en ligne (pour afficher les % en colonne, utiliser show.col.prc  = TRUE)
         title = "Proportion d'enfants voyant au moins une fois par semaine leur mère selon l'âge au départ du foyer parental", #titre du tableau
         var.labels = c("Age au départ du foyer parental", "Voit sa mère au moins une fois par semaine"), #labels pour les noms des variables
         value.labels = list(c("Moins de 20 ans", "20-21", "22-23", "24-25", "26-29", "30 ans ou plus"), #labels pour les modalités
                             c("Non", "Oui")),
         encoding = "UTF-8") #pour que les caractères accentués apparaissent correctement

On peut trouver une documentation relative au package sjPlot ici.


Sélection et exploration des variables

Le fichier de données contient 86 variables. Or, toutes ne sont pas nécessaires pour la réalisation de la figure souhaitée. De quelles variables avons-nous besoin ?

  • Celles représentées dans le graphique : âge au départ du foyer parental (PF_AGEDEPFOY_rec), et fréquence de visite à la mère (PA_FQAVM_rec)
  • Mais aussi, celles qui permettent de délimiter le champ, c’est-à-dire la population représentée dans le graphique : ici, il s’agit des personnes âgées de 30 à 79 ans dont la mère est encore en vie. Nous avons donc besoin de deux variables supplémentaire : l’âge des personnes pour exclure les moins de 30 ans (MA_AGEM_rec), ainsi que la variable indiquant si la mère est en vie ou non (PA_MEREBV_rec)
  • Enfin, bien que celle-ci ne soit pas directement visible sur le graphique, il ne faut pas oublier la variable de pondération : poids12

Le nom de chaque variable est indiqué dans le dictionnaire des codes du fichier pédagogique.

Sélectionner les variables nécessaires

Nous allons créer une nouvelle table, nommée erfi, qui contiendra uniquement ces variables. Pour cela, nous utilisons la fonction select, issue du package dplyr (inclus dans le tidyverse).

erfi <- select(ERFI1_FPA, PF_AGEDEPFOY_rec, PA_FQAVM_rec, MA_AGEM_rec, PA_MEREBV_rec, poids12)

Dans les arguments de la fonction select, on indique en premier lieu le nom de la table dans laquelle se trouvent les variables à sélectionner (ici ERFI1_FPA), puis le nom de chacune des variables à sélectionner, séparés par une virgule.
On assigne le résultat à un objet nommé erfi.

Exploration des variables d’intérêt

Commençons par observer la répartition des individus selon les différentes modalités des deux variables d’intérêt, l’âge au départ du foyer parental et la fréquence des visites à la mère. On va pour cela effectuer un tri à plat sur ces deux variables.

On utilise pour cela la fonction table. Son argument principal est la variable sur laquelle on souhaite réaliser le tri à plat. L’argument useNA = "always" sert à préciser que l’on souhaite que le résultat tienne compte des valeurs manquantes (par défaut, elles sont exclues).

Pour l’âge au départ du foyer parental :

table(erfi$PF_AGEDEPFOY_rec, useNA = "always")
## 
##    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
##   63   13   20   13   17   17   18   14   21   18   30   37   47   63  158  173 
##   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30 <NA> 
##  265  458 1228 1134 1312 1007  805  708  507  362  248  154  118   89  380  582
  • Il y a 582 valeurs manquantes. Comment expliquer que ce nombre soit aussi important ?
    • Regardons le questionnaire : avant la question sur l’âge au départ du foyer parental (p. 85), il est précisé que la question n’est posée que si le répondant ne vit avec aucun de ses deux parents. Autrement dit, tous les individus ne sont pas concernés par cette question, ce qui explique le grand nombre de valeurs manquantes.
  • Il n’y a pas d’âge supérieur à 30. Cela signifie-t-il que personne n’a quitté le foyer parental après 30 ans ?
    • Cette fois-ci, c’est vers le dictionnaire des codes qu’il faut se tourner. Celui-ci nous indique que la modalité “30” correspond en réalité à “30 ans et plus”. Il y a donc bien des individus qui ont quitté le foyer parental à plus de 30 ans, mais ils ne sont pas distingués.

On fait de même pour la fréquence de visite à la mère :

table(erfi$PA_FQAVM_rec, useNA = "always")
## 
##    0    1    2    3    9 <NA> 
##  377 2773 2597   66    8 4258

Là encore, le grand nombre de valeurs manquantes s’explique par le fait que la question sur la fréquence des visites à la mère n’est posée qu’aux personnes dont la mère est vivante, et qui ne vivent pas avec elle. On peut le voir dans le module Parents et foyer parental du questionnaire (p. 70 à 78).

Filtrer la population concernée

Nous avons pu identifier à l’étape précédente qu’un grand nombre de personnes n’ont pas répondu aux questions étudiées ici car non concernées. De plus, le champ du graphique précise que l’étude porte sur les personnes âgées de 30 à 79 ans, dont la mère est encore en vie. Or, les personnes enquêtées pour l’enquête ERFI-1 sont âgées de 18 à 79 ans, que leur mère soit vivante ou non.
Il faut donc appliquer un filtre sur la base de données initiale, afin de ne conserver que les individus concernés par notre analyse.
On repart de la base erfi créée à l’étape précédente. Nous allons cette fois utiliser une autre fonction issue du package dplyr, filter.

erfi <- filter(erfi, MA_AGEM_rec >= 30 & PA_MEREBV_rec == 1)

Les arguments de la fonction filter sont en premier lieu le nom de la table sur laquelle on veut appliquer le filtre (ici, erfi), puis les conditions sur lesquelles on doit filtrer cette table. Ici, on souhaite conserver les personnes qui sont âgées d’au moins 30 ans (MA_AGEM_rec >= 30) ET (&) dont la mère est en vie (PA_MEREBV_rec == 1).
On assigne le résultat à l’objet erfi. Le nombre de lignes est désormais réduit : 4563 au lieu de 10079 précédemment, car n’ont été conservées que les lignes correspondant aux individus remplissant les deux conditions du filtre.

📝 Lorsqu’on assigne un résultat à un objet déjà existant (comme c’est le cas ici avec erfi), on écrase ce qu’il contenait précédemment, sans possibilité de retour en arrière. Si l’on constate une erreur dans l’application du filtre, il faudra relancer la ligne de commande précédente (select) afin de retrouver la table erfi initiale. On aurait pu assigner le résultat à un nouvel objet en choisissant un nom qui n’a pas déjà été utilisé (par exemple erfi_filtre), pour ne pas prendre de risque.

Données manquantes

La population étant maintenant réduite à celle concernée par l’analyse, procédons à nouveau à un tri à plat sur les variables d’intérêt, pour vérifier s’il reste des données manquantes.

table(erfi$PF_AGEDEPFOY_rec, useNA = "always")
## 
##    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
##   23    1    5    6    4    4   10    3    8    7   12   10   12   17   53   65 
##   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30 <NA> 
##  123  220  615  552  636  500  409  348  268  193  119   76   66   51  143    4
table(erfi$PA_FQAVM_rec, useNA = "always")
## 
##    0    1    2    3    9 <NA> 
##  314 2220 1969   52    8    0

Il n’y a pas de données manquantes pour la fréquence de visite à la mère, en revanche, il en reste 4 pour l’âge au départ du foyer parental. Ce nombre étant très faible, on peut se contenter d’exclure les individus correspondant de la base de données pour le reste de l’analyse.
Pour cela, nous allons procéder à un nouveau filtre.

erfi <- filter(erfi, complete.cases(PF_AGEDEPFOY_rec))

On utilise à nouveau la fonction filter, avec comme premier argument la table que l’on souhaite filtrer (toujours erfi, dans notre cas). Puis, le second argument complete.cases(PF_AGEDEPFOY_rec) indique que l’on souhaite conserver uniquement les lignes qui comportent une valeur pour la variable PF_AGEDEPFOY_rec.
On assigne le résultat à l’objet erfi déjà existant, qui n’a désormais plus de 4559 lignes, les 4 individus pour lesquels il manque l’âge au départ du foyer parental ayant été exclus par le filtre.

📝 Dans notre cas, les données manquantes étant très peu nombreuses, on peut se contenter de supprimer les individus concernés. Cependant, lorsque ces données concernent un nombre important d’individus, il peut être important de les analyer pour comprendre d’où elles proviennent, et si les non-répondants ont un profil particulier.
Quelques pistes d’analyse des données manquantes sont explorées dans cet article.

Recoder les variables

Créer des classes d’âge au départ du foyer parental

Pour réaliser le tableau et le graphique souhaités, nous avons besoin de découper la variable d’âge au départ du foyer parental (variable quantitative continue, stockée au format numeric dans la base de données), en classes, comme sur l’axe horizontal du graphique.
On utilise pour cela l’interface icut du package questionr.

icut()

Dans l’interface qui s’ouvre suite au lancement de la commande icut(), il y a trois informations à renseigner :

  • A : le nom de la table dans laquelle se trouve la variable à découper ;
  • B : le nom de la variable à découper ;
  • C : le nom que l’on souhaite donner à la variable qui contiendra le découpage réalisé. Par défaut, l’interface propose de rajouter le suffixe “_rec” au nom de la variable d’origine, mais l’utilisateur est libre de choisir le nom de variable qu’il souhaite. Ici, on a choisi AGE_DEP.


En cliquant sur Découpage en classes, on arrive sur l’interface qui permet de déterminer les classes souhaitées.


La liste déroulante Méthode propose toute une série de méthodes automatiques de découpage d’une variable quantitative selon différents procédés statistiques. Nous utiliserons le mode manuel (Manual), qui propose à l’utilisateur de définir des propres bornes de classes (séparées par une virgule), à définir dans Breaks.

📝 Par défaut, les intervalles sont ouverts à droite (exemple : [0;20[ ). Ainsi, si l’on renseigne : 0,10,20 comme bornes de classe, les intervalles créés seront : [0;10[ ; [10;20[. On peut changer cela en cochant la case “Intervalles fermés à droite”.

En cliquant sur Code et résultat, on peut visualiser un tri à plat de la variable une fois découpée en classes. Cela permet notamment de voir si les intervalles créés correspondent bien à ceux souhaités, et si la répartition des individus dans les différentes classes est satisfaisante. Si la répartition est très déséquilibrée et que certaines classes ne contiennent que très peu d’individus, cela signifie que le découpage n’est pas le plus approprié.
Si l’on souhaite modifier le découpage, il suffit de cliquer à nouveau sur Découpage en classes pour revenir à l’interface précédente.


Une fois satisfait du découpage réalisé, on peut cliquer sur le bouton Done en haut à droite. L’interface se ferme et les lignes de code permettant d’exécuter le découpage choisi s’insèrent dans le script.

## Recodage de erfi$PF_AGEDEPFOY_rec en erfi$AGE_DEP
erfi$AGE_DEP <- cut(erfi$PF_AGEDEPFOY_rec,
  include.lowest = TRUE,
  right = FALSE,
  dig.lab = 4,
  breaks = c(0, 20, 22, 24, 26, 30, 79)
)

⚠️ Attention, l’interface icut ne fait que génèrer le code nécessaire au découpage de la variable, mais elle ne l’exécute pas. Actuellement, la variable AGE_DEP contenant l’âge au départ du foyer, regroupé en classes, n’existe pas encore. Pour la créer, il faut exécuter les lignes de codes insérées dans le script par icut, en les sélectionnant puis cliquant sur , ou simultanément sur les touches clavier Ctrl + Enter pour Windows / Cmd + Enter pour Mac. On peut alors constater dans l’environnement que la table erfi contient désormais 6 variables et non plus 5. On peut également réaliser un tri à plat sur la nouvelle variable AGE_DEP pour s’assurer que sa création s’est bien déroulée.

table(erfi$AGE_DEP, useNA = "always")
## 
##  [0,20) [20,22) [22,24) [24,26) [26,30) [30,79]    <NA> 
##    1750    1136     757     461     312     143       0

Recodage de la fréquence de visite à la mère

La variable de fréquence de visite à la mère présente cinq modalités, d’après le dictionnaire des codes : “Jamais” ; “moins d’une fois par an” ; “Moins d’une fois par semaine” ; “Au moins une fois par semaine” ; “Plusieurs fois par jour” ; “Ne sait pas”. Or, nous souhaitons seulement distinguer les personnes qui voient leur mère au moins une fois par semaine de ceux qui la voient moins fréquemment. Il nous faut donc recoder cette variable pour ne garder que deux modalités : “oui” ; “non”.
Pour cela, on utilise une autre interface issue du package questionr, irec, destinée au recodage des variables qualitatives.

irec()

Cette interface fonctionne de manière très similaire à celle de icut. Dans la première fenêtre, on renseigne la variable que l’on souhaite recoder et la méthode que l’on souhaite employer pour cela :

  • A : le nom de la table dans laquelle se trouve la variable à recoder ;
  • B : le nom de la variable à recoder ;
  • C : le nom que l’on souhaite donner à la variable créée à l’issue du recodage. Par défaut, l’interface propose de rajouter le suffixe “_rec” au nom de la variable d’origine, mais l’utilisateur est libre de choisir le nom de variable qu’il souhaite. Ici, on a choisi FREQ_MERE ;
  • D : la méthode que l’on souhaite employer pour le recodage. Ici on a choisi Character - minimal, qui est la méthode la plus simple ;
  • E : la classe de l’objet contenant la nouvelle variable (FREQ_MERE). Etant donné qu’il s’agit d’une variable qualitative, on peut choisir Character ou Factor. Ici, on a choisi Character par souci de simplicité pour la formation.


En cliquant sur Recodage, on arrive sur l’interface qui permet d’indiquer comment on souhaite recoder les modalités existantes de la variable.


En face de chacune des modalités existantes, on inscrit la valeur que cette modalité devra prendre dans le nouveau regroupement.

  • Les modalités 0 et 1 (qui signifient respectivement “Jamais, moins d’une fois par an” et “Moins d’une fois par semaine” d’après le dictionnaire des codes) correspondent à des personnes qui voient leur mère moins d’une fois par semaine : on va donc les recoder en “non”.
  • Les modalités 2 et 3 (respectivement “Au moins une fois par semaine” et “Plusieurs fois par jour” d’après le dictionnaire des codes) correspondent à des personnes qui voient leur mère au moins une fois par semaine : on va donc les recoder en “oui”.
  • Que faire de la modalité 9 (“Ne sait pas”) ?
    • De manière générale, la modalité “Ne sait pas” est laissée comme telle lors des opérations de recodage, sauf s’il y a une raison pertinente de regrouper ces individus avec une modalité particulière. Ici, si une personne a répondu ne pas savoir à quelle fréquence elle voit sa mère, on peut supposer que les visites sont très irrégulières, donc que la personne voit sa mère moins souvent qu’une fois par semaine. Il est donc cohérent de recoder “Ne sait pas” en “non”.

⚠️ Attention à la casse et aux fautes de frappe lorsque l’on renseigne les nouvelles modalités. Par exemple, si l’on inscrit “non” en face de “0” et “Non” en face de “1”, R considère qu’il s’agit de deux modalités différentes, et la nouvelle variable créée suite au recodage aura alors deux modalités “non” différentes, l’une orthographiée sans majuscule et l’autre avec une majuscule. Les modalités “0” et “1” de la variable d’origine n’auront pas été regroupées. Pour éviter cela, le plus simple est d’inscrire une seule fois chaque nouvelle modalité et de faire des copier-coller les fois suivantes.

En cliquant sur Code et résultats, on peut visualiser un tableau croisant l’ancienne et la nouvelle variable, pour voir si le recodage effectué correspond bien à celui souhaité. Si ce n’est pas le cas, on peut revenir à l’interface précédente en cliquant à nouveau sur Recodage.


Une fois satisfait du recodage, on peut cliquer sur le bouton Done en haut à droite. Tout comme avec l’interface icut, le code permettant de réaliser le recodage est alors généré par l’interface et inséré dans le script, mais il n’est pas exécuté. C’est à l’utilisateur de le faire en sélectionnant les lignes générées et en cliquant sur ou simultanément sur touches clavier Ctrl + Enter pour Windows / Cmd + Enter pour Mac.

## Recodage de erfi$PA_FQAVM_rec en erfi$FREQ_MERE
erfi$FREQ_MERE <- as.character(erfi$PA_FQAVM_rec)
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "0"] <- "non"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "1"] <- "non"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "2"] <- "oui"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "3"] <- "oui"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "9"] <- "non"

La table erfi contient désormais 7 variables. On peut vérifier que le recodage s’est bien passé en effectuant un tri à plat sur la nouvelle variable FREQ_MERE.

table(erfi$FREQ_MERE, useNA = "always")
## 
##  non  oui <NA> 
## 2540 2019    0

Tris à plat, tri croisé

Les tableaux que nous avons réalisés jusqu’à maintenant sont des tableaux d’effectifs bruts, sans pondération. Ils servent à vérifier la structure des données, mais pas à l’analyse.

Tri à plat sur l’âge au départ du foyer parental

Pour connaître la répartition des individus selon leur âge au départ du foyer parental, on utilise la fonction wtd.table du package questionr. Celle-ci fonctionne de manière très similaire à la fonction table utilisée précédemment, mais elle permet en plus de prendre en compte une variable de pondération, avec l’argument weights.

wtd.table(erfi$AGE_DEP, weights = erfi$poids12)
##    [0,20)   [20,22)   [22,24)   [24,26)   [26,30)   [30,79] 
## 7313804.8 4773950.4 3161785.6 1977938.9 1407880.1  616330.7

On obtient un tableau d’effectifs pondérés. Si l’on souhaite obtenir la répartition des individus sous forme de pourcentages (plus lisible, et préférable dès lors que l’on veut réaliser des comparaisons), il faut utiliser la fonction proportions.
On peut utiliser l’opérateur pipe (%>%) pour appliquer cette fonction directement sur le tableau précédemment réalisé.

wtd.table(erfi$AGE_DEP, weights = erfi$poids12) %>% #tableau d'effectifs
proportions() #calcule les pourcentages
##     [0,20)    [20,22)    [22,24)    [24,26)    [26,30)    [30,79] 
## 0.37990455 0.24797565 0.16423418 0.10274105 0.07313021 0.03201437

Tri à plat sur la fréquence de visite à la mère

On répète les mêmes opérations pour obtenir la répartition des individus selon la fréquence de visite à leur mère.

wtd.table(erfi$FREQ_MERE, weights = erfi$poids12) %>%
proportions()
##       non       oui 
## 0.5664051 0.4335949

On peut observer que 43 % des individus déclarent voir leur mère au moins une fois par semaine. Mais cette proportion varie-t-elle selon l’âge auquel on a quitté le foyer familial ? Pour le savoir, il faut procéder à un tri croisé entre les deux variables.

Tri croisé

Comme pour le tri à plat, on utilise la fonction wtd.table du package questionr, mais elle prend cette fois-ci trois arguments :

  • La variable à représenter sur les lignes du tableau croisé ;
  • La variable à représenter sur les colonnes du tableau croisé ;
  • La variable de pondération, avec l’argument weights
wtd.table(erfi$AGE_DEP, erfi$FREQ_MERE, weights = erfi$poids12)
##               non       oui
## [0,20)  4681550.3 2632254.5
## [20,22) 2640812.5 2133137.8
## [22,24) 1718352.7 1443432.9
## [24,26)  982355.7  995583.2
## [26,30)  632651.4  775228.7
## [30,79]  248532.1  367798.5

On obtient un tableau croisé d’effectifs pondérés, avec en lignes l’âge au départ du foyer parental, et en colonnes la fréquence de visite à la mère.
Pour calculer les valeurs en pourcentage, il faut en premier lieu se demander si l’on souhaite obtenir des pourcentages en ligne ou des pourcentages en colonne. Cela dépend de la position des variables dans le tableau. Ici, on souhaite comparer la répartition des fréquences de visite à la mère en fonction de l’âge au départ du foyer parental. On veut donc pouvoir comparer les différentes tranches d’âges entre elles. Celles-ci étant présentées en ligne dans le tableau, il nous faut donc calculer les pourcentages en ligne.
Pour cela, on va appliquer la fonction lprop au tableau précédemment réalisé.

wtd.table(erfi$AGE_DEP, erfi$FREQ_MERE, weights = erfi$poids12) %>%
lprop()
##          non   oui   Total
## [0,20)    64.0  36.0 100.0
## [20,22)   55.3  44.7 100.0
## [22,24)   54.3  45.7 100.0
## [24,26)   49.7  50.3 100.0
## [26,30)   44.9  55.1 100.0
## [30,79]   40.3  59.7 100.0
## Ensemble  56.6  43.4 100.0

Ainsi, presque 60 % des personnes ayant quitté le foyer parental à 30 ans ou plus voient leur mère au moins une fois par semaine, contre seulement 36 % des personnes qui l’ont quitté avant 20 ans. La fréquence de visite à la mère n’est donc pas indépendante de l’âge au départ du foyer parental.


Pourcentages en ligne, pourcentages en colonne : éléments de lecture

Dans le tableau ci-dessous, qui présente des pourcentages en ligne, la valeur encadrée se lit : “parmi les personnes qui ont quitté le foyer parental avant 20 ans, 36 % voient leur mère au moins une fois par semaine.”


Dans le second tableau, réalisé à partir des mêmes données, mais qui les présente sous forme de pourcentages en colonnes (fonction cprop() dans R), la valeur encadrée se lit : “parmi les personnes qui voient leur mère au moins une fois par semaine, 31,5 % ont quitté le foyer parental avant l’âge de 20 ans.”


Représentation graphique avec Esquisse

Préparation des données

Pour représenter cette même information graphiquement, il est nécessaire d’effectuer un travail préalable de préparation des données.
Dans un premier temps, nous allons stocker le tableau croisé réalisé précédemment (dont le résultat s’est affiché dans la console) dans notre environnement R, afin de pouvoir l’utiliser pour la réalisation du graphique. Pour cela, on relance les mêmes lignes de code que précédemment, mais en assignant le résultat à un objet, nommé TCROIS.

TCROIS <- wtd.table(erfi$AGE_DEP, erfi$FREQ_MERE, weights = erfi$poids12) %>%
  lprop()

Cette fois-ci, la tableau ne s’affiche pas dans la console, en revanche, un nouvel objet, TCROIS, est apparu dans notre environnement. En utilisant la fonction class, nous pouvons voir que celui-ci est de type table.

class(TCROIS)
## [1] "proptab" "table"

Pour pouvoir utiliser les fonctions permettant la réalisation des graphiques, il nous faut changer le format de l’objet contenant les données en data.frame, car ces fonctions ne s’appliquent que sur ce type d’objet.
On utilise pour cela la fonction as.data.frame, et on assigne le résultat à un nouvel objet que l’on nomme erfi_mere.

erfi_mere <- as.data.frame(TCROIS) 

Ce nouvel objet erfi_mere contient les valeurs du tableau croisé, mais sous un format différent.

  • La colonne Var1 contient les tranches d’âge au départ du foyer (affichées sur les lignes du tableau croisé) ;
  • La colonne Var2 contient les fréquences de visite à la mère (affichées sur les colonnes du tableau croisé) ;
  • La colonne Freq contient les pourcentages correspondant à chaque intersection, contenus dans les cases du tableau croisé.


Les noms Var1 et Var2 n’étant pas du tout explicites sur le contenu des variables que contiennent ces colonnes, il est préférable de les renommer. On fait pour cela appel à la fonction rename du package dplyr. Ses arguments se présentent sous la forme suivante : nouveau_nom = ancien_nom. On peut renommer plusieurs variables avec la même ligne de code, en les séparant par une virgule.

erfi_mere <- as.data.frame(TCROIS) %>% #on transforme T en data frame
  rename(age = Var1, visite_mere = Var2) #on renomme certaines colonnes pour que les noms soient plus explicites

Enfin, on ne souhaite pas représenter les marges du tableau croisé (c’est-à-dire la ligne “Ensemble” et la colonne “Total”) sur le graphique. Les données correspondant à cette ligne et à cette colonne ne doivent donc pas être présentes dans le tableau de données.
On va utiliser la fonction filter du package dplyr pour ne conserver que les âges différents de “Ensemble”, et les fréquences de visite à la mère différentes de “Total”.

erfi_mere <- as.data.frame(TCROIS) %>% #on transforme T en data frame
  rename(age = Var1, visite_mere = Var2) %>% #on renomme certaines colonnes pour que les noms soient plus explicites
  filter(age != "Ensemble" & visite_mere != "Total") #on filtre pour enlever les marges du tableau croisé

Les données sont désormais prêtes pour être utilisées avec les fonctions de représentation graphique.

Réalisation du graphique

Pour réaliser le graphique, on utilise l’interface equisser du package esquisse.

esquisser()

Dans l’interface qui s’ouvre suite au lancement de la commande esquisser(), on choisit dans la première liste déroulante la table dans laquelle se trouve les données qui vont servir à la construction du graphique. Ici, il s’agit de la table erfi_mere que l’on vient de créér lors de l’étape de préparation des données.
On clique ensuite sur Import Data pour importer le jeu de données.


On construit ensuite le graphique en faisant glisser les variables vers les champs correspondants :

  • X : variable à placer en abscisses (ici, il s’agit de l’âge au départ du foyer, age) ;
  • Y : valeurs de la variable représentée en ordonnées (ici, il s’agit de la fréquence de visite à la mère, en pourcentage, Freq) ;
  • fill : modalités de la variable représentée en ordonnées, pour les distinguer au sein des barres par différentes couleurs (ici, il s’agit de la variable visite_mere)


L’interface choisit automatiquement le type de graphique le plus adapté en fonction des données sélectionnées. Si cela ne correspond pas au type de graphique que l’on souhaite, il est possible de le modifier en cliquant sur le bouton Col en haut à gauche. Les différents types de graphique qu’il est possible de réaliser avec les données sélectionnées sont alors proposés.

Les onglets en bas offrent différentes options pour adapter et mettre en forme le graphique obtenu :

  • Labels & Title : Ajouter un titre, un sous-titre, une source, changer les noms des axes et le titre de la légende. En cliquant sur le symbole + à côté de chaque option, on peut également modifier sa mise en forme (police, taille, alignement…)


  • Plot options : Modifier les options du graphique, notamment les limites des axes

  • Appearance : Modifier les couleurs et le thème du graphique

  • Data : Appliquer des filtres sur les données représentées (par exemple, ne pas représenter les valeurs extrêmes, ou certaines modalités)

  • Code : Visualiser le code permettant de générer le graphique.

Il n’est pas possible d’exporter le graphique directement depuis l’interface esquisser. Celui-ci disparaitra sitôt l’interface fermée. Pour le conserver, il est nécessaire de visualiser le code permettant de générer le graphique et de le copier/coller dans son script, puis de l’exécuter. Le graphique ainsi généré apparaît alors dans l’onglet Plots du quadrant inférieur droit de RStudio, où il est possible de l’exporter avec le bouton

📝 Une fois le code permettant de générer le graphique copié/collé dans le script, on peut le modifier pour faire appel à des options non disponibles dans l’interface esquisser (exemples : changer les labels des modalités sur l’axe des abscisses, placer la légende en bas plutôt qu’à droite, etc.). Une documentation complète du package ggplot2, sur lequel s’appuie esquisse pour la réalisation des graphiques, est disponible ici.

ggplot(erfi_mere) +
 aes(x = age, y = Freq, fill = visite_mere) +
 geom_col() +
 scale_fill_manual(values = c(non = "#A50026", 
oui = "#006837")) +
 labs(x = "Age au départ (ans)", y = "En %", title = "Proportion (%) d'enfants voyant leur mère\nau moins une fois par semaine, selon l'âge au départ du foyer parental", 
 caption = "Champ : femmes et hommes âgés de 30 à 79 ans, dont la mère est encore en vie ;\nSource : Ined-Insee, ERFI-GGS, 2005", 
 fill = "Voit sa mère au moins\nune fois par semaine") +
 theme_classic() +
 theme(plot.title = element_text(face = "bold.italic", size = 12,
 hjust = 0.5), plot.caption = element_text(face = "italic", hjust = 0), axis.title.y = element_text(hjust = 1), 
 axis.title.x = element_text(hjust = 1))

Pour reproduire à l’identique la figure 1 de l’article de Population & Sociétés, on peut exécuter le code ci-dessous, qui reprend en grande partie les traitements réalisés au cours de cette formation. On y ajoute les traitements nécessaires au calcul des proportions de personnes qui voient au moins une semaine leur père, et quelques modifications sont apportés au code permettant la réalisation du graphique afin de produire des courbes (type de graphique impossible à réaliser via l’interface esquisser sur ce type de données).

#sélection des variables utiles et des individus concernés
erfi <- select(ERFI1_FPA, MA_AGEM_rec, PA_FQAVM_rec, PF_AGEDEPFOY_rec, PA_MEREBV_rec, PB_PEREBV_rec, PB_FQAVP_rec, poids12)
erfi <- filter(erfi, MA_AGEM_rec >= 30 & PA_MEREBV_rec == 1 & PB_PEREBV_rec == 1)
erfi <- filter(erfi, complete.cases(PF_AGEDEPFOY_rec))

#recodage âge au départ du foyer
erfi$AGE_DEP <- cut(erfi$PF_AGEDEPFOY_rec,
                    include.lowest = TRUE,
                    right = FALSE,
                    dig.lab = 4,
                    breaks = c(0, 20, 22, 24, 26, 30, 79)
)

#recodage fréquence des visites aux parents
erfi$FREQ_MERE <- as.character(erfi$PA_FQAVM_rec)
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "0"] <- "non"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "1"] <- "non"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "2"] <- "oui"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "3"] <- "oui"
erfi$FREQ_MERE[erfi$PA_FQAVM_rec == "9"] <- "non"

erfi$FREQ_PERE <- as.character(erfi$PB_FQAVP_rec)
erfi$FREQ_PERE[erfi$PB_FQAVP_rec == "0"] <- "non"
erfi$FREQ_PERE[erfi$PB_FQAVP_rec == "1"] <- "non"
erfi$FREQ_PERE[erfi$PB_FQAVP_rec == "2"] <- "oui"
erfi$FREQ_PERE[erfi$PB_FQAVP_rec == "3"] <- "oui"
erfi$FREQ_PERE[erfi$PB_FQAVP_rec == "9"] <- "non"

#calcul des % pour les visites à la mère
TAB_MERE <- wtd.table(erfi$AGE_DEP, erfi$FREQ_MERE, weights = erfi$poids12) %>%
  lprop() %>% as.data.frame() %>%
  rename(age = Var1, visite = Var2) %>%
  filter(age != "Ensemble" & visite == "oui") %>% #on veut représenter sur le graphique seulement la part de personnes qui voient leur mère une fois par semaine, donc on ne garde que les "oui"
  mutate(parent = "mere") #on crée une nouvelle variable indiquant le parent concerné

#on fait de même pour les visites au père
TAB_PERE <- wtd.table(erfi$AGE_DEP, erfi$FREQ_PERE, weights = erfi$poids12) %>%
  lprop() %>% as.data.frame() %>%
  rename(age = Var1, visite = Var2) %>%
  filter(age != "Ensemble" & visite == "oui") %>% 
  mutate(parent = "pere")

#on rassemble les deux tableaux en un seul
DATA_GRAPH <- rbind(TAB_MERE, TAB_PERE)

#Représentation graphique
ggplot(DATA_GRAPH, aes(age, Freq, color = parent, group = parent)) +
  geom_line() +
  scale_x_discrete(labels = c("Moins de 20 ans", "20-21", "22-23", "24-25", "26-29", "30 ans ou plus")) + #mettre des labels sur l'axe des abscisses
  scale_y_continuous(limits = c(25,65), breaks = c(seq(25,65,5))) + #changer la graduation de l'axe des ordonnées (de 25 à 65, avec un pas de 5)
  scale_color_manual (values = c("#1068c9", "#065535"), labels = c("sa mère", "son père")) + #changer les couleurs des courbes et les labels de la légende
  labs(x = "Age au départ (ans)", y = "En %", title = "Proportion (%) d'enfants voyant au moins une fois par semaine \nleur père ou leur mère, selon l'âge au départ du foyer parental", 
       caption = "Champ : Femmes et hommes âgés de 30 à 79 ans, dont les deux parents sont encore en vie\nSource : Ined-Insee, ERFI-GGS, 2005", 
       color = "Voit au moins\nune fois par semaine :") +
  theme_classic() +
  theme(plot.title = element_text(face = "bold.italic", 
                                  hjust = 0.5), plot.caption = element_text(face = "italic", hjust = 0), axis.title.y = element_text(hjust = 1), 
        axis.title.x = element_text(hjust = 1))

```

Bibliographie

Autour de l’enquête ERFI

Albertini M., Brini E., 2021, « I’ve changed my mind. The intentions to be childless, their stability and realisation », European Societies, 23(1), p. 119‑160. doi:10.1080/14616696.2020.1764997
Bauer D., 2009, « Chapitre 8. L’organisation des tâches domestiques et parentales dans le couple », in Régnier-Loilier A. (dir.), Portraits de famille, Ined Éditions, p. 219‑239. doi:10.4000/books.ined.5053
Beaujouan É., 2011, « La fécondité des deuxièmes unions en France : âges des conjoints et autres facteurs: », Population, Vol. 66(2), p. 275‑311. doi:10.3917/popu.1102.0275
Beaujouan É., 2016, « Chapitre 5. Fréquence des désaccords, satisfaction dans le couple et séparation », in Régnier-Loilier A. (dir.), Parcours de familles, Ined Éditions, p. 137‑160. doi:10.4000/books.ined.4793
Dereuddre R., Buffel V., Bracke P., 2017, « Power and the gendered division of contraceptive use in Western European couples », Social Science Research, 64, p. 263‑276. doi:10.1016/j.ssresearch.2016.10.004
Le Goff M., Navaux J., Ragot L., 2016, « Chapitre 15. L’influence des étapes de vie sur les transferts des parents aux enfants », in Régnier-Loilier A. (dir.), Parcours de familles, Ined Éditions, p. 385‑402. doi:10.4000/books.ined.4908
Lefèvre C., Kortchaguina I. I., Prokofieva L. M., 2009, « Chapitre 20. Les différences d’opinions entre la France et la Russie sur le soutien entre générations », in Régnier-Loilier A. (dir.), Portraits de famille, Ined Éditions, p. 515‑536. doi:10.4000/books.ined.5173
Makay Z., 2016, « Chapitre 13. Congé parental et interruption de l’activité professionnelle des mères en France et en Hongrie », in Régnier-Loilier A. (dir.), Parcours de familles, Ined Éditions, p. 333‑357. doi:10.4000/books.ined.4873
Peri-Rotem N., 2020, « Écarts de fécondité en fonction du niveau d’instruction : le rôle de la religion en Grande-Bretagne et en France: », Population, Vol. 75(1), p. 9‑38. doi:10.3917/popu.2001.0009
Rault W., Letrait M., 2010, « Formes d’unions différentes, profils distincts ? Une comparaison des pacsé.e.s en couple de sexe différent et des marié.e.s », Sociologie, 1(3), p. 319. doi:10.3917/socio.003.0319
Régnier-Loilier A., 2006, « À quelle fréquence voit-on ses parents ? », Population & Sociétés, 427(9), p. 1‑4. doi:10.3917/popsoc.427.0001
Régnier-Loilier A., 2007, « Conditions de passation et biais occasionnés par la présence d’un tiers sur les réponses obtenues à l’enquête Érfi », Economie et Statistique, 407(1), p. 27‑49. doi:10.3406/estat.2007.7071
Régnier-Loilier A., 2014, « Etude des relations familiales et intergénérationnelles (ERFI - 1re vague) (2005): Version française de l’enquête "Generations and Gender Survey" (GGS) »,. doi:10.48756/INED-IE0214-4582
Régnier-Loilier A., 2016, « Chapitre 4. Le devenir conjugal des personnes en relation non cohabitante », in Régnier-Loilier A. (dir.), Parcours de familles, Ined Éditions, p. 111‑135. doi:10.4000/books.ined.4788
Régnier-Loilier A., 2021, « Chapitre 1. Présentation d’Érfi et retour sur six années d’enquête », in Parcours de familles : L’enquête Étude des relations familiales et intergénérationnelles, Paris, Ined Éditions, Grandes Enquêtes, p. 33‑51. doi:10.4000/books.ined.4763
Régnier-Loilier A., Guisse N., 2021, « Chapitre 2. Attrition et déformation de l’échantillon au fil des vagues de l’enquête Érfi », in Parcours de familles : L’enquête Étude des relations familiales et intergénérationnelles, Paris, Ined Éditions, Grandes Enquêtes, p. 53‑85. doi:10.4000/books.ined.4768
Régnier-Loilier A., Sebille P., 2007, « Aménagements du questionnaire Generations and Gender Surveys en France (vague 1) », Document de travail, 144, Paris, Ined.
Renaut S., Ogg J., 2009, « Enfants du baby-boom et parents vieillissants : des valeurs et des attitudes contingentes au parcours de vie: », Gérontologie et société, vol. 31 / n° 127(4), p. 129‑158. doi:10.3917/gs.127.0129
Renaut S., Ogg J., Aouici S., 2016, « Chapitre 14. Fin d’activité et passage à la retraite, une période empreinte d’incertitude », in Régnier-Loilier A. (dir.), Parcours de familles, Ined Éditions, p. 359‑382. doi:10.4000/books.ined.4883
Riederer B., Buber-Ennser I., Brzozowska Z., 2019, « Fertility Intentions and Their Realization in Couples: How the Division of Household Chores Matters », Journal of Family Issues, 40(13), p. 1860‑1882. doi:10.1177/0192513X19848794
Schwanitz K., Rampazzo F., Vitali A., 2021, « Unpacking intentions to leave the parental home in Europe using the Generations and Gender Survey », Demographic Research, 45, p. 17‑54. doi:10.4054/DemRes.2021.45.2
Sebille P., 2009, « Chapitre 12. Un passage vers l’âge adulte en mutation ? », in Régnier-Loilier A. (dir.), Portraits de famille, Ined Éditions, p. 315‑340. doi:10.4000/books.ined.5088
Steinbach A., Hank K., 2016, « Intergenerational Relations in Older Stepfamilies: A Comparison of France, Germany, and Russia », The Journals of Gerontology Series B: Psychological Sciences and Social Sciences, 71(5), p. 880‑888. doi:10.1093/geronb/gbw046
Tanskanen A., Rotkirch A., 2014, « The impact of grandparental investment on mothers’ fertility intentions in four European countries », Demographic Research, 31, p. 1‑26. doi:10.4054/DemRes.2014.31.1

Ressources R

Adjerad R., Galiana L., s. d., « Guide des bonnes pratiques en R », Guide des bonnes pratiques en R.
Barnier J., s. d., « Introduction à R et au tidyverse », Introduction à R et au tidyverse.
Della Vedova C., 2020, « Blog - DellaData », DellaData Transformez vos données en connaissances.
G2R, s. d., « MTECT-MTE / Formations à R », Formations R aux MTES & MCTRCT.
INSEE, s. d., « utilitR », utilitR.
Larmarange J., s. d., « analyse-R », analyse-R.
Vaudor L., s. d., « R-atique - Analyse de données avec R », R-atique.