.. include:: weblinks.txt .. _factors: 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 :ref:`overview`, 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é**. 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 :download:`ce fichier `. .. code-block:: r > 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 :func:`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 :func:`levels`:: > levels(f_genres) [1] "Animation" "Comédie" "Drame" "Guerre" [5] "Peplum" "Romance" "Science fiction" "Western" 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 :func:`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 :func:`group-by` du package `dplyr `_. 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 :func:`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 :func:`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 .. admonition:: 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. 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). .. tip:: 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 :func:`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 :func:`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...