1 RPubs?

RPubs는 R 사용자를 위한 Web 서비스의 하나로 R로 작성된 코드+실행결과+설명을 markdown 문서로 만들어 업로드 할 수 있는 사이트다.



2 데이터 전처리(Data Preprocessing)란?

주어진 원데이터를 그대로 사용하기보다는 원하는 형태로 변형해서 분석하는 경우가 굉장히 많다.
따라서 분석에 적합하게 데이터를 가공하는 작업을 ’데이터 전처리’라고 한다.

유사한 말로 데이터 가공(Data Manipulation), 데이터 핸들링(Data Handling), 데이터 클리닝(Data Cleanging) 등이 있다.



3 dplyr 패키지

데이터를 빨리 쉽게 가공할 수 있도록 도와주는 R 패키지이며 데이터 전처리 작업에 가장 많이 사용되는 패키지.

dplyr은 plyr의 차기작으로서, 유연한 데이터 조작의 문버을 제공하며 데이터프레임을 집중적으로 다루는 툴입니다.

데이터 조작을 위한 문법으로 체계화를 해서 한번 배워놓으면 쉽다는 점과 더불어, C언어로 만들어서 매우 빠르다.



3.1 dplyr의 다양한 함수


dplyr 함수 기능
filter() 행 추출
select() 열(변수) 추출
arrange() 정렬
mutate() 변수 추가
summarise() 통계치 산출
group_by() 집단별로 나누기
left_join() 데이터 합치기(열)
bind_rows() 데이터 합치기(행)

4 데이터 불러오기(실습)

http://bit.ly/start_r

dplyr 패키지를 설치하고 로드한 후 실습에 사용할 csv_exam.csv 파일을 데이터 프레임으로 만들어서 출력해보자.


# Load library
library(dplyr)
library(ggplot2)

# Set Working directory
setwd("C:/R/Doit/")

exam <- read.csv("C:\\R\\Doit\\csv_exam.csv")
exam
##    id class math english science
## 1   1     1   50      98      50
## 2   2     1   60      97      60
## 3   3     1   45      86      78
## 4   4     1   30      98      58
## 5   5     2   25      80      65
## 6   6     2   50      89      98
## 7   7     2   80      90      45
## 8   8     2   90      78      25
## 9   9     3   20      98      15
## 10 10     3   50      98      45
## 11 11     3   65      65      65
## 12 12     3   45      85      32
## 13 13     4   46      98      65
## 14 14     4   48      87      12
## 15 15     4   75      56      78
## 16 16     4   58      98      65
## 17 17     5   65      68      98
## 18 18     5   80      78      90
## 19 19     5   89      68      87
## 20 20     5   78      83      58

5 filter() : 조건에 맞는 데이터만 추출하기



5.1 조건에 맞는 데이터만 추출하기

데이터를 분석할 때 전체 데이터를 분석하기도 하지만 일부를 추출해 분석하기도 한다.

dplyr 패키지의 filter()를 이용해 1반 학생들의 데이터만 추출해보자.


# 일반 베이스 함수을 사용한 경우
exam[exam$class == 1, ]
##   id class math english science
## 1  1     1   50      98      50
## 2  2     1   60      97      60
## 3  3     1   45      86      78
## 4  4     1   30      98      58
# dplyr 패키지의 filter()를 사용한 경우
exam %>% 
  filter(class == 1)
##   id class math english science
## 1  1     1   50      98      50
## 2  2     1   60      97      60
## 3  3     1   45      86      78
## 4  4     1   30      98      58

%>% 기호는 ’파이프 연산자(pipe operator)’라고 읽는다.
%>%는 물길을 연결하는 수도관(파이프)처럼 함수들을 연결하는 기능을 하며
단축키 Ctrl + Shift + M을 누르면 %>%이 삽입됨.



5.2 초과, 미만, 이상, 이하 조건 걸기

부등호를 이용하면 특정 값 초과나 미만인 경우, 이상이나 이하인 경우에 해당하는 데이터만 추출 할 수 있다.


# 수학 점수가 50점을 초과한 경우
exam %>%
  filter(math > 50)
##    id class math english science
## 1   2     1   60      97      60
## 2   7     2   80      90      45
## 3   8     2   90      78      25
## 4  11     3   65      65      65
## 5  15     4   75      56      78
## 6  16     4   58      98      65
## 7  17     5   65      68      98
## 8  18     5   80      78      90
## 9  19     5   89      68      87
## 10 20     5   78      83      58
# 영어 점수가 80점 이하인 경우
exam %>% 
  filter(english <= 80)
##   id class math english science
## 1  5     2   25      80      65
## 2  8     2   90      78      25
## 3 11     3   65      65      65
## 4 15     4   75      56      78
## 5 17     5   65      68      98
## 6 18     5   80      78      90
## 7 19     5   89      68      87
# 1반이면서 수학 점수가 50점 이상인 경우
exam %>% 
  filter(class == 1 & math >= 50)
##   id class math english science
## 1  1     1   50      98      50
## 2  2     1   60      97      60

5.3 추출한 행으로 데이터 만들기

새 변수를 만들 때 처럼 <- 기호를 이용하면 추출한 행으로 새로운 데이터를 만들 수 있다.

1반과 2반을 추출해 각각 새 데이터로 만든 후 각 반의 수학 점수 평균을 구해보자!


class1 <- exam %>% 
  filter(class == 1)     # class가 1인 행 추출, class1에 할당

class2 <- exam %>% 
  filter(class == 2)     # class가 2인 행 추출, class2에 할당

mean(class1$math)        # 1반 수학 점수 평균 구하기
## [1] 46.25
mean(class2$math)        # 2반 수학 점수 평균 구하기
## [1] 61.25

6 select() : 필요한 변수만 추출하기



6.1 변수 추출하기

select()는 데이터에 들어 있는 수많은 변수 중 일부 변수만 추출해 활용하고자 할 때 사용한다.


# math 변수 추출
exam %>% 
  select(math)
##    math
## 1    50
## 2    60
## 3    45
## 4    30
## 5    25
## 6    50
## 7    80
## 8    90
## 9    20
## 10   50
## 11   65
## 12   45
## 13   46
## 14   48
## 15   75
## 16   58
## 17   65
## 18   80
## 19   89
## 20   78
# class, math, english 변수 추출
exam %>% 
  select(class, math, english)
##    class math english
## 1      1   50      98
## 2      1   60      97
## 3      1   45      86
## 4      1   30      98
## 5      2   25      80
## 6      2   50      89
## 7      2   80      90
## 8      2   90      78
## 9      3   20      98
## 10     3   50      98
## 11     3   65      65
## 12     3   45      85
## 13     4   46      98
## 14     4   48      87
## 15     4   75      56
## 16     4   58      98
## 17     5   65      68
## 18     5   80      78
## 19     5   89      68
## 20     5   78      83
# math 제외하기
exam %>% 
  select(-math)
##    id class english science
## 1   1     1      98      50
## 2   2     1      97      60
## 3   3     1      86      78
## 4   4     1      98      58
## 5   5     2      80      65
## 6   6     2      89      98
## 7   7     2      90      45
## 8   8     2      78      25
## 9   9     3      98      15
## 10 10     3      98      45
## 11 11     3      65      65
## 12 12     3      85      32
## 13 13     4      98      65
## 14 14     4      87      12
## 15 15     4      56      78
## 16 16     4      98      65
## 17 17     5      68      98
## 18 18     5      78      90
## 19 19     5      68      87
## 20 20     5      83      58

6.2 filter()와 select() 조합하기

dplyr 패키지의 함수들은 %>%를 이용해 조합할 수 있다는 큰 장점이 있다.


# class가 1인 행만 추출한 다음 english 추출
exam %>% 
  filter(class ==1) %>% 
  select(english)
##   english
## 1      98
## 2      97
## 3      86
## 4      98

7 arrange() : 순서대로 정렬하기



7.1 순서대로 정렬하기

arrange()를 이용하면 데이터를 원하는 순서로 정렬할 수 있다.


# 오름차순으로 정렬하기
exam %>% 
  arrange(math) 
##    id class math english science
## 1   9     3   20      98      15
## 2   5     2   25      80      65
## 3   4     1   30      98      58
## 4   3     1   45      86      78
## 5  12     3   45      85      32
## 6  13     4   46      98      65
## 7  14     4   48      87      12
## 8   1     1   50      98      50
## 9   6     2   50      89      98
## 10 10     3   50      98      45
## 11 16     4   58      98      65
## 12  2     1   60      97      60
## 13 11     3   65      65      65
## 14 17     5   65      68      98
## 15 15     4   75      56      78
## 16 20     5   78      83      58
## 17  7     2   80      90      45
## 18 18     5   80      78      90
## 19 19     5   89      68      87
## 20  8     2   90      78      25
# 내림차순으로 정렬하기
exam %>% 
  arrange(desc(math)) 
##    id class math english science
## 1   8     2   90      78      25
## 2  19     5   89      68      87
## 3   7     2   80      90      45
## 4  18     5   80      78      90
## 5  20     5   78      83      58
## 6  15     4   75      56      78
## 7  11     3   65      65      65
## 8  17     5   65      68      98
## 9   2     1   60      97      60
## 10 16     4   58      98      65
## 11  1     1   50      98      50
## 12  6     2   50      89      98
## 13 10     3   50      98      45
## 14 14     4   48      87      12
## 15 13     4   46      98      65
## 16  3     1   45      86      78
## 17 12     3   45      85      32
## 18  4     1   30      98      58
## 19  5     2   25      80      65
## 20  9     3   20      98      15
# class 및 math 오름차순 정렬
exam %>% 
  arrange(class, math) 
##    id class math english science
## 1   4     1   30      98      58
## 2   3     1   45      86      78
## 3   1     1   50      98      50
## 4   2     1   60      97      60
## 5   5     2   25      80      65
## 6   6     2   50      89      98
## 7   7     2   80      90      45
## 8   8     2   90      78      25
## 9   9     3   20      98      15
## 10 12     3   45      85      32
## 11 10     3   50      98      45
## 12 11     3   65      65      65
## 13 13     4   46      98      65
## 14 14     4   48      87      12
## 15 16     4   58      98      65
## 16 15     4   75      56      78
## 17 17     5   65      68      98
## 18 20     5   78      83      58
## 19 18     5   80      78      90
## 20 19     5   89      68      87

8 mutate() : 파생변수 추가하기



8.1 파생변수 추가하기

mutate()를 사용하면 기존 데이터에 파생변수를 만들어 추가할 수 있다.


# 총합 변수를 추가한 후 일부 추출
exam %>% 
  mutate(total = math + english + science) %>% 
  head
##   id class math english science total
## 1  1     1   50      98      50   198
## 2  2     1   60      97      60   217
## 3  3     1   45      86      78   209
## 4  4     1   30      98      58   186
## 5  5     2   25      80      65   170
## 6  6     2   50      89      98   237
# 여러 파생변수 한 번에 추가하기
exam %>% 
  mutate(total = math + english + science,
         mean = (math + english + science)/3) %>% 
  head
##   id class math english science total     mean
## 1  1     1   50      98      50   198 66.00000
## 2  2     1   60      97      60   217 72.33333
## 3  3     1   45      86      78   209 69.66667
## 4  4     1   30      98      58   186 62.00000
## 5  5     2   25      80      65   170 56.66667
## 6  6     2   50      89      98   237 79.00000
# mutate()에 ifelse() 적용하기
exam %>% 
  mutate(test = ifelse(science >= 60, "pass", "fail")) %>% 
  head
##   id class math english science test
## 1  1     1   50      98      50 fail
## 2  2     1   60      97      60 pass
## 3  3     1   45      86      78 pass
## 4  4     1   30      98      58 fail
## 5  5     2   25      80      65 pass
## 6  6     2   50      89      98 pass
# 총합 변수를 추가한 다음 총합 변수 기준으로 오름차순 정렬을 해보자.
exam %>% 
  mutate(total = math + english + science) %>% 
  arrange(total) %>% 
  head
##   id class math english science total
## 1  9     3   20      98      15   133
## 2 14     4   48      87      12   147
## 3 12     3   45      85      32   162
## 4  5     2   25      80      65   170
## 5  4     1   30      98      58   186
## 6  8     2   90      78      25   193

9 group_by() & summarise()



9.1 집단별로 요약하기

집단별 평균과 같이 각 집단을 요약한 값을 구할 때는 group_by()와 summarise()를 사용한다.
group_by()에 변수를 지정하면 변수 항목별로 데이터를 분리하고, 여기에 summarise()를 조합하면 집단별 요약 통계량을 산출한다.


# class별로 분리해서 math 평균을 산출해보자.
exam %>% 
  group_by(class) %>% 
  summarise(mean_math = mean(math))
## # A tibble: 5 x 2
##   class mean_math
##   <int>     <dbl>
## 1     1      46.2
## 2     2      61.2
## 3     3      45.0
## 4     4      56.8
## 5     5      78.0

9.2 summarise()에 자주 사용하는 요약 통계량 함수.


함수 의미
mean() 평균
sd() 표준편차
sum() 합계
median() 중위수
min() 최솟값
max() 최댓값
n() 빈도
# 여러 요약 통계량 한 번에 산출하기
exam %>% 
  group_by(class) %>% 
  summarise(mean_math = mean(math),
            sum_math = sum(math),
            median_math = median(math),
            n = n())
## # A tibble: 5 x 5
##   class mean_math sum_math median_math     n
##   <int>     <dbl>    <int>       <dbl> <int>
## 1     1      46.2      185        47.5     4
## 2     2      61.2      245        65.0     4
## 3     3      45.0      180        47.5     4
## 4     4      56.8      227        53.0     4
## 5     5      78.0      312        79.0     4

10 실습을 해봅시다 :)



ggplot2 패키지에 내장된 mpg 데이터를 이용해 분석 문제를 해결해 보세요.


  1. 자동차 제조회사에 따라 도시 연비가 다른지 알아보려고 합니다. “audi”와 “toyota” 중
    어느 manufacturer(자동차 제조 회사)의 cty(도시 연비)가 평균적으로 더 높은지 알아보세요.
mpg_audi <- mpg %>% 
  filter(manufacturer == "audi")

mpg_toyota <- mpg %>% 
  filter(manufacturer == "toyota")

mean(mpg_audi$hwy)
## [1] 26.44444
mean(mpg_toyota$hwy)
## [1] 24.91176

  1. mpg 데이터는 11개 변수로 구성되어 있습니다. 이 중 일부만 추출해 분석에 활용하려고 합니다.
    mpg 데이터에서 class(자동차 종류), cty(도시 연비) 변수를 추출해 새로운 데이터를 만드세요.
    새로 만든 데이터 일부를 출력해 두 변수로만 구성되어 있는지 확인하세요.
mpg_new <- mpg %>% 
  select(class, cty)

head(mpg_new)
## # A tibble: 6 x 2
##   class     cty
##   <chr>   <int>
## 1 compact    18
## 2 compact    21
## 3 compact    20
## 4 compact    21
## 5 compact    16
## 6 compact    18

  1. “audi”에서 생산한 자동차 중에 어떤 자동차 모델의 hwy(고속도로 연비)가 높은지 알아보려고 합니다.
    “audi”에서 생산한 자동차 중 hwy가 1 ~ 5위에 해당하는 자동차의 데이터를 출력하시오.
mpg %>% 
  filter(manufacturer == "audi") %>% 
  arrange(desc(hwy)) %>%
  head(5)
## # A tibble: 5 x 11
##   manufacturer model displ  year   cyl trans drv     cty   hwy fl    class
##   <chr>        <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi         a4     2.00  2008     4 manu~ f        20    31 p     comp~
## 2 audi         a4     2.00  2008     4 auto~ f        21    30 p     comp~
## 3 audi         a4     1.80  1999     4 auto~ f        18    29 p     comp~
## 4 audi         a4     1.80  1999     4 manu~ f        21    29 p     comp~
## 5 audi         a4 q~  2.00  2008     4 manu~ 4        20    28 p     comp~

  1. 회사별로 “suv” 자동차의 도시 및 고속도로 통합 연비 평균을 구해 내림차순으로 정렬하고,
    1 ~ 5위까지 출력해보세요. (단, 지금까지 다룬 dplyr 함수들을 하나의 구문으로 조합해서 해결하세요.)
mpg %>% 
  group_by(manufacturer) %>% 
  filter(class == "suv") %>% 
  mutate(total = (hwy + cty)/2) %>% 
  summarise(mean_total = mean(total)) %>% 
  arrange(desc(mean_total)) %>% 
  head(5)
## # A tibble: 5 x 2
##   manufacturer mean_total
##   <chr>             <dbl>
## 1 subaru             21.9
## 2 toyota             16.3
## 3 nissan             15.9
## 4 mercury            15.6
## 5 jeep               15.6