DS Study/R4DS(R언어)

[R4DS] [6] tidyr로 하는 타이디 데이터

23학번이수현 2024. 4. 6. 01:30

1.Introduce

- 해당 챕터에서는 R에서 데이터를 일관성있게 정리하는 법을 학습한다.

- 이는 타이디(tidy,깔끔한) 데이터 라는 구조이다.

- 타이디 데이터에 대해 실무적으로 소개하고, tidyr 패키지에 포함된 도구를 살펴본다

 

1.1.Ready

- 지저분한 데이터셋을 정리하는 도구가 있는 tidyr 패키지에 중점을 둔다.

- tidyr 은 tidyverse의 핵심 구성원이다.

 

2.타이디 데이터

- 하나의 기본 데이터를 표현하는 방식은 다양하다.

- 다음 예시는 같은 데이터를 다른 네 가지 방식으로 구성하여 보여준다.

- 각 데이터셋은 네 개의 변수, country,year,population 및 cases의 값을 동일하게 보여주지만 다른 방식으로 구성한다.

 

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
table2
# A tibble: 12 × 4
   country      year type            count
   <chr>       <dbl> <chr>           <dbl>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583
 table3
# A tibble: 6 × 3
  country      year rate             
  <chr>       <dbl> <chr>            
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
table4a
# A tibble: 3 × 3
  country     `1999` `2000`
  <chr>        <dbl>  <dbl>
1 Afghanistan    745   2666
2 Brazil       37737  80488
3 China       212258 213766
table4b
# A tibble: 3 × 3
  country         `1999`     `2000`
  <chr>            <dbl>      <dbl>
1 Afghanistan   19987071   20595360
2 Brazil       172006362  174504898
3 China       1272915272 1280428583

- 이들은 모두 같은 데이터를 표현하지만, 사용성이 같지는 않다.

- 데이터셋을 타이디하게 만드는, 서로 연관된 세 가지 규칙은 다음과 같다.

 

1. 변수마다 해당되는 열이 있어야 한다.

2. 관측값마다 해당되는 행이 있어야 한다.

2. 값마다 해당하는하나의 셀이 있어야한다.

 

- 세 가지 규칙은 서로 연관되어 있음

- 이 셋 중 두 가지만 충족시키는 것은 불가능함

- 이 상호관계 때문에 다음의 더 간단하고 실용적인 지침이 도출된다.

 

1. 데이터셋을 티블에 각각 넣어라.

2. 변수를 열에 각각 넣어라.

 

- 위의 5가지 예시중 table1만 타이디하다.

- 해당 테이블만 유일하게 각 열이 변수인 표현이기 때문이다.

 

- 데이터가 타이디해야 하는 이유가 뭘까? 

- 주요 장점은 두가지가 존재한다.

 

I) 타이디 데이터를 사용하면 이에 적용할 도구들이  공통성을 가지게 되어, 이들을 익히기 더 쉬워진다.

II)변수를 열에 배치하면 R의 벡터화 속성이 가장 발휘된다는 점에서 구체적인 장점이 생김

 

- table1 즉 타이디데이터를 사용하여 작업하는 방법을 보여주는 몇가지 간단한 예제

 #10,000명 당 비율 계산
> table1 %>%
+     mutate(rate = cases / population * 10000)
# A tibble: 6 × 5
  country      year  cases population  rate
  <chr>       <dbl>  <dbl>      <dbl> <dbl>
1 Afghanistan  1999    745   19987071 0.373
2 Afghanistan  2000   2666   20595360 1.29 
3 Brazil       1999  37737  172006362 2.19 
4 Brazil       2000  80488  174504898 4.61 
5 China        1999 212258 1272915272 1.67 
6 China        2000 213766 1280428583 1.67
 #연간 사례 수 계산
> table1 %>%
+     count(year, wt = cases)
# A tibble: 2 × 2
   year      n
  <dbl>  <dbl>
1  1999 250740
2  2000 296920
#시간에 따른 변화 시각화
> library(ggplot2)
> ggplot(table1, aes(year,cases)) +
+     geom_line(aes(group = country), color = "grey") +
+     geom_point(aes(color = country))

 

2.1. 연습문제

Q1) 변수와 관측값이 각 샘플 테이블에서 어떻게 구성되어 있는지 설명하라.

 

I) table1

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

- 각 행은 country, year의 조합을 나타내고

- 각 열은 cases 에따른 population을 나타낸다.

 

II) table2

table2
# A tibble: 12 × 4
   country      year type            count
   <chr>       <dbl> <chr>           <dbl>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583

- 각 행은 country, year, type의 조합을 나타내고

- 각 열은 count를 의미한다.

 

III) table3

 table3
# A tibble: 6 × 3
  country      year rate             
  <chr>       <dbl> <chr>            
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
>

- 각 행은 country,year의 조합을 의미하고

- 각 열은 해당 rate를 의미한다.

 

3.피봇하기 

- 우리가 마주치게 될 대부분의 데이터들은 타이디하지 않을 것이다.

- 이유는 크게 두가지가 존재한다.

 

I) 대부분의 사람들은 타이디 데이터의 원리에 익숙하지 않으며, 데이터 작업에 많은 시간을 써야한다.

II) 데이터는 분석보다는 다른 용도에 편리하도록 구성되는 경우가 많다.

 

- 따라서 실제 분석에서는 타이디하게 만드는 작업이 필요하다. 

 

- 첫 번째 단계에서는 항상 변수와 관측값이 무엇인지 파악하는 것이다. 

- 두 번째 단계에서는 자주 일어나는 다음의 두 가지 문제 중 하나를 해결하는 것

 

I) 하나의 변수가 여러 열에 분산되어 있을 수 있다.

II) 하나의 관측값이 여러 행에 흩어져 있을 수 있다.

 

- 일반적으로 한 데이터셋은 이 문제들 중 하나로 인해 어려움을 겪게 된다.

- 정말 운이 없는 경우만, 두 문제 모두로 고생하게 될 것이다. 

 

- 이러한 문제를 해결하기위해선 tidyr에서 가장 중요한 함수인 pivot_longer()과 pivit_wider()가 필요.

 

3.1. 더 길게 만들기

- 자주 생기는 문제는 데이터셋의 일부 열 이름이 변수 이름이 아니라 변수 값인 경우이다.

-table4a를 보면 열 이름 1999와 2000은 year 변수 값을 나타내며, 각 행은 하나가 아닌 두 개의 관측값을 나타낸다.

table4a
# A tibble: 3 × 3
  country     `1999` `2000`
  <chr>        <dbl>  <dbl>
1 Afghanistan    745   2666
2 Brazil       37737  80488
3 China       212258 213766
>

-해당 데이터셋을 타이디하게 만들려면 해당 열을 새로운 두 변수로 피봇해야한다.

- 이 작업을 설명하기 위해 세 가지 파라미터가 필요하다.

 

i) 변수가 아니라 값을 나타내는 열 집합. 이 예에서는 열 1999와 열 2000이다.

ii) 열 이름 자리에 나타난 값의 변수 이름. 여기에서는 year이다.

iii) 셀에 값이 분산되어 있는 변수의 이름. 여기에서는 cases이다. 

 

이러한 파라미터와 함께 pivot_longer() 호출을 생성할 수 있다.

> table4a %>%
+     pivot_longer(c(`1999`,`2000`),names_to = 'year',values_to = 'cases')
# A tibble: 6 × 3
  country     year   cases
  <chr>       <chr>  <dbl>
1 Afghanistan 1999     745
2 Afghanistan 2000    2666
3 Brazil      1999   37737
4 Brazil      2000   80488
5 China       1999  212258
6 China       2000  213766

3.2. 더 넓게 만들기

- pivot_wider()는 pivor_longer()의 반대이다. 관측값이 여러행에 흩어져 있을 때 사용한다.

- 예를 들어 table2를 보자. 하나의 관측값은 한 해, 한 국가에 대한 것이지만 각 관측값이 두 행에 흩어져 있다.

> table2
# A tibble: 12 × 4
   country      year type            count
   <chr>       <dbl> <chr>           <dbl>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583

- 이것을 타이디하게 하기 위해,먼저 pivot_longer()와 비슷한 방식으로 표현 방법을 분석한다.

-그러나 이번에는 파라미터가 두 개만 필요하다.

 

i) 변수 이름을 포함하는 열, 여기에선 type

ii) 값을 포함하는 열, 여기에서는 count

 

table2 %>%
+     pivot_wider(names_from = type, values_from = count)
# 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