Les facteurs
Objectifs d’apprentissage
Les facteurs permettent de stocker des variables catégorielles, c’est-à-dire des variables qui prennent un nombre limité de valeurs différentes. Les variables catégorielles entrent dans les modèles statistiques différemment des variables continues, c’est pourquoi les développeurs de R ont créé un type de données spécifique pour s’assurer que les fonctions de modélisation traiteront ces données correctement.
Vous apprendrez ici à créer et manipuler les facteurs.
Les facteurs
En pratique, les facteurs sont stockés sous la forme d’un vecteur de valeurs entières avec un ensemble correspondant de valeurs de caractères à utiliser lorsque le facteur est affiché (pensez à un dictionnaire).
Transformation d’un vecteur
Utilisez la fonction factor()
pour créer un facteur. Le seul argument indispensable pour créer un facteur est un vecteur de valeurs. Les variables numériques et les variables de caractères peuvent être transformées en facteurs, mais les niveaux d’un facteur seront toujours des valeurs de caractères. Vous pouvez voir les niveaux possibles d’un facteur grâce à la commande levels()
.
# Transformer un vecteur de caractères en facteur
data = c("a", "c", "b", "a", "a", "b")
fdata = factor(data)
fdata
## [1] a c b a a b
## Levels: a b c
# Transformer un tableau numérique en facteur
data = c(1,2,2,3,1,2,3,3,1,2,3,3,1)
fdata = factor(data)
fdata
## [1] 1 2 2 3 1 2 3 3 1 2 3 3 1
## Levels: 1 2 3
Définir les niveaux
Les niveaux d’un facteur sont utilisés lors de l’affichage des valeurs du facteur. Vous pouvez changer ces niveaux au moment où vous créez un facteur en passant un vecteur avec les nouvelles valeurs par l’argument labels=
. Notez que cela change en fait les niveaux internes du facteur, et pour changer les étiquettes d’un facteur après sa création, la forme d’assignation (<-
) de la fonction niveaux est utilisée.
Pour convertir les données par défaut du facteur fdata, utilisez l’argument labels =
data <- c(1,2,2,3,1,2,3,3,1,2,3,3,1)
#Definition des labels lors de la construction du facteur
fdata <- factor(data, labels = c("Weak", "Mild", "Strong"))
fdata
## [1] Weak Mild Mild Strong Weak Mild Strong Strong Weak Mild
## [11] Strong Strong Weak
## Levels: Weak Mild Strong
#Redéfinition des labels après la construction
levels(fdata) <- c('I','II','III')
fdata
## [1] I II II III I II III III I II III III I
## Levels: I II III
Les facteurs sont un moyen efficace de stocker des valeurs de caractères, car chaque chaine de caractère unique n’est stockée qu’une seule fois, et les données elles-mêmes sont stockées sous forme de vecteur d’entiers.
Pour modifier l’ordre dans lequel les niveaux seront affichés par rapport à leur ordre de tri par défaut, l’argument levels=
doit recevoir un vecteur de toutes les valeurs possibles de la variable dans l’ordre souhaité.
Considérons quelques données constituées des noms de mois :
lesMois <- c("Mars", "Avril", "Janvier", "Novembre", "Janvier",
"Septembre", "Octobre", "Septembre", "Novembre", "Août",
"Janvier", "Novembre", "Novembre", "Février", "Mai", "Août",
"Juillet", "Décembre", "Août", "Septembre", "Novembre",
"Février", "Avril")
lesMois <- factor(lesMois)
Par défaut, les niveaux seront présentés par ordre alphabétique, ce qui, dans le cas des mois, rendra la lecture des résultats un peu difficile lors de la synthèse des informations.
Par exemple, la fonction table()
nous dira combien de fois chaque mois est apparu dans notre vecteur lesMois
table(lesMois)
## lesMois
## Août Avril Décembre Février Janvier Juillet Mai Mars
## 3 2 1 2 3 1 1 1
## Novembre Octobre Septembre
## 5 1 3
Bien que les mois aient clairement un ordre, cela ne se reflète pas dans le résultat de la fonction de tableau. On peut donc déclarer l’ordre d’apparition des mois en utilisant l’argument levels =
lesMois <- factor(lesMois,levels=c("Janvier","Fevrier","MarS",
"Avril","Mai","Juin","Juillet","Aout","Septembre",
"Octobre","Novembre","Decembre"))
table(lesMois)
## lesMois
## Janvier Fevrier MarS Avril Mai Juin Juillet Aout
## 3 0 0 2 1 0 1 0
## Septembre Octobre Novembre Decembre
## 3 1 5 0
Facteurs ordonnés
Dans notre déclaration des facteurs, nous n’avons pas indiqué de notion d’ordre entre les mois. De ce fait, les opérateurs de comparaison ne vont pas fonctionner.
lesMois[2] > lesMois[3]
## Warning in Ops.factor(lesMois[2], lesMois[3]): '>' not meaningful for factors
## [1] NA
La création d’un facteur ordonné résout ce problème:
lesMois <- factor(lesMois,levels=c("Janvier","Fevrier","MarS",
"Avril","Mai","Juin","Juillet","Aout","Septembre",
"Octobre","Novembre","Decembre"), ordered = TRUE)
table(lesMois)
## lesMois
## Janvier Fevrier MarS Avril Mai Juin Juillet Aout
## 3 0 0 2 1 0 1 0
## Septembre Octobre Novembre Decembre
## 3 1 5 0
lesMois[2] > lesMois[3]
## [1] TRUE
Une autre façon couremment utilisée pour créer des facteurs est de diviser une variable numérique continue en intervalles en utilisant la fonction cut()
. L’argument break=
est utilisé pour décrire comment des plages de nombres seront converties en valeurs de facteurs. Si un nombre est fourni par l’argument breaks=
, le facteur résultant sera créé en divisant la plage de la variable en ce nombre d’intervalles de longueur égale ; si un vecteur de valeurs est fourni, les valeurs du vecteur sont utilisées pour déterminer les points de rupture. Notez que si un vecteur de valeurs est fourni, le nombre de niveaux du facteur résultant sera inférieur de un au nombre de valeurs du vecteur.
Prenons par exemple l’ensemble de données sur les femmes, qui contient la taille et le poids d’un échantillon de femmes. Si vous voulez créer un facteur correspondant au poids, avec trois niveaux également espacés :
data("women")
wfact = cut(women$height,3)
wfact
## [1] (58,62.7] (58,62.7] (58,62.7] (58,62.7] (58,62.7] (62.7,67.3]
## [7] (62.7,67.3] (62.7,67.3] (62.7,67.3] (62.7,67.3] (67.3,72] (67.3,72]
## [13] (67.3,72] (67.3,72] (67.3,72]
## Levels: (58,62.7] (62.7,67.3] (67.3,72]
table(wfact)
## wfact
## (58,62.7] (62.7,67.3] (67.3,72]
## 5 5 5
L’argument labels= argument
permet de donner des noms aux intervalles plutôt que la représentation standard en intervalle.
wfact = cut(women$height,3,labels=c('Low','Medium','High'))
table(wfact)
## wfact
## Low Medium High
## 5 5 5