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.
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.

