วิธีการนับตามกลุ่มใน R

การนับตามกลุ่มหลายกลุ่มซึ่งบางครั้งเรียกว่ารายงานแบบไขว้อาจเป็นวิธีที่มีประโยชน์ในการดูข้อมูลตั้งแต่การสำรวจความคิดเห็นของประชาชนไปจนถึงการทดสอบทางการแพทย์ ตัวอย่างเช่นผู้คนโหวตตามเพศและกลุ่มอายุอย่างไร นักพัฒนาซอฟต์แวร์ที่ใช้ทั้ง R และ Python เป็นผู้ชายกับผู้หญิงกี่คน?

มีหลายวิธีในการนับประเภทนี้ตามหมวดหมู่ใน R ที่นี่ฉันต้องการแบ่งปันรายการโปรดของฉัน

สำหรับการสาธิตในบทความนี้ฉันจะใช้ชุดย่อยของแบบสำรวจ Stack Overflow Developers ซึ่งสำรวจนักพัฒนาในหลายหัวข้อตั้งแต่เงินเดือนไปจนถึงเทคโนโลยีที่ใช้ ฉันจะย่อคอลัมน์สำหรับภาษาที่ใช้เพศและถ้ารหัสเป็นงานอดิเรก ฉันยังเพิ่มคอลัมน์ LanguageGroup ของตัวเองด้วยว่าผู้พัฒนารายงานโดยใช้ R, Python ทั้งสองหรือไม่

หากคุณต้องการติดตามหน้าสุดท้ายของบทความนี้มีคำแนะนำเกี่ยวกับวิธีดาวน์โหลดและโต้แย้งข้อมูลเพื่อให้ได้ชุดข้อมูลเดียวกันกับที่ฉันใช้

ข้อมูลมีหนึ่งแถวสำหรับการตอบแบบสำรวจแต่ละรายการและสี่คอลัมน์เป็นอักขระทั้งหมด

str (mydata) 'data.frame': 83379 obs. จาก 4 ตัวแปร: $ 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" Yes "" No "" Yes "" No "... $ LanguageGroup: chr" Python "" Python "" Neither "" Python "...

ฉันกรองข้อมูลดิบเพื่อทำให้ครอสแท็บสามารถจัดการได้มากขึ้นรวมถึงการลบค่าที่ขาดหายไปและเลือกเพศที่ใหญ่ที่สุดสองเพศเท่านั้นคือชายและหญิง

แพ็คเกจภารโรง

ดังนั้นการแบ่งเพศในแต่ละกลุ่มภาษาเป็นอย่างไร สำหรับการรายงานประเภทนี้ใน data frame หนึ่งในเครื่องมือ go-to ของฉันคือtabyl()ฟังก์ชัน  ของแพ็คเกจภารโรง

tabyl()ฟังก์ชันพื้นฐานจะส่งคืนกรอบข้อมูลที่มีการนับ ชื่อคอลัมน์แรกที่คุณเพิ่มไปยังtabyl()โต้แย้งกลายเป็นแถวและที่สองหนึ่งคอลัมน์ 

ห้องสมุด (ภารโรง) tabyl (mydata, Gender, LanguageGroup)

เพศทั้งสองไม่ใช่ Python R Man 3264 43908 29044 969 ผู้หญิง 374 3705 1940175

สิ่งที่ดีtabyl()คือมันง่ายมากที่จะสร้างเปอร์เซ็นต์เช่นกัน adorn_percentages("col")หากคุณต้องการที่จะเห็นร้อยละสำหรับคอลัมน์แทนผลรวมคะแนนดิบแต่ละเพิ่ม จากนั้นคุณสามารถไพพ์ผลลัพธ์เหล่านั้นเป็นฟังก์ชันการจัดรูปแบบเช่น  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (หลัก = 1)

เพศทั้งคู่ไม่ใช่ Python R Man 89.7% 92.2% 93.7% 84.7% ผู้หญิง 10.3% 7.8% 6.3% 15.3%

adorn_percentages("row")หากต้องการดูร้อยละโดยแถวเพิ่ม 

หากคุณต้องการเพิ่มตัวแปรที่สามเช่น Hobbyist ก็ทำได้ง่ายเช่นกัน

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

adorn_percentages ("col")%>%

adorn_pct_formatting (หลัก = 1)

อย่างไรก็ตามการเปรียบเทียบผลลัพธ์ด้วยภาพมากกว่าสองระดับจะทำได้ยากขึ้นเล็กน้อย รหัสนี้ส่งคืนรายการที่มีกรอบข้อมูลหนึ่งสำหรับตัวเลือกระดับที่สาม:

$ ไม่มีเพศทั้งคู่ไม่ใช่ Python R Man 79.6% 86.7% 86.4% 74.6% ผู้หญิง 20.4% 13.3% 13.6% 25.4% $ ใช่เพศทั้งคู่ไม่ใช่ Python R Man 91.6% 93.9% 95.0% 88.0% ผู้หญิง 8.4% 6.1% 5.0% 12.0%

แพ็คเกจ CGPfunctions

แพ็คเกจ CGPfunctions นั้นคุ้มค่ากับการมองหาวิธีที่ง่ายและรวดเร็วในการแสดงภาพข้อมูลตารางไขว้ ติดตั้งได้จาก CRAN install.packages("CGPfunctions")กับปกติ

แพคเกจที่มีสองฟังก์ชั่นที่น่าสนใจสำหรับการตรวจสอบแท็บไขว้: และPlotXTabs() PlotXTabs2()รหัสนี้ส่งคืนกราฟแท่งของข้อมูล (กราฟแรกด้านล่าง):

ไลบรารี (CGPfunctions)

PlotXTabs (mydata)

ภาพหน้าจอโดย Sharon Machlis

PlotXTabs2(mydata) สร้างกราฟที่มีรูปลักษณ์ที่แตกต่างกันและสรุปทางสถิติบางส่วน (กราฟที่สองทางด้านซ้าย)

หากคุณไม่ต้องการหรือต้องการข้อมูลสรุปเหล่านั้นคุณสามารถลบออกด้วยresults.subtitle = FALSEเช่น  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

ภาพหน้าจอโดย Sharon Machlis

PlotXTabs2()มีตัวเลือกการโต้แย้งไม่กี่โหลรวมถึงชื่อเรื่องคำบรรยายตำนานโครงร่างสีและหนึ่งในสี่ประเภทของพล็อต: ด้านข้างสแต็กโมเสกหรือเปอร์เซ็นต์ นอกจากนี้ยังมีตัวเลือกที่ผู้ใช้ ggplot2 คุ้นเคยเช่น ggtheme และ palette คุณสามารถดูรายละเอียดเพิ่มเติมได้ในไฟล์วิธีใช้ของฟังก์ชัน

แพ็คเกจ vtree

แพ็กเกจ vtree สร้างกราฟิกสำหรับครอสแท็บซึ่งตรงข้ามกับกราฟ การรันvtree()ฟังก์ชันหลักในตัวแปรเดียวเช่น 

ห้องสมุด (vtree)

vtree (mydata, "LanguageGroup")

ทำให้คุณได้รับคำตอบพื้นฐานนี้:

ชารอนมัคลิส

ฉันไม่สนใจค่าเริ่มต้นของสีที่นี่ แต่คุณสามารถสลับในจานสี RColorBrewer ได้ อาร์กิวเมนต์จานสีของ vtree ใช้หมายเลขจานสีไม่ใช่ชื่อ คุณสามารถดูว่ามีหมายเลขกำกับอย่างไรในเอกสารประกอบแพ็คเกจ vtree ฉันสามารถเลือก 3 สำหรับ Greens และ 5 สำหรับ Purples น่าเสียดายที่ค่าเริ่มต้นเหล่านั้นทำให้คุณมีสีที่เข้มขึ้นสำหรับตัวเลขการนับที่ต่ำกว่าซึ่งไม่สมเหตุสมผลเสมอไป (และไม่เหมาะกับฉันในตัวอย่างนี้) ฉันสามารถเปลี่ยนพฤติกรรมเริ่มต้นนั้นได้โดยsortfill = TRUEใช้สีที่เข้มขึ้นเพื่อให้ได้ค่าที่  สูงขึ้น

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

ชารอนมัคลิส

หากคุณพบว่าสีเข้มทำให้อ่านข้อความได้ยากมีตัวเลือกบางอย่าง ทางเลือกหนึ่งคือการใช้อาร์กิวเมนต์ธรรมดาเช่น  vtree(mydata, "LanguageGroup", plain = TRUE). อีกตัวเลือกหนึ่งคือการตั้งค่าการเติมสีเดียวแทนที่จะจานสีโดยใช้อาร์กิวเมนต์เช่นfillcolor vtree(mydata, LanguageGroup", fillcolor = "#99d8c9")

หากต้องการดูตัวแปรสองตัวแปรในรายงานตารางไขว้เพียงเพิ่มชื่อคอลัมน์ที่สองและจานสีหรือสีหากคุณไม่ต้องการค่าเริ่มต้น คุณสามารถใช้ตัวเลือกธรรมดาหรือระบุจานสีสองสีหรือสองสี ด้านล่างฉันเลือกสีเฉพาะแทนที่จะเป็นจานสีและฉันหมุนกราฟเพื่ออ่านแนวตั้งด้วย

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

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

แนวนอน = FALSE)

ชารอนมัคลิส

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)

ด้วยต้นไม้ที่ได้รับยุ่งมากผมคิดว่ามันจะช่วยให้มีทั้งจำนวนหรือร้อยละเป็นป้ายชื่อโหนดไม่ใช่ทั้งสองอย่าง ดังนั้นอาร์กิวเมนต์สุดท้ายในโค้ดด้านบน  showcount = FALSEจึงตั้งค่ากราฟให้แสดงเฉพาะเปอร์เซ็นต์และไม่นับ

ชารอนมัคลิส

จำนวนมากขึ้นตามตัวเลือกกลุ่ม

มีวิธีอื่น ๆ ที่เป็นประโยชน์ในการจัดกลุ่มและนับใน R ได้แก่ base R, dplyr และ data.table Base R มี  xtabs()ฟังก์ชันเฉพาะสำหรับงานนี้ สังเกตไวยากรณ์ของสูตรด้านล่าง: เครื่องหมายทิลเดอแล้วตัวแปรหนึ่งตัวบวกตัวแปรอื่น

xtabs (~ LanguageGroup + Gender, data = mydata)

ภาษาเพศกลุ่มชายหญิงทั้ง 3264374 ทั้ง 43908 3705 Python 29044 1940 R 969175

count()ฟังก์ชันของ dplyr จะรวม "จัดกลุ่มตาม" และ "นับแถวในแต่ละกลุ่ม" ไว้ในฟังก์ชันเดียว

ห้องสมุด (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

เช่นเดียวกับข้อมูลส่วนใหญ่ ggplot2 เป็นตัวเลือกที่ดีในการแสดงผลสรุป กราฟ ggplot แรกด้านล่างพล็อต LanguageGroup บนแกน X และจำนวนของแต่ละส่วนบนแกน Y การเติมสีแสดงว่ามีคนบอกว่าเขียนโค้ดเป็นงานอดิเรกหรือไม่ และ facet_wrap พูดว่า: สร้างกราฟแยกกันสำหรับแต่ละค่าในคอลัมน์ Gender

ห้องสมุด (ggplot2)

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

geom_bar (stat = "เอกลักษณ์") +

facet_wrap (facets = vars (เพศ))

ชารอนมัคลิส

เนื่องจากมีผู้หญิงค่อนข้างน้อยในกลุ่มตัวอย่างจึงยากที่จะเปรียบเทียบเปอร์เซ็นต์ระหว่างเพศเมื่อกราฟทั้งสองใช้มาตราส่วนแกน Y เดียวกัน ฉันสามารถเปลี่ยนสิ่งนั้นได้ดังนั้นแต่ละกราฟจึงใช้มาตราส่วนแยกกันโดยการเพิ่มอาร์กิวเมนต์scales = “free_y”ให้กับfacet_wrap()ฟังก์ชัน:

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

geom_bar (stat = "เอกลักษณ์") +

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

ตอนนี้การเปรียบเทียบตัวแปรหลายตัวตามเพศทำได้ง่ายขึ้น

สำหรับเคล็ดลับ R เพิ่มเติมโปรดไปที่หน้า“ Do More With R” หรือดูรายการเล่น YouTube“ Do More With R”

ดูหน้าถัดไปสำหรับข้อมูลเกี่ยวกับวิธีดาวน์โหลดและโต้แย้งข้อมูลที่ใช้ในการสาธิตนี้