3. 전처리3

3.1 Tidy Data

  • ‘간결한 데이터’

3.1.1 Tidy Data의 필요성

  • 데이터의 각 행에는 분류 처리에 필요한 기준이 필요하다
  • 아래의 데이터에는 분류 기준이 없기 때문에 Tidy data로 변환한다.
  • 예로 doBy::summaryBy()는 summaryBy(value ~ category, data) 형태로 사용되는데, 컬럼 정보가 없기 때문에 실행될 수 없다.

3.1.2 기준 컬럼 없는 데이터 생성

Gangwon <- c(200, 500, 400)
Gyeongnam <- c(400, 300, 500)
Chungbuk <- c(600, 300, 400)
sales <- data.frame(Gangwon, Gyeongnam, Chungbuk)
sales
##   Gangwon Gyeongnam Chungbuk
## 1     200       400      600
## 2     500       300      300
## 3     400       500      400
  • 따라서 원 데이터가 행 별로 기준을 갖게 하려면 다음과 같이 같은 행에 기준 컬럼의 내용이 오도록 변환해야 한다
  • 일반 데이터를 Tidy 데이터로 만드는데는 두 가지 방법이 있다.
  • 하나는 기본함수 stack()이고, 다른 하나는 reshape2::melt() 이다

3.1.3 Tidy data로 변환

stack()

sales <- stack(sales)
sales
##   values       ind
## 1    200   Gangwon
## 2    500   Gangwon
## 3    400   Gangwon
## 4    400 Gyeongnam
## 5    300 Gyeongnam
## 6    500 Gyeongnam
## 7    600  Chungbuk
## 8    300  Chungbuk
## 9    400  Chungbuk
library(doBy) 
summaryBy(values~ind, sales)
##         ind values.mean
## 1   Gangwon    366.6667
## 2 Gyeongnam    400.0000
## 3  Chungbuk    433.3333

3.1.4 원래 데이터로 되돌리기

unstack()

sales2 <- unstack(sales)
sales2
##   Gangwon Gyeongnam Chungbuk
## 1     200       400      600
## 2     500       300      300
## 3     400       500      400

3.1.5 reshape2 패키지 사용

melt()

  • Tidy data로 변환
library(reshape2)
## Warning: package 'reshape2' was built under R version 3.5.1
sales3 <- melt(sales2); sales2
## No id variables; using all as measure variables
##   Gangwon Gyeongnam Chungbuk
## 1     200       400      600
## 2     500       300      300
## 3     400       500      400
summaryBy(value ~ variable, sales3)
##    variable value.mean
## 1   Gangwon   366.6667
## 2 Gyeongnam   400.0000
## 3  Chungbuk   433.3333
  • melt는 기준열 생성
  • 1:4 까지 선택하면 나머지 변수들이 원래 데이터 아래쪽에 붙게됨.
  • 5:9 까지의 컬럼들의 컬럼 제목과 값들이 아래쪽에 붙음.
head(french_fries)
##    time treatment subject rep potato buttery grassy rancid painty
## 61    1         1       3   1    2.9     0.0    0.0    0.0    5.5
## 25    1         1       3   2   14.0     0.0    0.0    1.1    0.0
## 62    1         1      10   1   11.0     6.4    0.0    0.0    0.0
## 26    1         1      10   2    9.9     5.9    2.9    2.2    0.0
## 63    1         1      15   1    1.2     0.1    0.0    1.1    5.1
## 27    1         1      15   2    8.8     3.0    3.6    1.5    2.3
head(melt(french_fries, id.vars = 1:4))
##   time treatment subject rep variable value
## 1    1         1       3   1   potato   2.9
## 2    1         1       3   2   potato  14.0
## 3    1         1      10   1   potato  11.0
## 4    1         1      10   2   potato   9.9
## 5    1         1      15   1   potato   1.2
## 6    1         1      15   2   potato   8.8
NROW(french_fries)
## [1] 696
head(melt(french_fries, id.vars = 1:4, na.rm = T))
##   time treatment subject rep variable value
## 1    1         1       3   1   potato   2.9
## 2    1         1       3   2   potato  14.0
## 3    1         1      10   1   potato  11.0
## 4    1         1      10   2   potato   9.9
## 5    1         1      15   1   potato   1.2
## 6    1         1      15   2   potato   8.8

dcast() 또는 acast()

  • 원래 데이터로 되돌리기
  • dcast()는 데이터 프레임을, acast()는 행렬을 반환한다.
sales4 <- dcast(sales3, value ~ variable)
sales4
##   value Gangwon Gyeongnam Chungbuk
## 1   200     200        NA       NA
## 2   300      NA       300      300
## 3   400     400       400      400
## 4   500     500       500       NA
## 5   600      NA        NA      600
sales5 <- acast(sales3, value ~ variable)
sales5
##     Gangwon Gyeongnam Chungbuk
## 200     200        NA       NA
## 300      NA       300      300
## 400     400       400      400
## 500     500       500       NA
## 600      NA        NA      600

연습문제 3

다음의 과일 데이터를 이용하여 다음 물음에 답하시오

Apple <- c(6, 10, 13)
Banana <- c(2, 8, 10)
Peach <- c(7, 3, 5)
Berry <- c(8, 15, 11)
Year <- c(2000, 2001, 2002)
Fruit <- data.frame(Apple, Banana, Peach, Berry, Year)
Fruit
##   Apple Banana Peach Berry Year
## 1     6      2     7     8 2000
## 2    10      8     3    15 2001
## 3    13     10     5    11 2002
  1. stack(), summaryBy()을 이용하여 과일 별 평균 판매량을 구하시오
stack.fruit <- stack(Fruit[, 1:4])
stack.fruit
##    values    ind
## 1       6  Apple
## 2      10  Apple
## 3      13  Apple
## 4       2 Banana
## 5       8 Banana
## 6      10 Banana
## 7       7  Peach
## 8       3  Peach
## 9       5  Peach
## 10      8  Berry
## 11     15  Berry
## 12     11  Berry
summaryBy(values ~ ind, stack.fruit)
##      ind values.mean
## 1  Apple    9.666667
## 2 Banana    6.666667
## 3  Peach    5.000000
## 4  Berry   11.333333
  1. melt()를 이용하여 과일 별 평균 판매랑 구하시오.
melt.fruit <- melt(Fruit, id.var = 5)
melt.fruit
##    Year variable value
## 1  2000    Apple     6
## 2  2001    Apple    10
## 3  2002    Apple    13
## 4  2000   Banana     2
## 5  2001   Banana     8
## 6  2002   Banana    10
## 7  2000    Peach     7
## 8  2001    Peach     3
## 9  2002    Peach     5
## 10 2000    Berry     8
## 11 2001    Berry    15
## 12 2002    Berry    11
summaryBy(value ~ variable, melt.fruit)
##   variable value.mean
## 1    Apple   9.666667
## 2   Banana   6.666667
## 3    Peach   5.000000
## 4    Berry  11.333333

3.2 data table

3.2.1 data table 의 특징

  • 데이터 프레임 대신 데이터 테이블을 생각해 볼 수 있다.
  • 데이터 테이블은 속도가 매우 빠르므로, 대용량의 데이터를 빠르게 처리할 필요가 있을 때 유용하다
  • 지속적인 업데이트로 사용방법도 편리해졌다.

3.2.2 dt 생성하기

name <- c("James", "Mary", "Kevin")
age <- c(22, 23, 24)
df <- data.frame(name, age); df
##    name age
## 1 James  22
## 2  Mary  23
## 3 Kevin  24
library(data.table)
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:reshape2':
## 
##     dcast, melt
name <- c("James", "Mary", "Kevin")
age <- c(22, 23, 24)
dt <- data.table(name, age); dt   # 데이터 테이블로 묶어도 df로 나오기 때문에 DT로 변환 해야함
##     name age
## 1: James  22
## 2:  Mary  23
## 3: Kevin  24
iris.dt <- as.data.table(iris); iris.dt  # head, tail 기능
##      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
##  ---                                                            
## 146:          6.7         3.0          5.2         2.3 virginica
## 147:          6.3         2.5          5.0         1.9 virginica
## 148:          6.5         3.0          5.2         2.0 virginica
## 149:          6.2         3.4          5.4         2.3 virginica
## 150:          5.9         3.0          5.1         1.8 virginica
iris.dt[10:30]   # 내용의 순서가 아니라 출력 순서에 따라 행 번호 매겨지는 점 주의
##     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##  1:          4.9         3.1          1.5         0.1  setosa
##  2:          5.4         3.7          1.5         0.2  setosa
##  3:          4.8         3.4          1.6         0.2  setosa
##  4:          4.8         3.0          1.4         0.1  setosa
##  5:          4.3         3.0          1.1         0.1  setosa
##  6:          5.8         4.0          1.2         0.2  setosa
##  7:          5.7         4.4          1.5         0.4  setosa
##  8:          5.4         3.9          1.3         0.4  setosa
##  9:          5.1         3.5          1.4         0.3  setosa
## 10:          5.7         3.8          1.7         0.3  setosa
## 11:          5.1         3.8          1.5         0.3  setosa
## 12:          5.4         3.4          1.7         0.2  setosa
## 13:          5.1         3.7          1.5         0.4  setosa
## 14:          4.6         3.6          1.0         0.2  setosa
## 15:          5.1         3.3          1.7         0.5  setosa
## 16:          4.8         3.4          1.9         0.2  setosa
## 17:          5.0         3.0          1.6         0.2  setosa
## 18:          5.0         3.4          1.6         0.4  setosa
## 19:          5.2         3.5          1.5         0.2  setosa
## 20:          5.2         3.4          1.4         0.2  setosa
## 21:          4.7         3.2          1.6         0.2  setosa
##     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  • data.table 패키지에 있는 fread() 함수를 이용하면 자료를 빠르게 읽는다
DT <- fread("train.csv")
class(DT)
## [1] "data.table" "data.frame"
str(DT)  # 문자열 그냥 캐릭터로 가져옴
## Classes 'data.table' and 'data.frame':   891 obs. of  12 variables:
##  $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
##  $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
##  $ Name       : chr  "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
##  $ Sex        : chr  "male" "female" "female" "female" ...
##  $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
##  $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
##  $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
##  $ Ticket     : chr  "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
##  $ Fare       : num  7.25 71.28 7.92 53.1 8.05 ...
##  $ Cabin      : chr  "" "C85" "" "C123" ...
##  $ Embarked   : chr  "S" "C" "S" "S" ...
##  - attr(*, ".internal.selfref")=<externalptr>
data <- read.csv("train.csv")
str(data)
## 'data.frame':    891 obs. of  12 variables:
##  $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
##  $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
##  $ Name       : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
##  $ Sex        : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
##  $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
##  $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
##  $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
##  $ Ticket     : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
##  $ Fare       : num  7.25 71.28 7.92 53.1 8.05 ...
##  $ Cabin      : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
##  $ Embarked   : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...

3.2.3 dt접근방법

  • 데이터프레임 접근방식과 차이가 없다
iris.dt <- as.data.table(iris); iris.dt
##      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
##  ---                                                            
## 146:          6.7         3.0          5.2         2.3 virginica
## 147:          6.3         2.5          5.0         1.9 virginica
## 148:          6.5         3.0          5.2         2.0 virginica
## 149:          6.2         3.4          5.4         2.3 virginica
## 150:          5.9         3.0          5.1         1.8 virginica
iris.dt[1,]  # 행 접근
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1:          5.1         3.5          1.4         0.2  setosa
iris.dt[,1]  # 열 접근
##      Sepal.Length
##   1:          5.1
##   2:          4.9
##   3:          4.7
##   4:          4.6
##   5:          5.0
##  ---             
## 146:          6.7
## 147:          6.3
## 148:          6.5
## 149:          6.2
## 150:          5.9
  1. 단일 칼럼 접근방법
iris.dt[, Sepal.Length]       # " "없이 출력하면 벡터로 출력
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
##  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
##  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
##  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
##  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
##  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
iris.dt[, "Sepal.Length"]     # " "붙여야 데이터테이블로 결과 산출 따라서 기본적으로  " "사용한다
##      Sepal.Length
##   1:          5.1
##   2:          4.9
##   3:          4.7
##   4:          4.6
##   5:          5.0
##  ---             
## 146:          6.7
## 147:          6.3
## 148:          6.5
## 149:          6.2
## 150:          5.9
  1. 복수 컬럼 접근 방법
iris.dt[, c(Sepal.Length, Petal.Length)]      # 마찬가지 벡터
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
##  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
##  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
##  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
##  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
##  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9 1.4 1.4 1.3
## [154] 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 1.6 1.4 1.1 1.2 1.5 1.3 1.4 1.7 1.5
## [171] 1.7 1.5 1.0 1.7 1.9 1.6 1.6 1.5 1.4 1.6 1.6 1.5 1.5 1.4 1.5 1.2 1.3
## [188] 1.4 1.3 1.5 1.3 1.3 1.3 1.6 1.9 1.4 1.6 1.4 1.5 1.4 4.7 4.5 4.9 4.0
## [205] 4.6 4.5 4.7 3.3 4.6 3.9 3.5 4.2 4.0 4.7 3.6 4.4 4.5 4.1 4.5 3.9 4.8
## [222] 4.0 4.9 4.7 4.3 4.4 4.8 5.0 4.5 3.5 3.8 3.7 3.9 5.1 4.5 4.5 4.7 4.4
## [239] 4.1 4.0 4.4 4.6 4.0 3.3 4.2 4.2 4.2 4.3 3.0 4.1 6.0 5.1 5.9 5.6 5.8
## [256] 6.6 4.5 6.3 5.8 6.1 5.1 5.3 5.5 5.0 5.1 5.3 5.5 6.7 6.9 5.0 5.7 4.9
## [273] 6.7 4.9 5.7 6.0 4.8 4.9 5.6 5.8 6.1 6.4 5.6 5.1 5.6 6.1 5.6 5.5 4.8
## [290] 5.4 5.6 5.1 5.1 5.9 5.7 5.2 5.0 5.2 5.4 5.1
iris.dt[, c("Sepal.Length", "Petal.Length")]  # 데이터테이블의 형태 유지
##      Sepal.Length Petal.Length
##   1:          5.1          1.4
##   2:          4.9          1.4
##   3:          4.7          1.3
##   4:          4.6          1.5
##   5:          5.0          1.4
##  ---                          
## 146:          6.7          5.2
## 147:          6.3          5.0
## 148:          6.5          5.2
## 149:          6.2          5.4
## 150:          5.9          5.1
  1. 주의점
iris.dt[1, Species]                                     # Sepcise 값들이 숫자 값으로 바뀌게 됨.
## [1] setosa
## Levels: setosa versicolor virginica
iris.dt[1, "Species"]
##    Species
## 1:  setosa
iris.dt[1, c(Sepal.Length, Petal.Width, Species)]       # Species 친구가 1로 출력/ 팩터가 숫자로 바뀜
## [1] 5.1 0.2 1.0
iris.dt[1, c("Sepal.Length", "Petal.Width", "Species")] # " " 있어야 정상출력
##    Sepal.Length Petal.Width Species
## 1:          5.1         0.2  setosa
  1. 조건식으로 검색
iris.dt[iris.dt$Petal.Length > 1.5,]  # 데이터프레임과 동일
##      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
##   1:          5.4         3.9          1.7         0.4    setosa
##   2:          4.8         3.4          1.6         0.2    setosa
##   3:          5.7         3.8          1.7         0.3    setosa
##   4:          5.4         3.4          1.7         0.2    setosa
##   5:          5.1         3.3          1.7         0.5    setosa
##  ---                                                            
## 109:          6.7         3.0          5.2         2.3 virginica
## 110:          6.3         2.5          5.0         1.9 virginica
## 111:          6.5         3.0          5.2         2.0 virginica
## 112:          6.2         3.4          5.4         2.3 virginica
## 113:          5.9         3.0          5.1         1.8 virginica
iris.dt[Petal.Length > 1.5, ]
##      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
##   1:          5.4         3.9          1.7         0.4    setosa
##   2:          4.8         3.4          1.6         0.2    setosa
##   3:          5.7         3.8          1.7         0.3    setosa
##   4:          5.4         3.4          1.7         0.2    setosa
##   5:          5.1         3.3          1.7         0.5    setosa
##  ---                                                            
## 109:          6.7         3.0          5.2         2.3 virginica
## 110:          6.3         2.5          5.0         1.9 virginica
## 111:          6.5         3.0          5.2         2.0 virginica
## 112:          6.2         3.4          5.4         2.3 virginica
## 113:          5.9         3.0          5.1         1.8 virginica

3.2.4 행렬계산

  • 데이터테이블을 사용하면 보다 빠른 계산이 가능하다.
  • 컬럼 쪽에서도 다양한 계산이 가능하다.
library(data.table)
iris.dt <-data.table(iris)
aggregate(Sepal.Length ~ Species, iris.dt, mean)
##      Species Sepal.Length
## 1     setosa        5.006
## 2 versicolor        5.936
## 3  virginica        6.588
tapply(iris.dt$Sepal.Length, iris.dt$Species, mean)
##     setosa versicolor  virginica 
##      5.006      5.936      6.588
iris.dt[ , mean(Sepal.Length), by = Species]
##       Species    V1
## 1:     setosa 5.006
## 2: versicolor 5.936
## 3:  virginica 6.588
iris.dt[ , mean(Sepal.Length), by = Species]
##       Species    V1
## 1:     setosa 5.006
## 2: versicolor 5.936
## 3:  virginica 6.588
iris.dt[ , list(신기하네.length =  mean(Sepal.Length)), by = Species]
##       Species 신기하네.length
## 1:     setosa           5.006
## 2: versicolor           5.936
## 3:  virginica           6.588

연습문제

pima <- fread("diabetes.csv")
pima[100,]
##    Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1:           1     122            90            51     220 49.7
##    DiabetesPedigreeFunction Age Outcome
## 1:                    0.325  31       1

Outcome이 1인경우 당뇨환자를 의미하며, 0인 경우 당뇨환자가 아님을 의미한다. 당뇨환자와 그렇지 않은 환자의 인슐린 수치의 평균을 구하시오

a <- pima[Outcome == 1,Insulin ]
b <- pima[Outcome == 0,Insulin ]
mean(a); mean(b)
## [1] 100.3358
## [1] 68.792

3.3 dplyr 패키지

3.3.1 dplyr 특징

  • 기존의 함수를 사용해도 되지만, dplyr 패키지의 함수를 사용하면 작업을 보다 직관적으로 수행할 수 있다.
  • 또한 dplyr 패키지의 함수들은 바르게 동작하며, 특히 파이프 연산자는 문법을 쉽게하는데 큰 도움을 준다

3.3.2dplyr 활용하기

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:data.table':
## 
##     between, first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
iris %>% head() %>% dim()
## [1] 6 5
x <- c(1, 2, 3, 4, 5)
class(data.frame(x))      # 이 방법을 사용하거나
## [1] "data.frame"
x2 <- as.data.frame(x)    # 이렇게 해야하지만
class(x2)
## [1] "data.frame"
x %>% as.data.frame() %>% class()  # 파이프 방식은 한 번에 ㅋ  
## [1] "data.frame"

select()

  • 첫 번째 인자로는 데이터 프레임을. 그 다음은 원하는 컬럼을 인자로 받는다
head(iris[, c("Sepal.Length", "Species")])
##   Sepal.Length Species
## 1          5.1  setosa
## 2          4.9  setosa
## 3          4.7  setosa
## 4          4.6  setosa
## 5          5.0  setosa
## 6          5.4  setosa
head(select(iris, Sepal.Length, Species))
##   Sepal.Length Species
## 1          5.1  setosa
## 2          4.9  setosa
## 3          4.7  setosa
## 4          4.6  setosa
## 5          5.0  setosa
## 6          5.4  setosa
head(iris %>% select(Sepal.Length, Species))
##   Sepal.Length Species
## 1          5.1  setosa
## 2          4.9  setosa
## 3          4.7  setosa
## 4          4.6  setosa
## 5          5.0  setosa
## 6          5.4  setosa

filter

head(iris %>% filter(Species == "setosa"))
##   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
head(iris %>% filter(Sepal.Length < 5.0))
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.9         3.0          1.4         0.2  setosa
## 2          4.7         3.2          1.3         0.2  setosa
## 3          4.6         3.1          1.5         0.2  setosa
## 4          4.6         3.4          1.4         0.3  setosa
## 5          4.4         2.9          1.4         0.2  setosa
## 6          4.9         3.1          1.5         0.1  setosa
head(iris %>% filter(Species == "setosa" & Sepal.Length < 5.0))
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.9         3.0          1.4         0.2  setosa
## 2          4.7         3.2          1.3         0.2  setosa
## 3          4.6         3.1          1.5         0.2  setosa
## 4          4.6         3.4          1.4         0.3  setosa
## 5          4.4         2.9          1.4         0.2  setosa
## 6          4.9         3.1          1.5         0.1  setosa

group_by

  • 데이터를 그룹으로 나누는 역할을 한다
iris %>% group_by(Species) %>% summarize(Sepal.Avg = mean(Sepal.Length)) 
## # A tibble: 3 x 2
##   Species    Sepal.Avg
##   <fct>          <dbl>
## 1 setosa          5.01
## 2 versicolor      5.94
## 3 virginica       6.59
tapply(iris$Sepal.Length, iris$Species, mean)
##     setosa versicolor  virginica 
##      5.006      5.936      6.588
iris.dt[ , mean(Sepal.Length), by = Species, ]
##       Species    V1
## 1:     setosa 5.006
## 2: versicolor 5.936
## 3:  virginica 6.588

arrange

  • base 함수에서 정렬을 지원하는 함수는 sort(), order()
  • dplyr 의 arrange() 가 더 직관적
iris.dt[order(iris$Sepal.Length), ]   # 데이터 테이블을 이용
##      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
##   1:          4.3         3.0          1.1         0.1    setosa
##   2:          4.4         2.9          1.4         0.2    setosa
##   3:          4.4         3.0          1.3         0.2    setosa
##   4:          4.4         3.2          1.3         0.2    setosa
##   5:          4.5         2.3          1.3         0.3    setosa
##  ---                                                            
## 146:          7.7         3.8          6.7         2.2 virginica
## 147:          7.7         2.6          6.9         2.3 virginica
## 148:          7.7         2.8          6.7         2.0 virginica
## 149:          7.7         3.0          6.1         2.3 virginica
## 150:          7.9         3.8          6.4         2.0 virginica
head(iris %>% arrange(Sepal.Length))
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.3         3.0          1.1         0.1  setosa
## 2          4.4         2.9          1.4         0.2  setosa
## 3          4.4         3.0          1.3         0.2  setosa
## 4          4.4         3.2          1.3         0.2  setosa
## 5          4.5         2.3          1.3         0.3  setosa
## 6          4.6         3.1          1.5         0.2  setosa
head(iris %>% arrange(-Sepal.Length))       # 내림차순은  - 로 지원함 
##   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 1          7.9         3.8          6.4         2.0 virginica
## 2          7.7         3.8          6.7         2.2 virginica
## 3          7.7         2.6          6.9         2.3 virginica
## 4          7.7         2.8          6.7         2.0 virginica
## 5          7.7         3.0          6.1         2.3 virginica
## 6          7.6         3.0          6.6         2.1 virginica
head(iris %>% arrange(desc(Sepal.Length)))  # 이것도 마찬가지로 내림차순
##   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 1          7.9         3.8          6.4         2.0 virginica
## 2          7.7         3.8          6.7         2.2 virginica
## 3          7.7         2.6          6.9         2.3 virginica
## 4          7.7         2.8          6.7         2.0 virginica
## 5          7.7         3.0          6.1         2.3 virginica
## 6          7.6         3.0          6.6         2.1 virginica

연습문제 ^^7

  1. dplyr를 이용하여 pima 의 정보를 확인하시오
pima <- read.csv("diabetes.csv")
head(pima %>% filter(Outcome , mean(BMI)))
##   Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1           6     148            72            35       0 33.6
## 2           8     183            64             0       0 23.3
## 3           0     137            40            35     168 43.1
## 4           3      78            50            32      88 31.0
## 5           2     197            70            45     543 30.5
## 6           8     125            96             0       0  0.0
##   DiabetesPedigreeFunction Age Outcome
## 1                    0.627  50       1
## 2                    0.672  32       1
## 3                    2.288  33       1
## 4                    0.248  26       1
## 5                    0.158  53       1
## 6                    0.232  54       1
  1. group_by 를 사용하여 당뇨병 여부에 따라, blood Pressure 의 평균을 산출하시오
pima %>% group_by(Outcome) %>% summarize(bp.Mean = mean(BloodPressure)) 
## # A tibble: 2 x 2
##   Outcome bp.Mean
##     <int>   <dbl>
## 1       0    68.2
## 2       1    70.8
  1. 가장 높은 BMI 를 갖는 환자는 몇 번째 환자인가? ( order 를 사용하여 구하고, 환자의 BMI 값을 쓰시오.)
pima[order(-pima$BMI), ][1,]
##     Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 178           0     129           110            46     130 67.1
##     DiabetesPedigreeFunction Age Outcome
## 178                    0.319  26       1

연습문제

pima <- read.csv("diabetes.csv")
  1. pima dataset에서 outcome에 따라, 데이터를 나누고 각 변수에 대한 boxplot을 그려비교하시오
a <- pima[pima$Outcom == 0, ]
b <- pima[pima$Outcom == 1, ]
boxplot(a); boxplot(b)

2. pima dataset에서 outcome과 다른 변수들 사이의 상관계수를 corrgram 그래프로 그리시오

library(corrgram)
corrgram(pima)

  1. 그 외 다른 방법으로 EDA를 수행하시오
summary(pima)
##   Pregnancies        Glucose      BloodPressure    SkinThickness  
##  Min.   : 0.000   Min.   :  0.0   Min.   :  0.00   Min.   : 0.00  
##  1st Qu.: 1.000   1st Qu.: 99.0   1st Qu.: 62.00   1st Qu.: 0.00  
##  Median : 3.000   Median :117.0   Median : 72.00   Median :23.00  
##  Mean   : 3.845   Mean   :120.9   Mean   : 69.11   Mean   :20.54  
##  3rd Qu.: 6.000   3rd Qu.:140.2   3rd Qu.: 80.00   3rd Qu.:32.00  
##  Max.   :17.000   Max.   :199.0   Max.   :122.00   Max.   :99.00  
##     Insulin           BMI        DiabetesPedigreeFunction      Age       
##  Min.   :  0.0   Min.   : 0.00   Min.   :0.0780           Min.   :21.00  
##  1st Qu.:  0.0   1st Qu.:27.30   1st Qu.:0.2437           1st Qu.:24.00  
##  Median : 30.5   Median :32.00   Median :0.3725           Median :29.00  
##  Mean   : 79.8   Mean   :31.99   Mean   :0.4719           Mean   :33.24  
##  3rd Qu.:127.2   3rd Qu.:36.60   3rd Qu.:0.6262           3rd Qu.:41.00  
##  Max.   :846.0   Max.   :67.10   Max.   :2.4200           Max.   :81.00  
##     Outcome     
##  Min.   :0.000  
##  1st Qu.:0.000  
##  Median :0.000  
##  Mean   :0.349  
##  3rd Qu.:1.000  
##  Max.   :1.000
m <- lm(Outcome ~ Insulin + Age + Pregnancies + BloodPressure + SkinThickness + BMI + DiabetesPedigreeFunction,
        data = pima)
 M <- lm(Outcome ~ ., data = pima)
step(M, direction = "both")
## Start:  AIC=-1397.67
## Outcome ~ Pregnancies + Glucose + BloodPressure + SkinThickness + 
##     Insulin + BMI + DiabetesPedigreeFunction + Age
## 
##                            Df Sum of Sq    RSS     AIC
## - SkinThickness             1    0.0031 121.57 -1399.7
## - Insulin                   1    0.2326 121.80 -1398.2
## <none>                                  121.57 -1397.7
## - Age                       1    0.4589 122.03 -1396.8
## - BloodPressure             1    1.3221 122.89 -1391.4
## - DiabetesPedigreeFunction  1    1.7106 123.28 -1388.9
## - Pregnancies               1    2.5807 124.15 -1383.5
## - BMI                       1    6.4455 128.01 -1360.0
## - Glucose                   1   21.1563 142.72 -1276.5
## 
## Step:  AIC=-1399.65
## Outcome ~ Pregnancies + Glucose + BloodPressure + Insulin + BMI + 
##     DiabetesPedigreeFunction + Age
## 
##                            Df Sum of Sq    RSS     AIC
## - Insulin                   1    0.2526 121.82 -1400.0
## <none>                                  121.57 -1399.7
## - Age                       1    0.4560 122.03 -1398.8
## + SkinThickness             1    0.0031 121.57 -1397.7
## - BloodPressure             1    1.3324 122.90 -1393.3
## - DiabetesPedigreeFunction  1    1.7442 123.31 -1390.7
## - Pregnancies               1    2.5812 124.15 -1385.5
## - BMI                       1    7.3084 128.88 -1356.8
## - Glucose                   1   21.5947 143.17 -1276.1
## 
## Step:  AIC=-1400.05
## Outcome ~ Pregnancies + Glucose + BloodPressure + BMI + DiabetesPedigreeFunction + 
##     Age
## 
##                            Df Sum of Sq    RSS     AIC
## <none>                                  121.82 -1400.0
## + Insulin                   1    0.2526 121.57 -1399.7
## - Age                       1    0.5314 122.36 -1398.7
## + SkinThickness             1    0.0231 121.80 -1398.2
## - BloodPressure             1    1.3836 123.21 -1393.4
## - DiabetesPedigreeFunction  1    1.5990 123.42 -1392.0
## - Pregnancies               1    2.6724 124.50 -1385.4
## - BMI                       1    7.1056 128.93 -1358.5
## - Glucose                   1   22.3475 144.17 -1272.7
## 
## Call:
## lm(formula = Outcome ~ Pregnancies + Glucose + BloodPressure + 
##     BMI + DiabetesPedigreeFunction + Age, data = pima)
## 
## Coefficients:
##              (Intercept)               Pregnancies  
##                -0.836299                  0.020926  
##                  Glucose             BloodPressure  
##                 0.005709                 -0.002357  
##                      BMI  DiabetesPedigreeFunction  
##                 0.013081                  0.140302  
##                      Age  
##                 0.002792