tidy 데이터: 변수는 열, 관측은 행
tidy 데이터: 변수는 열, 관측은 행
같은 데이터라도 정리하는 방식은 여러 가지예요. 그런데 어떤 구조는 tidyverse 도구로 다루기 훨씬 수월하죠. 이 페이지에서는 tidyverse가 기대하는 데이터 구조인 tidy data의 규칙과, 지저분한 데이터를 tidy하게 바꾸는 핵심 도구인 pivot을 알아볼게요.
본문
tidy 데이터란 무엇인가
데이터셋이 tidy하다는 것은 세 가지 규칙을 만족한다는 뜻이에요.
- 각 변수는 하나의 열이다. (각 열은 하나의 변수)
- 각 관측은 하나의 행이다. (각 행은 하나의 관측)
- 각 값은 하나의 셀이다. (각 셀은 단일한 값)
예를 들어 결핵(TB) 사례 수를 담은 데이터가 세 가지 방식으로 있다고 해볼게요. 같은 값을 담고 있어도 그중 table1처럼 변수별로 열이 나뉜 구조가 tidyverse에서 다루기 가장 쉬워요.
table1
#> # A tibble: 6 × 4
#> country year cases population
#> <chr> <dbl> <dbl> <dbl>
#> 1 Afghanistan 1999 745 19987071
#> 2 Afghanistan 2000 2666 20595360
#> 3 Brazil 1999 37737 172006362
#> 4 Brazil 2000 80488 174504898
#> 5 China 1999 212258 1272915272
#> 6 China 2000 213766 1280428583
왜 굳이 tidy하게 만들까요? 우선 데이터 구조를 하나로 통일하면 그 구조를 다루는 도구를 배우기 쉬워요. 또 변수를 열에 두면 R의 벡터화된 성격이 빛을 발해요. 대부분의 R 기본 함수는 값의 벡터에 대해 동작하니까, tidy 데이터를 변형하는 게 아주 자연스러워지죠.
tidy 데이터라면 dplyr 함수가 바로 잘 동작해요.
# 인구 10만 명당 비율 계산
table1 |>
mutate(rate = cases / population * 10000)
# 연도별 총 사례 수
table1 |>
group_by(year) |>
summarize(total_cases = sum(cases))
데이터 늘리기: pivot_longer()
실제 데이터는 대부분 tidy하지 않아요. 대표적인 경우가 변수가 열 이름에 숨어 있는 경우예요. billboard 데이터를 보면 곡의 순위가 wk1, wk2, ...처럼 주차별로 열에 흩어져 있어요. 여기서 열 이름은 어떤 변수(주차)이고, 셀 값은 또 다른 변수(순위)예요.
이럴 땐 pivot_longer()로 긴 형태로 펼치면 돼요. 핵심 인자 세 가지를 기억해요.
cols: 피벗할 열(즉 변수가 아닌 열)을 지정해요.select()와 같은 문법이라starts_with("wk")처럼 쓸 수 있어요.names_to: 열 이름에 담긴 변수의 이름을 정해요.values_to: 셀 값에 담긴 변수의 이름을 정해요.
billboard |>
pivot_longer(
cols = starts_with("wk"),
names_to = "week",
values_to = "rank"
)
week, rank는 새로 만드는 변수 이름이라 따옴표로 감싸요. 곡이 76주 미만 차트에 머물렀다면 나머지는 NA로 채워지는데, 이런 구조 때문에 생긴 NA는 진짜 결측이 아니라서 values_drop_na = TRUE로 지울 수 있어요.
billboard |>
pivot_longer(
cols = starts_with("wk"),
names_to = "week",
values_to = "rank",
values_drop_na = TRUE
)
데이터 줄이기: pivot_wider()
반대 방향은 pivot_wider()예요. 하나의 관측이 여러 행에 흩어져 있을 때, 열 이름에 담길 변수를 names_from, 셀 값에 들어갈 변수를 values_from으로 지정해 넓은 형태로 모아요.
피벗 과정에서 값이 유일하게 매칭되지 않으면 경고와 함께 목록 열(list-column)이 생겨요. 이런 경우엔 경고가 알려주는 힌트로 중복된 조합을 찾아 데이터를 고치거나, 그룹·요약 기능으로 각 행·열 조합이 한 행만 갖도록 정리해야 해요.
더 알아보기
- 더 다양한 피벗 예시는
vignette("pivot", package = "tidyr")에서 볼 수 있어요. - tidy 데이터 이론의 자세한 역사는 Journal of Statistical Software의 Tidy Data 논문에 담겨 있어요.
- 목록 열을 다루는 법은 Rectangling 페이지와 이어져요.