วิธีการนับตามกลุ่มใน 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)

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

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”
ดูหน้าถัดไปสำหรับข้อมูลเกี่ยวกับวิธีดาวน์โหลดและโต้แย้งข้อมูลที่ใช้ในการสาธิตนี้