천선생의 삶
[R] 데이터 핸들링 쉽게하기 - dplyr 본문
안녕하세요. 천선생입니다.
데이터 핸들링(Data Handling) 라는 말, 많이 들어보셨나요?
분석을 하기 위해서는, 주어진 데이터를 올바르게 조작하는 방법을 알아야 합니다!
우리는 이것을 데이터 핸들링이라고 부릅니다.
오늘은 데이터 핸들링에서 제가 가장 많이 사용하는 dplyr 패키지를 소개시켜드리겠습니다.
- Why dplyr?
앞에서 간단히 설명드렸듯이, 데이터 핸들링이란 말그대로 데이터를 이리저리 손으로 굴려보는 것을 뜻합니다.
범주별로 묶어서 연산을 한다던지, 변수끼리의 연산으로 새로운 변수를 만들어본다던지 하는 듯의 행위 말이죠.
물론, 기존에 알고계신 함수나 패키지를 활용하여 핸들링을 해도 됩니다!
그러나 전처리를 위한 패키지 dplyr을 활용하면 조금 더 쉽게 접근할 수 있을 것입니다.
- 예제설명
말로만 설명해서 이해가 된다면 우리는 공부하지 않고 분석 전문가가 되어있겠죠!
내장 데이터인 mtcars 를 통해 간단한 예시문을 작성해보겠습니다.
먼저, 데이터의 형태먼저 확인해보겠습니다!
str(mtcars)
# 'data.frame': 32 obs. of 11 variables:
# $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
# $ disp: num 160 160 108 258 360 ...
# $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
# $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
# $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
# $ qsec: num 16.5 17 18.6 19.4 17 ...
# $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
# $ am : num 1 1 1 0 0 0 0 0 0 0 ...
# $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
# $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
모든 변수를 사용해도 되지만, 간단한 설명을 위해 우리가 사용할 범주형 변수와, 연속형 변수를 정해보겠습니다.
변수명 | 형태 | 설명 |
mpg | 수치형 | 연비를 의미합니다. |
cyl | 범주형 | 실린더의 수를 의미합니다. 4, 6, 8의 값을 갖습니다. |
hp | 수치형 | 마력(Horse Power)을 의미합니다. |
cyl에 따른 두 수치형 데이터의 평균을 알아보겠습니다.
## mtcars 데이터를 통한 dplyr의 이해
data <- mtcars
## 1. dplyr을 사용하지 않고 핸들링하기 ##
data1 <- subset(data, select = c(mpg, cyl, hp)) #사용할 변수 분리
tapply(data1$mpg, data$cyl, mean)
# 4 6 8
# 26.66364 19.74286 15.10000
tapply(data1$hp, data$cyl, mean)
# 4 6 8
# 82.63636 122.28571 209.21429
## 2. dplyr을 사용하고 핸들링하기 ##
library(dplyr)
data %>%
select(mpg, cyl, hp) %>%
group_by(cyl) %>%
summarise(avg_mpg = mean(mpg),
avg_hp = mean(hp))
# # A tibble: 3 x 3
# cyl avg_mpg avg_hp
#
# 1 4 26.7 82.6
# 2 6 19.7 122.
# 3 8 15.1 209.
여기서 3가지의 특징점을 찾을 수 있습니다.
1. 파이프연산자 %>%
2. 그룹핑함수 group_by
3. 요약함수 summarise
이 3가지만 완벽하게 알아가신다면, 오늘 포스팅의 연습과 변형을 통하여 무수히 많은 핸들링을 하실 수 있습니다!
이제부터 이 3가지 주요 요소들을 예제와 함께 풀어보겠습니다.
- %>%(pipe operator)?
데이터 전처리를 할 때, 하나의 데이터에 여러 처리를 한번에 하고싶으신 적이 있나요?
그렇다면 지금 필요한 것은 %>% (파이프 연산자) 입니다!
파이프 연산자란, 말그대로 여러 함수를 이어주는 역할을 하게됩니다.
예제를 통해 빠르게 이해해보록 하겠습니다!
## 파이프 연산자를 통한 데이터 처리하기
#select : dplyr에 포함된 함수로, 컬값을 입력하면 해당 컬럼만 선택합니다.
#파이프 연산자를 사용하지 않고 적용하는 방법
summary(head(select(data, wt, vs, am)))
#파이프 연산자를 활용하는 방법
data %>%
select(wt, vs, am) %>%
head() %>%
summary()
#Result
# wt vs am
# Min. :2.320 Min. :0.0 Min. :0.0
# 1st Qu.:2.684 1st Qu.:0.0 1st Qu.:0.0
# Median :3.045 Median :0.5 Median :0.5
# Mean :2.988 Mean :0.5 Mean :0.5
# 3rd Qu.:3.384 3rd Qu.:1.0 3rd Qu.:1.0
# Max. :3.460 Max. :1.0 Max. :1.0
2개의 방법은 모두 같은 결과값을 보여줍니다. 그렇다면 왜, 사용하는 것일까요?
그 이유는 가독성에 있습니다. 코드를 공유하게 되면, 빠르게 이해하고 생각의 흐름을 따라가는 것이 중요하기 때문이죠.
첫번째 방법에서 예제와 같은 경우는 간단하기 때문에 쉽게 따라갈 수 있지만, 조금만 더 복잡해져도 무리가 있습니다.
%>% 연산자는 이러한 문제를 감소시키고, 코드의 생산성을 향상시키기 위한 큰 역할을 하게됩니다!
(* 이때, 데이터를 입력하는 인자값에는 이전까지의 연산값이 입력되게 됩니다.)
- group_by & summarise?
두번째로 소개시켜드릴 것은 group_by 와 summarise입니다.
이 함수는 SQL에서 group by 절과 같은 기능을 하는데요.
데이터에서 기준변수를 지정하고, 지정된 기준변수에 따라 연산값을 뽑아주는 역할을 합니다.
## group_by와 summarise를 통한 데이터 요약하기
data %>%
select(mpg, disp, am) %>%
group_by(am) %>%
summarise(avg_mpg = mean(mpg),
avg_disp = mean(disp),
sd_mpg = sd(mpg),
sd_disp = sd(disp))
# # A tibble: 2 x 5
# am avg_mpg avg_disp sd_mpg sd_disp
#
# 1 0 17.1 290. 3.83 110.
# 2 1 24.4 144. 6.17 87.2
이때 반환값이 tibble형식인것을 확인할 수 있습니다.
tibble이란 데이터프레임의 한 종류로, 조금 더 편리하게 데이터 프레임을 사용하기 위해 개발된 형식입니다.
기본적으로는 데이터프레임과 유사하게 동작하며 자세한 내용을 원하시는 분들을 위해 R의 문서를 링크하겠습니다!
https://cran.r-project.org/web/packages/tibble/vignettes/tibble.html
- 활용. ggplot과의 연계
dplyr을 활용하여 전처리를 완료한 이후, 우리는 원하는 값을 시각화하고 싶을 때가 있습니다.
그렇다면 바로 ggplot을 파이프 연산자로 연결해주시면 됩니다!
## ggplot과의 연계
#mutate : dplyr에 포함된 함수로, 변수들간의 연산을 통하여 새로운 변수를 생성해줍니다.
data %>%
select(mpg, disp, am, vs) %>%
mutate(md = mpg*disp) %>% #mpg 칼럼과 disp칼럼의 곱을 활용하여 md라는 칼럼을 생성합니다.
ggplot() +
geom_point(aes(x = mpg, y = disp, cex = md, color = md)) # cex : 포인트의 크기, color = 포인트의 색상
- 마치며
이번 포스트에서는 데이터 핸들링(Data Handling)을 위해 사용하게 되는 dplyr의 여러 함수들을 알아보았습니다.
익숙해지기 이전에는 필요없어보이는 함수처럼 보입니다.
그러나 이후에는 dplyr없이는 수월한 진행이 힘들 정도로 높은 의존도를 지니는 함수들입니다.
따라서 반드시! 연습을 하시는 것을 추천드립니다.
그러다보면 다루지 못한 수많은 dplyr의 함수들에 대해서도 차차 알아가실 수 있을 것이라고 생각됩니다.
이후 더욱 알찬 포스트로 돌아오겠습니다.
'Data Analysis > R Basic' 카테고리의 다른 글
[R] 시각화 시작하기 - ggplot2 (0) | 2019.07.23 |
---|---|
[R] apply 함수 활용하기 - apply, sapply (0) | 2019.07.14 |
[R] 사용자 정의 함수 활용하기 - function (0) | 2019.07.12 |
[R] 반복문 활용하기 - for, while (0) | 2019.07.11 |
[R] 조건문 활용하기 - if, else, if else (0) | 2019.07.10 |