Consignes pour la séance

Chaque groupe de travail poursuit le travail commencé la séance précédente, en suivant les objectifs donnés dans le tableau ci-dessous.

Consignes :

Variable Objectifs
Prénoms Recoder la variable du prénom pour supprimer les erreurs de frappe. Trouver ensuite les 6 prénoms les plus fréquents. Pour le prénom le plus fréquent, déterminez grâce à la variable de l’année de naissance à quelles périodes ce prénom était le plus populaire. Croiser ensuite les 6 prénoms les plus fréquents avec la ville (recodée en Paris/Hors Paris) et commenter les résultats obtenus.
Sexe Recoder les années de promotion en une nouvelle variable de classes (par décennies, par exemple), pour la croiser ensuite avec le sexe. Commenter les résultats. Croiser ensuite le sexe avec le rang d’entrée (en utilisant un recodage) et commenter les résultats obtenus.
Date de naissance Recoder la date de naissance pour obtenir une variable de l’âge lors de l’entrée aux Mines, en déduire l’âge normal d’entrée aux Mines et recoder une variable qui indique si un élève est entré aux Mines avant, pendant ou après l’âge normal d’entrée. Croiser ensuite cette variable avec le sexe. Commenter. Croiser cette variable avec l’année de promotion (si besoin, en recodant cette dernière aussi).
Pays de naissance Recoder la variable du pays de naissance en distingant plusieurs groupes de pays (par exemple, France métropolitaine, colonies françaises et autres pays). Croiser ensuite cette variable avec le sexe, puis avec l’année de naissance des élèves (si besoin, en recodant cette dernière variable également).
Ville de naissance Recoder la variable de la ville selon que l’élève est né à Paris, en région parisienne ou ailleurs. Croiser cette variable avec le sexe, puis avec le rang d’entrée aux Mines (si besoin en recodant également le rang d’entrée).
Rang d’entrée Recoder la variable du rang d’entrée selon que l’élève est “major”, “dernier reçu” ou autre, puis croiser cette variable avec le sexe. Croiser ensuite avec le rang de sortie (si besoin en le recodant lui aussi).
Promotion année Commencer par repérer les années avec le plus grand nombre d’élèves. Commenter. Puis Recoder cette variable en classes de votre choix pour la croiser avec le sexe d’abord, puis la ville d’origine des candidats (si besoin en recodant cette variable également).

Introduction : utilité et objectifs du recodage

Nous chargeons la base de données dans la variable mines :

# Charger des données dans la variable cpes
library(here)
mines <- readRDS(here("data", "mines_clean.rds"))

Les variables d’une base de données sont souvent inadaptées aux analyses qu’on souhaite pratiquer. Par exemple, nous aimerions connaître la provenance des candidats par ville de naissance :

villes_tap <- table(mines$ne_ville)

Ce tri à plat ne nous aide pas à décrire la variable, car son nombre de modalités est trop élevé.

Nous pourrions certes tronquer le tri à plat, de sorte à ne garder que les villes de naissance les plus fréquentes :

villes_tap_tri <- sort(villes_tap, decreasing = TRUE)
head(villes_tap_tri)
## 
##      Paris       Lyon    Neuilly  Marseille Strasbourg      Nancy 
##        261         24         20         18         17         14

Mais cette solution a de nombreuses limites :

C’est pourquoi il serait plus utile de créer une nouvelle variable “né·e à Paris” à partir de la variable “ville de naissance”. Cette variable indiquerait simplement si la personne est née à Paris ou hors de Paris.

L’acte de créer une nouvelle variable à partir d’autres variables s’appelle le recodage. C’est une étape presque incontournable de toute analyse statistique.

Qu’est-ce que le recodage ?

Le recodage peut prendre de très nombreuses formes. Parmi les plus fréquentes, on retiendra :

  • modifier le type de la variable (quanti -> quali, quali -> quanti)
  • changer les modalités d’une variable qualitative (souvent pour les réduire)
  • modifier les valeurs d’une variable quantitative (par exemple, calculer un âge à partir de la date de naissance)
  • enlever des valeurs rares ou aberrantes
  • combiner l’information de plusieurs variables dans une seule nouvelle variable

Comment recoder ?

Dans ce document, nous allons voir quelques commandes R utiles pour procéder aux recodages les plus fréquents.

# Chargeons quelques paquets R utiles au recodage
library(tidyverse)
library(dplyr)

Regrouper les modalités d’une variable qualitative

Reprenons notre exemple avec les villes. Essayons de créer une variable qui indiquerait simplement si la personne est née à Paris ou hors de Paris.

mines <- mutate(mines,
                ne_paris = case_when(
                  ne_ville == "Paris" ~ "Né à Paris",
                  ne_ville != "Paris" ~ "Hors de Paris",
                  TRUE ~ ne_ville
                  ))

Observons les résultats produits par ce recodage :

table(mines$ne_paris)
## 
## Hors de Paris    Né à Paris 
##           826           261

On peut maintenant utiliser cette variable pour faire des tableaux croisés :

library(questionr)
tab_paris_sexe = table(mines$ne_paris, mines$sexe)
prop(tab_paris_sexe)
##                
##                 F     M     Total
##   Hors de Paris   2.4  73.6  76.0
##   Né à Paris      0.3  23.7  24.0
##   Total           2.7  97.3 100.0

Faire des classes à partir d’une variable quantitative

Nous voulons recoder la date de naissance pour créer une variable qualitative contenant des classes (né entre XXXX et XXXX).

mines <- mutate(mines,
                classe_naissance = case_when(
                  ne_date_a <= 1850 ~ "1819-1850",
                  ne_date_a <= 1900 ~ "1851-1900",
                  ne_date_a <= 1950 ~ "1901-1950",
                  ne_date_a <= 1974 ~ "1951-1974",
                  TRUE ~ as.character(ne_date_a)
                ))

Autre possibilité :

mines <- mutate(mines,
                classe_naissance2 = cut(ne_date_a,
                                       breaks = seq(1800, 2000, by=50),
                                       dig.lab = 4))

Tri à plat de la nouvelle variable :

freq(mines$classe_naissance)
freq(mines$classe_naissance2)

Changer la valeur d’une variable

Pour une variable qualitative (facteur dans R) :

# Vérifier si la variable est un facteur
str(mines$prenom1)
##  chr [1:1150] "Emile" "Jean" "Alexandre" "Louis" "Leopold" "Georges" ...
# Si ce n'est pas le cas, la transformer en facteur
mines$prenom1_f <- as.factor(mines$prenom1)

# Maintenant, procéder au recodage
mines$prenom1_f <- fct_collapse(mines$prenom1_f,
  "Jean-Philippe" = c("Jean- Phillipe"), # Recoder "Jean- Phillipe" en "Jean-Philippe"
  "Philippe" = c("Phillipe", "Phillippe") # Recoder "Phillipe" et "Phillippe" en "Philippe"
)

Pour une variable quantitative :

mines <- mutate(mines,
                ne_date_m = case_when(
                  ne_date_m == 19 ~ 10,
                  TRUE ~ ne_date_m
                ))

Enlever des valeurs

Par exemple, enlevons les élèves dont nous n’avons pas l’année de naissance :

mines_sans_na <- filter(mines, !is.na(ne_date_a))

nrow(mines)
## [1] 1150
nrow(mines_sans_na)
## [1] 1127

On pourrait aussi enlever tous les élèves dont nous avons l’année de naissance :

mines_na <- filter(mines, is.na(ne_date_a))

Attention : lorsqu’on retire des individus, il faut absolument créer une base de données à part pour cela, et bien indiquer que cette opération a changé l’échantillon.

Combiner de l’information de plusieurs variables

Créons une variable combinant le sexe des élèves avec leur pays de naissance :

mines <- mutate(mines,
                sexe_pays = case_when(
                  (sexe == "F") & (ne_pays == "France") ~ "Femme née en France",
                  (sexe == "F") & (ne_pays != "France") ~ "Femme née hors de France",
                  (sexe == "M") & (ne_pays == "France") ~ "Homme né en France",
                  (sexe == "M") & (ne_pays != "France") ~ "Homme né hors de France",
                  TRUE ~ "Autre"
                ))

table(mines$sexe_pays)
## 
##                    Autre      Femme née en France Femme née hors de France 
##                       50                       26                        3 
##       Homme né en France  Homme né hors de France 
##                     1025                       46

Fonctions utiles pour le recodage

mutate() pour créer une nouvelle variable

mutate(base_de_donnees, nouvelle_var = xxx)

Combinée avec la fonction case_when(), nous pouvons effectuer la majeure partie des recodages dont nous avons besoin :

# Recodage de base_de_donnees$ancienne_variable
mutate(base_de_donnees,
       nouvelle_var = case_when(
         condition 1 du recodage ici ~ nouvelle valeur,
         condition 2 du recodage ici ~ autre nouvelle valeur,
         TRUE ~ ancienne_variable
       ))

filter() pour sélectionner des individus dans une base

Syntaxe :

filter(base_de_donnees, condition de filtre)

Par exemple, gardons seulement les élèves nés au mois de novembre :

filter(mines, ne_date_m == 11)

select() pour sélectionner des colonnes dans une base

Syntaxe :

filter(base_de_donnees, nom_de_la_colonne)

Par exemple, ne gardons que le nom des élèves et leur année de promotion :

select(mines, nom, promotion_a)

Enchaîner les commandes avec %>%

Quand les paquets tidyverse et dplyr sont chargés, R vous permet d’enchaîner des commandes avec l’opérateur %>% (prononcé “pipe” comme “tuyau” en anglais).

Par exemple, au lieu de faire :

mines2 <- filter(mines, !is.na(ne_date_a))
mines2 <- select(mines2, entree_rang)
mines2 <- mutate(mines2, premier = case_when(
  entree_rang == 1 ~ "Premier",
  TRUE ~ "Pas premier"
))

Nous pouvons faire :

mines2 <- mines %>%
  filter(!is.na(ne_date_a)) %>%
  select(entree_rang) %>%
  mutate(premier = case_when(
    entree_rang == 1 ~ "Premier",
    TRUE ~ "Pas premier"
  ))

On peut lire l’opérateur %>% comme “puis…” :

mines2 <- mines %>% # On prend la base de données mines, puis...
  filter(!is.na(ne_date_a)) %>% # On enlève les individus qui n'ont pas d'année de naissance, puis...
  select(entree_rang) %>% # On garde seulement la colonne du rang d'entrée, puis...
  mutate(premier = case_when( # On ajoute une variable nommée "premier"
    entree_rang == 1 ~ "Premier",
    TRUE ~ "Pas premier"
  ))