단변량 범주형 데이터를 다양한 형태의 표로 간단히 제작하는 방법을 살펴보자. starwarsdb
데이터 팩키지에 포함된 스타워즈 관련 데이터셋부터 시작해보자.
스타워즈 영화에 출연한 캐릭터와 캐릭터의 눈 색깔을 살펴보자.
library(janitor)
library(tidyverse)
library(starwarsdb)
::people %>%
starwarsdbselect(name, eye_color)
# A tibble: 82 × 2
name eye_color
<chr> <chr>
1 Luke Skywalker blue
2 C-3PO yellow
3 R2-D2 red
4 Darth Vader yellow
5 Leia Organa brown
6 Owen Lars blue
7 Beru Whitesun lars blue
8 R5-D4 red
9 Biggs Darklighter brown
10 Obi-Wan Kenobi blue-gray
# … with 72 more rows
스타워즈 영화에 출연한 캐릭터와 캐릭터의 눈 색깔을 살펴보자. NA
값이 존재하기 때문에 이를 제거해보자.
<- starwarsdb::people %>%
starwars_table select(name, eye_color) %>%
::tabyl(eye_color) %>%
janitorna.omit()
starwars_table
eye_color n percent valid_percent
black 9 0.10975610 0.1125
blue 19 0.23170732 0.2375
blue-gray 1 0.01219512 0.0125
brown 20 0.24390244 0.2500
gold 1 0.01219512 0.0125
green, yellow 1 0.01219512 0.0125
hazel 2 0.02439024 0.0250
orange 8 0.09756098 0.1000
pink 1 0.01219512 0.0125
red 5 0.06097561 0.0625
red, blue 1 0.01219512 0.0125
white 1 0.01219512 0.0125
yellow 11 0.13414634 0.1375
gt
외양 2janitor
표 결과물을 gt
팩키지에 연결시켜 표를 시각적으로 가치있게 제작한다.
library(gt)
%>%
starwars_table select(-starts_with("valid")) %>%
gt() %>%
fmt_percent(
columns = percent,
decimals =1
%>%
) tab_header(
title = md("**☛ 범주형 데이터 훈련 ☚**"),
subtitle = md("*`gt`, `janitor`*")
%>%
) tab_source_note(
source_note = md("http://jenrichmond.rbind.io/post/digging-into-the-janitor-package/")) %>%
cols_align(
align = "center",
columns = eye_color
%>%
) tab_options(
table.width = pct(50),
heading.background.color = "#1E61B0", # R logo 파란색
heading.title.font.size = "32px",
column_labels.background.color = "#F7F7F7", # R logo 회색
column_labels.font.weight = "bold",
stub.background.color = "#ffffff",
stub.font.weight = "bold"
)
☛ 범주형 데이터 훈련 ☚ | ||
---|---|---|
gt , janitor |
||
eye_color | n | percent |
black | 9 | 11.0% |
blue | 19 | 23.2% |
blue-gray | 1 | 1.2% |
brown | 20 | 24.4% |
gold | 1 | 1.2% |
green, yellow | 1 | 1.2% |
hazel | 2 | 2.4% |
orange | 8 | 9.8% |
pink | 1 | 1.2% |
red | 5 | 6.1% |
red, blue | 1 | 1.2% |
white | 1 | 1.2% |
yellow | 11 | 13.4% |
http://jenrichmond.rbind.io/post/digging-into-the-janitor-package/ |
범주형 데이터 표를 제작하게 되면 각종 합계를 행과 열을 기준으로 작성하고 행과 열에서 비율도 계산할 필요가 있다.
<-
starwars_ttl_table ::people %>%
starwarsdbselect(name, eye_color) %>%
::tabyl(eye_color) %>%
janitorna.omit() %>%
select(-percent, percent = valid_percent) %>%
adorn_totals(c("row"), name = "합계")
starwars_ttl_table
eye_color n percent
black 9 0.1125
blue 19 0.2375
blue-gray 1 0.0125
brown 20 0.2500
gold 1 0.0125
green, yellow 1 0.0125
hazel 2 0.0250
orange 8 0.1000
pink 1 0.0125
red 5 0.0625
red, blue 1 0.0125
white 1 0.0125
yellow 11 0.1375
합계 80 1.0000
단변량 범주형 변수를 gt
팩키지로 외양을 전문가스럽게 작성한다.
%>%
starwars_ttl_table gt() %>%
fmt_percent(
columns = percent,
decimals =1
%>%
) tab_header(
title = md("**☛ 범주형 데이터 훈련 ☚**"),
subtitle = md("*`gt`, `janitor`*")
%>%
) tab_source_note(
source_note = md("http://jenrichmond.rbind.io/post/digging-into-the-janitor-package/")) %>%
cols_align(
align = "center",
columns = eye_color
%>%
) tab_options(
table.width = pct(70),
heading.background.color = "#1E61B0", # R logo 파란색
heading.title.font.size = "32px",
column_labels.background.color = "#F7F7F7", # R logo 회색
column_labels.font.weight = "bold",
stub.background.color = "#ffffff",
stub.font.weight = "bold"
%>%
) tab_spanner(label = "요약 통계량", columns = c(n, percent)) %>%
tab_style(
style = list(
cell_fill(color = "skyblue"),
cell_text(
align = "right",
size = "large",
weight = "bold")
),locations = cells_body(rows = eye_color == "합계"))
☛ 범주형 데이터 훈련 ☚ | ||
---|---|---|
gt , janitor |
||
eye_color | 요약 통계량 | |
n | percent | |
black | 9 | 11.2% |
blue | 19 | 23.8% |
blue-gray | 1 | 1.2% |
brown | 20 | 25.0% |
gold | 1 | 1.2% |
green, yellow | 1 | 1.2% |
hazel | 2 | 2.5% |
orange | 8 | 10.0% |
pink | 1 | 1.2% |
red | 5 | 6.2% |
red, blue | 1 | 1.2% |
white | 1 | 1.2% |
yellow | 11 | 13.8% |
합계 | 80 | 100.0% |
http://jenrichmond.rbind.io/post/digging-into-the-janitor-package/ |
단변량 범주형 데이터를 확대해서 2변량 범주형 데이터를 다양한 형태의 표로 간단히 제작하는 방법을 살펴보자.
스타워즈 영화에 출연한 캐릭터와 캐릭터의 생리학적 성과 성 정체성에 살펴보자. 4
sex
: 생리학적 성별gender
: 성 정체성::people %>%
starwarsdbselect(name, sex, gender)
# A tibble: 82 × 3
name sex gender
<chr> <chr> <chr>
1 Luke Skywalker male masculine
2 C-3PO none masculine
3 R2-D2 none masculine
4 Darth Vader male masculine
5 Leia Organa female feminine
6 Owen Lars male masculine
7 Beru Whitesun lars female feminine
8 R5-D4 none masculine
9 Biggs Darklighter male masculine
10 Obi-Wan Kenobi male masculine
# … with 72 more rows
스타워즈 영화에 출연한 캐릭터 생물학적 성과 성 정체성에 대해 요약 표를 작성해보자.
<- starwarsdb::people %>%
gender_table select(name, sex, gender) %>%
::tabyl(sex, gender) %>%
janitorna.omit()
gender_table
sex feminine masculine
female 16 0
hermaphroditic 0 1
male 0 60
none 1 4
표를 작성하는데 있어 핵심적으로 포함되는 합계(Total), 비율 등이 포함되도록 이를 넣어보자.
<- starwarsdb::people %>%
gender_ttl_table select(name, sex, gender) %>%
::tabyl(sex, gender) %>%
janitorna.omit() %>%
adorn_totals(where = c("row", "col"), name = "합계")
gender_ttl_table
sex feminine masculine 합계
female 16 0 16
hermaphroditic 0 1 1
male 0 60 60
none 1 4 5
합계 17 65 82
“합계(Total)”을 넣었다면 이번에는 비율을 표에 삽입해 보자. 퍼센티지 비율은 행 혹은 칼럼 기준으로 지정할 수 있고 adorn_
을 사용해서 기본 표에 다양한 기능을 넣을 수 있다.
<- starwarsdb::people %>%
gender_pcnt_table select(name, sex, gender) %>%
::tabyl(sex, gender) %>%
janitorna.omit() %>%
adorn_totals(where = c("row", "col"), name = "합계") %>%
adorn_percentages(denominator = "col") %>%
adorn_pct_formatting(digits = 0)
gender_pcnt_table
sex feminine masculine 합계
female 94% 0% 20%
hermaphroditic 0% 2% 1%
male 0% 92% 73%
none 6% 6% 6%
합계 100% 100% 100%
<- starwarsdb::people %>%
gender_ttl_pcnt_table select(name, sex, gender) %>%
::tabyl(sex, gender) %>%
janitorna.omit() %>%
adorn_totals(where = c("row", "col"), name = "합계") %>%
adorn_percentages(denominator = "col") %>%
adorn_pct_formatting(digits = 0) %>%
adorn_ns(position = "rear")
gender_ttl_pcnt_table
sex feminine masculine 합계
female 94% (16) 0% (0) 20% (16)
hermaphroditic 0% (0) 2% (1) 1% (1)
male 0% (0) 92% (60) 73% (60)
none 6% (1) 6% (4) 6% (5)
합계 100% (17) 100% (65) 100% (82)
gt
외양정성껏 작성한 janitor
표를 gt
팩키지에 연결시켜 2변량 범주형 표를 시각적으로 가치있게 제작한다.
%>%
gender_ttl_pcnt_table gt() %>%
tab_header(
title = md("**☛ 2변량 교차 범주형 데이터 ☚**"),
subtitle = md("*`gt`, `janitor`*")
%>%
) tab_source_note(
source_note = md("참고: https://garthtarr.github.io/meatR/janitor.html")) %>%
cols_align(
align = "right",
columns = c(feminine, masculine, 합계)
%>%
) tab_options(
table.width = pct(100),
heading.background.color = "#1E61B0", # R logo 파란색
heading.title.font.size = "32px",
column_labels.background.color = "#F7F7F7", # R logo 회색
column_labels.font.weight = "bold",
stub.background.color = "#ffffff",
stub.font.weight = "bold"
%>%
) tab_spanner(label = "요약 통계량", columns = c(feminine, masculine)) %>%
tab_style(
style = list(
cell_fill(color = "skyblue"),
cell_text(
align = "right",
size = "large",
weight = "bold")
),locations = cells_body(rows = sex == "합계",
columns = 합계))
☛ 2변량 교차 범주형 데이터 ☚ | |||
---|---|---|---|
gt , janitor |
|||
sex | 요약 통계량 | 합계 | |
feminine | masculine | ||
female | 94% (16) | 0% (0) | 20% (16) |
hermaphroditic | 0% (0) | 2% (1) | 1% (1) |
male | 0% (0) | 92% (60) | 73% (60) |
none | 6% (1) | 6% (4) | 6% (5) |
합계 | 100% (17) | 100% (65) | 100% (82) |
참고: https://garthtarr.github.io/meatR/janitor.html |
gtsummary
5먼저 gtsummary
팩키지에 포함된 trial
데이터셋을 바탕으로 다양한 표제작을 신속히 할 수 있는 방법을 살펴보자.
library(gtsummary)
<-
sample_tbl %>%
trial select(trt, age, response) %>%
na.omit()
sample_tbl
# A tibble: 183 × 3
trt age response
<chr> <dbl> <int>
1 Drug A 23 0
2 Drug B 9 1
3 Drug A 31 0
4 Drug A 51 1
5 Drug B 39 0
6 Drug A 37 0
7 Drug A 32 0
8 Drug A 31 0
9 Drug B 34 0
10 Drug B 42 0
# … with 173 more rows
tbl_summary()
함수를 사용해서 기본 생성 표를 제작해보자.
%>%
sample_tbl tbl_summary(by = "trt")
Characteristic | Drug A, N = 891 | Drug B, N = 941 |
---|---|---|
Age | 46 (37, 60) | 48 (38, 55) |
Tumor Response | 27 (30%) | 31 (33%) |
1
Median (IQR); n (%)
|
다음 단계로 필요한 요약 통계량을 뽑아내서 이를 표에 반영하는 방식을 살펴보자.
<-
gtsummary_tbl %>%
sample_tbl tbl_summary(
by = "trt",
statistic = list(
all_continuous() ~ "평균: {mean} (표준편차: {sd})",
all_categorical() ~ "{n} / 총계: {N} (비율: {p}%)"
),label = list("age" ~ "연령",
"response" ~ "반응")
%>%
) modify_spanning_header(all_stat_cols() ~ "**신약**")
gtsummary_tbl
Characteristic | 신약 | |
---|---|---|
Drug A, N = 891 | Drug B, N = 941 | |
연령 | 평균: 47 (표준편차: 15) | 평균: 47 (표준편차: 14) |
반응 | 27 / 총계: 89 (비율: 30%) | 31 / 총계: 94 (비율: 33%) |
1
평균: Mean (표준편차: SD); n / 총계: N (비율: %)
|
나름 필요한 정보가 모두 담긴 표가 제작되었으니 이를 gt
팩키지와 연결시켜 표를 제작해보자.
gtsummary
객체를 gt()
에 연결시켜 작업하는 방법은 현재 없음.
%>%
gtsummary_tbl gt()
Error in UseMethod("group_vars"): no applicable method for 'group_vars' applied to an object of class "c('tbl_summary', 'gtsummary')"
janitor
- tabyls: a tidy, fully-featured approach to counting things↩︎
“R NOTES TO MYSELF”, “cleaning penguins with the janitor package”↩︎
Daniel D. Sjoberg (June 27, 2019), “gtsummary
- Introduction to {gt} + {gtsummary} Packages”, Memorial Sloan Kettering Cancer Center↩︎
Daniel D. Sjoberg (June 27, 2019), “gtsummary
- Introduction to {gt} + {gtsummary} Packages”, Memorial Sloan Kettering Cancer Center↩︎
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com