1 단변량 범주형 1

단변량 범주형 데이터를 다양한 형태의 표로 간단히 제작하는 방법을 살펴보자. starwarsdb 데이터 팩키지에 포함된 스타워즈 관련 데이터셋부터 시작해보자.

1.1 데이터 살펴보기

스타워즈 영화에 출연한 캐릭터와 캐릭터의 눈 색깔을 살펴보자.

library(janitor)
library(tidyverse)
library(starwarsdb)

starwarsdb::people %>%
  select(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

1.2 범주형 데이터 요약

스타워즈 영화에 출연한 캐릭터와 캐릭터의 눈 색깔을 살펴보자. NA 값이 존재하기 때문에 이를 제거해보자.

starwars_table <- starwarsdb::people %>%
  select(name, eye_color) %>% 
  janitor::tabyl(eye_color) %>% 
  na.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

1.3 멋진 gt 외양 2

janitor 표 결과물을 gt 팩키지에 연결시켜 표를 시각적으로 가치있게 제작한다.

library(gt)

starwars_table %>% 
  select(-starts_with("valid")) %>% 
  gt() %>% 
    fmt_percent(
      columns = percent,
      decimals =1
    ) %>% 
    tab_header(
      title = md("**&#9755; 범주형 데이터 훈련 &#9754;**"),
      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/

1.4 단변량 표 합계 3

범주형 데이터 표를 제작하게 되면 각종 합계를 행과 열을 기준으로 작성하고 행과 열에서 비율도 계산할 필요가 있다.

starwars_ttl_table <- 
  starwarsdb::people %>%
    select(name, eye_color) %>% 
    janitor::tabyl(eye_color) %>% 
    na.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("**&#9755; 범주형 데이터 훈련 &#9754;**"),
      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 2변량 범주형

단변량 범주형 데이터를 확대해서 2변량 범주형 데이터를 다양한 형태의 표로 간단히 제작하는 방법을 살펴보자.

2.1 데이터 살펴보기

스타워즈 영화에 출연한 캐릭터와 캐릭터의 생리학적 성과 성 정체성에 살펴보자. 4

  • sex: 생리학적 성별
  • gender: 성 정체성
starwarsdb::people %>%
  select(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

2.2 범주형 데이터 요약

스타워즈 영화에 출연한 캐릭터 생물학적 성과 성 정체성에 대해 요약 표를 작성해보자.

gender_table <- starwarsdb::people %>%
  select(name, sex, gender) %>% 
  janitor::tabyl(sex, gender) %>% 
  na.omit()

gender_table
            sex feminine masculine
         female       16         0
 hermaphroditic        0         1
           male        0        60
           none        1         4

2.3 합계 포함된 표

표를 작성하는데 있어 핵심적으로 포함되는 합계(Total), 비율 등이 포함되도록 이를 넣어보자.

gender_ttl_table <- starwarsdb::people %>%
  select(name, sex, gender) %>% 
  janitor::tabyl(sex, gender) %>% 
  na.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_을 사용해서 기본 표에 다양한 기능을 넣을 수 있다.

gender_pcnt_table <- starwarsdb::people %>%
  select(name, sex, gender) %>% 
  janitor::tabyl(sex, gender) %>% 
  na.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%
gender_ttl_pcnt_table <- starwarsdb::people %>%
  select(name, sex, gender) %>% 
  janitor::tabyl(sex, gender) %>% 
  na.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)

2.4 멋진 gt 외양

정성껏 작성한 janitor 표를 gt 팩키지에 연결시켜 2변량 범주형 표를 시각적으로 가치있게 제작한다.

gender_ttl_pcnt_table %>% 
  gt() %>% 
    tab_header(
      title = md("**&#9755; 2변량 교차 범주형 데이터 &#9754;**"),
      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

3 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')"
 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com