Le facteur sonne toujours deux fois

Les facteurs sont utilisés pour représenter des variables catégorielles. C’est un type particulier de données dans R. On les utilise pour décrire des données statistiques dans des tableaux de comptage, des modèles et des graphiques.
stats
analyse de données
facteurs
R
Auteur·rice
Date de publication

23, décembre 2024

Les facteurs (voir « 4 Les facteurs | Exploration de données avec R — bookdown.org ») sont utilisés pour représenter des variables catégorielles. C’est un type particulier de données dans R. On s’en sert pour décrire des données statistiques dans des tableaux de comptage, des modèles et des graphiques. Recemment, on m’a demandé de l’aide sur le code suivant:

library('questionr')
library('dplyr')

data(hdv2003)

hdv2003 <- hdv2003 %>% 
  mutate(trage = case_when(
    age < 15 ~ "1. moins de 15 ans",
    age < 30 ~ "2. entre 15 et 29 ans",
    age < 60 ~ "3. entre 30 et 59 ans",
    age >= 60 ~ "4. 60 ans ou plus",
    TRUE ~ "Indeterminé"
  ))

freq(hdv2003$trage)
                         n    % val%
2. entre 15 et 29 ans  302 15.1 15.1
3. entre 30 et 59 ans 1182 59.1 59.1
4. 60 ans ou plus      516 25.8 25.8

L’auteur souhaitait que la modalité "1. moins de 15 ans" apparaisse dans le tri à plat de trage. Il a donc eu l’idée d’utiliser une factorisation. La méthode qu’il a employé était la suivante:

hdv2003 <- hdv2003 %>% 
  mutate(trage_fac = as.factor(trage))

freq(hdv2003$trage_fac)
                         n    % val%
2. entre 15 et 29 ans  302 15.1 15.1
3. entre 30 et 59 ans 1182 59.1 59.1
4. 60 ans ou plus      516 25.8 25.8

Surprise, la modalité "1. moins de 15 ans" n’apparait toujours pas. Il a donc essayé de refactoriser en précisant les niveaux, avec la fonction levels().

levels(hdv2003$trage_fac) <- c("1. moins de 15 ans", "2. entre 15 et 29 ans", "3. entre 30 et 59 ans", "4. 60 ans ou plus")
freq(hdv2003$trage_fac)
                         n    % val%
1. moins de 15 ans     302 15.1 15.1
2. entre 15 et 29 ans 1182 59.1 59.1
3. entre 30 et 59 ans  516 25.8 25.8
4. 60 ans ou plus        0  0.0  0.0

Patatra … les niveaux ne correspondent plus.

Que s’est-il passé ?

La discrétisation ne garde pas trace des modalités souhaitées. Ainsi, lorsqu’on a appliqué as.factor(), on convertit une variable en facteur, R stocke la variable sous forme de vecteur de valeurs entières avec un ensemble correspondant de valeurs de caractères à utiliser lorsque le facteur est affiché. Ces valeurs de caractères sont les niveaux (levels) du facteur.

Solution

On reprend la variable catégorielle et on la factorise à l’aide de la fonction factor() en précisant l’argument levels = selon un vecteur composé des catégories souhaitées.

hdv2003 <- hdv2003 %>%
  mutate(trage_fac = factor(
    trage,
    levels = c(
      "1. moins de 15 ans",
      "2. entre 15 et 29 ans",
      "3. entre 30 et 59 ans",
      "4. 60 ans ou plus"
    )
  ))
freq(hdv2003$trage_fac)  
                         n    % val%
1. moins de 15 ans       0  0.0  0.0
2. entre 15 et 29 ans  302 15.1 15.1
3. entre 30 et 59 ans 1182 59.1 59.1
4. 60 ans ou plus      516 25.8 25.8

Références

« 4 Les facteurs | Exploration de données avec R — bookdown.org ». https://bookdown.org/ael/rexplor/chap3.html.

Vous aimez ce blog RStats? Soutenez-le !

Envoyez moi un mail