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
- 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
- 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
- 단일 칼럼 접근방법
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
- 복수 컬럼 접근 방법
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
- 주의점
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
- 조건식으로 검색
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
- 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
- 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
- 가장 높은 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")- 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)- 그 외 다른 방법으로 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