Programování

Jak počítat podle skupiny v R.

Počítání podle více skupin - někdy nazývaných kontingenční zprávy - může být užitečným způsobem, jak se dívat na údaje od průzkumů veřejného mínění až po lékařské testy. Jak například lidé hlasovali podle pohlaví a věkových skupin? Kolik softwarových vývojářů, kteří používají R i Python, jsou muži vs. ženy?

Existuje mnoho způsobů, jak tento druh počítání podle kategorií v R. Tady bych chtěl sdílet některé z mých oblíbených.

U ukázek v tomto článku použiji podmnožinu průzkumu Stack Overflow Developers, který zkoumá vývojáře na desítkách témat od platů po použité technologie. Zbavím to sloupců pro použité jazyky, pohlaví a pokud se kódují jako koníček. Také jsem přidal svůj vlastní sloupec LanguageGroup pro to, zda vývojář nahlásil použití R, Pythonu, obou nebo ani jednoho.

Pokud byste chtěli pokračovat, obsahuje poslední stránka tohoto článku pokyny, jak stáhnout a uspořádat data, abyste získali stejnou sadu dat, kterou používám.

Data mají pro každou odpověď průzkumu jeden řádek a čtyři sloupce jsou všechny znaky.

str (mydata) 'data.frame': 83379 obs. ze 4 proměnných: $ Pohlaví: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Fanda: chr" Ano "" Ne "" Ano "" Ne "... $ Jazyková skupina: chr" Python "" Python "" Ani "" Python „...

Filtroval jsem surová data, aby byly křížové tabulky lépe zvládnutelné, včetně odstranění chybějících hodnot a převzetí pouze dvou největších pohlaví, muže a ženy.

Balíček správce

Jaké je tedy rozdělení podle pohlaví v každé jazykové skupině? Pro tento typ hlášení v datovém rámci je jedním z mých go-to nástrojů balíček správce tabyl () funkce.

Základní tabyl () funkce vrací datový rámec s počty. Název prvního sloupce, který přidáte do a tabyl () argument se stává řádeka ten druhý sloupec

knihovna (správce) tabyl (mydata, Gender, LanguageGroup)

Pohlaví Oba Ani Python R Muž 3264 43908 29044 969 Žena 374 3705 1940 175

Co je hezké tabyl () je také velmi snadné generovat procenta. Chcete-li zobrazit procenta pro každý sloupec místo hrubých součtů, přidejte adorn_percentages ("col"). Tyto výsledky pak můžete propojit do formátovací funkce, jako jeadorn_pct_formatting ().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (číslice = 1)

Pohlaví Oba Ani Python R Muž 89,7% 92,2% 93,7% 84,7% Žena 10,3% 7,8% 6,3% 15,3%

Chcete-li zobrazit procenta podle řádku, přidejte adorn_percentages ("řádek")

Pokud chcete přidat třetí proměnnou, například Hobbyist, je to také snadné.

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

adorn_percentages ("col")%>%

adorn_pct_formatting (číslice = 1)

Tímto způsobem je však o něco těžší vizuálně porovnat výsledky ve více než dvou úrovních. Tento kód vrací a seznam s jedním datovým rámcem pro každou volbu třetí úrovně:

$ Ne Pohlaví Oba Ani Python R Man 79,6% 86,7% 86,4% 74,6% Žena 20,4% 13,3% 13,6% 25,4% $ Ano Pohlaví Oba Ani Python R Man 91,6% 93,9% 95,0% 88,0% Žena 8,4% 6,1% 5,0% 12,0%

Balíček CGPfunctions

Balíček CGPfunctions stojí za to hledat několik rychlých a snadných způsobů vizualizace dat křížové tabulky. Nainstalujte jej z CRAN obvyklým způsobem install.packages ("CGPfunctions").

Balíček má dvě zajímavé funkce pro zkoumání kontingenčních tabulek: PlotXTabs () a PlotXTabs2 (). Tento kód vrací sloupcové grafy dat (první graf níže):

knihovna (CGPfunctions)

PlotXTabs (mydata)

Snímek obrazovky Sharon Machlis,

PlotXTabs2 (mydata) vytvoří graf s jiným vzhledem a několika statistickými souhrny (druhý graf vlevo).

Pokud tyto souhrny nepotřebujete nebo nechcete, můžete je odstranit pomocí results.subtitle = FALSE, jakoPlotXTabs2 (mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Snímek obrazovky Sharon Machlis,

PlotXTabs2 () má několik desítek možností argumentů, včetně názvu, titulku, legend, barevného schématu a jednoho ze čtyř typů vykreslení: strana, zásobník, mozaika nebo procenta. K dispozici jsou také možnosti známé uživatelům ggplot2, například ggtheme a palette. Další podrobnosti najdete v souboru nápovědy k funkci.

Balíček vtree

Balíček vtree se generuje grafika pro křížové tabulky na rozdíl od grafů. Spuštění hlavní vtree () funkce na jedné proměnné, například

knihovna (vtree)

vtree (mydata, "LanguageGroup")

dostane tuto základní odpověď:

Sharon Machlis,

Tady se mi příliš nelíbí výchozí nastavení barev, ale můžete si vyměnit paletu RColorBrewer. argument palety vtree používá paletu čísla, ne jména; jak jsou očíslovány, najdete v dokumentaci balíčku vtree. Mohl bych například vybrat 3 pro Zelené a 5 pro Purpurové. Bohužel tato výchozí nastavení vám poskytnou intenzivnější barvu dolní počítat čísla, což nemusí vždy dávat smysl (a v tomto příkladu to pro mě nefunguje dobře). Toto výchozí chování mohu změnit pomocí sortfill = PRAVDA použít intenzivnější barvu pro vyšší hodnota.

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

Sharon Machlis,

Pokud zjistíte, že tmavá barva ztěžuje čtení textu, existuje několik možností. Jednou z možností je použít prostý argument, jako jevtree (mydata, "LanguageGroup", plain = TRUE). Další možností je nastavit jednu barvu výplně místo palety pomocí vyplň barvu argument, jako jevtree (mydata, LanguageGroup ", fillcolor =" # 99d8c9 ").

Chcete-li se podívat na dvě proměnné v kontingenčním přehledu, jednoduše přidejte název druhého sloupce a paletu nebo barvu, pokud nechcete výchozí. Můžete použít prostou volbu nebo zadat dvě palety nebo dvě barvy. Níže jsem místo palet vybral konkrétní barvy a graf jsem také otočil, aby se četlo svisle.

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

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

Horiz = FALSE)

Sharon Machlis,

Můžete přidat více než dvě kategorie, i když se s růstem stromu bude těžší číst a sledovat jej. Pokud vás zajímá pouze nějaký z větví můžete určit, které se mají zobrazit pomocí držet argument. Níže jsem nastavil vtree () zobrazit pouze lidi, kteří používají R bez Pythonu nebo kteří používají R i Python.

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

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

Pohlaví = "# 99d8c9", Fanda = "# 9ecae1"),

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

Když je strom tak zaneprázdněný, myslím, že to pomůže mít buď počet nebo procenta jako popisky uzlů, ne obojí. Takže ten poslední argument v kódu výše, showcount = FALSE, nastaví graf tak, aby zobrazoval pouze procenta a nepočítal se.

Sharon Machlis,

Více počítat podle možností skupiny

Existují i ​​další užitečné způsoby seskupování a počítání v R, včetně base R, dplyr a data.table. Základna R máxtabs () funkce speciálně pro tento úkol. Všimněte si níže uvedené syntaxe vzorce: vlnovka a poté jedna proměnná plus další proměnná.

xtabs (~ LanguageGroup + Gender, data = mydata)

Pohlaví Jazyk Skupina Muž Žena Oba 3264 374 Ani 43908 3705 Python 29044 1940 R 969 175

dplyr's počet() funkce kombinuje „seskupit podle“ a „spočítat řádky v každé skupině“ do jedné funkce.

knihovna (dplyr)

my_summary%

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

my_summary LanguageGroup Gender Hobbyist n 1 Ani Muž Ano 34419 2 Python Muž Ano 25093 3 Ani Muž Ne 9489 4 Python Muž Ne 3951 5 Oba Muži Ano 2807 6 Ani Žena Ano 2250 7 Ani Žena Ne 1455 8 Python Žena Ano 1317 9 R Muž Ano 757 10 Žena v Pythonu Ne 623 11 Oba muži Ne 457 12 Obě ženy Ano 257 13 R Muž Ne 212 14 Obě ženy Ne 117 15 R Žena Ano 103 16 R Žena Ne 72

Ve třech řádcích kódu níže načíst balíček data.table, vytvořit data.table z mých dat a poté použít speciální .N symbol data.table, který označuje počet řádků ve skupině.

knihovna (data.table)

mydt <- setDT (mydata)

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

Vizualizace pomocí ggplot2

Stejně jako u většiny dat je ggplot2 dobrou volbou pro vizualizaci souhrnných výsledků. První graf ggplot níže vykresluje LanguageGroup na ose X a počet pro každou na ose Y. Barva výplně představuje, zda někdo říká, že kóduje jako koníček. A facet_wrap říká: Vytvořte samostatný graf pro každou hodnotu ve sloupci Pohlaví.

knihovna (ggplot2)

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

geom_bar (stat = "identita") +

facet_wrap (facets = vars (Gender))

Sharon Machlis,

Protože ve vzorku je relativně málo žen, je obtížné porovnávat procenta mezi pohlavími, když oba grafy používají stejnou stupnici osy Y. Mohu to však změnit, takže každý graf používá samostatnou stupnici přidáním argumentu scales = “free_y” do facet_wrap () funkce:

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

geom_bar (stat = "identita") +

facet_wrap (facets = vars (Gender), scales = "free_y")

Nyní je snazší porovnávat více proměnných podle pohlaví.

Další tipy R najdete na stránce „Do More With R“ na stránce YouTube nebo v seznamu „Do More With R“.

Na další stránce najdete informace o tom, jak stahovat a měnit data použitá v této ukázce.

$config[zx-auto] not found$config[zx-overlay] not found