Rでグループごとに数える方法

複数のグループによるカウント(クロス集計レポートと呼ばれることもあります)は、世論調査から医療検査に至るまでのデータを調べるのに便利な方法です。たとえば、人々は性別や年齢層ごとにどのように投票しましたか?RとPythonの両方を使用するソフトウェア開発者の数は男性と女性ですか?

Rのカテゴリでこの種のカウントを行う方法はたくさんあります。ここでは、私のお気に入りのいくつかを共有したいと思います。

この記事のデモでは、Stack Overflow Developers調査のサブセットを使用します。この調査では、給与から使用されているテクノロジーに至るまで、数十のトピックについて開発者を調査します。使用する言語、性別、およびそれらが趣味としてコーディングされているかどうかの列を使用して、それを絞り込みます。また、開発者がR、Python、またはその両方を使用して報告したかどうかについて、独自のLanguageGroup列を追加しました。

フォローしたい場合は、この記事の最後のページに、私が使用しているのと同じデータセットを取得するためにデータをダウンロードして整理する方法についての説明があります。

データには、調査回答ごとに1つの行があり、4つの列はすべて文字です。

str(mydata) 'data.frame':83379obs。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 "... $愛好家:chr"はい ""いいえ ""はい ""いいえ "... $ LanguageGroup:chr" Python "" Python ""どちらでもない "" Python 「..。。

生データをフィルタリングして、クロス集計をより管理しやすくしました。たとえば、欠落している値を削除し、男性と女性の2つの最大の性別のみを取得しました。

管理人パッケージ

では、各言語グループ内の性別の内訳は何ですか?データフレームでのこのタイプのレポートの場合、私の頼りになるツールの1つは、管理人パッケージのtabyl()機能です。 

基本 tabyl()関数は、カウント付きのデータフレームを返します。tabyl()引数に追加する最初の列名がになり、2番目の列名がになります。 

ライブラリ(用務員)tabyl(mydata、Gender、LanguageGroup)

性別両方どちらでもないPythonR男性326443908 29044969女性3743705 1940 175

良い点tabyl()は、パーセントを生成するのも非常に簡単なことです。生の合計ではなく各列のパーセントを表示する場合は、を追加しadorn_percentages("col")ます。次に、これらの結果をadorn_pct_formatting()。などのフォーマット関数にパイプ処理でき ます。

tabyl(mydata、Gender、LanguageGroup)%>%

adorn_percentages( "col")%>%

adorn_pct_formatting(digits = 1)

性別両方どちらでもないPythonR男性89.7%92.2%93.7%84.7%女性10.3%7.8%6.3%15.3%

行ごとのパーセントを表示するには、を追加しadorn_percentages("row")ます。 

Hobbyistなどの3番目の変数を追加する場合も、簡単です。

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

adorn_percentages( "col")%>%

adorn_pct_formatting(digits = 1)

ただし、この方法では、2つ以上のレベルで結果を視覚的に比較するのが少し難しくなります。このコードは、第3レベルの選択ごとに1つのデータフレームを含むリストを返します。

$いいえ性別両方どちらでもないPythonR男性79.6%86.7%86.4%74.6%女性20.4%13.3%13.6%25.4%$はい性別両方どちらでもないPython R男性91.6%93.9%95.0%88.0%女性8.4%6.1%5.0%12.0%

CGPfunctionsパッケージ

CGPfunctionsパッケージは、クロス集計データを視覚化するためのすばやく簡単な方法を探す価値があります。通常のCRANからインストールしますinstall.packages("CGPfunctions")

このパッケージには、クロス集計を調べるための2つの重要な関数がPlotXTabs()ありPlotXTabs2()ます。このコードは、データの棒グラフを返します(下の最初のグラフ)。

ライブラリ(CGPfunctions)

PlotXTabs(mydata)

シャロンマクリスによるスクリーンショット、

PlotXTabs2(mydata) 外観の異なるグラフといくつかの統計要約を作成します(左の2番目のグラフ)。

これらの要約が不要または必要ない場合はresults.subtitle = FALSE、などを使用 して削除できますPlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE)

シャロンマクリスによるスクリーンショット、

PlotXTabs2()タイトル、キャプション、凡例、配色、および4つのプロットタイプ(サイド、スタック、モザイク、またはパーセント)のいずれかを含む、数十の引数オプションがあります。ggthemeやpaletなど、ggplot2ユーザーに馴染みのあるオプションもあります。詳細については、関数のヘルプファイルを参照してください。

vtreeパッケージ

vtreeパッケージは、グラフではなくクロス集計のグラフィックを生成します。次のvtree()ような1つの変数でmain関数を 実行する

ライブラリ(vtree)

vtree(mydata、 "LanguageGroup")

この基本的な応答を取得します。

シャロン・マクリス、

ここではデフォルトの色には興味がありませんが、RColorBrewerパレットで交換できます。vtreeのパレット引数は、名前ではなくパレット番号を使用します。それらがどのように番号付けされているかは、vtreeパッケージのドキュメントで確認できます。たとえば、緑に3つ、紫に5つを選択できます。残念ながら、これらのデフォルトでは、カウント数が少ないほど色が濃くなりますが、これは必ずしも意味がありません(この例ではうまく機能しません)。そのデフォルトの動作を変更しsortfill = TRUEて、より高い値に対してより強い色を使用することができます。 

vtree(mydata、 "LanguageGroup"、パレット= 3、sortfill = TRUE)

シャロン・マクリス、

暗い色でテキストが読みづらくなる場合は、いくつかのオプションがあります。1つのオプションは、などの単純な引数 を使用することvtree(mydata, "LanguageGroup", plain = TRUE)です。別のオプションはfillcolor、などの引数 を使用して、パレットの代わりに単一の塗りつぶし色を設定することvtree(mydata, LanguageGroup", fillcolor = "#99d8c9")です。

クロス集計レポートで2つの変数を確認するには、デフォルトが必要ない場合は、2番目の列名とパレットまたは色を追加するだけです。プレーンオプションを使用するか、2つのパレットまたは2つの色を指定できます。以下では、パレットの代わりに特定の色を選択し、グラフを回転して垂直方向に読み取りました。

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

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

horiz = 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、dplyr、data.tableなど、Rでグループ化してカウントする他の便利な方法があります。ベースRには、xtabs()このタスク専用の機能があり ます。以下の式の構文に注意してください。チルダ、次に1つの変数と別の変数。

xtabs(〜LanguageGroup +性別、データ= mydata)

性別言語グループ男性女性両方3264374どちらでもない439083705 Python 29044 1940 R 969175

dplyrのcount()関数は、「groupby 」と「countrows ineachgroup 」を1つの関数に結合します。

ライブラリ(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グラフは、X軸にLanguageGroupをプロットし、Y軸にそれぞれのカウントをプロットします。塗りつぶしの色は、誰かが趣味としてコーディングしていると言っているかどうかを表します。そして、facet_wrapは次のように述べています。[性別]列の値ごとに個別のグラフを作成します。

ライブラリ(ggplot2)

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

geom_bar(stat = "identity")+

facet_wrap(facets = vars(Gender))

シャロン・マクリス、

サンプルには女性が比較的少ないため、両方のグラフが同じY軸スケールを使用している場合、性別間のパーセンテージを比較することは困難です。ただし、これを変更できるのでscales = “free_y”facet_wrap()関数に引数を追加することで、各グラフが個別のスケールを使用します。

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

geom_bar(stat = "identity")+

facet_wrap(facets = vars(Gender)、scales = "free_y")

性別ごとに複数の変数を比較するのが簡単になりました。

Rに関するその他のヒントについては、の「Do More With R」ページにアクセスするか、「Do MoreWithR」YouTubeプレイリストをご覧ください。

このデモで使用されるデータをダウンロードして処理する方法については、次のページを参照してください。