8. Facteurs

Le terme de facteur est employé en R pour désigner une variable catégorielle que l’on utilise pour regrouper des données de même nature.

A titre d’exemple, dans le chapitre Un aperçu du fonctionnement de R, le type de carburant a été utilisé comme facteur pour identifier chaque type de véhicule à l’affichage.

Un facteur peut être ordonné ou non ordonné.

8.1. Exemple

Pour illustrer la notion de facteur, on va considérer les données relatives aux 20 meilleures entrées au cinéma en France, telles que disponibles sur Allociné.

Les données sont fournies sous la forme de vecteurs dans ce fichier.

> titres
 [1] "Titanic"
 [2] "Bienvenue chez les Ch'tis"
 [3] "Intouchables"
 [4] "Blanche-Neige et les sept nains"
 [5] "La Grande Vadrouille"
 [6] "Autant en emporte le vent"
 [7] "Il était une fois dans l'Ouest"
 [8] "Le Livre de la jungle"
 [9] "Avatar"
[10] "Les 101 Dalmatiens"
[11] "Astérix et Obélix : Mission Cléopâtre"
[12] "Les Dix Commandements"
[13] "Ben-Hur"
[14] "Les Visiteurs"
[15] "Le Pont de la rivière Kwaï"
[16] "Cendrillon"
[17] "Le Petit Monde de don Camillo"
[18] "Les Aristochats"
[19] "Qu'est-ce qu'on a fait au Bon Dieu ?"
[20] "Le Jour le plus long"

> entrees
 [1] 20634793 20489303 19490688 18319651 17273065 14563937 14862764 14696567
 [9] 14677888 14660594 14559509 14229745 13826124 13782991 13481750 13216631
[17] 12791168 12541369 12366033 11933629

> genres
 [1] "Drame"           "Comédie"         "Drame"           "Animation"
 [5] "Comédie"         "Romance"         "Western"         "Animation"
 [9] "Science fiction" "Animation"       "Comédie"         "Peplum"
[13] "Peplum"          "Comédie"         "Guerre"          "Animation"
[17] "Comédie"         "Animation"       "Comédie"         "Guerre"

Pour utiliser le vecteur genres comme une variable catégorielle, on utilise la fonction factor():

> f_genres <- factor(genres)

L’affichage est maintenant légèrement différent et inclut maintenant des levels, c’est à dire les occurences uniques des valeurs ayant servi à constituer le vecteur de facteurs. En termes mathématiques, il s’agit d’un ensemble:

> f_genres
 [1] Drame           Comédie         Drame           Animation
 [5] Comédie         Romance         Western         Animation
 [9] Science fiction Animation       Comédie         Peplum
[13] Peplum          Comédie         Guerre          Animation
[17] Comédie         Animation       Comédie         Guerre
8 Levels: Animation Comédie Drame Guerre Peplum Romance ... Western

Lorsqu’un vecteur a été identifié comme un vecteur de facteurs, on obtient la liste des facteurs avec la fonction levels():

> levels(f_genres)
[1] "Animation"       "Comédie"         "Drame"           "Guerre"
[5] "Peplum"          "Romance"         "Science fiction" "Western"

8.2. Groupement

Lorsqu’on travaille avec des vecteurs, les facteurs permettent d’effectuer des opérations sur des groupements de données avec la fonction R core tapply().

On peut compter le nombre de films dans chaque catégorie avec un groupement indiqué par le vecteur f_genres:

> tapply(entrees, f_genres, length)
      Animation         Comédie           Drame          Guerre
              5               6               2               2
         Peplum         Romance Science fiction         Western
              2               1               1               1

ou la moyenne des entrées:

> tapply(entrees, f_genres, mean)
      Animation         Comédie           Drame          Guerre
       14686962        15210345        20062740        12707690
         Peplum         Romance Science fiction         Western
       14027934        14563937        14677888        14862764

Important

La très grande majorité du temps les données seront structurées en data frames et les opérations de groupement se feront avec la fonction group-by() du package dplyr.

8.3. Facteurs ordonnés

Les facteurs précédents n’avaient pas de relation d’ordonnancement. Ils ont été affichés par ordre alphabétique.

On peut cependant imposer aux facteurs d’être ordonnés suivant une certaine logique. Pour illustrer ça, imaginons un magasin de tee shirts qui doit gérer un stock de différentes tailles:

> sizes <- c("m", "xl", "l", "xs", "s", "m", "m", "l")
> us <- factor(sizes)
> us
[1] m  xl l  xs s  m  m  l
Levels: l m s xl xs

Sans précautions particulières, comme attendu, les facteurs sont ordonnés par ordre alphabétique ce qui manque de pertinence. La fonction factor() admet un argument levels qui apporte une solution à ce problème:

> os <- factor(sizes, levels = c("xs", "s", "m", "l", "xl"))
> os
[1] m  xl l  xs s  m  m  l
Levels: xs s m l xl

On peut également utiliser la fonction ordered() qui effectue le même travail, mais permet un affichage plus efficace:

> os2 <- ordered(sizes, levels = c("xs", "s", "m", "l", "xl"))
> os2
[1] m  xl l  xs s  m  m  l
Levels: xs < s < m < l < xl

Exercice

Créer manuellement un vecteur ranking contenant 20 valeurs représentant une appréciation personnelle de chacun des 20 films parmi les 5 suivantes : « Exceptionnel », « Bien », « Pas mal », « Bof », « A fuir ». Manifestement la présentation par ordre alphabétique ne reflète pas l’appréciation du film. Créer un vecteur de facteurs ordonnés. Utilisez le pour faire la moyenne du nombre d’entrées des films en fonction de votre niveau d’appréciation.

8.4. Tables de contingence

Un facteur (ou variable catégorielle) permet d’effectuer des groupements de variables. A partir de ces groupements, on peut effectuer un comptage des données groupées et obtenir une table de contingence (frequency table).

Astuce

Si on en utilise deux, on effectue des groupements d’ordre 2, c’est à dire qu’on utilise un deuxième facteur pour effectuer une deuxième opération de groupement dans les sous groupes constitués lors de la première étape. Et ainsi de suite…

La fonction table() permet de produire une table de contingence. S’il y a k facteurs dans les données, on obtient k groupements et une table de contingence comprenant k valeurs.

On lance 100 fois un dé (non pipé):

> x <- sample(1:6, size=100, replace=T)

On identifie les valeurs obtenues comme étant des facteurs (variables catégorielles):

> xf <- factor(x)
> str(xf)
Factor w/ 6 levels "1","2","3","4",..: 5 3 1 5 6 4 2 4 3 4 ...

On peut afficher les propriétés du vecteur xf, du plus haut au plus bas niveau:

> class(xf)
[1] "factor"

> mode(xf)
[1] "numeric"

> typeof(xf)
[1] "integer"

On obtient la table de contingence avec la fonction table():

> table(xf)
xf
 1  2  3  4  5  6
17 27 15 19 11 11

Ce qui indique que le 1 a été tiré 17 fois, le 2 27 fois, etc…