본문 바로가기
R

R - 데이터 분석 (3) : dplyr 패키지

by Tiabet 2023. 5. 21.

이번 포스팅에선 R에서 데이터 분석을 할 때 tidyr과 항상 같이 사용되는 dplyr 패키지와 주요 함수들에 대해 간단히 정리해보도록 하겠다. tidyr 패키지의 함수들이 데이터프레임의 틀을 조정하는 느낌이었다면, dplyr 패키지의 함수들은 직접적으로 작업을 실행하는 느낌이다. SQL을 공부할 때에도 여러 함수들을 다뤘었는데 그 함수들과 역할이 거의 비슷하다.

 

우선 코드 진행에 필요한 dplyr 패키지와, 데이터셋으로 사용할 nycflights13 패키지를 로드해준다.

library(dplyr)
library(nycflights13)
flights

 

SQL에서 가장 먼저 공부한 함수가 select 였는데, dplyr에도 역시 select 함수가 있다. 열을 선택하는 것은 데이터 분석의 가장 기초적인 수준이니까 당연한 것일 수도 있지만..

flights %>% select(year:day)

파이프 오퍼레이터와 ' : ' 을 사용해 year 열부터 day 열까지 모든 열을 선택할 수 있다.

flights %>% select(-(year:day))

그리고 R이 좋은 것이 - 함수를 사용해 특정 열들을 제외하고 선택할 수 있다는 것이다. 파이썬에서는 drop 함수를 사용하여 다소 길게 수행되는데 그에 비해 굉장히 편리하다.

 

dep = flights %>% select(starts_with("dep"))
flights %>% select(ends_with("time"))
flights %>% select(contains("time"))

위처럼 starts_with, ends_with, contains 등의 함수들도 모두 지원하고 있어서 원하는 목적대로 적절한 함수를 찾아서 수행하면 될 것이다.

 

flights %>% rename(tail_num = tailnum) %>% select(tail_num)

그리고 rename 함수를 사용해서 특정 열의 이름을 바꾸는 것도 가능하다.

 

다음으로는 굉장히 많이 사용되는 filter 함수를 살펴보자. SQL에서도 마찬가지였듯이, select가 특정 열을 고르는 함수라면 filter는 열 안의 데이터들에 조건을 걸어 특정 행들을 고르는 함수이다.

 

flights %>% filter(month == 3, day == 1)

 

다음으로는 데이터의 정보를 빠르게 확인할 수 있는 summarize 함수를 살펴보자.

flights %>% summarize(max_dep = max(dep_time, na.rm = TRUE),
                      min_dep = min(dep_time, na.rm = TRUE))

 

굳이 sort를 해주지 않더라도 max_dep과 min_dep의 최댓값, 최솟값을 빠르게 확인할 수 있다.

 

다음은 역시 굉장히 많이 쓰이는 group_by 함수이다.

by_day = flights %>% group_by(year, month, day)

by_day

출력되는 것을 확인해보면 그룹화가 year, month, day 순으로 진행되었음에도 아무 차이가 없다. 하지만 group_by는 항상 다른 명령어와 같이 사용해줘야 그 결과를 명확히 확인할 수 있는 법이다. 애초에 그룹화하는 이유가 있을 테니까.

 

by_day %>%  summarise(delay = mean(dep_delay, na.rm = TRUE))

 

그래서 이렇게 dep_delay 의 평균을 delay라는 열을 추가하여 확인해보면, 그룹화가 잘 진행되었음을 확인할 수 있다.

참고로 summarize로 쓰던 summarise로 쓰던 기능은 똑같다. 영국식 영어와 미국식 영어를 모두 배려한 것이라고 한다.

 

flights %>% group_by(dest) %>%  summarize(
  count = n(),
  dist = mean(distance, na.rm = TRUE),
  delay = mean(arr_delay, na.rm = TRUE)
)

이렇게 summarize 와 연계해서도 사용할 수 있다. n()은 SQL에서 count()와 같은 기능을 한다. na.rm은 결측치 NA를 remove, 삭제하고 진행하라는 의미이다.

 

다음은 정렬 함수인 arrange이다. arrange는 사용법이 간단하다.

flights %>% arrange(year, month, day)
flights %>% arrange(desc(dep_delay))

디폴트가 오름차순이어서, 내림차순으로 정렬하고 싶으면 desc를 사용해주면 된다. 결과는 생략하도록 하겠다.

 

다음으로는 SQL에서도 다루었던, 두 개의 테이블을 합할 때 사용하는 join 함수를 살펴보자.

SQL에서 처럼 합치는 방식이 다양하다. 사용을 위해 두 개의 테이블을 생성했다.

flights2 = flights %>%
  select(year:day, hour, tailnum, carrier)

flights2

airlines

flights2 에는 carrier의 이름이 간략하게 나와있으나 airlines 에는 전체 이름도 같이 있다.

 

flights2 %>%  left_join(airlines, by = "carrier")

 

이런 식으로 left_join을 실행해주면 간략한 버젼의 carrier 이름 옆에 해당되는 풀네임들이 알아서 합쳐진다. 다른 join들의 사용법은 생략하도록 하겠다.

 

마지막으로는 기존 열끼리 계산을 하여 새로운 열을 생성할 수 있는 mutate 함수에 대해 살펴보겠다.

flights_sml = flights %>%  select(
    year:day,
    ends_with("delay"),
    distance,
    air_time
    )

flights_sml %>%  mutate(
    gain = dep_delay - arr_delay,
    speed = distance / air_time * 60)

summarize가 mean, max 등의 작업을 했다면 mutate는 열 끼리 사칙연산을 진행하는 등의 작업을 하여 열을 추가할 수 있다. 개인적으로는 실무에서 아주 유용하게 쓰일 것 같은 함수이다.

 

flights_sml %>%  mutate(
    across(c('dep_delay', 'arr_delay'), ~ .x * 60)
    )

mutate는 위처럼 across 함수와 같이 엮어서 사용할 수도 있다.

위와 같은 결과를 낳는데, 확인해보면 dep_delay와 arr_delay에 60씩 곱해진 것을 볼 수 있다. 이 열의 모든 행에 대해서 이 작업을 실행하라고 명령할 때 mutate, summarize 와 함께 사용되는 함수라고 보면 된다.

 

 

이상으로 R에서 데이터 분석을 진행할 때 많이 사용되는 패키지들을 살펴보았다. 여유가 된다면 직접 데이터셋에 대해서 분석을 진행해보고자 한다.