public bigdata

R4DS (R FOR DATASCIENCE) 10장 dplyr로 하는 관계형 데이터 본문

R programming/R4DS (R for DataScience)

R4DS (R FOR DATASCIENCE) 10장 dplyr로 하는 관계형 데이터

public bigdata 2020. 7. 13. 16:05

10.1

데이터 분석 시에 테이블을 하나만 사용하는 경우는 거의 없고 이들을 적절하게 결합 해야 하는 상황이 발생한다. 관계는 두 개의 테이블 사이에서 정의된다. 이런 관계형 데이터에 동작하도록 설계된 세 가지 유형의 함수가 dplyr 패키지 안에 있다고 한다.

  • 뮤테이팅 조인 : 다른 데이터프레임에 있는 관측값에서 값을 가져와 테이블의 새로운 변수로 추가
  • 필터링 조인 : 다른 테이블의 관측값과 일치하는지에 다라 관측값을 걸러낸다.
  • 집합 연산 : 관측값을 집합 원소로 취급한다.

dplyr 패키지는 SQL보다 쉽고 데이터 분석에 특화되었기 때문에 일반적인 데이터 분석 작업을 하기는 더 쉽지만, 일반적으로 필요하지 않은 작업을 수행하기에는 더 어렵다.

10.2 연습문제 - pass

10.3 키

테이블에 기본키가 없다면 mutate와 row_number를 이용하여 기본키를 추가할 수 있다.

> iris %>% mutate(key = row_number()) %>% head()
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
  key
1   1
2   2
3   3
4   4
5   5
6   6

10.3.1 연습문제 - pass

10.4 뮤테이팅 조인

fligths 테이블에 carrier 컬럼을 이용해서 airlines테이블에 있는 name 컬럼을 가져오려고 한다. 아래처럼 할 수 있다.

flights %>% 
  select(-origin, -dest) %>% 
  mutate(name = airlines$name[match(flights$carrier, airlines$carrier)]) %>% 
  view()

그러나 여러 변수를 매치시켜야 하는 경우 일반화하기 어렵다. 그래서 뮤테이팅 조인이 필요한 것이다. 뮤테이팅 조인은 1개의 내부 조인(inner join)과 3개의 외부 조인(outer join)이 존재한다.

각 조인의 원리는 따로 정리하기에는 복잡하니 복습 시 책을 참고하자.

10.4.4 중복키

  • 하나의 테이블에 왜래키, 하나의 테이블에 기본키가 있다면 일대다 관계를 가진다.
  • 그런데 두 개의 테이블 어느 곳에도 기본키가 없다면 이런 상황은 일반적으로 오류인 상황이다. 둘 모두 key 값으로 사용하려는 컬럼이 중복이라면 가능한 모든 조합에 대해 테이블이 매칭된다.

10.4.5 키 열 정의하기

left_join등을 실행할 때 by = c("tailnum"="tailnum2")로 지정하면 해당 변수들끼리 매칭하여 조인한다. 여러개의 변수들이 조인에 필요한 경우 by = c("변수1"="변수2", ...계속...) ','(콤마)로 구분하여 추가로 지정하면 된다.

10.4.6 연습문제

중요한 문제들이 많지만 정리하는데 시간이 오래 걸리므로 다음에 해당 포스트를 복습할때 링크를 타고 들어가 코딩해보면서 복습하도록 하자. 문제, 정답 

10.4.7 기타 구현

dplyr 패키지는 4가지 조인함수를 제공한다.

  • inner_join
  • left_join
  • right_join
  • full_join

dplyr의 조인은 빠르고 행 순서를 어지럽히지 않는다. SQL은 dplyr보다 폭넓은 조인 유형을 지원한다. 등식이 아닌 다른 제약 조건을 사용해서 테이블을 연결할 수도 있다고 한다.(non-equisjoin)

10.5 필터링 조인

필터링 조인은 뮤테이팅 조인과 같은 방식으로 관측값을 매칭하지만 변수가 아닌 관측값에 영향을 준다?

  • semi_join(x, y) : y와 매칭되는 x의 모든 관측값을 보존한다.
  • anti_join(x, y) : y와 매치되는 x의 모든 관측값을 삭제한다.

1) semi_join

semi_join은 필터링된 요약 테이블을 다시 원래 행과 매치시키는 데 유용하다.

 

원데이터에서 조건에 따라 테이블을 요약하고 필터링 했을 때, 해당 행들에 해당하는 원 데이터가 궁금할 할 때 사용한다. 

 

필터링 조인을 사용하지 않는 경우(아래 코드), 그러나 단순히 dest 컬럼만 사용해 매칭하는 것이 아닌 경우에 복잡한 코드를 작성해야 한다.

### 조건에 따라 요약된 데이터 ###
> top_dest <- flights %>% 
+   count(dest, sort = TRUE) %>% 
+   head(10)

> top_dest
# A tibble: 10 x 2
   dest      n
   <chr> <int>
 1 ORD   17283
 2 ATL   17215
 3 LAX   16174
 4 BOS   15508

### 요약된 데이터의 원 데이터를 찾는 방법 ###
> flights %>% 
+   filter(dest %in% top_dest$dest)
# A tibble: 141,145 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl>
 1  2013     1     1      542            540         2      923            850        33
 2  2013     1     1      554            600        -6      812            837       -25
 3  2013     1     1      554            558        -4      740            728        12
 4  2013     1     1      555            600        -5      913            854        19

세미조인을 사용한 경우(아래 코드)

> flights %>% 
+   semi_join(top_dest)
Joining, by = "dest"
# A tibble: 141,145 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl>
 1  2013     1     1      542            540         2      923            850        33
 2  2013     1     1      554            600        -6      812            837       -25
 3  2013     1     1      554            558        -4      740            728        12
 4  2013     1     1      555            600        -5      913            854        19

단. 세미조인, 안티 조인은 뮤테이팅 조인처럼 행을 복제하여 생성하지는 않는다. 원 데이터에서 매칭되는 경우만 보여주는 역할을 한다.

 

안티조인은 세미조인과 역할만 다를뿐 사용방법은 동일하다.

10.5.1 연습문제

문제, 해설

10.6 - pass

10.7 집합연산