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.
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.
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.
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.
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.
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.
Cette formation s’appuie sur l’utilisation de plusieurs ressources :
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) 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.
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
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.
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 :
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.
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.
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 :
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.
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 :
📝 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 :
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.
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 :
📝 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.
R est un langage de programmation et un logiciel libre principalement destiné à l’analyse statistique et à la science des données.
Il permet:
Pourquoi utiliser R ?
R est un logiciel:
Les principaux inconvénients de R
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.
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.
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 :
L’utilisation de projets RStudio présente plusieurs avantages :
Comment créer un projet RStudio?
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).
Créer un nouveau projet en cliquant sur File, puis New Project. Le menu suivant s’affiche :
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).
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:
.
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’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 :
📝 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
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:
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 |
|---|---|
|
Afficher la liste de tous les objets dans l’environnement R |
|
Afficher le contenu de l’objet ‘a’ |
|
Supprimer l’objet ‘a’ de l’environnement |
|
Supprimer l’objet ‘a’ et ‘b’ de l’environnement |
|
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 :
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)
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 :
## [1] "numeric"
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)
## 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
## [1] "data.frame"
## [1] "integer"
📝 Dans R, on accéde aux variables d’un data frame avec l’opérateur
$.
df1$var1signifie donc la variablevar1du data framedf1.
Par ailleurs, R est sensible à la casse ce qui signifie que si vous tapezdf1$Var1au lieu dedf1$var1alors R enverra un message d’erreur dans la console de typeUnknown or uninitialised column: df1$Var1car il ne connaît pas la variabledf1$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.
## '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 ...
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):
Exemple : avec la fonction mean (du package R base)
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:
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”
## [1] 5.5
## [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).
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 à | |
| >= | Supérieur ou égal à | |
| < | Strictement inférieur à | |
| <= | Inférieur ou égal à | |
| == | Egal à | |
| != | Différent de | |
| & | ET (l’un et l’autre) | |
| | | OU (l’un ou l’autre) | |
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
## [1] 0.2
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 :
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"))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.
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 :
#
;%>%) 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:
c())mean())round(nom_objet, digits=1) où
l’argument digits indique le nombre de décimales/le nombre de
chiffres après la virgule)Pour réaliser ces différentes opérations, il y a plusieurs méthodes:
#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.
## [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.
%>%) 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.
Afin de réaliser l’exercice proposé ici, nous allons utiliser 4 packages:
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).
install.packages(c("readr", "tidyverse", "questionr", "esquisse"), dependencies = TRUE, repo="http://cran.rstudio.com/")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).
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 fonctionload()
- Pour les fichiers au format «texte brut» (.csv, .txt), on utilise la famille de fonctionsread.. 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).
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.
## [1] 10079 86
Notre jeu de données comprend 10 079 lignes et 86 colonnes.
## # 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>, …
## 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
## 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”)
## [1] "integer"
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] "character"
Conversion d’une variable logique en numérique
On utilise la fonction as.numeric(nom_variable). TRUE
devient 1, FALSE devient 0.
## [1] "logical"
## [1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE
## [1] 1 0 1 0 1 0 1 0 1 0
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 correctementOn peut trouver une documentation relative au package sjPlot ici.
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 ?
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).
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 :
##
## 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
On fait de même pour la fréquence de visite à la mère :
##
## 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).
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.
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.
##
## 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
##
## 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.
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.
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.
Dans l’interface qui s’ouvre suite au lancement de la commande
icut(), il y a trois informations à renseigner :
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.
##
## [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.
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 :
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.
⚠️ 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.
##
## non oui <NA>
## 2540 2019 0
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.
## [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.
## 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 :
## 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é.
## 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.”
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.
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.
## [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.
Ce nouvel objet erfi_mere contient les valeurs du tableau croisé, mais sous un format différent.
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 explicitesEnfin, 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.
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 :
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))```