Cara menghitung menurut kelompok di R

Menghitung berdasarkan beberapa kelompok - terkadang disebut laporan tab silang - dapat menjadi cara yang berguna untuk melihat data mulai dari survei opini publik hingga tes medis. Misalnya, bagaimana orang memilih berdasarkan jenis kelamin dan kelompok umur? Berapa banyak pengembang perangkat lunak yang menggunakan R dan Python adalah pria vs. wanita?

Ada banyak cara untuk melakukan penghitungan menurut kategori semacam ini di R. Di sini, saya ingin membagikan beberapa favorit saya.

Untuk demo dalam artikel ini, saya akan menggunakan subset dari survei Stack Overflow Developers, yang mensurvei pengembang tentang lusinan topik mulai dari gaji hingga teknologi yang digunakan. Saya akan menguranginya dengan kolom untuk bahasa yang digunakan, jenis kelamin, dan jika mereka membuat kode sebagai hobi. Saya juga menambahkan kolom LanguageGroup saya sendiri untuk mengetahui apakah pengembang melaporkan menggunakan R, Python, keduanya, atau tidak keduanya.

Jika Anda ingin mengikutinya, halaman terakhir artikel ini berisi petunjuk tentang cara mengunduh dan mengatur data untuk mendapatkan kumpulan data yang sama yang saya gunakan.

Data memiliki satu baris untuk setiap respons survei, dan keempat kolom tersebut semuanya karakter.

str (mydata) 'data.frame': 83379 obs. dari 4 variabel: $ Jenis Kelamin: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Hobi: chr" Ya "" Tidak "" Ya "" Tidak "... $ LanguageGroup: chr" Python "" Python "" Neither "" Python "...

Saya memfilter data mentah untuk membuat tab silang lebih mudah dikelola, termasuk menghapus nilai yang hilang dan hanya mengambil dua jenis kelamin terbesar, Pria dan Wanita.

Paket petugas kebersihan

Jadi, apa rincian gender dalam setiap kelompok bahasa? Untuk jenis pelaporan ini dalam bingkai data, salah satu alat bantu saya adalah tabyl()fungsi paket petugas kebersihan . 

Fungsi dasar tabyl()mengembalikan bingkai data dengan hitungan. Nama kolom pertama yang Anda tambahkan ke tabyl()argumen menjadi baris , dan yang kedua menjadi kolom

library (janitor) tabyl (mydata, Gender, LanguageGroup)

Gender Keduanya Tidak Baik Python R Man 3264 43908 29044 969 Wanita 374 3705 1940 175

Yang menyenangkan tabyl()adalah sangat mudah untuk menghasilkan persen juga. Jika Anda ingin melihat persentase untuk setiap kolom dan bukan total mentah, tambahkan adorn_percentages("col"). Anda kemudian dapat menyalurkan hasil tersebut ke dalam fungsi pemformatan seperti  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (digit = 1)

Gender Keduanya Tidak Baik Python R Laki-laki 89,7% 92,2% 93,7% 84,7% Wanita 10,3% 7,8% 6,3% 15,3%

Untuk melihat persen demi baris, tambahkan adorn_percentages("row")

Jika Anda ingin menambahkan variabel ketiga, seperti Hobbyist, itu juga mudah.

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

adorn_percentages ("col")%>%

adorn_pct_formatting (digit = 1)

Namun, cara ini menjadi sedikit lebih sulit untuk membandingkan hasil secara visual di lebih dari dua tingkat. Kode ini mengembalikan daftar dengan satu bingkai data untuk setiap pilihan tingkat ketiga:

$ Tidak Jenis Kelamin Baik Tidak Baik Python R Man 79.6% 86.7% 86.4% 74.6% Wanita 20.4% 13.3% 13.6% 25.4% $ Ya Jenis Kelamin Baik Tidak Baik Python R Man 91.6% 93.9% 95.0% 88.0% Wanita 8.4% 6.1% 5.0% 12.0%

Paket CGPfunctions

Paket CGPfunctions layak untuk dicoba karena beberapa cara cepat dan mudah untuk memvisualisasikan data tab silang. Instal dari CRAN dengan biasa install.packages("CGPfunctions").

Paket ini memiliki dua fungsi yang menarik untuk memeriksa tab silang: PlotXTabs()dan PlotXTabs2(). Kode ini mengembalikan grafik batang dari data (grafik pertama di bawah):

perpustakaan (CGPfunctions)

PlotXTabs (mydata)

Tangkapan layar oleh Sharon Machlis,

PlotXTabs2(mydata) membuat grafik dengan tampilan berbeda, dan beberapa ringkasan statistik (grafik kedua di kiri).

Jika Anda tidak memerlukan atau menginginkan ringkasan tersebut, Anda dapat menghapusnya dengan results.subtitle = FALSE, seperti  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Tangkapan layar oleh Sharon Machlis,

PlotXTabs2()memiliki beberapa lusin opsi argumen, termasuk judul, keterangan, legenda, skema warna, dan salah satu dari empat jenis plot: sisi, tumpukan, mosaik, atau persen. Ada juga opsi yang familiar bagi pengguna ggplot2, seperti ggtheme dan palette. Anda dapat melihat detail lebih lanjut di file bantuan fungsi.

Paket vtree

Paket vtree menghasilkan grafik untuk crosstab dan bukan grafik. Menjalankan vtree()fungsi utama pada satu variabel, seperti 

perpustakaan (vtree)

vtree (mydata, "LanguageGroup")

memberi Anda respons dasar ini:

Sharon Machlis,

Saya tidak tertarik pada default warna di sini, tetapi Anda dapat menukar dengan palet RColorBrewer. Argumen palet vtree menggunakan nomor palet , bukan nama; Anda dapat melihat bagaimana mereka diberi nomor di dokumentasi paket vtree. Saya bisa memilih 3 untuk Hijau dan 5 untuk Ungu, misalnya. Sayangnya, default tersebut memberi Anda warna yang lebih intens untuk angka hitungan yang lebih rendah, yang tidak selalu masuk akal (dan tidak berfungsi dengan baik untuk saya dalam contoh ini). Saya dapat mengubah perilaku default itu dengan sortfill = TRUEmenggunakan warna yang lebih intens untuk nilai yang lebih tinggi

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

Sharon Machlis,

Jika Anda merasa warna gelap membuat teks sulit dibaca, ada beberapa opsi. Salah satu opsinya adalah menggunakan argumen biasa , seperti  vtree(mydata, "LanguageGroup", plain = TRUE). Opsi lainnya adalah menyetel warna isian tunggal alih-alih palet, menggunakan fillcolorargumen, seperti  vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

Untuk melihat dua variabel dalam laporan tab silang, cukup tambahkan nama kolom kedua dan palet atau warna jika Anda tidak menginginkan default. Anda dapat menggunakan opsi polos atau menentukan dua palet atau dua warna. Di bawah ini saya memilih warna tertentu daripada palet, dan saya juga memutar grafik untuk dibaca secara vertikal.

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

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

horizontal = FALSE)

Sharon Machlis,

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)

Dengan pohon mendapatkan begitu sibuk, saya pikir itu membantu untuk memiliki baik jumlah atau persentase sebagai label node, tidak keduanya. Jadi argumen terakhir pada kode di atas  showcount = FALSE,,, mengatur grafik agar hanya menampilkan persen dan bukan hitungan.

Sharon Machlis,

Lebih banyak hitungan berdasarkan opsi grup

Ada cara lain yang berguna untuk mengelompokkan dan menghitung dalam R, termasuk basis R, dplyr, dan data.table. Basis R memiliki  xtabs()fungsi khusus untuk tugas ini. Perhatikan sintaks rumus di bawah ini: sebuah tilde dan kemudian satu variabel ditambah variabel lainnya.

xtabs (~ LanguageGroup + Gender, data = mydata)

Jenis Kelamin Bahasa Kelompok Pria Wanita Baik 3264374 Tidak Baik 43908 3705 Python 29044 1940 R 969 175

Fungsi dplyr count()menggabungkan "group by" dan "count row in each group" menjadi satu fungsi.

perpustakaan (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

Seperti kebanyakan data, ggplot2 adalah pilihan yang baik untuk memvisualisasikan hasil yang diringkas. Grafik ggplot pertama di bawah memplot LanguageGroup pada sumbu X dan jumlah masing-masing pada sumbu Y. Warna isian menunjukkan apakah seseorang mengatakan bahwa mereka membuat kode sebagai hobi. Dan, facet_wrap mengatakan: Buat grafik terpisah untuk setiap nilai di kolom Gender.

perpustakaan (ggplot2)

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

geom_bar (stat = "identitas") +

facet_wrap (facets = vars (Gender))

Sharon Machlis,

Karena sampel wanita relatif sedikit, sulit untuk membandingkan persentase antar gender saat kedua grafik menggunakan skala sumbu Y yang sama. Saya bisa mengubahnya, jadi setiap grafik menggunakan skala terpisah, dengan menambahkan argumen scales = “free_y”ke facet_wrap()fungsi:

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

geom_bar (stat = "identitas") +

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

Sekarang lebih mudah untuk membandingkan beberapa variabel berdasarkan jenis kelamin.

Untuk tips R lainnya, buka halaman "Lakukan Lebih Banyak Dengan R" atau lihat playlist YouTube "Lakukan Lebih Banyak Dengan R".

Lihat halaman berikutnya untuk info tentang cara mengunduh dan menyatukan data yang digunakan dalam demo ini.