R에서 그룹별로 계산하는 방법

여러 그룹 (크로스 탭 보고서라고도 함)별로 계산하는 것은 여론 조사에서 의료 테스트에 이르기까지 다양한 데이터를 보는 데 유용한 방법이 될 수 있습니다. 예를 들어, 사람들은 성별과 연령대별로 어떻게 투표 했습니까? R과 Python을 모두 사용하는 소프트웨어 개발자가 남성 대 여성은 몇 명입니까?

R에서 카테고리별로 이러한 종류의 계산을 수행하는 방법에는 여러 가지가 있습니다. 여기에서 제가 좋아하는 몇 가지를 공유하고 싶습니다.

이 기사의 데모에서는 급여에서 사용되는 기술에 이르기까지 수십 가지 주제에 대해 개발자를 대상으로하는 Stack Overflow Developers 설문 조사의 하위 집합을 사용할 것입니다. 사용 된 언어, 성별, 취미로 코딩하는 경우에 대한 열을 작성하겠습니다. 또한 개발자가 R, Python 또는 둘 다 사용하거나 둘 다 사용하지 않는지 여부에 대한 내 고유 한 LanguageGroup 열을 추가했습니다.

따라하려면이 기사의 마지막 페이지에 내가 사용중인 데이터 세트를 얻기 위해 데이터를 다운로드하고 랭 글링하는 방법에 대한 지침이 있습니다.

데이터에는 각 설문 조사 응답에 대해 하나의 행이 있으며 4 개 열은 모두 문자입니다.

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 "... $ 취미 : chr"예 ""아니요 ""예 ""아니요 "... $ LanguageGroup : chr"Python ""Python ""둘 다 ""Python "...

누락 된 값을 제거하고 가장 큰 두 성별 인 남성과 여성 만 사용하는 등 교차 분석을보다 쉽게 ​​관리 할 수 ​​있도록 원시 데이터를 필터링했습니다.

관리인 패키지

그렇다면 각 언어 그룹의 성별 구분은 무엇입니까? 데이터 프레임에서 이러한 유형의보고를 할 때 필자가 사용하는 도구 중 하나는 관리인 패키지의 tabyl()기능입니다. 

기본 tabyl()함수는 카운트가있는 데이터 프레임을 반환합니다. tabyl()인수에 추가 한 첫 번째 열 이름이 이되고 두 번째 열 이름이 됩니다

도서관 (janitor) tabyl (mydata, Gender, LanguageGroup)

성별 둘 다 아님 Python R 남자 3264 43908 29044969 여자 374 3705 1940175

좋은 점 tabyl()은 퍼센트를 생성하는 것도 매우 쉽다는 것입니다. 원시 합계 대신 각 열의 백분율을 보려면을 추가하십시오 adorn_percentages("col"). 그런 다음 이러한 결과를  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup) %> %

adorn_percentages ( "col") %> %

adorn_pct_formatting (숫자 = 1)

성별 둘 다 아님 Python R 남자 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 남자 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 %

CGP 기능 패키지

CGP 기능 패키지는 크로스 탭 데이터를 시각화하는 빠르고 쉬운 방법을 찾아 볼 가치가 있습니다. CRAN에서 일반적인 install.packages("CGPfunctions").

이 패키지에는 교차 분석을 검사하는 데 유용한 두 가지 기능이 있습니다. PlotXTabs()PlotXTabs2(). 이 코드는 데이터의 막대 그래프를 반환합니다 (아래 첫 번째 그래프).

라이브러리 (CGP 기능)

PlotXTabs (mydata)

Sharon Machlis의 스크린 샷,

PlotXTabs2(mydata) 다른 모양과 통계 요약 (왼쪽의 두 번째 그래프)으로 그래프를 만듭니다.

당신이 필요하지 않거나 그 요약을 원하는 경우에, 당신은 그들을 제거 할 수 있습니다 results.subtitle = FALSE같은  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Sharon Machlis의 스크린 샷,

PlotXTabs2()제목, 캡션, 범례, 색 구성표, 측면, 스택, 모자이크 또는 퍼센트의 네 가지 플롯 유형 중 하나를 포함하여 몇 가지 인수 옵션이 있습니다. ggtheme 및 palette와 같이 ggplot2 사용자에게 익숙한 옵션도 있습니다. 함수의 도움말 파일에서 자세한 내용을 볼 수 있습니다.

vtree 패키지

vtree 패키지는 그래프가 아닌 교차 분석 용 그래픽 을 생성 합니다 . 다음 vtree()과 같은 하나의 변수에 대해 주 함수  실행

라이브러리 (vtree)

vtree (mydata, "LanguageGroup")

이 기본 응답을 얻습니다.

Sharon Machlis,

여기서는 색상 기본값에 관심이 없지만 RColorBrewer 팔레트에서 바꿀 수 있습니다. vtree의 팔레트 인수는 이름이 아닌 팔레트 번호를 사용 합니다. vtree 패키지 문서에서 번호가 어떻게 매겨져 있는지 확인할 수 있습니다. 예를 들어 녹색은 3 개, 보라색은 5 개를 선택할 수 있습니다. 불행히도 이러한 기본값은 더 낮은 개수의 숫자에 대해 더 강렬한 색상을 제공하므로 항상 의미가있는 것은 아닙니다 (이 예에서는 잘 작동하지 않음). 더 높은 값에 sortfill = TRUE더 강렬한 색상을 사용하도록 기본 동작을 변경할 수 있습니다 . 

vtree (mydata, "LanguageGroup", 팔레트 = 3, sortfill = TRUE)

Sharon Machlis,

어두운 색으로 인해 텍스트를 읽기 힘들다면 몇 가지 옵션이 있습니다. 하나의 옵션은 사용하는 것입니다 일반 같은 인수를  vtree(mydata, "LanguageGroup", plain = TRUE). 또 다른 옵션은와 fillcolor같은 인수를  사용하여 팔레트 대신 단일 채우기 색상을 설정하는 것입니다 vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

교차 분석 보고서에서 두 개의 변수를 보려면 기본값을 원하지 않는 경우 두 번째 열 이름과 팔레트 또는 색상을 추가하면됩니다. 일반 옵션을 사용하거나 두 개의 팔레트 또는 두 가지 색상을 지정할 수 있습니다. 아래에서는 팔레트 대신 특정 색상을 선택하고 그래프를 회전하여 세로로 읽었습니다.

vtree (mydata, c ( "LanguageGroup", "성별"),

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

horiz = 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)

트리가 너무 바빠서 노드 레이블로 개수 또는 백분율을 지정 하는 것이 도움이된다고 생각합니다 . 따라서 위 코드의 마지막 인수 인은  개수가 아닌 백분율 만 표시하도록 그래프를 설정합니다.showcount = FALSE

Sharon Machlis,

그룹 옵션으로 더 많은 카운트

base R, dplyr 및 data.table을 포함하여 R에서 그룹화하고 계산하는 다른 유용한 방법이 있습니다. Base R에는  xtabs()이 작업을위한 기능이 있습니다. 아래의 공식 구문에 유의하십시오. 물결표와 하나의 변수와 다른 변수를 차례로 추가합니다.

xtabs (~ LanguageGroup + 성별, 데이터 = mydata)

성별 언어 그룹 남성 여성 모두 3264374 둘 다 아님 43908 3705 Python 29044 1940 R 969175

dplyr의 count()함수는 "그룹 별"및 "각 그룹의 행 개수"를 단일 함수로 결합합니다.

도서관 (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은 Gender 열의 각 값에 대해 별도의 그래프를 만듭니다.

라이브러리 (ggplot2)

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

geom_bar (stat = "identity") +

facet_wrap (facets = vars (성별))

Sharon Machlis,

표본에 여성이 상대적으로 적기 때문에 두 그래프가 동일한 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 팁을 보려면 "R로 더 많은 작업 수행"페이지로 이동하거나 "R로 더 많은 작업 수행"YouTube 재생 목록을 확인하십시오.

이 데모에 사용 된 데이터를 다운로드하고 랭 글링하는 방법에 대한 정보는 다음 페이지를 참조하십시오.