gt
패키지로 데이터 테이블 만들기 - 1
표도 데이터 시각화의 방법
데이터 시각화를 한다고 하면 대부분 떠올리는 작업이 그래프를 그리는 작업이다. 데이터 시각화를 시작할 때는 먼저 데이터를 대상으로 할지, 어떤 그래프를 써서 데이터를 예쁘고 직관적으로 표현할지를 고민하게 된다. 하지만 데이터 시각화 결과가 들어갈 보고문서에는 대부분 그래프와 함c께 작성하는 것이 표이다. 데이터 시각화라고 할 때 많은 사람들은 표까지 생각하지는 않는 듯하다. 인터넷 상의 표의 정의1를 보면 ’시각적 의사소통과 자료의 정렬 양식’으로 나와 있다. 결국 표도 데이터 시각화의 일부인 것이다.
표는 데이터를 직접적으로 표현한다는 점에서 그래프나 플롯과는 다르다. 데이터를 직접 표현하기 때문에 데이터를 정확하게 표현하지만 데이터의 전체적인 흐름이나 분포를 알아보기에는 적절치 않다. 하지만 그래프나 플롯은 정확한 데이터를 알아보기 힘들다는 점에서 표와 그래프, 플롯은 상호 보완적으로 사용되어야 한다.
보통 표는 행과 열로 이루어진 데이터의 모음이다. 행은 각각의 개별 사례2나 개별 사례를 적절히 그루핑한 요약된 데이터가 표현된다. 열은 각각의 사례를 설명하기 위해 필요한 속성이 나열된다. 행과 열은 이 만나는 곳이 사용자가 알고 싶어하는 데이터가 위치하고 이 곳을 칸, 혹은 셀이라고 한다.
표는 그 구성 방법에 따라 1차원 표와 다차원 표로 구성된다. 1차원 표는 단순히 데이터의 나열인 경우를 말한다. 이런 테이블을 ’단순 표(simple table)’이라고도 한다. 다차원 표는 1차원 표를 적절한 변환(추상화)하여 표에서 제공하는 몇가지 차원의 정보를 모두 가져야 데이터를 해석할 수 있는 표를 말한다. 다차원 표 중에서 가장 흔하게 보이는 표가 2차원 표, 교차표(cross table)이다. 2차원 표는 행(X축)과 열(Y축)의 정보를 가지고 해당 칸(셀)의 정보를 해석할 수 있다.
아래의 그림은 1차원 표와 2차원 표의 예를 보이고 있다.
위의 예에서 보면 1차원 표의 경우는 데이터를 설명하는 속성이 위쪽에만 설정되어 있다. 하지만 2차원 표의 경우는 데이터를 설명하는 속성이 위쪽과 왼쪽에 모두 설정되어 있다. 특정 칸의 데이터를 해석하기 위해서는 행과 열의 속성 정보를 모두 알아야 한다는 것이다.
1차원 표의 장점은 데이터를 원본 차원에서 확인 할 수 있다는 점이다. 반면 데이터의 행이 길어질 수 있어 보고서에 수록하는 것인 적절치 않을 때가 있다. 하지만 다차원 표의 가장 큰 장점은 데이터를 요약하고 구조화하였기 때문에 대량의 데이터의 특성을 간략히 표현했다는 점이다. 하지만 데이터를 요약하는 방식에 따라 전달되는 정보가 제한적일 수 있다는 단점이 있다.
표의 구성 방법과 요소는 사용자가 표현하고 싶은 데이터와 형태에 따라 표현방식이 매우 다르기 때문에 어느 하나로 정의하기가 어렵다. 다음 그림은 논문의 작성에서 대표적으로 사용되는 미국 심리학회의 표 구성 가이드라인이다.
모든 표를 APA 가이드라인에 맞춰 그릴 수는 없겠지만 APA 가이드라인을 보면 표에 꼭 들어가야 할 몇가지 요소들을 알 수 있다.
표 제목(Title) : 표에서 표현하고 있는 데이터를 대표하는 제목이 반드시 필요하다.
표 헤드(Heading) : 표에서 제시하고 있는 사례들의 속성값들에 대한 이름이 표현된 표 가로축의 맨 위줄을 말한다.
표 스텁(Stub) : 표에서 표현되는 다양한 사례를 구분하기 위해 필요한 세로축의 가장 왼쪽 줄을 말한다.
표 몸체(Body) : 표의 헤드와 스텁으로 감싸고 있는 데이터가 표현된 셀들이 표현된 부분을 말한다.
실무에서 표를 그릴 때 가장 많이 사용하는 툴은 아마도 MS-Excel일 것이다. SpreadSheet로 거의 유일하게(?) 살아남은 이 툴은 표를 그리는 WYSYWYG(What You See IS Wat You Get) 툴로 거의 모든 Spreadsheet를 없애버렸다고 해도 과언이 아닐 듯 하다. 어쨌던 엑셀은 표를 그리는데 매우 특화된 툴임에는 틀림없고 초보자들도 쉽게 사용할 수 있지만 사용하다보면 몇가지 단점을 만날 수 있다.
가장 큰 단점이 반복된 작업을 하기가 어렵다는 점이다. 이는 WYSIWIG 툴들이 가지는 공통된 단점이다. 표를 쉽게 만들 수 있지만 유사한 표를 다시 만들어야 하는 경우 반복된 작업을 수행해야하고 반복된 작업을 꼼꼼히 기록해두지 않으면 동일한 표를 만들기 어렵다. 두번째 단점이 기초 데이터의 구조가 업데이트 되면 표를 다시 그려야 하는 경우가 발생한다는 점이다. 기초 데이터의 열 이름이 바뀌거나 열이 추가, 삭제되면 이 데이터로부터 파생된 표가 정상적으로 표현되지 않는다는 것이다. 이러한 문제는 엑셀을 사용해 본 사용자라면 한번쯤, 아니 자주 겪는 문제일 것이다.
이제 엑셀에서 탈피해서 R에서 표를 그려보자. R에서도 아주 훌륭한, 그리고 예쁘게 표를 그릴 수 있는 다양한 방법을 제공한다. R로 표를 그려보면 반복된 작업을 할 필요가 없다는 점에서, 기초 데이터의 업데이트가 발생해도 바로 반영할 수 있다는 점, 표를 세세하게 다룰 수 있다는 점에서 엑셀로 다시 돌아갈 수 없을 수도 있다.
gt
패키지
R에서 표를 만들기 위해 사용되는 패키지 중에 하나가 gt
패키지이다. gt
패키지는 표의 세부 구성들을 상세히 구분하고 이들을 구조적으로 조화롭게 구성시켜서 표를 만드는 다양한 함수와 매개 변수들을 제공한다. gt
패키지에서 사용하는 표의 세부 파트는 다음의 그림과 같다.
표의 구성을 보면 앞에서 살펴보았던 APA 가이드라인상의 표와 유사한 형태를 보인다. 이와 같이 표를 세부적인 파트로 구분하고 이들을 각각 설정함으로써 표를 만들 수 있다.
gt
패키지에서 권장하는 표 생성 방식은 다음의 그림과 같다.
우선 표를 만들기 위한 기초 데이터를 생성해야 한다. gt
패키지로 생성되는 표는 tidyverse
방식을 준용하여 생성하는 것이 편하다. 따라서 gt
표를 생성하기 위해 만드는 기초 데이터도 tidyverse
의 tibble
이나 R의 기초 데이터 셋인 data.frame
으로 생성한다. 이렇게 생성된 기초 데이터 셋은 gt
객체로 변환되고 gt
패키지에서 제공되는 다양한 함수와 매개변수를 설정하여 사용자가 원하는 형태의 표로 만들게 된다. 마지막으로 이 표를 다른 문서에서 활용하기 위해 html, pdf 등의 문서로 변환하여 활용한다.
Data Import
이번 포스트에서는 각각의 학제에 소속된 학과들에 대한 정보를 표현하기 위한 표를 그려보도록 하겠다. 표에서는 각각의 열을 학제로 구분(Stub)하고, 특성으로 표현되는 열은 크게 합계와 평균 으로 묶어주고(span), 학위과정 데이터를 사용하여 행을 그룹핑한 후 그룹별, 전체 합계와 평균 행을 추가하는 표를 그리겠다.
gt
패키지를 사용하여 표를 만들어 보기 위해 사용하는 데이터는 한국교육개발원 교육통계서비스 홈페이지의 학교/학과별 데이터셋 - 대학 - 학과별(상반기) - 2021를 활용하겠다.
library(readxl)
library(tidyverse)
df <- read_excel('./21년 고등 학과별 입학정원 입학 지원 재적 재학 휴학 외국인유학생 졸업 교원_211119.xlsx', skip = 12, na = '-', sheet = '학과별 주요 현황', col_names = T, col_types = c(rep('text', 8), rep('numeric', 56)))
## 학제 열을 팩터로 변환하고 레벨을 적절히 설정해 줌
df$학제 <- fct_relevel(df$학제, '대학교', '교육대학', '산업대학', '기술대학', '방송통신대학', '사내대학(대학)', '원격대학(대학)', '사이버대학(대학)', '각종대학(대학)', '전문대학(2년제)', '전문대학(3년제)', '전문대학(4년제)', '기능대학', '원격대학(전문)', '사이버대학(전문)', '사내대학(전문)', '전공대학', '일반대학원', '특수대학원', '전문대학원')
1. 표로 그릴 데이터 셋 만들기
우선 데이터를 정제하기 위해 필요한 데이터만 필터링과 서브세팅하도록 하겠다. 여기서 필요한 데이터는 각각의 데이터 중 ’합계’에 해당하는 열이고 이 데이터들을 학제와 학위과정으로 그룹핑하여 합계와 평균을 낸 데이터이다. 다음과 같이 산출한다.
df.gt <- df |>
group_by(학제, 학위과정) |>
summarise_at(vars(학과수_전체, 지원자_전체_계, 입학자_전체_계, 재적생_전체_계, 재학생_전체_계, 휴학생_전체_계), funs(sum, mean)) |>
# summarise_at(vars(학과수_전체, 지원자_전체_계, 입학자_전체_계, 재적생_전체_계, 재학생_전체_계, 휴학생_전체_계, 외국인유학생_총계_계, 졸업자_전체, 전임교원_계, 비전임교원_계, 시간강사_계), funs(sum, mean)) |>
ungroup() |>
filter(학과수_전체_sum > 100) |>
arrange(학제)
head(df.gt)
## # A tibble: 6 x 14
## 학제 학위과정 학과수_전체_sum 지원자_전체_계_s~ 입학자_전체_계_~
## <fct> <chr> <dbl> <dbl> <dbl>
## 1 대학교 대학과정 12028 2635154 329306
## 2 교육대학 대학과정 140 15805 3864
## 3 산업대학 대학과정 251 22128 2379
## 4 사이버대학(대학) 대학과정 357 51840 34279
## 5 전문대학(2년제) 전문대학과~ 2546 473154 70200
## 6 전문대학(3년제) 전문대학과~ 3095 603197 87333
## # ... with 9 more variables: 재적생_전체_계_sum <dbl>,
## # 재학생_전체_계_sum <dbl>, 휴학생_전체_계_sum <dbl>, 학과수_전체_mean <dbl>,
## # 지원자_전체_계_mean <dbl>, 입학자_전체_계_mean <dbl>,
## # 재적생_전체_계_mean <dbl>, 재학생_전체_계_mean <dbl>,
## # 휴학생_전체_계_mean <dbl>
여기서 하나 주목해아하는 부분이 중간의 ungroup()
이다. group_by()
를 통해 생성된 data.frame이나 tibble은 최종적으로 grouped_df
클래스로 생성된다. 이 클래스도 data.frame과 tibble에서 상속된 클래스이기 때문에 이들과 유사하게 다룰 수 있다. 하지만 몇가지 예상치 않게 사용할 수 없는 함수가 있기 때문에 가급적 ungroup()
으로 grouped_df
클래스를 해제시켜준 것이다.
2. gt
객체 생성하기
gt
패키지를 사용하여 표를 그리려면 먼저 gt
패키지의 gt()
함수를 사용하여 gt
객체를 생성한다.(아래의 실행결과는 표의 일부만 표현하였다)
library(gt)
df.gt |>
gt()
학제 | 학위과정 | 학과수_전체_sum | 지원자_전체_계_sum | 입학자_전체_계_sum | 재적생_전체_계_sum | 재학생_전체_계_sum | 휴학생_전체_계_sum | 학과수_전체_mean | 지원자_전체_계_mean | 입학자_전체_계_mean | 재적생_전체_계_mean | 재학생_전체_계_mean | 휴학생_전체_계_mean |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
대학교 | 대학과정 | 12028 | 2635154 | 329306 | 1938254 | 1415162 | 504165 | 1.4895356 | 326.33486 | 40.780929 | 240.03146 | 175.25226 | 62.435294 |
교육대학 | 대학과정 | 140 | 15805 | 3864 | 15409 | 15045 | 364 | 2.3333333 | 263.41667 | 64.400000 | 256.81667 | 250.75000 | 6.066667 |
산업대학 | 대학과정 | 251 | 22128 | 2379 | 14539 | 11076 | 3374 | 1.0244898 | 90.31837 | 9.710204 | 59.34286 | 45.20816 | 13.771429 |
사이버대학(대학) | 대학과정 | 357 | 51840 | 34279 | 135155 | 119995 | 15160 | 0.8321678 | 120.83916 | 79.904429 | 315.04662 | 279.70862 | 35.337995 |
전문대학(2년제) | 전문대학과정 | 2546 | 473154 | 70200 | 238266 | 162729 | 75386 | 1.3874659 | 257.84959 | 38.256131 | 129.84523 | 88.68065 | 41.082289 |
전문대학(3년제) | 전문대학과정 | 3095 | 603197 | 87333 | 304435 | 213105 | 91162 | 1.6775068 | 326.93604 | 47.334959 | 165.00542 | 115.50407 | 49.410298 |
전문대학(4년제) | 전문대학과정 | 317 | 63559 | 9174 | 33340 | 24242 | 9077 | 1.1362007 | 227.81004 | 32.881720 | 119.49821 | 86.88889 | 32.534050 |
기능대학 | 전문대학과정 | 263 | 19102 | 7565 | 23910 | 14860 | 9050 | 1.4858757 | 107.92090 | 42.740113 | 135.08475 | 83.95480 | 51.129944 |
일반대학원 | 대학원과정 | 10076 | 121226 | 69928 | 161987 | 143965 | 18022 | 2.6501841 | 31.88480 | 18.392425 | 42.60573 | 37.86560 | 4.740137 |
특수대학원 | 대학원과정 | 4351 | 84377 | 45448 | 124912 | 107537 | 17375 | 1.6550019 | 32.09471 | 17.287181 | 47.51312 | 40.90415 | 6.608977 |
전문대학원 | 대학원과정 | 1088 | 39141 | 15556 | 40516 | 36108 | 4408 | 1.5432624 | 55.51915 | 22.065248 | 57.46950 | 51.21702 | 6.252482 |
앞서 설명한 바와 같이 각각의 행을 구분할 수 있는 구분열(Stub)을 설정해야 한다. 또 목표로 설정한 표는 학위과정별로 소계와 평균을 구해야하기 때문에 학위과정별로 그룹핑해야 한다. 행 구분을 위한 구분 열은 rowname_col
로 설정하고 행을 그루핑하기 위한 열은 groupname_col
로 설정한다.
library(gt)
gt.table1 <- df.gt |>
gt(rowname_col = '학제',
groupname_col = '학위과정')
학과수_전체_sum | 지원자_전체_계_sum | 입학자_전체_계_sum | 재적생_전체_계_sum | 재학생_전체_계_sum | 휴학생_전체_계_sum | 학과수_전체_mean | 지원자_전체_계_mean | 입학자_전체_계_mean | 재적생_전체_계_mean | 재학생_전체_계_mean | 휴학생_전체_계_mean | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
대학과정 | ||||||||||||
대학교 | 12028 | 2635154 | 329306 | 1938254 | 1415162 | 504165 | 1.4895356 | 326.33486 | 40.780929 | 240.03146 | 175.25226 | 62.435294 |
교육대학 | 140 | 15805 | 3864 | 15409 | 15045 | 364 | 2.3333333 | 263.41667 | 64.400000 | 256.81667 | 250.75000 | 6.066667 |
산업대학 | 251 | 22128 | 2379 | 14539 | 11076 | 3374 | 1.0244898 | 90.31837 | 9.710204 | 59.34286 | 45.20816 | 13.771429 |
사이버대학(대학) | 357 | 51840 | 34279 | 135155 | 119995 | 15160 | 0.8321678 | 120.83916 | 79.904429 | 315.04662 | 279.70862 | 35.337995 |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2546 | 473154 | 70200 | 238266 | 162729 | 75386 | 1.3874659 | 257.84959 | 38.256131 | 129.84523 | 88.68065 | 41.082289 |
전문대학(3년제) | 3095 | 603197 | 87333 | 304435 | 213105 | 91162 | 1.6775068 | 326.93604 | 47.334959 | 165.00542 | 115.50407 | 49.410298 |
전문대학(4년제) | 317 | 63559 | 9174 | 33340 | 24242 | 9077 | 1.1362007 | 227.81004 | 32.881720 | 119.49821 | 86.88889 | 32.534050 |
기능대학 | 263 | 19102 | 7565 | 23910 | 14860 | 9050 | 1.4858757 | 107.92090 | 42.740113 | 135.08475 | 83.95480 | 51.129944 |
대학원과정 | ||||||||||||
일반대학원 | 10076 | 121226 | 69928 | 161987 | 143965 | 18022 | 2.6501841 | 31.88480 | 18.392425 | 42.60573 | 37.86560 | 4.740137 |
특수대학원 | 4351 | 84377 | 45448 | 124912 | 107537 | 17375 | 1.6550019 | 32.09471 | 17.287181 | 47.51312 | 40.90415 | 6.608977 |
전문대학원 | 1088 | 39141 | 15556 | 40516 | 36108 | 4408 | 1.5432624 | 55.51915 | 22.065248 | 57.46950 | 51.21702 | 6.252482 |
이제 표의 각 부분을 설정한다. 먼저 표의 제목부터 설정한다. tab_header()
를 사용하여 title
매개변수로 표 제목을 설정하고 subtitle
을 사용하여 표 부제목을 설정할 수 있다.
gt.table2 <- gt.table1 |>
tab_header(title = '고등교육기관 데이터', subtitle = '2021년 전체 고등교육기관 대상')
고등교육기관 데이터 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2021년 전체 고등교육기관 대상 | ||||||||||||
학과수_전체_sum | 지원자_전체_계_sum | 입학자_전체_계_sum | 재적생_전체_계_sum | 재학생_전체_계_sum | 휴학생_전체_계_sum | 학과수_전체_mean | 지원자_전체_계_mean | 입학자_전체_계_mean | 재적생_전체_계_mean | 재학생_전체_계_mean | 휴학생_전체_계_mean | |
대학과정 | ||||||||||||
대학교 | 12028 | 2635154 | 329306 | 1938254 | 1415162 | 504165 | 1.4895356 | 326.33486 | 40.780929 | 240.03146 | 175.25226 | 62.435294 |
교육대학 | 140 | 15805 | 3864 | 15409 | 15045 | 364 | 2.3333333 | 263.41667 | 64.400000 | 256.81667 | 250.75000 | 6.066667 |
산업대학 | 251 | 22128 | 2379 | 14539 | 11076 | 3374 | 1.0244898 | 90.31837 | 9.710204 | 59.34286 | 45.20816 | 13.771429 |
사이버대학(대학) | 357 | 51840 | 34279 | 135155 | 119995 | 15160 | 0.8321678 | 120.83916 | 79.904429 | 315.04662 | 279.70862 | 35.337995 |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2546 | 473154 | 70200 | 238266 | 162729 | 75386 | 1.3874659 | 257.84959 | 38.256131 | 129.84523 | 88.68065 | 41.082289 |
전문대학(3년제) | 3095 | 603197 | 87333 | 304435 | 213105 | 91162 | 1.6775068 | 326.93604 | 47.334959 | 165.00542 | 115.50407 | 49.410298 |
전문대학(4년제) | 317 | 63559 | 9174 | 33340 | 24242 | 9077 | 1.1362007 | 227.81004 | 32.881720 | 119.49821 | 86.88889 | 32.534050 |
기능대학 | 263 | 19102 | 7565 | 23910 | 14860 | 9050 | 1.4858757 | 107.92090 | 42.740113 | 135.08475 | 83.95480 | 51.129944 |
대학원과정 | ||||||||||||
일반대학원 | 10076 | 121226 | 69928 | 161987 | 143965 | 18022 | 2.6501841 | 31.88480 | 18.392425 | 42.60573 | 37.86560 | 4.740137 |
특수대학원 | 4351 | 84377 | 45448 | 124912 | 107537 | 17375 | 1.6550019 | 32.09471 | 17.287181 | 47.51312 | 40.90415 | 6.608977 |
전문대학원 | 1088 | 39141 | 15556 | 40516 | 36108 | 4408 | 1.5432624 | 55.51915 | 22.065248 | 57.46950 | 51.21702 | 6.252482 |
다음으로 각각의 셀에 표현되는 수치값의 형태를 설정한다. 합계값은 모두 소수점이하가 필요없고 평균값도 사실 소수점 한자리 이상 표현될 필요는 없을 듯 하다. gt
표 각 셀의 숫자 형태는 fmt_number()
를 사용한다.
gt.table3 <- gt.table2 |>
fmt_number(columns = 3:8, decimals = 0, use_seps = TRUE) |>
fmt_number(columns = 9:14, decimals = 1, use_seps = TRUE)
고등교육기관 데이터 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2021년 전체 고등교육기관 대상 | ||||||||||||
학과수_전체_sum | 지원자_전체_계_sum | 입학자_전체_계_sum | 재적생_전체_계_sum | 재학생_전체_계_sum | 휴학생_전체_계_sum | 학과수_전체_mean | 지원자_전체_계_mean | 입학자_전체_계_mean | 재적생_전체_계_mean | 재학생_전체_계_mean | 휴학생_전체_계_mean | |
대학과정 | ||||||||||||
대학교 | 12,028 | 2,635,154 | 329,306 | 1,938,254 | 1,415,162 | 504,165 | 1.5 | 326.3 | 40.8 | 240.0 | 175.3 | 62.4 |
교육대학 | 140 | 15,805 | 3,864 | 15,409 | 15,045 | 364 | 2.3 | 263.4 | 64.4 | 256.8 | 250.8 | 6.1 |
산업대학 | 251 | 22,128 | 2,379 | 14,539 | 11,076 | 3,374 | 1.0 | 90.3 | 9.7 | 59.3 | 45.2 | 13.8 |
사이버대학(대학) | 357 | 51,840 | 34,279 | 135,155 | 119,995 | 15,160 | 0.8 | 120.8 | 79.9 | 315.0 | 279.7 | 35.3 |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2,546 | 473,154 | 70,200 | 238,266 | 162,729 | 75,386 | 1.4 | 257.8 | 38.3 | 129.8 | 88.7 | 41.1 |
전문대학(3년제) | 3,095 | 603,197 | 87,333 | 304,435 | 213,105 | 91,162 | 1.7 | 326.9 | 47.3 | 165.0 | 115.5 | 49.4 |
전문대학(4년제) | 317 | 63,559 | 9,174 | 33,340 | 24,242 | 9,077 | 1.1 | 227.8 | 32.9 | 119.5 | 86.9 | 32.5 |
기능대학 | 263 | 19,102 | 7,565 | 23,910 | 14,860 | 9,050 | 1.5 | 107.9 | 42.7 | 135.1 | 84.0 | 51.1 |
대학원과정 | ||||||||||||
일반대학원 | 10,076 | 121,226 | 69,928 | 161,987 | 143,965 | 18,022 | 2.7 | 31.9 | 18.4 | 42.6 | 37.9 | 4.7 |
특수대학원 | 4,351 | 84,377 | 45,448 | 124,912 | 107,537 | 17,375 | 1.7 | 32.1 | 17.3 | 47.5 | 40.9 | 6.6 |
전문대학원 | 1,088 | 39,141 | 15,556 | 40,516 | 36,108 | 4,408 | 1.5 | 55.5 | 22.1 | 57.5 | 51.2 | 6.3 |
표의 몸체(Body)는 적절히 보기좋게 설정된 듯 하다. 그런데 헤더의 열 이름이 사용자 친화적이지 않은 느낌이다. 열의 절반은 합계값이고 절반은 평균값이다. 이를 매 열마다 반복하면 열 이름이 쓸데없이 길어진다. 합계와 평균을 나타내는 열들 묶어(Span) 표기해주는 함수는 tab_spanner()
이다.
gt.table4 <- gt.table3 |>
tab_spanner(columns = 3:8, label = '합계') |>
tab_spanner(columns = 9:14, label = '평균')
고등교육기관 데이터 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2021년 전체 고등교육기관 대상 | ||||||||||||
합계 | 평균 | |||||||||||
학과수_전체_sum | 지원자_전체_계_sum | 입학자_전체_계_sum | 재적생_전체_계_sum | 재학생_전체_계_sum | 휴학생_전체_계_sum | 학과수_전체_mean | 지원자_전체_계_mean | 입학자_전체_계_mean | 재적생_전체_계_mean | 재학생_전체_계_mean | 휴학생_전체_계_mean | |
대학과정 | ||||||||||||
대학교 | 12,028 | 2,635,154 | 329,306 | 1,938,254 | 1,415,162 | 504,165 | 1.5 | 326.3 | 40.8 | 240.0 | 175.3 | 62.4 |
교육대학 | 140 | 15,805 | 3,864 | 15,409 | 15,045 | 364 | 2.3 | 263.4 | 64.4 | 256.8 | 250.8 | 6.1 |
산업대학 | 251 | 22,128 | 2,379 | 14,539 | 11,076 | 3,374 | 1.0 | 90.3 | 9.7 | 59.3 | 45.2 | 13.8 |
사이버대학(대학) | 357 | 51,840 | 34,279 | 135,155 | 119,995 | 15,160 | 0.8 | 120.8 | 79.9 | 315.0 | 279.7 | 35.3 |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2,546 | 473,154 | 70,200 | 238,266 | 162,729 | 75,386 | 1.4 | 257.8 | 38.3 | 129.8 | 88.7 | 41.1 |
전문대학(3년제) | 3,095 | 603,197 | 87,333 | 304,435 | 213,105 | 91,162 | 1.7 | 326.9 | 47.3 | 165.0 | 115.5 | 49.4 |
전문대학(4년제) | 317 | 63,559 | 9,174 | 33,340 | 24,242 | 9,077 | 1.1 | 227.8 | 32.9 | 119.5 | 86.9 | 32.5 |
기능대학 | 263 | 19,102 | 7,565 | 23,910 | 14,860 | 9,050 | 1.5 | 107.9 | 42.7 | 135.1 | 84.0 | 51.1 |
대학원과정 | ||||||||||||
일반대학원 | 10,076 | 121,226 | 69,928 | 161,987 | 143,965 | 18,022 | 2.7 | 31.9 | 18.4 | 42.6 | 37.9 | 4.7 |
특수대학원 | 4,351 | 84,377 | 45,448 | 124,912 | 107,537 | 17,375 | 1.7 | 32.1 | 17.3 | 47.5 | 40.9 | 6.6 |
전문대학원 | 1,088 | 39,141 | 15,556 | 40,516 | 36,108 | 4,408 | 1.5 | 55.5 | 22.1 | 57.5 | 51.2 | 6.3 |
이번에는 열 이름을 사용자가 알아보기 쉽게 바꾸어 준다. 열이름을 바꾸는 함수는 cols_label()
이다.
gt.table5 <- gt.table4 |>
cols_label(학제 = '학교종류',
학과수_전체_sum = '학과수',
지원자_전체_계_sum = '지원자',
입학자_전체_계_sum = '입학자',
재적생_전체_계_sum = '재적생',
재학생_전체_계_sum = '재학생',
휴학생_전체_계_sum = '휴학생',
# 외국인유학생_총계_계_sum = '외국인학생',
# 졸업자_전체_sum = '졸업자',
# 전임교원_계_sum = '전임교원',
# 비전임교원_계_sum = '비전임교원',
# 시간강사_계_sum = '시간강사',
학과수_전체_mean = '학과수',
지원자_전체_계_mean = '지원자',
입학자_전체_계_mean = '입학자',
재적생_전체_계_mean = '재적생',
재학생_전체_계_mean = '재학생',
휴학생_전체_계_mean = '휴학생'
# 외국인유학생_총계_계_mean = '외국인학생',
# 졸업자_전체_mean = '졸업자',
# 전임교원_계_mean = '전임교원',
# 비전임교원_계_mean = '비전임교원',
# 시간강사_계_mean = '시간강사'
)
고등교육기관 데이터 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2021년 전체 고등교육기관 대상 | ||||||||||||
합계 | 평균 | |||||||||||
학과수 | 지원자 | 입학자 | 재적생 | 재학생 | 휴학생 | 학과수 | 지원자 | 입학자 | 재적생 | 재학생 | 휴학생 | |
대학과정 | ||||||||||||
대학교 | 12,028 | 2,635,154 | 329,306 | 1,938,254 | 1,415,162 | 504,165 | 1.5 | 326.3 | 40.8 | 240.0 | 175.3 | 62.4 |
교육대학 | 140 | 15,805 | 3,864 | 15,409 | 15,045 | 364 | 2.3 | 263.4 | 64.4 | 256.8 | 250.8 | 6.1 |
산업대학 | 251 | 22,128 | 2,379 | 14,539 | 11,076 | 3,374 | 1.0 | 90.3 | 9.7 | 59.3 | 45.2 | 13.8 |
사이버대학(대학) | 357 | 51,840 | 34,279 | 135,155 | 119,995 | 15,160 | 0.8 | 120.8 | 79.9 | 315.0 | 279.7 | 35.3 |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2,546 | 473,154 | 70,200 | 238,266 | 162,729 | 75,386 | 1.4 | 257.8 | 38.3 | 129.8 | 88.7 | 41.1 |
전문대학(3년제) | 3,095 | 603,197 | 87,333 | 304,435 | 213,105 | 91,162 | 1.7 | 326.9 | 47.3 | 165.0 | 115.5 | 49.4 |
전문대학(4년제) | 317 | 63,559 | 9,174 | 33,340 | 24,242 | 9,077 | 1.1 | 227.8 | 32.9 | 119.5 | 86.9 | 32.5 |
기능대학 | 263 | 19,102 | 7,565 | 23,910 | 14,860 | 9,050 | 1.5 | 107.9 | 42.7 | 135.1 | 84.0 | 51.1 |
대학원과정 | ||||||||||||
일반대학원 | 10,076 | 121,226 | 69,928 | 161,987 | 143,965 | 18,022 | 2.7 | 31.9 | 18.4 | 42.6 | 37.9 | 4.7 |
특수대학원 | 4,351 | 84,377 | 45,448 | 124,912 | 107,537 | 17,375 | 1.7 | 32.1 | 17.3 | 47.5 | 40.9 | 6.6 |
전문대학원 | 1,088 | 39,141 | 15,556 | 40,516 | 36,108 | 4,408 | 1.5 | 55.5 | 22.1 | 57.5 | 51.2 | 6.3 |
표 안의 데이터를 잘 살펴보면 행 그룹의 순서가 대학->전문대학->대학원의 순서로 설정되어 있다. 보통 전문대학->대학->대학원으로 표현되는 것이 일반적이다. 이렇게 행 그룹의 순서를 바꾸는 함수는 row_group_order()
이다.
gt.table6 <- gt.table5 |>
row_group_order(
groups = c('전문대학과정', '대학과정', '대학원과정')
)
고등교육기관 데이터 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2021년 전체 고등교육기관 대상 | ||||||||||||
합계 | 평균 | |||||||||||
학과수 | 지원자 | 입학자 | 재적생 | 재학생 | 휴학생 | 학과수 | 지원자 | 입학자 | 재적생 | 재학생 | 휴학생 | |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2,546 | 473,154 | 70,200 | 238,266 | 162,729 | 75,386 | 1.4 | 257.8 | 38.3 | 129.8 | 88.7 | 41.1 |
전문대학(3년제) | 3,095 | 603,197 | 87,333 | 304,435 | 213,105 | 91,162 | 1.7 | 326.9 | 47.3 | 165.0 | 115.5 | 49.4 |
전문대학(4년제) | 317 | 63,559 | 9,174 | 33,340 | 24,242 | 9,077 | 1.1 | 227.8 | 32.9 | 119.5 | 86.9 | 32.5 |
기능대학 | 263 | 19,102 | 7,565 | 23,910 | 14,860 | 9,050 | 1.5 | 107.9 | 42.7 | 135.1 | 84.0 | 51.1 |
대학과정 | ||||||||||||
대학교 | 12,028 | 2,635,154 | 329,306 | 1,938,254 | 1,415,162 | 504,165 | 1.5 | 326.3 | 40.8 | 240.0 | 175.3 | 62.4 |
교육대학 | 140 | 15,805 | 3,864 | 15,409 | 15,045 | 364 | 2.3 | 263.4 | 64.4 | 256.8 | 250.8 | 6.1 |
산업대학 | 251 | 22,128 | 2,379 | 14,539 | 11,076 | 3,374 | 1.0 | 90.3 | 9.7 | 59.3 | 45.2 | 13.8 |
사이버대학(대학) | 357 | 51,840 | 34,279 | 135,155 | 119,995 | 15,160 | 0.8 | 120.8 | 79.9 | 315.0 | 279.7 | 35.3 |
대학원과정 | ||||||||||||
일반대학원 | 10,076 | 121,226 | 69,928 | 161,987 | 143,965 | 18,022 | 2.7 | 31.9 | 18.4 | 42.6 | 37.9 | 4.7 |
특수대학원 | 4,351 | 84,377 | 45,448 | 124,912 | 107,537 | 17,375 | 1.7 | 32.1 | 17.3 | 47.5 | 40.9 | 6.6 |
전문대학원 | 1,088 | 39,141 | 15,556 | 40,516 | 36,108 | 4,408 | 1.5 | 55.5 | 22.1 | 57.5 | 51.2 | 6.3 |
이제 전체적인 표의 형태가 대략 갖춰진 듯 하다. 마지막으로 각 행 그룹의 합계, 평균 행을 넣고 마지막에 전체 합계, 평균 행을 넣어주겠다. 각 행 그룹의 요약 행을 넣는 함수는 summary_rows()
이고 전체 요약 행을 넣는 함수는 grand_summary_rows()
이다.
gt.table7 <- gt.table6 |>
summary_rows(
groups = T,
columns = 3:8,
fns = list(
합계 = ~sum(.),
평균값 = ~mean(.)),
formatter = fmt_number,
decimals = 0,
use_seps = TRUE
) |>
summary_rows(
groups = T,
columns = 9:14,
fns = list(
합계 = ~sum(.),
평균값 = ~mean(.)),
formatter = fmt_number,
decimals = 1,
use_seps = TRUE
) |>
grand_summary_rows(
columns = 3:8,
fns = list(
합계 = ~sum(.),
평균값 = ~mean(.)),
decimals = 0,
use_seps = TRUE
) |>
grand_summary_rows(
columns = 9:14,
fns = list(
합계 = ~sum(.),
평균값 = ~mean(.)),
decimals = 1,
use_seps = TRUE
)
고등교육기관 데이터 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2021년 전체 고등교육기관 대상 | ||||||||||||
합계 | 평균 | |||||||||||
학과수 | 지원자 | 입학자 | 재적생 | 재학생 | 휴학생 | 학과수 | 지원자 | 입학자 | 재적생 | 재학생 | 휴학생 | |
전문대학과정 | ||||||||||||
전문대학(2년제) | 2,546 | 473,154 | 70,200 | 238,266 | 162,729 | 75,386 | 1.4 | 257.8 | 38.3 | 129.8 | 88.7 | 41.1 |
전문대학(3년제) | 3,095 | 603,197 | 87,333 | 304,435 | 213,105 | 91,162 | 1.7 | 326.9 | 47.3 | 165.0 | 115.5 | 49.4 |
전문대학(4년제) | 317 | 63,559 | 9,174 | 33,340 | 24,242 | 9,077 | 1.1 | 227.8 | 32.9 | 119.5 | 86.9 | 32.5 |
기능대학 | 263 | 19,102 | 7,565 | 23,910 | 14,860 | 9,050 | 1.5 | 107.9 | 42.7 | 135.1 | 84.0 | 51.1 |
합계 | 6,221 | 1,159,012 | 174,272 | 599,951 | 414,936 | 184,675 | 5.7 | 920.5 | 161.2 | 549.4 | 375.0 | 174.2 |
평균값 | 1,555 | 289,753 | 43,568 | 149,988 | 103,734 | 46,169 | 1.4 | 230.1 | 40.3 | 137.4 | 93.8 | 43.5 |
대학과정 | ||||||||||||
대학교 | 12,028 | 2,635,154 | 329,306 | 1,938,254 | 1,415,162 | 504,165 | 1.5 | 326.3 | 40.8 | 240.0 | 175.3 | 62.4 |
교육대학 | 140 | 15,805 | 3,864 | 15,409 | 15,045 | 364 | 2.3 | 263.4 | 64.4 | 256.8 | 250.8 | 6.1 |
산업대학 | 251 | 22,128 | 2,379 | 14,539 | 11,076 | 3,374 | 1.0 | 90.3 | 9.7 | 59.3 | 45.2 | 13.8 |
사이버대학(대학) | 357 | 51,840 | 34,279 | 135,155 | 119,995 | 15,160 | 0.8 | 120.8 | 79.9 | 315.0 | 279.7 | 35.3 |
합계 | 12,776 | 2,724,927 | 369,828 | 2,103,357 | 1,561,278 | 523,063 | 5.7 | 800.9 | 194.8 | 871.2 | 750.9 | 117.6 |
평균값 | 3,194 | 681,232 | 92,457 | 525,839 | 390,320 | 130,766 | 1.4 | 200.2 | 48.7 | 217.8 | 187.7 | 29.4 |
대학원과정 | ||||||||||||
일반대학원 | 10,076 | 121,226 | 69,928 | 161,987 | 143,965 | 18,022 | 2.7 | 31.9 | 18.4 | 42.6 | 37.9 | 4.7 |
특수대학원 | 4,351 | 84,377 | 45,448 | 124,912 | 107,537 | 17,375 | 1.7 | 32.1 | 17.3 | 47.5 | 40.9 | 6.6 |
전문대학원 | 1,088 | 39,141 | 15,556 | 40,516 | 36,108 | 4,408 | 1.5 | 55.5 | 22.1 | 57.5 | 51.2 | 6.3 |
합계 | 15,515 | 244,744 | 130,932 | 327,415 | 287,610 | 39,805 | 5.8 | 119.5 | 57.7 | 147.6 | 130.0 | 17.6 |
평균값 | 5,172 | 81,581 | 43,644 | 109,138 | 95,870 | 13,268 | 1.9 | 39.8 | 19.2 | 49.2 | 43.3 | 5.9 |
합계 | 34,512 | 4,128,683 | 675,032 | 3,030,723 | 2,263,824 | 747,543 | 17.2 | 1,840.9 | 413.8 | 1,568.3 | 1,255.9 | 309.4 |
평균값 | 3,137 | 375,335 | 61,367 | 275,520 | 205,802 | 67,958 | 1.6 | 167.4 | 37.6 | 142.6 | 114.2 | 28.1 |
다음 포스트에서는 gt
표를 예쁘게 꾸며보는 방법을 알아보도록 하겠다..
Coming Soon..
데이터베이스에서는 튜플, 레코드 등으로 불린다.↩︎
'데이터 시각화' 카테고리의 다른 글
21년 고등교육기관 정보 요약 - gt 패키지를 이용한 데이터 강조 in R (0) | 2021.12.10 |
---|---|
21년 고등교육기관 정보 요약 - gt 패키지를 이용한 표 꾸미기 in R (0) | 2021.12.08 |
Tableau가 뽑은 10대 데이터 시각화 (0) | 2021.11.07 |
특성화고 졸업생은 어디로?특성화고 졸업후 상황 - Sankey 다이어그램 (11) | 2021.07.22 |
막대 차트 (0) | 2021.06.26 |
댓글