Programmering

Hvordan telle etter gruppe i R

Å telle etter flere grupper - noen ganger kalt krysstabellrapporter - kan være en nyttig måte å se på data som spenner fra meningsmålinger til medisinske tester. Hvordan stemte folk for eksempel etter kjønn og aldersgruppe? Hvor mange programvareutviklere som bruker både R og Python er menn mot kvinner?

Det er mange måter å gjøre denne typen telling etter kategorier i R. Her vil jeg dele noen av favorittene mine.

For demonstrasjonene i denne artikkelen vil jeg bruke en delmengde av Stack Overflow Developers-undersøkelsen, som kartlegger utviklere om dusinvis av emner som spenner fra lønn til brukt teknologi. Jeg redigerer det med kolonner for brukte språk, kjønn og hvis de koder som en hobby. Jeg la også til min egen LanguageGroup-kolonne for om en utvikler rapporterte å bruke R, Python, begge deler eller ingen av dem.

Hvis du vil følge med, har den siste siden i denne artikkelen instruksjoner om hvordan du laster ned og krangler dataene for å få det samme datasettet jeg bruker.

Dataene har en rad for hvert undersøkelsessvar, og de fire kolonnene er alle tegn.

str (mydata) 'data.frame': 83379 obs. av 4 variabler: $ Kjønn: 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" Ja "" Nei "" Ja "" Nei "... $ LanguageGroup: chr" Python "" Python "" Verken "" Python "...

Jeg filtrerte rådataene for å gjøre krysstabellene mer håndterbare, inkludert å fjerne manglende verdier og bare ta de to største kjønnene, mann og kvinne.

Vaktmesterpakken

Så, hva er kjønnsfordelingen i hver språkgruppe? For denne typen rapportering i en dataramme er et av mine mest brukte verktøy vaktmesterpakken tabyl () funksjon.

Det grunnleggende tabyl () funksjon returnerer en dataramme med tellinger. Det første kolonnenavnet du legger til i tabyl () argument blir rad, og den andre den kolonne

bibliotek (vaktmester) tabyl (mydata, Gender, LanguageGroup)

Kjønn Begge verken Python R Mann 3264 43908 29044 969 Kvinne 374 3705 1940 175

Hva er fint med tabyl () er det veldig enkelt å generere prosent også. Hvis du vil se prosentandel for hver kolonne i stedet for rå totaler, legger du til adorn_percentages ("col"). Du kan deretter føre disse resultatene til en formateringsfunksjon somadorn_pct_formatting ().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (sifre = 1)

Kjønn Begge verken Python R Mann 89,7% 92,2% 93,7% 84,7% Kvinne 10,3% 7,8% 6,3% 15,3%

For å se prosentvis etter rad, legg til adorn_percentages ("rad")

Hvis du vil legge til en tredje variabel, for eksempel Hobbyist, er det også enkelt.

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

adorn_percentages ("col")%>%

adorn_pct_formatting (sifre = 1)

Imidlertid blir det litt vanskeligere å visuelt sammenligne resultater på mer enn to nivåer på denne måten. Denne koden returnerer a liste med en dataramme for hvert valg på tredje nivå:

$ Nei Kjønn Begge verken Python R Man 79,6% 86,7% 86,4% 74,6% Kvinne 20,4% 13,3% 13,6% 25,4% $ Ja Kjønn Begge verken Python R Man 91,6% 93,9% 95,0% 88,0% Kvinne 8,4% 6,1% 5,0% 12,0%

CGPfunctions-pakken

CGPfunctions-pakken er verdt å se etter noen raske og enkle måter å visualisere krysstabelldata på. Installer det fra CRAN med det vanlige install.packages ("CGPfunctions").

Pakken har to funksjoner av interesse for å undersøke krysstabeller: PlotXTabs () og PlotXTabs2 (). Denne koden returnerer søylediagrammer over dataene (første graf nedenfor):

bibliotek (CGPfunksjoner)

PlotXTabs (mydata)

Skjermbilde av Sharon Machlis,

PlotXTabs2 (mydata) lager en graf med et annet utseende, og noen statistiske sammendrag (andre graf til venstre).

Hvis du ikke trenger eller vil ha disse sammendragene, kan du fjerne dem med results.subtitle = FALSE, som for eksempelPlotXTabs2 (mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Skjermbilde av Sharon Machlis,

PlotXTabs2 () har et par dusin argumentalternativer, inkludert tittel, billedtekst, legender, fargevalg og en av fire plottyper: side, stack, mosaikk eller prosent. Det er også alternativer kjent for ggplot2-brukere, for eksempel ggtheme og palett. Du kan se flere detaljer i funksjonens hjelpefil.

Vtree-pakken

Vtree-pakken genererer grafikk for krysstabeller i motsetning til grafer. Kjører hoved vtree () funksjon på en variabel, for eksempel

bibliotek (vtree)

vtree (mydata, "LanguageGroup")

gir deg dette grunnleggende svaret:

Sharon Machlis,

Jeg er ikke opptatt av fargestandardene her, men du kan bytte i en RColorBrewer-palett. vtrees palettargument bruker palett tall, ikke navn; Du kan se hvordan de er nummerert i dokumentasjonen til vtree-pakken. Jeg kunne for eksempel velge 3 for greener og 5 for lilla. Dessverre gir disse standardene deg en mer intens farge for Nedre telle tall, noe som ikke alltid gir mening (og ikke fungerer bra for meg i dette eksemplet). Jeg kan endre den standardadferden med sorteringsfyll = SANT å bruke den mer intense fargen til høyere verdi.

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

Sharon Machlis,

Hvis du synes den mørke fargen gjør det vanskelig å lese tekst, er det noen alternativer. Et alternativ er å bruke vanlig argument, slik somvtree (mydata, "LanguageGroup", vanlig = SANT). Et annet alternativ er å angi en enkelt fyllfarge i stedet for en palett ved å bruke Fyll farge argument, slik somvtree (mydata, LanguageGroup ", fillcolor =" # 99d8c9 ").

Hvis du vil se på to variabler i en krysstabellrapport, legger du bare til et andre kolonnenavn og palett eller farge hvis du ikke vil ha standard. Du kan bruke alternativet vanlig eller angi to paletter eller to farger. Nedenfor valgte jeg spesifikke farger i stedet for paletter, og jeg roterte også grafen for å lese vertikalt.

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

fyllfarge = c (LanguageGroup = "# e7d4e8", Kjønn = "# 99d8c9"),

horizon = FALSE)

Sharon Machlis,

Du kan legge til mer enn to kategorier, selv om det blir litt vanskeligere å lese og følge når treet vokser. Hvis du bare er interessert i noen av grenene, kan du angi hvilken som skal vises med beholde argument. Nedenfor satte jeg meg vtree () for å vise bare personer som bruker R uten Python eller som bruker både R og Python.

vtree (mydata, c ("Kjønn", "LanguageGroup", "Hobbyist"),

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

Kjønn = "# 99d8c9", hobbyist = "# 9ecae1"),

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

Med at treet blir så travelt, tror jeg det hjelper å ha enten tellingen eller prosentandelen som node-etiketter, ikke begge deler. Så det siste argumentet i koden ovenfor, showcount = FALSE, setter grafen til å bare vise prosent og ikke telle.

Sharon Machlis,

Flere teller etter gruppealternativer

Det er andre nyttige måter å gruppere og telle i R, inkludert base R, dplyr og data.table. Base R harxtabs () funksjon spesielt for denne oppgaven. Merk formelsyntaks nedenfor: en tilde og deretter en variabel pluss en annen variabel.

xtabs (~ LanguageGroup + Gender, data = mydata)

Kjønnsspråk Gruppe Mann Kvinne Begge 3264374 Verken 43908 3705 Python 29044 1940 R 969 175

dplyr’s telle() funksjon kombinerer "gruppere etter" og "telle rader i hver gruppe" til en enkelt funksjon.

bibliotek (dplyr)

min_summary%

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

my_summary SpråkGruppe Kjønn Hobbyist n 1 Verken mann Ja 34419 2 Python-mann Ja 25093 3 Verken mann Nei 9489 4 Python-mann Nei 3951 5 Begge menn Ja 2807 6 Verken kvinne Ja 2250 7 Verken kvinne Nei 1455 8 Python-kvinne Ja 1317 9 R Mann Ja 757 10 Python Woman Nei 623 11 Begge menn Nei 457 12 Begge kvinner Ja 257 13 R Mann Nei 212 14 Begge kvinner Nei 117 15 R Kvinner Ja 103 16 R Kvinner Nei 72

I de tre kodelinjene nedenfor laster jeg inn data.table-pakken, lager en data.table fra dataene mine, og bruker deretter den spesielle .N data.table symbol som står for antall rader i en gruppe.

bibliotek (data.table)

mydt <- setDT (mydata)

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

Visualisering med ggplot2

Som med de fleste data er ggplot2 et godt valg for å visualisere oppsummerte resultater. Den første ggplotgrafen nedenfor viser LanguageGroup på X-aksen og antall for hver på Y-aksen. Fyllfarge representerer om noen sier at de koder som en hobby. Og facet_wrap sier: Lag et eget diagram for hver verdi i Kjønn-kolonnen.

bibliotek (ggplot2)

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

geom_bar (stat = "identitet") +

facet_wrap (fasetter = vars (kjønn))

Sharon Machlis,

Fordi det er relativt få kvinner i utvalget, er det vanskelig å sammenligne prosentandeler mellom kjønn når begge grafene bruker samme Y-akseskala. Jeg kan endre det, skjønt, slik at hver graf bruker en egen skala, ved å legge til argumentet skalaer = “free_y” til facet_wrap () funksjon:

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

geom_bar (stat = "identitet") +

facet_wrap (fasetter = vars (kjønn), skalaer = "gratis_y")

Nå er det lettere å sammenligne flere variabler etter kjønn.

For flere R-tips, gå til "Gjør mer med R" -siden på eller sjekk ut "Gjør mer med R"-YouTube-spillelisten.

Se neste side for informasjon om hvordan du laster ned og krangler data som brukes i denne demoen.

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