Facteur en R : variable catégorielle et variables continues

⚡ Résumé intelligent

En R, la fonction Factor stocke les données catégorielles sous forme de vecteur de codes entiers associés à un ensemble de niveaux, ce qui permet au langage de séparer un groupe limité de catégories d'une mesure continue.

  • 🏷️ Structure: Un facteur contient des codes entiers plus un attribut de niveaux, de sorte que chaque catégorie est validée par rapport à une liste fixe.
  • 🧩 Création: factor() convertit un vecteur de caractères, et class() confirme que le résultat a été transformé de caractères en facteur.
  • (I.e. Nominal: Sans argument de niveaux, R trie lui-même les catégories, donc aucun classement entre les couleurs ou les genres n'est sous-entendu.
  • (I.e. Ordinal: L'option ordered = TRUE, associée à un vecteur de niveaux explicite, fixe le classement du plus bas au plus haut.
  • (I.e. Continu: Les colonnes numériques et entières restent continues par défaut, comme le démontre class(mtcars$mpg).
  • ⚠️ Piège de conversion : La méthode as.numeric() appliquée à un facteur renvoie les codes de niveau ; il faut donc d’abord lire l’étiquette à l’aide de levels().
  • 🧠 Entretien: relevel() définit la base de référence du modèle et droplevels() efface les catégories laissées de côté par un sous-ensemble.

Facteurs dans R : variables catégorielles et variables continues

Qu’est-ce que le facteur dans R ?

Facteur en R Un facteur est une variable utilisée pour catégoriser et stocker des données, avec un nombre limité de valeurs différentes. Il stocke les données sous forme de vecteur d'entiers. En R, le facteur est également connu comme une variable catégorielle qui stocke des valeurs de type chaîne de caractères et entier. Il est principalement utilisé en modélisation statistique et en analyse exploratoire de données avec R.

En interne, un facteur est constitué de deux objets voyageant ensemble : un vecteur d’entiers de codes et un attribut de caractère nommé niveauxChaque code correspond à une position dans le vecteur des niveaux, c'est pourquoi l'affichage d'un facteur montre des mots tandis que déclasser() affiche des chiffres.

Dans un jeu de données, on peut distinguer deux types de variables : catégorique et continu.

  • Dans les statistiques descriptives des variables catégorielles dans R, la valeur est limitée et généralement basée sur un groupe fini particulier. Par exemple, une variable catégorielle dans R peut être le pays, l'année, le sexe, la profession.
  • Une variable continue, en revanche, peut prendre n'importe quelle valeur, de l'entier au décimal. Par exemple, on peut avoir le chiffre d'affaires, le prix d'une action, etc.

Il est important de préserver cette distinction, car R choisit silencieusement des valeurs par défaut différentes pour chaque type. Une colonne numérique est résumée par une moyenne et une médiane, tandis qu'une colonne de facteurs est résumée par le nombre d'occurrences par niveau. Stocker une catégorie sous forme de texte ou de nombre modifie donc l'analyse obtenue. L'ensemble des modes de stockage est présenté dans le guide. Types de données et opérateurs R.

Variables catégorielles

Variables catégorielles dans R sont stockées dans un facteur. Examinons le code ci-dessous pour convertir une variable de type caractère en variable de type facteur dans R. De nombreuses routines de modélisation et d'apprentissage automatique ne peuvent pas traiter du texte brut ; les catégories doivent donc être encodées sous forme de niveaux ou de nombres avant l'entraînement du modèle.

Syntaxe

factor(x = character(), levels, labels = levels, ordered = is.ordered(x))

La documentation de référence de base de R présente deux arguments supplémentaires que la forme abrégée ci-dessus omet : exclure, qui supprime les valeurs avant la construction de l'ensemble de niveaux, et nmax, une limite supérieure sur le nombre de niveaux qui accélère la conversion de très grands vecteurs.

Arguments:

  • x: Un vecteur de données catégorielles en R. Doit être une chaîne de caractères ou un entier, pas un nombre décimal.
  • niveaux: Un vecteur des valeurs possibles de x. Cet argument est facultatif. La valeur par défaut est la liste unique des éléments du vecteur x, triés par ordre croissant.
  • quiAjoutez une étiquette aux données catégorielles x dans R. Par exemple, 1 peut prendre l'étiquette « homme » tandis que 0, l'étiquette « femme ».
  • exclure: Vecteur de valeurs à exclure lors de la formation de l'ensemble de niveau. Les valeurs exclues deviennent NA dans le résultat.
  • commandé: Un indicateur logique qui détermine si les niveaux doivent être considérés comme ordonnés, dans l'ordre indiqué.
  • nmax: Une limite supérieure optionnelle sur le nombre de niveaux, utile pour les vecteurs longs.

Exemple :

Convertissons un vecteur de caractères en un facteur et confirmons la modification avec class().

# Create gender vector
gender_vector <- c("Male", "Female", "Female", "Male", "Male")
class(gender_vector)
# Convert gender_vector to a factor
factor_gender_vector <-factor(gender_vector)
class(factor_gender_vector)

Sortie :

## [1] "character"
## [1] "factor"

La classe est passée de caractère à facteur, mais rien n'a changé dans les valeurs affichées. Il est important de transformer un string dans une variable de facteur dans R avant une tâche d'apprentissage automatique, car c'est à ce stade que les catégories deviennent un ensemble fixe et validé.

Une variable catégorielle dans R peut être divisée en variable catégorielle nominale et variable catégorielle ordinale.

Variable catégorielle nominale

Une variable catégorielle nominale peut prendre plusieurs valeurs, mais leur ordre est indifférent. Par exemple, homme ou femme. En R, les variables catégorielles nominales ne sont pas ordonnées.

# Create a color vector
color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow')
# Convert the vector to factor
factor_color <- factor(color_vector)
factor_color

Sortie :

## [1] blue   red    green  white  black  yellow
## Levels: black blue green red white yellow

L'argument `factor_color` ne permet pas de déterminer l'ordre des valeurs. La liste des niveaux est alphabétique uniquement parce qu'aucun argument `levels` n'a été fourni ; R a donc trié lui-même les valeurs uniques. Ce tri suit les paramètres régionaux actifs et non l'ASCII brut, ce qui explique pourquoi il est important de spécifier explicitement les niveaux lorsque l'ordre est pertinent.

Variable catégorielle ordinale

Les variables catégorielles ordinales possèdent un ordre naturel. Ce classement découle de l'ordre du vecteur transmis à la fonction. niveaux L'argument `ordered` et l'argument `ordered` défini sur `TRUE` indiquent à R de traiter cette séquence comme un classement plutôt que comme une simple liste. Définir `ordered` sur `FALSE` ne modifie pas le classement ; cela produit simplement un facteur non ordonné. Pour classer du plus élevé au plus bas, inversez le vecteur `levels` lui-même.

Exemple :

Nous pouvons utiliser le résumé pour compter les valeurs de chaque variable factorielle dans R.

# Create Ordinal categorical vector 
day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening')
# Convert `day_vector` to a factor with ordered level
factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight'))
# Print the new variable
factor_day

Sortie :

## [1] evening   morning   afternoon midday    
midnight  evening

La console affiche d'abord les valeurs, puis le classement. Le bloc suivant s'ouvre sur la ligne Levels, toujours commentée ; le classement reste donc visible pendant l'ajout de l'appel à summary() au code précédent.

## Levels: morning < midday < afternoon < evening < midnight
# Append the line to above code
# Count the number of occurence of each level
summary(factor_day)

Sortie :

##   morning    midday afternoon   evening  midnight
##         1         1         1         2         1

R a ordonné le niveau de « matin » à « minuit », conformément à l'argument `levels`. Le facteur étant ordonné, les opérateurs de comparaison tels que `<` et `>` s'appliquent également, contrairement au facteur de couleur nominal mentionné précédemment.

Variables continues

Les variables continues sont le comportement par défaut dans R. Elles sont stockées sous forme numérique ou entière. On peut le constater avec l'exemple du jeu de données ci-dessous. `mtcars` est un jeu de données intégré qui rassemble des informations sur différents types de voitures. On peut l'importer avec `mtcars` et vérifier le type de la variable `mpg` (mile par gallon). Elle renvoie une valeur numérique, indiquant qu'il s'agit d'une variable continue.

dataset <- mtcars
class(dataset$mpg)

Sortie

## [1] "numeric"

Toutes les colonnes numériques ne sont pas réellement continues. Dans le même jeu de données, la colonne « cyl » ne contient que les valeurs 4, 6 et 8, et la colonne « am » que les valeurs 0 et 1 ; il s’agit donc de catégories stockées sous forme de nombres. Les convertir avec la fonction `factor()` avant la modélisation empêche R de considérer l’écart entre les valeurs de 4 et 6 cylindres comme une quantité mesurée. L’opération inverse, consistant à découper une colonne continue en bandes, est gérée par la fonction `cut()`.

Niveaux et étiquettes des facteurs dans R

L'attribut « levels » est la partie d'un facteur que vous passerez le plus de temps à ajuster, car il détermine à la fois ce qui est affiché et ce qu'un modèle considère comme la valeur de référence. Quatre fonctions utilitaires de base de R couvrent la quasi-totalité des cas.

Fonction Ce qu'il fait Utilisation typique
niveaux(f) Lit ou remplace les noms de niveau Renommer les abréviations en étiquettes lisibles
nniveaux(f) Renvoie le nombre de niveaux La vérification d'une catégorie n'a pas provoqué d'explosion après une jointure.
relevel(f, ref) Se déplace d'un niveau vers l'avant Choisir la ligne de base pour une régression
droplevels(f) Supprime les niveaux comportant zéro observation. Nettoyage après sous-ensemble ou filtrage

Le bloc ci-dessous applique ces quatre facteurs aux critères de couleur et de genre créés précédemment.

# Inspect the levels of an existing factor
levels(factor_color)          # the level names, in the order R stored them
nlevels(factor_color)         # how many distinct levels exist

# Rename the levels in place (the new vector must follow the same order)
levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow')

# Attach labels at creation time instead of renaming afterwards
gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male'))

# Make 'male' the reference level that modelling functions compare against
gender_coded <- relevel(gender_coded, ref = 'male')

# Remove levels that survived a subset but no longer occur in the data
subset_color <- droplevels(factor_color[1:3])

Deux détails sont à retenir. L'affectation à `levels()` renomme par position ; un vecteur mal adapté est donc silencieusement réétiqueté dans la mauvaise catégorie. De plus, un sous-ensemble conserve chaque niveau d'origine jusqu'à l'appel à `droplevels()`, ce qui explique pourquoi un sous-ensemble filtré trame de données Il est toujours possible de tracer des barres vides. qui L'argument est encore différent : il nomme les niveaux au moment de la création, et les étiquettes dupliquées fusionnent plusieurs valeurs d'entrée en un seul niveau.

Comment convertir un facteur en numérique ou en caractère en R ?

Il s'agit du bug le plus fréquent lié aux facteurs dans R. Un facteur stockant des codes numériques, l'appel à `as.numeric()` renvoie ces codes au lieu des valeurs affichées à l'écran. Un facteur contenant les années 2021 à 2023 sera donc renvoyé comme 1, 2 et 3.

# A factor whose labels happen to look like numbers
year_factor <- factor(c('2021', '2023', '2022', '2023'))

# WRONG: this returns the internal codes 1, 3, 2, 3 - not the years
as.numeric(year_factor)

# RIGHT: read the label through the levels attribute first
as.numeric(levels(year_factor))[year_factor]

# Equivalent and easier to remember, but slightly slower
as.numeric(as.character(year_factor))

# Back to plain text
as.character(year_factor)

La documentation de base de R recommande `as.numeric(levels(f))[f]` comme méthode correcte et légèrement plus rapide, tandis que `as.numeric(as.character(f))` est son équivalent plus lisible. Les deux méthodes lisent d'abord l'étiquette, puis effectuent la conversion.

  • Facteur de caractère: as.character(f) renvoie les étiquettes sous forme de texte brut.
  • Codes de conversion de facteurs en entiers: as.integer(f) ou unclass(f) lorsque les codes sont ce que vous voulez réellement.
  • Caractère à facteur: factor(x) ou le raccourci plus rapide as.factor(x).
  • Convertir numériquement en facteur: factor(x) pour les codes discrets, cut(x, breaks) pour les valeurs continues qui nécessitent un regroupement.

Une seule mesure de sécurité s'applique à tous. Si une valeur de x n'apparaît pas dans le vecteur levels, factor() attribue la valeur NA à cet élément au lieu de générer une erreur. Ainsi, un espace superflu ou une différence de casse peut entraîner la suppression silencieuse de lignes. Comparer les valeurs uniques avant et après la conversion, ou trier le cadre de données La nouvelle colonne met rapidement en évidence le problème.

Facteur, caractère ou numérique en R : quand utiliser chaque type ?

Choisir le mode de stockage dès le départ permet d'éviter de nombreux débogages ultérieurs. Le tableau compare les trois modes que peut prendre une colonne de texte ou de code.

Propriétés Facteur Personnage Numérique
Stocké sous Codes entiers plus un attribut de niveaux String Doubles ou entiers
Ensemble fixe de valeurs Oui, définis par niveaux Non Non
Ordre d'affichage personnalisé Oui, par niveaux Par ordre alphabétique uniquement Numérique uniquement
Arithmétique Non autorisé Non autorisé Autorisé
Contrastes de modèles Construit automatiquement Contraint en premier Traitée comme une mesure

Utiliser un facteur lorsque les valeurs proviennent d'une liste connue et fermée, lorsque l'ordre d'affichage ou de classement est important, ou lorsque la colonne alimente un modèle ou une légende de graphique. Utilisez-la. caractère pour le texte libre, les identifiants et tout ce que vous analyserez ou combinerez, comme les noms, les notes et les codes qui arrivent continuellement avec de nouvelles valeurs. numérique uniquement lorsque la distance entre deux valeurs est significative.

Le bloc ci-dessous présente les moyens les plus rapides de vérifier ce que vous possédez réellement.

# Ask R what each column of a data frame actually is
sapply(mtcars, class)

# Direct membership tests
is.factor(factor_day)
is.ordered(factor_day)

# unclass() exposes the integer codes hiding behind the labels
unclass(factor_color)

Deux habitudes garantissent un choix judicieux. Exécutez `sapply(df, class)` après chaque importation, car un seul caractère parasite dans une colonne numérique transforme toute la colonne en texte. Et convertissez en facteur le plus tard possible, après le nettoyage et la fusion des données, afin que… déplyr Les jointures et les filtres comparent toujours des chaînes de caractères simples plutôt que des ensembles de niveaux incompatibles.

FAQ

Lorsque l'argument `levels` n'est pas fourni, la fonction `factor()` appelle `unique()` et trie les valeurs par ordre croissant. Ce tri dépend des paramètres régionaux actifs et ne correspond donc pas toujours à l'ASCII standard. Il est recommandé de spécifier explicitement l'argument `levels` lorsque l'ordre des valeurs est important.

`table(f)` renvoie un nombre d'occurrences nommé pour chaque niveau, et `prop.table(table(f))` convertit ces nombres en proportions. Les deux fonctions conservent les niveaux vides visibles, ce qui les rend utiles pour repérer les catégories qui ont disparu après le filtrage. trame de données.

La fonction `factor()` compare chaque élément aux niveaux que vous avez fournis. Toute valeur sans correspondance est remplacée par `NA` au lieu de générer une erreur. Avant la conversion, vérifiez `setdiff(unique(x), your_levels)` et soyez attentif aux espaces superflus et aux différences de casse dans les données sources.

La fonction `cut()` divise un vecteur numérique aux points de rupture que vous spécifiez et renvoie un facteur. Indiquez des étiquettes pour nommer les bandes de manière plus claire et spécifiez `ordered_result = TRUE` si les bandes sont classées. La fonction `findInterval()` est plus rapide lorsqu'il suffit de connaître l'indice de la classe.

Depuis R 4.0.0, la valeur par défaut de `stringsAsFactors` pour `data.frame()` et `read.csv()` est `FALSE`, ce qui garantit que les colonnes de texte restent au format caractère. Les scripts plus anciens qui utilisaient une conversion automatique doivent désormais appeler explicitement `factor()` sur les colonnes qu'ils modélisent.

Less qu'auparavant. La documentation de base de R indique que les chaînes de caractères identiques partagent désormais le même espace de stockage, ce qui réduit considérablement l'écart dans la plupart des cas. L'utilisation de facteurs reste avantageuse pour valider les catégories et fixer l'ordre des niveaux utilisés dans les modèles et les graphiques.

La plupart des fonctions de modélisation acceptent directement les facteurs et créent automatiquement des contrastes fictifs, tandis que de nombreuses machine learning Les packages attendent une matrice numérique. La fonction `model.matrix()` ou l'encodage one-hot permettent de combler cette lacune, et un facteur ordonné peut conserver son classement.

Oui. Copilote GitHub Fonctionne avec RStudio 2023.09.0 et versions ultérieures et propose des suggestions de complétion à partir des commentaires et du code du fichier ouvert. L'ordre des niveaux et la gestion des valeurs NA sont des suggestions à vérifier, et non des faits avérés.

Résumez cet article avec :