Comment compter par groupe dans R

Le comptage par plusieurs groupes - parfois appelé rapports d'analyse croisée - peut être un moyen utile d'examiner des données allant des enquêtes d'opinion publique aux tests médicaux. Par exemple, comment les gens ont-ils voté par sexe et groupe d'âge? Combien de développeurs de logiciels utilisant à la fois R et Python sont des hommes contre des femmes?

Il existe de nombreuses façons de faire ce genre de comptage par catégories dans R. Ici, j'aimerais partager certains de mes favoris.

Pour les démos de cet article, j'utiliserai un sous-ensemble de l'enquête Stack Overflow Developers, qui interroge les développeurs sur des dizaines de sujets allant des salaires aux technologies utilisées. Je vais le réduire avec des colonnes pour les langues utilisées, le sexe et si elles codent comme un passe-temps. J'ai également ajouté ma propre colonne LanguageGroup pour savoir si un développeur a signalé utiliser R, Python, les deux ou ni l'un ni l'autre.

Si vous souhaitez suivre, la dernière page de cet article contient des instructions sur la façon de télécharger et de gérer les données pour obtenir le même ensemble de données que j'utilise.

Les données comportent une ligne pour chaque réponse à l'enquête et les quatre colonnes sont toutes des caractères.

str (mydata) 'data.frame': 83379 obs. de 4 variables: $ Gender: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Hobbyist: chr" Oui "" Non "" Oui "" Non "... $ LanguageGroup: chr" Python "" Python "" Ni l'un ni l'autre "" Python "...

J'ai filtré les données brutes pour rendre les tableaux croisés plus faciles à gérer, notamment en supprimant les valeurs manquantes et en prenant uniquement les deux plus grands sexes, l'homme et la femme.

Le forfait concierge

Alors, quelle est la répartition par sexe au sein de chaque groupe linguistique? Pour ce type de rapport dans une trame de données, l'un de mes outils de prédilection est la tabyl()fonction du package de conciergerie . 

La tabyl()fonction de base renvoie un bloc de données avec des nombres. Le premier nom de colonne que vous ajoutez à un tabyl()argument devient la ligne et le second la colonne

bibliothèque (concierge) tabyl (mydata, Gender, LanguageGroup)

Sexe Les deux Ni l'un ni l'autre Python R Homme 3264 43908 29044969 Femme 374 3705 1940175

Ce qui est bien, tabyl()c'est qu'il est également très facile de générer des pourcentages. Si vous voulez voir les pourcentages pour chaque colonne au lieu des totaux bruts, ajoutez adorn_percentages("col"). Vous pouvez ensuite diriger ces résultats dans une fonction de mise en forme telle que  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (chiffres = 1)

Sexe Les deux Aucun Python R Homme 89,7% 92,2% 93,7% 84,7% Femme 10,3% 7,8% 6,3% 15,3%

Pour afficher les pourcentages par ligne, ajoutez adorn_percentages("row")

Si vous souhaitez ajouter une troisième variable, telle que Hobbyist, c'est également facile.

tabyl (mydata, Gender, LanguageGroup, Hobbyist)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (chiffres = 1)

Cependant, il devient un peu plus difficile de comparer visuellement les résultats à plus de deux niveaux de cette façon. Ce code renvoie une liste avec une trame de données pour chaque choix de troisième niveau:

$ Non Sexe Les deux Ni Python R Homme 79,6% 86,7% 86,4% 74,6% Femme 20,4% 13,3% 13,6% 25,4% $ Oui Sexe Les deux Ni Python R Homme 91,6% 93,9% 95,0% 88,0% Femme 8,4% 6,1% 5,0% 12,0%

Le package CGPfunctions

Le package CGPfunctions vaut le coup d'œil pour trouver des moyens rapides et faciles de visualiser les données de tableau croisé. Installez-le depuis CRAN avec l'habituel install.packages("CGPfunctions").

Le package a deux fonctions intéressantes pour l'examen des tableaux croisés: PlotXTabs()et PlotXTabs2(). Ce code renvoie des graphiques à barres des données (premier graphique ci-dessous):

bibliothèque (fonctions CGP)

PlotXTabs (mydata)

Capture d'écran de Sharon Machlis,

PlotXTabs2(mydata) crée un graphique avec un aspect différent et des résumés statistiques (deuxième graphique à gauche).

Si vous n'avez pas besoin de ces résumés ou que vous ne les voulez pas, vous pouvez les supprimer avec results.subtitle = FALSE, par exemple  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Capture d'écran de Sharon Machlis,

PlotXTabs2()a quelques dizaines d'options d'argument, y compris le titre, la légende, les légendes, le jeu de couleurs et l'un des quatre types de tracé: côté, pile, mosaïque ou pourcentage. Il existe également des options familières aux utilisateurs de ggplot2, telles que ggtheme et palette. Vous pouvez voir plus de détails dans le fichier d'aide de la fonction.

Le package vtree

Le package vtree génère des graphiques pour les tableaux croisés par opposition aux graphiques. Exécution de la vtree()fonction principale sur une variable, telle que 

bibliothèque (vtree)

vtree (mydata, "LanguageGroup")

vous donne cette réponse de base:

Sharon Machlis,

Je n'aime pas les valeurs par défaut des couleurs ici, mais vous pouvez échanger dans une palette RColorBrewer. L'argument palette de vtree utilise des numéros de palette , pas des noms; vous pouvez voir comment ils sont numérotés dans la documentation du paquet vtree. Je pourrais choisir 3 pour les verts et 5 pour les violets, par exemple. Malheureusement, ces valeurs par défaut vous donnent une couleur plus intense pour les nombres inférieurs , ce qui n'a pas toujours de sens (et ne fonctionne pas bien pour moi dans cet exemple). Je peux changer ce comportement par défaut avec sortfill = TRUEpour utiliser la couleur la plus intense pour la valeur la plus élevée. 

vtree (mydata, "LanguageGroup", palette = 3, sortfill = TRUE)

Sharon Machlis,

Si vous trouvez que la couleur sombre rend la lecture du texte difficile, il existe quelques options. Une option consiste à utiliser l' argument simple , tel que  vtree(mydata, "LanguageGroup", plain = TRUE). Une autre option consiste à définir une seule couleur de remplissage au lieu d'une palette, en utilisant l' fillcolorargument, tel que  vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

Pour examiner deux variables dans un rapport d'analyse croisée, ajoutez simplement un deuxième nom de colonne et une palette ou une couleur si vous ne voulez pas la valeur par défaut. Vous pouvez utiliser l'option ordinaire ou spécifier deux palettes ou deux couleurs. Ci-dessous, j'ai choisi des couleurs spécifiques au lieu de palettes, et j'ai également fait pivoter le graphique pour le lire verticalement.

vtree (mydata, c ("LanguageGroup", "Gender"),

fillcolor = c (LanguageGroup = "# e7d4e8", Sexe = "# 99d8c9"),

horiz = FAUX)

Sharon Machlis,

You can add more than two categories, although it gets a bit harder to read and follow as the tree grows. If you’re only interested in some of the branches, you can specify which to display with the keep argument. Below, I set vtree() to show only people who use R without Python or who use both R and Python.

vtree(mydata, c("Gender", "LanguageGroup", "Hobbyist"),

horiz = FALSE, fillcolor = c(LanguageGroup = "#e7d4e8",

Gender = "#99d8c9", Hobbyist = "#9ecae1"),

keep = list(LanguageGroup = c("R", "Both")), showcount = FALSE)

Avec l'arbre devient si occupé, je pense qu'il est utile d'avoir soit le nombre ou le pour cent que les étiquettes de nœud, pas les deux. Donc, le dernier argument du code ci-dessus,  showcount = FALSEdéfinit le graphique pour afficher uniquement des pourcentages et non des comptes.

Sharon Machlis,

Plus d'options de comptage par groupe

Il existe d'autres moyens utiles de regrouper et de compter dans R, notamment base R, dplyr et data.table. Base R a la  xtabs()fonction spécifiquement pour cette tâche. Notez la syntaxe de la formule ci-dessous: un tilde, puis une variable plus une autre variable.

xtabs (~ LanguageGroup + Gender, data = mydata)

Sexe Langue Groupe Homme Femme Les deux 3264374 Aucun des deux 43908 3705 Python 29044 1940 R 969175

La count()fonction de dplyr combine «grouper par» et «compter les lignes dans chaque groupe» en une seule fonction.

bibliothèque (dplyr)

mon_sommaire%

count(LanguageGroup, Gender, Hobbyist, sort = TRUE)

my_summary LanguageGroup Gender Hobbyist n 1 Neither Man Yes 34419 2 Python Man Yes 25093 3 Neither Man No 9489 4 Python Man No 3951 5 Both Man Yes 2807 6 Neither Woman Yes 2250 7 Neither Woman No 1455 8 Python Woman Yes 1317 9 R Man Yes 757 10 Python Woman No 623 11 Both Man No 457 12 Both Woman Yes 257 13 R Man No 212 14 Both Woman No 117 15 R Woman Yes 103 16 R Woman No 72

In the three lines of code below, I load the data.table package, create a data.table from my data, and then use the special .N data.table symbol that stands for number of rows in a group. 

library(data.table)

mydt <- setDT(mydata)

mydt[, .N, by = .(LanguageGroup, Gender, Hobbyist)]

Visualizing with ggplot2

Comme pour la plupart des données, ggplot2 est un bon choix pour visualiser les résultats résumés. Le premier graphique ggplot ci-dessous trace LanguageGroup sur l'axe X et le nombre de chacun sur l'axe Y. La couleur de remplissage indique si quelqu'un dit qu'il code comme passe-temps. Et, facet_wrap dit: Créez un graphique séparé pour chaque valeur de la colonne Sexe.

bibliothèque (ggplot2)

ggplot (mon_sommaire, aes (LanguageGroup, n, fill = Hobbyist)) +

geom_bar (stat = "identité") +

facet_wrap (facets = vars (Sexe))

Sharon Machlis,

Étant donné que l'échantillon compte relativement peu de femmes, il est difficile de comparer les pourcentages entre les sexes lorsque les deux graphiques utilisent la même échelle de l'axe Y. Cependant, je peux changer cela, de sorte que chaque graphique utilise une échelle distincte, en ajoutant l'argument scales = “free_y”à la facet_wrap()fonction:

ggplot (mon_sommaire, aes (LanguageGroup, n, fill = Hobbyist)) +

geom_bar (stat = "identité") +

facet_wrap (facets = vars (Sexe), échelles = "free_y")

Il est désormais plus facile de comparer plusieurs variables par sexe.

Pour plus de conseils R, rendez-vous sur la page «Faites plus avec R» ou consultez la liste de lecture YouTube «Faites plus avec R».

Consultez la page suivante pour savoir comment télécharger et gérer les données utilisées dans cette démo.