R'de gruba göre nasıl sayılır

Birden çok gruba göre sayma - bazen çapraz tablo olarak da adlandırılır - kamuoyu anketlerinden tıbbi testlere kadar çeşitli verilere bakmanın yararlı bir yolu olabilir. Örneğin, insanlar cinsiyet ve yaş grubuna göre nasıl oy kullandı? Hem R hem de Python kullanan kaç yazılım geliştiricisi kadın ve erkek?

R'de kategorilere göre bu tür sayım yapmanın pek çok yolu vardır. Burada, favorilerimden bazılarını paylaşmak istiyorum.

Bu makaledeki demolar için, geliştiricileri maaşlardan kullanılan teknolojilere kadar düzinelerce konuda anket yapan Stack Overflow Developers anketinin bir alt kümesini kullanacağım. Kullanılan diller, cinsiyet ve hobi olarak kodlarlarsa sütunlar ekleyeceğim. Ayrıca, bir geliştiricinin R, Python mu, ikisini de mi yoksa ikisini birden mi kullandığını rapor edip etmediği konusunda kendi Dil Grubu sütunumu ekledim.

Takip etmek isterseniz, bu makalenin son sayfasında, kullandığım veri kümesini elde etmek için verilerin nasıl indirilip karıştırılacağına dair talimatlar yer almaktadır.

Verilerin her anket yanıtı için bir satırı vardır ve dört sütunun tümü karakterlerdir.

str (mydata) 'data.frame': 83379 gözlem. 4 değişken: $ Cinsiyet: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Meraklı: chr" Evet "" Hayır "" Evet "" Hayır "... $ Dil Grubu: chr" Python "" Python "" Hiçbiri "" Python "...

Eksik değerleri kaldırmak ve yalnızca en büyük iki cinsiyeti (Erkek ve Kadın) almak da dahil olmak üzere çapraz tabloları daha yönetilebilir hale getirmek için ham verileri filtreledim.

Kapıcı paketi

Öyleyse, her dil grubundaki cinsiyet dağılımı nedir? Bir veri çerçevesinde bu tür bir raporlama için, benim gitme araçlarımdan biri kapıcı paketinin tabyl()işlevidir. 

Temel tabyl()işlev, sayıları olan bir veri çerçevesi döndürür. Bir tabyl()bağımsız değişkene eklediğiniz ilk sütun adı satır olur ve ikincisi sütun olur

kütüphane (kapıcı) tabyl (mydata, Gender, LanguageGroup)

Cinsiyet İkisi de Python R Erkek 3264 43908 29044 969 Kadın 374 3705 1940175

Güzel olan şey tabyl(), yüzdeler oluşturmanın da çok kolay olmasıdır. Ham toplamlar yerine her sütunun yüzdelerini görmek istiyorsanız, ekleyin adorn_percentages("col"). Daha sonra bu sonuçları gibi bir biçimlendirme işlevine aktarabilirsiniz  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (rakamlar = 1)

Cinsiyet İkisi Hiçbiri Python R Erkek 89,7% 92,2% 93,7% 84,7% Kadın 10,3% 7,8% 6,3% 15,3%

Yüzdeleri satıra göre görmek için ekleyin adorn_percentages("row")

Hobbyist gibi üçüncü bir değişken eklemek istiyorsanız, bu da kolaydır.

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

adorn_percentages ("col")%>%

adorn_pct_formatting (rakamlar = 1)

Ancak, sonuçları bu şekilde ikiden fazla seviyede görsel olarak karşılaştırmak biraz daha zorlaşır. Bu kod , her üçüncü düzey seçim için bir veri çerçevesine sahip bir liste döndürür :

$ Hayır Cinsiyet İkisi İkisi Hiçbiri Python R Erkek% 79,6% 86,7% 86,4% 74,6 Kadın% 20,4% 13,3% 13,6% 25,4 $ Evet Cinsiyet İkisi İkisi de Python R Erkek 91,6% 93,9% 95,0% 88,0% Kadın 8,4% 6,1% 5,0% 12,0%

CGPfunctions paketi

CGPfunctions paketi, çapraz tablo verilerini görselleştirmenin bazı hızlı ve kolay yollarını aramaya değer. Her zamanki gibi CRAN'dan yükleyin install.packages("CGPfunctions").

Paket, çapraz tabloları incelemek için iki ilgi alanına sahiptir: PlotXTabs()ve PlotXTabs2(). Bu kod, verilerin çubuk grafiklerini döndürür (aşağıdaki ilk grafik):

kütüphane (CGPfunctions)

PlotXTabs (verilerim)

Sharon Machlis'in ekran görüntüsü,

PlotXTabs2(mydata) farklı bir görünüme sahip bir grafik ve bazı istatistiksel özetler (soldaki ikinci grafik) oluşturur.

Bu özetlere ihtiyacınız yoksa veya istemiyorsanız results.subtitle = FALSE, gibi  ile kaldırabilirsiniz PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Sharon Machlis'in ekran görüntüsü,

PlotXTabs2()başlık, resim yazısı, göstergeler, renk şeması ve dört çizim türünden biri dahil olmak üzere birkaç düzine bağımsız değişken seçeneğine sahiptir: yan, yığın, mozaik veya yüzde. Ayrıca ggplot2 kullanıcılarına aşina olan ggtheme ve palette gibi seçenekler de vardır. Fonksiyonun yardım dosyasında daha fazla ayrıntı görebilirsiniz.

VTree paketi

Vtree paketi, grafiklerin aksine çapraz tablolar için grafikler oluşturur. Ana vtree()işlevi tek bir değişken üzerinde çalıştırmak , örneğin 

kütüphane (vtree)

vtree (mydata, "LanguageGroup")

size şu temel yanıtı verir:

Sharon Machlis,

Buradaki renk varsayılanlarına meraklı değilim, ancak bir RColorBrewer paletinde takas edebilirsiniz. vtree'nin palet argümanı isimleri değil palet numaralarını kullanır ; vtree paket belgelerinde nasıl numaralandıklarını görebilirsiniz. Örneğin Yeşiller için 3 ve Morlar için 5 seçebilirim. Ne yazık ki, bu varsayılanlar size daha düşük sayılar için daha yoğun bir renk verir ve bu her zaman mantıklı değildir (ve bu örnekte benim için pek iyi çalışmaz). Daha yüksek değer sortfill = TRUEiçin daha yoğun rengi kullanmak için bu varsayılan davranışı ile değiştirebilirim . 

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

Sharon Machlis,

Koyu rengin metni okumayı zorlaştırdığını görürseniz, bazı seçenekler vardır. Bir seçenek , gibi düz argümanı  kullanmaktır vtree(mydata, "LanguageGroup", plain = TRUE). Başka bir seçenek de fillcolor, gibi bir bağımsız değişken  kullanarak palet yerine tek bir dolgu rengi ayarlamaktır vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

Bir çapraz tablo raporunda iki değişkene bakmak için, varsayılanı istemiyorsanız ikinci bir sütun adı ve palet veya renk eklemeniz yeterlidir. Düz seçeneği kullanabilir veya iki palet veya iki renk belirtebilirsiniz. Aşağıda paletler yerine belirli renkler seçtim ve ayrıca grafiği dikey olarak okumak için döndürdüm.

vtree (verilerim, c ("DilGrubu", "Cinsiyet"),

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

ufuk = YANLIŞ)

Sharon Machlis,

Ağaç büyüdükçe okumak ve takip etmek biraz zorlaşsa da ikiden fazla kategori ekleyebilirsiniz. Yalnızca bazı dallarla ilgileniyorsanız , keepbağımsız değişkenle hangisinin görüntüleneceğini belirtebilirsiniz . Aşağıda, vtree()yalnızca Python olmadan R kullanan veya hem R hem de Python kullanan kişileri göstermeyi ayarladım .

vtree (mydata, c ("Cinsiyet", "DilGrubu", "Hobi Sahibi"),

yatay = YANLIŞ, fillcolor = c (DilGrubu = "# e7d4e8",

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

keep = list (LanguageGroup = c ("R", "Her ikisi")), showcount = YANLIŞ)

Ağaç çok meşgul oluyor, ben biraz şey olur düşünmek ya sayımı veya düğüm etiketleri, ikisini olarak yüzde. Böylece, yukarıdaki koddaki son bağımsız değişken  showcount = FALSE, grafiği yalnızca yüzdeleri gösterecek ve sayıları göstermeyecek şekilde ayarlar.

Sharon Machlis,

Grup seçeneklerine göre daha fazla sayı

R bazında, dplyr ve data.table dahil olmak üzere R'de gruplandırmanın ve saymanın başka yararlı yolları da vardır. Base R, xtabs()özellikle bu görev için işleve sahiptir  . Aşağıdaki formül sözdizimine dikkat edin: yaklaşık işareti ve ardından bir değişken artı başka bir değişken.

xtabs (~ DilGrubu + Cinsiyet, veriler = verilerim)

Cinsiyet Dil Grup Erkek Kadın İkisi de 3264374 Ne 43908 3705 Python 29044 1940 R 969175

dplyr'in count()işlevi "gruplama ölçütü " ve "her gruptaki satırları sayma" yı tek bir işlevde birleştirir.

kütüphane (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

Çoğu veride olduğu gibi ggplot2, özetlenmiş sonuçları görselleştirmek için iyi bir seçimdir. Aşağıdaki ilk ggplot grafiği, X ekseni üzerindeki LanguageGroup'u ve Y eksenindeki her biri için sayıyı çizer. Dolgu rengi, birinin hobi olarak kod yazıp yazmadığını gösterir. Ve facet_wrap şunu söylüyor: Cinsiyet sütunundaki her değer için ayrı bir grafik yapın.

kütüphane (ggplot2)

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

geom_bar (stat = "kimlik") +

facet_wrap (yönler = değişkenler (Cinsiyet))

Sharon Machlis,

Örnekte görece az sayıda kadın olduğu için, her iki grafik de aynı Y ekseni ölçeğini kullandığında cinsiyetler arasında yüzdeleri karşılaştırmak zordur. Yine de bunu değiştirebilirim, böylece her grafik scales = “free_y”, facet_wrap()işleve argümanı ekleyerek ayrı bir ölçek kullanır :

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

geom_bar (stat = "kimlik") +

facet_wrap (fasets = vars (Cinsiyet), ölçekler = "free_y")

Artık birden çok değişkeni cinsiyete göre karşılaştırmak daha kolay.

Daha fazla R ipucu için, "R ile Daha Çok Şey Yapın" sayfasına gidin veya "R ile Daha Çok Şey Yapın" YouTube oynatma listesine bakın.

Bu demoda kullanılan verilerin nasıl indirileceği ve tartışılacağı hakkında bilgi için sonraki sayfaya bakın.