Jak liczyć według grup w R

Liczenie przez wiele grup - czasami nazywane raportami krzyżowymi - może być użytecznym sposobem przeglądania danych, od badań opinii publicznej po testy medyczne. Na przykład, w jaki sposób ludzie głosowali według płci i grupy wiekowej? Ilu programistów, którzy używają zarówno języka R, jak i Python, to mężczyźni w porównaniu z kobietami?

Jest wiele sposobów liczenia według kategorii w R. W tym miejscu chciałbym podzielić się niektórymi z moich ulubionych.

W prezentacjach w tym artykule wykorzystam podzbiór ankiety Stack Overflow Developers, w której ankietowani są deweloperzy na dziesiątki tematów, od wynagrodzeń po używane technologie. Zmniejszę liczbę z kolumnami dla używanych języków, płci i tego, czy kodują jako hobby. Dodałem także własną kolumnę LanguageGroup, aby sprawdzić, czy programista zgłosił używanie R, Python, obu, czy żadnego.

Jeśli chcesz kontynuować, na ostatniej stronie tego artykułu znajdują się instrukcje dotyczące pobierania i porządkowania danych w celu uzyskania tego samego zestawu danych, którego używam.

Dane mają jeden wiersz na każdą odpowiedź na ankietę, a wszystkie cztery kolumny są znakami.

str (moje dane) 'data.frame': 83379 obs. z 4 zmiennych: $ Płeć: 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" Yes "" No "" Yes "" No "... $ LanguageGroup: chr" Python "" Python "" Ani "" Python „…

Przefiltrowałem nieprzetworzone dane, aby ułatwić zarządzanie tabelami przestawnymi, w tym usunięcie brakujących wartości i wzięcie tylko dwóch największych płci, mężczyzny i kobiety.

Pakiet dozorcy

A więc jaki jest podział na płeć w każdej grupie językowej? W przypadku tego typu raportowania w ramce danych jednym z moich narzędzi jest funkcja pakietu dozorcy tabyl()

Podstawowa tabyl()funkcja zwraca ramkę danych z liczbą. Pierwsza nazwa kolumny dodana do tabyl()argumentu staje się wierszem , a druga kolumną

biblioteka (dozorca) tabyl (moje dane, płeć, grupa językowa)

Płeć Obie Ani Python R Mężczyzna 3264 43908 29044 969 Kobieta 374 3705 1940175

Fajne tabyl()jest to, że bardzo łatwo jest też generować procenty. Jeśli chcesz zobaczyć procenty dla każdej kolumny zamiast surowych sum, dodaj adorn_percentages("col"). Następnie możesz przesłać te wyniki do funkcji formatującej, takiej jak  adorn_pct_formatting().

tabyl (moje dane, płeć, grupa językowa)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (cyfry = 1)

Płeć Obie Ani Python R Mężczyzna 89,7% 92,2% 93,7% 84,7% Kobieta 10,3% 7,8% 6,3% 15,3%

Aby zobaczyć procenty w wierszach, dodaj adorn_percentages("row")

Jeśli chcesz dodać trzecią zmienną, taką jak Hobbyist, to też jest łatwe.

tabyl (moje dane, płeć, grupa językowa, hobbysta)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (cyfry = 1)

Jednak wizualne porównanie wyników na więcej niż dwóch poziomach w ten sposób staje się nieco trudniejsze. Ten kod zwraca listę z jedną ramką danych dla każdego wyboru trzeciego poziomu:

$ Nie Płeć Oba Ani Python R Mężczyzna 79,6% 86,7% 86,4% 74,6% Kobieta 20,4% 13,3% 13,6% 25,4% $ Tak Płeć Oboje Ani Python R Mężczyzna 91,6% 93,9% 95,0% 88,0% Kobieta 8,4% 6,1% 5,0% 12,0%

Pakiet CGPfunctions

Pakiet CGPfunctions warto poszukać szybkich i łatwych sposobów wizualizacji danych tabeli krzyżowej. Zainstaluj go z CRAN za pomocą zwykłego install.packages("CGPfunctions").

Pakiet ma dwie interesujące funkcje do badania tabel przestawnych: PlotXTabs()i PlotXTabs2(). Ten kod zwraca wykresy słupkowe danych (pierwszy wykres poniżej):

biblioteka (funkcje CGP)

PlotXTabs (moje dane)

Zrzut ekranu: Sharon Machlis,

PlotXTabs2(mydata) tworzy wykres o innym wyglądzie i kilku podsumowaniach statystycznych (drugi wykres po lewej).

Jeśli nie potrzebujesz lub nie chcesz tych podsumowań, możesz je usunąć za pomocą results.subtitle = FALSE, na przykład  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Zrzut ekranu: Sharon Machlis,

PlotXTabs2()ma kilkadziesiąt opcji argumentów, w tym tytuł, podpis, legendy, schemat kolorów i jeden z czterech typów wykresów: boczny, stos, mozaika lub procent. Istnieją również opcje znane użytkownikom ggplot2, takie jak ggtheme i palette. Więcej szczegółów można znaleźć w pliku pomocy funkcji.

Pakiet vtree

Pakiet vtree generuje grafikę dla tabel przestawnych w przeciwieństwie do wykresów. Uruchamianie głównej vtree()funkcji na jednej zmiennej, takiej jak 

biblioteka (vtree)

vtree (moje dane; „LanguageGroup”)

dostaje tę podstawową odpowiedź:

Sharon Machlis,

Nie przepadam za domyślnymi kolorami, ale możesz zamienić paletę RColorBrewer. argument palety vtree używa numerów palet , a nie nazw; możesz zobaczyć, jak są ponumerowane w dokumentacji pakietu vtree. Mógłbym na przykład wybrać 3 dla Zielonych i 5 dla Fioletów. Niestety, te wartości domyślne dają bardziej intensywny kolor dla mniejszych liczb, co nie zawsze ma sens (i nie działa dobrze dla mnie w tym przykładzie). Mogę zmienić to domyślne zachowanie, sortfill = TRUEużywając bardziej intensywnego koloru dla wyższej wartości. 

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

Sharon Machlis,

Jeśli okaże się, że ciemny kolor utrudnia czytanie tekstu, istnieje kilka opcji. Jedną z opcji jest użycie zwykłego argumentu, takiego jak  vtree(mydata, "LanguageGroup", plain = TRUE). Inną opcją jest ustawienie pojedynczego koloru wypełnienia zamiast palety przy użyciu fillcolorargumentu, takiego jak  vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

Aby spojrzeć na dwie zmienne w raporcie tabeli przestawnej, po prostu dodaj nazwę drugiej kolumny i paletę lub kolor, jeśli nie chcesz mieć wartości domyślnej. Możesz użyć opcji zwykłej lub określić dwie palety lub dwa kolory. Poniżej wybrałem określone kolory zamiast palet, a także obróciłem wykres, aby czytać w pionie.

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

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

poziom = FAŁSZ)

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)

Ponieważ drzewo jest tak zajęte, myślę, że warto mieć albo liczbę, albo procent jako etykiety węzłów, a nie oba. Więc ten ostatni argument w powyższym kodzie  showcount = FALSE, ustawia wykres tak, aby wyświetlał tylko procenty, a nie zliczenia.

Sharon Machlis,

Więcej liczenia według opcji grup

Istnieją inne przydatne sposoby grupowania i liczenia w języku R, w tym podstawowe R, dplyr i data.table. Base R ma  xtabs()funkcję specjalnie do tego zadania. Zwróć uwagę na poniższą składnię formuły: tylda, a następnie jedna zmienna i inna zmienna.

xtabs (~ LanguageGroup + Gender, data = mydata)

Płeć Język Grupa Mężczyzna Kobieta Obie 3264374 Żadne 43908 3705 Python 29044 1940 R 969 175

Funkcja dplyr count()łączy „grupowanie według” i „policz wiersze w każdej grupie” w jedną funkcję.

biblioteka (dplyr)

my_summary%

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

Podobnie jak w przypadku większości danych, ggplot2 jest dobrym wyborem do wizualizacji podsumowanych wyników. Pierwszy wykres ggplot poniżej przedstawia LanguageGroup na osi X i liczbę dla każdego z nich na osi Y. Kolor wypełnienia określa, czy ktoś mówi, że programuje jako hobby. A facet_wrap mówi: Utwórz osobny wykres dla każdej wartości w kolumnie Płeć.

biblioteka (ggplot2)

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

geom_bar (stat = "identity") +

facet_wrap (facets = vars (płeć))

Sharon Machlis,

Ponieważ w próbie jest stosunkowo niewiele kobiet, trudno jest porównać wartości procentowe dla różnych płci, gdy oba wykresy wykorzystują tę samą skalę osi Y. Mogę to jednak zmienić, więc każdy wykres używa osobnej skali, dodając argument scales = “free_y”do facet_wrap()funkcji:

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

geom_bar (stat = "identity") +

facet_wrap (facets = vars (płeć), scales = "free_y")

Teraz łatwiej jest porównać wiele zmiennych według płci.

Aby uzyskać więcej wskazówek dotyczących języka R, przejdź na stronę „Zrób więcej z R” lub sprawdź listę odtwarzania YouTube „Zrób więcej z R”.

Zobacz następną stronę, aby uzyskać informacje na temat pobierania i porządkowania danych używanych w tym demo.