Exemple de base de données individuelles pour R

, par Joël Girès

Je présente dans cet article une procédure pour créer une base de données individuelles contenant un peu plus de 8000 individus à partir des fichiers issus de l’enquête Histoire de vie - Construction des identités menée par l’INSEE en 2003. Je m’inspire des transformations que Julien Barnier a apporté à ces données telles qu’elles sont visibles dans le package questionr. Je repars néanmoins ici de zéro à partir des fichiers originaux, afin de produire un échantillon de plus grande taille (celui-ci étant limité à 2000 individus dans le package questionr). Cet article est le préalable d’autres articles sur ce site qui montrent divers exemples de traitements avec R, puisque je me sers dans ces derniers des données dont la construction est présentée ici. Cet article est également utile pour toute personne qui voudrait créer une base de données individuelles sur R et adaptée aux sciences sociales à destination d’étudiant-es, pour s’exercer ou pour créer des scripts à diffuser sur internet. Un script directement exécutable est téléchargeable en fin d’article.

Import des données

Nous devons d’abord charger les données de l’enquête Histoire de vie de INSEE dans un objet R (ici nommé d). Pour ce faire, nous devons utiliser le package foreign pour importer les fichiers téléchargeables sur le site de l’INSEE, puisque ceux-ci sont au format dBase. La base de données est coupée en quatre fichiers, que nous réunissons avec la clé d$IDENT grâce à la fonction left_join du tidyverse. Nous sélectionnons pour finir quelques variables adaptées pour l’analyse en sciences sociales.

library(foreign)
library(tidyverse)
options(encoding = "UTF-8") # Je définis l'encodages des caractères en UTF-8
 
# Je charge les 4 fichiers dBase
hdv1 <- read.dbf("hdv1.dbf")
hdv2 <- read.dbf("hdv2.dbf")
hdv3 <- read.dbf("hdv3.dbf")
hdv4 <- read.dbf("hdv4.dbf")
 
# Je les joins avec la clé IDENT (voir doc du jeu de données)
d <- hdv1 %>% 
  left_join(hdv2, by = "IDENT") %>% 
  left_join(hdv3, by = "IDENT") %>% 
  left_join(hdv4, by = "IDENT") %>% 
  select(IDENT, POIDSF.x, POIDLOG.y, AGEE, SEXEE, NIVE2TE, NIVE2TCJ, OCCUPAE, QUALIFE, VCLSO, A8B, ASATIS, LMUS5, LLIRE4, LOIS18, LOIS17, LOIS14, LOIS3, LOIS8, LT1FREQ, LT2FREQ, LL1FREQ, LL2FREQ)
rm(list = c("hdv1", "hdv2", "hdv3", "hdv4")) # J'efface les 4 objets hdvx chargés

Recodage des variables

Nous recodons ensuite les modalités de ces variables et changeons leurs noms. Il s’agit principalement de changements d’appellation des variables et de leurs modalités. Il n’y a que les heures journalières consacrées à la lecture, les heures journalières à regarder la télévision et les catégories d’âge qui sont des variables transformées.

## Recodage de d$SEXEE
d$SEXEE <- fct_recode(d$SEXEE,
                      "Homme" = "1",
                      "Femme" = "2"
)
 
## Recodage de d$AGEE
d$AGEE_rec <- cut(d$AGEE,
                  include.lowest = FALSE,
                  right = FALSE,
                  dig.lab = 4,
                  breaks = c(17, 35, 50, 65, 97)
)
 
## Recodage de d$NIVE2TE
d$NIVE2TE <- fct_recode(d$NIVE2TE,
                        "Aucun ou primaire" = "00",
                        "Aucun ou primaire" = "03",
                        "Aucun ou primaire" = "04",
                        "Collège ou Lycée" = "15",
                        "Collège ou Lycée" = "17",
                        "Enseignement professionnel" = "20",
                        "Enseignement professionnel" = "30",
                        "Enseignement supérieur" = "40"
)
 
## Recodage de d$NIVE2TCJ
d$NIVE2TCJ <- fct_recode(d$NIVE2TCJ,
                         "Aucun ou primaire" = "00",
                         "Aucun ou primaire" = "03",
                         "Aucun ou primaire" = "04",
                         "Collège ou Lycée" = "15",
                         "Collège ou Lycée" = "17",
                         "Enseignement professionnel" = "20",
                         "Enseignement professionnel" = "30",
                         "Enseignement supérieur" = "40",
                         NULL = "99"
)
 
## Recodage de d$OCCUPAE
d$OCCUPAE <- fct_recode(d$OCCUPAE,
                        "Exerce une profession" = "1",
                        "Chômeur" = "2",
                        "Etudiant" = "3",
                        "Exerce une profession" = "4",
                        "Retraité" = "5",
                        "Retraité" = "6",
                        "Au foyer" = "7",
                        "Autre inactif" = "8"
)
 
## Recodage de d$QUALIFE
d$QUALIFE <- fct_recode(d$QUALIFE,
                        "Ouvrier specialise" = "1",
                        "Ouvrier qualifie" = "2",
                        "Technicien" = "3",
                        "Agent de maitrise" = "4",
                        "Cadre" = "5",
                        "Employe" = "6",
                        "Autre" = "7"
)
 
## Recodage de d$VCLSO
d$VCLSO <- fct_recode(d$VCLSO,
                      "Appartient à une classe sociale" = "1",
                      "N'appartient pas à une classe sociale" = "2",
                      NULL = "9"
)
 
## Recodage de d$A8B
d$A8B <- fct_recode(d$A8B,
                    "Plus important que le reste" = "1",
                    "Aussi important que le reste" = "2",
                    "Moins important que le reste" = "3",
                    "Peu important" = "4"
)
 
## Recodage de d$ASATIS
d$ASATIS <- fct_recode(d$ASATIS,
                       "Satisfaction" = "1",
                       "Insatisfaction" = "2",
                       "Equilibre" = "3"
)
 
## Recodage de d$LMUS5
d$LMUS5 <- fct_recode(d$LMUS5,
                      "Ecoute du Rap" = "1",
                      "N'écoute pas de rap" = "0"
)
 
## Recodage de d$LLIRE4
d$LLIRE4 <- fct_recode(d$LLIRE4,
                       "Lit des BD" = "1",
                       "Ne lit pas des BD" = "0"
)
 
## Recodage de d$LOIS18
d$LOIS18 <- fct_recode(d$LOIS18,
                       "Va à la pêche/chasse" = "1",
                       "Ne va pas à la pêche/chasse" = "0"
)
 
## Recodage de d$LOIS17
d$LOIS17 <- fct_recode(d$LOIS17,
                       "Fait la cuisine par plaisir" = "1",
                       "Ne fait pas la cuisine par plaisir" = "0"
)
 
## Recodage de d$LOIS14
d$LOIS14 <- fct_recode(d$LOIS14,
                       "Fait du bricolage" = "1",
                       "Ne fait pas du bricolage" = "0"
)
 
## Recodage de d$LOIS3
d$LOIS3 <- fct_recode(d$LOIS3,
                      "Va au cinéma" = "1",
                      "Ne va pas au cinéma" = "0"
)
 
## Recodage de d$LOIS8
d$LOIS8 <- fct_recode(d$LOIS8,
                      "Fait du sport" = "1",
                      "Ne fait pas de sport" = "0"
)
 
## Création des heures journalières à regarder la télévision
d$LT1FREQ <- as.numeric(d$LT1FREQ)
d$LT1FREQ_JOUR <- case_when(
  d$LT2FREQ == 1 & !is.na(d$LT1FREQ) ~ d$LT1FREQ,
  d$LT2FREQ == 2 & !is.na(d$LT1FREQ) ~ d$LT1FREQ/7,
  d$LT2FREQ == 3 & !is.na(d$LT1FREQ) ~ d$LT1FREQ/30.5
)
 
## Création des heures journalières de lecture
d$LL1FREQ <- as.numeric(d$LL1FREQ)
d$LL1FREQ_JOUR <- case_when(
  d$LL2FREQ == 1 & !is.na(d$LL1FREQ) ~ d$LL1FREQ,
  d$LL2FREQ == 2 & !is.na(d$LL1FREQ) ~ d$LL1FREQ/7,
  d$LL2FREQ == 3 & !is.na(d$LL1FREQ) ~ d$LL1FREQ/30.5
)
 
## Je renomme les variables et ne sélectionne pas celles qui ont servi à la construction des variables définitives
d <- rename(d, id = IDENT, poidsf = POIDSF.x, poidlog = POIDLOG.y, age = AGEE, age_rec = AGEE_rec, sexe = SEXEE, nivetud = NIVE2TE, nivetud_cj = NIVE2TCJ, occup = OCCUPAE, qualif = QUALIFE, clso = VCLSO, trav.imp = A8B, trav.satisf = ASATIS, rap.hiphop = LMUS5, lecture.bd = LLIRE4, peche.chasse = LOIS18, cuisine = LOIS17, bricolage = LOIS14, cinema = LOIS3, sport = LOIS8, heures.tv = LT1FREQ_JOUR, heures.lecture = LL1FREQ_JOUR) %>% 
  select(-LT1FREQ, -LT2FREQ, -LL1FREQ, -LL2FREQ)

Synthèse des variables

La base de données est ainsi prête et formatée dans l’objet d. Dans le tableau suivant, on trouve un récapitulatif des variables retenues, leurs noms actuels tels que recodés, leurs noms originaux dans les fichiers de l’INSEE (notamment pour voir quelles sont les questions qui en sont à l’origine dans la documentation) et leurs différentes modalités.

Nom actuelTypeNom originalModalités
id factor IDENT Identifiant unique
poidsf numeric POIDSF Variable de pondération individuelle
poidlog numeric POIDLOG Pondération individuelle relative (poidsf divisé par moyenne de poidsf)
age integer AGEE Âge exact en années
sexe factor SEXEE 1. Homme
2. Femme
nivetud factor NIVE2TE 1. Aucun ou primaire
2. Collège ou Lycée
3. Enseignement professionnel
4. Enseignement supérieur
nivetud_cj factor NIVE2TCJ 1. Aucun ou primaire
2. Collège ou Lycée
3. Enseignement professionnel
4. Enseignement supérieur
occup factor OCCUPAE 1. Exerce une profession
2. Chômeur
3. Etudiant
4. Retraité
5. Au foyer
6. Autre inactif
qualif factor QUALIFE 1. Ouvrier specialise
2. Ouvrier qualifie
3. Technicien
4. Agent de maitrise
5. Cadre
6. Employe
7. Autre
clso factor VCLSO 1. Appartient à une classe sociale
2. N’appartient pas à une classe sociale
trav.imp factor A8B 1. Plus important que le reste
2. Aussi important que le reste
3. Moins important que le reste
4. Peu important
trav.satisf factor ASATIS 1. Satisfaction
2. Insatisfaction
3. Equilibre
rap.hiphop factor LMUS5 1. N’écoute pas de rap
2. Ecoute du Rap
lecture.bd factor LLIRE4 1. Ne lit pas des BD
2. Lit des BD
peche.chasse factor LOIS18 1. Ne va pas à la pêche/chasse
2. Va à la pêche/chasse
cuisine factor LOIS17 1. Ne fait pas la cuisine par plaisir
2. Fait la cuisine par plaisir
bricolage factor LOIS14 1. Ne fait pas du bricolage
2. Fait du bricolage
cinema factor LOIS3 1. Ne va pas au cinéma
2. Va au cinéma
sport factor LOIS8 1. Ne fait pas de sport
2. Fait du sport
age_rec factor Variable créée à partir de AGEE 1. [17,35)
2. [35,50)
3. [50,65)
4. [65,97)
heures.tv numeric Variable créée à partir de LT1FREQ & LT2FREQ Heures passées par jour à regarder la télévision
heures.lecture numeric Variable créée à partir de LL1FREQ & LL2FREQ Heures passées par jour à la lecture