파생변수 만드는 법과 조건문 ifelse의 활용
김선생님은 학생들의 중간고사 시험에 관한 데이터를 가지고 있다. 데이터에는 학생들의 이름, 영어점수, 수학점수라는 3가지 종류의 변수가 있다. 김선생님은 여기에 '평균'이라는 새로운 변수 즉 파생변수를 추가하고 싶다. 어떻게 파생변수를 만들 수 있을까?
파생변수 만드는 법을 알아보자.
1. 데이터 프레임을 생성한다.
df <-data.frame(name = c('뚱이', '뿡이', '찡이'),
english = c(90, 60, 70),
math = c(70, 80, 90))
> df
name english math
1 뚱이 90 70
2 뿡이 60 80
3 찡이 70 90
2. 파생변수를 추가한다.
df$sum(새로만들 변수 이름) < - df$english + df$math (새로 만들공식)
데이터프레임$추가할 파생변수명 <- 이를 만드는 공식
df에 english, math의 평균값을 파생변수로 추가하고 싶다면, 다음과 같이 명령하면 된다.
df$mean <- (df$english +df$math)/2
새로 만든 변수는 항상 맨 오른쪽 칼럼에 붙어서 나타난다.
> df
name english math mean
1 뚱이 90 70 80
2 뿡이 60 80 70
3 찡이 70 90 80
mpg데이터에는 cty(도시 내 연비), hwy(고속도로 연비)라는 두 가지 기준의 데이터가 존재한다.
이 둘의 평균을 내서 '통합연비변수'를 생성해보자. 통합연비변수의 이름은 'total'이라고 지정하려 한다.
mpg <- data.frame(ggplot2::mpg)
mpg$total <- (mpg$cty + mpg$hwy)/2
제대로 됐는지 확인해보자.
head(mpg)
> head(mpg)
manufacturer model displ year cyl trans drv cty hwy fl class total
1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact 23.5
2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact 25.0
3 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact 25.5
4 audi a4 2.0 2008 4 auto(av) f 21 30 p compact 25.5
5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact 21.0
6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact 22.0
전체 차량들의 통합연비평균이 궁금하다. 그러니 파생변수의 평균값도 한 번 구해보자
>mean(mpg$total)
[1] 20.14957
내가 차량을 생산하는 공장의 품질관리 업무를 맡았다고 가정해보자.
생산되는 차량의 연비를 기준으로 합격/불합격을 결정해 출고할지 말지를 결정해야 한다.
1. 차량들의 데이터(mpg)를 살펴봤다. 연비데이터가 도심지역과 고속도로 지역으로 분리되어 있다.
이를 통합해서 본다면 결정이 더 수월할 것이라 판단, 통합연비데이터 total이라는 파생변수를 만들었다.
mpg$total <- (mpg$cty + mpg$hwy)/2
2. 통합연비데이터를 여러모로 확인해봤다.
> summary(mpg$total)
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.50 15.50 20.50 20.15 23.50 39.50
>hist(mpg$total)
"중간값 20 정도를 연비의 합/불합 기준으로 잡자!" 는 판단이 섰다. 데이터를 분석해보니 결정이 수월해졌다.
3. 이제 조건문을 활용해 합격판정변수를 새로 만들어보자. 조건문은 ifelse함수를 사용한다.
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail")
> head(mpg)
manufacturer model displ year cyl trans drv cty hwy fl class total test
1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact 23.5 pass
2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact 25.0 pass
3 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact 25.5 pass
4 audi a4 2.0 2008 4 auto(av) f 21 30 p compact 25.5 pass
5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact 21.0 pass
6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact 22.0 pass
# mpg에 test라는 변수를 새로 만들었다.
# mpg데이터 중 total의 값이 20 이상이라면 pass, 그렇지 않다면 fail이라는 값을 부여한다.
4. 합/불합을 판단했으니 그 개수가 궁금하다. table이라는 함수를 써 빈도를 분석할 수 있다.
> table(mpg$test)
fail pass
106 128
5. 해당 결과를 시각화해보자.
library(ggplot2)
qplot(mpg$test)
#항목별로 막대가 생겼고, 값의 길이만큼 막대로 표현됐다.
앞에서는 조건을 합/불합 하나만 두고 데이터를 분류했다. 만약 조건을 여러개(A, B, C 등급)로 두고 분류하고 싶다면 어떻게 해야할까?
1. 우선 기준치를 정하자.
30이상이면 A등급,
20-29는 B등급,
20미만은 C등급
2. ifelse를 두 번 사용해보자
mpg$grade <- ifelse(mpg$total >= 30, "A",
ifelse(mpg$total >= 20, "B", "C"))
# mpg$total의 값이 30이상이라면 mpg$grade에 A값을 부여한다.
#아니라면 다시 ifelse함수에 의해 20이상인지 판단한다.
#그렇다면 B를 부여하고, 그렇지 않다면 C를 부여한다.
ifelse를 계속해서 중첩하면 원하는 만큼 쪼갤 수 있다.
네 등급으로 나눠보자.
mpg_new$grade <- ifelse(mpg$total >=30 "A",
ifelse(mpg$total>=20 "B",
ifelse(mpg$total>=10 "C", "D")))
1. 데이터 불러올 때 패키지에 있는 데이터만 쏙 뽑아오는 방법이 있었다.
또 패키지 함수를 쓸 때는 항상 먼저 불러와야 한다.
mpg <- as.data.frame(ggplot2::mpg)
library(dplyr)
library(ggplot2)
2.데이터를 불러왔으면, 데이터가 어떻게 생겼는지 파악해야 한다.
head(mpg) # Raw데이터 앞부분
tail(mpg) # Raw데이터 뒷부분
View(mpg) # Raw데이터 뷰어창에서 확인
dim(mpg) #차원
str(mpg) #속성
summary(mpg) #요약통계량
3. 데이터를 정리/수정하자. 변수명부터 바꿔보자.
mpg <- rename(mpg, company = manufacturer)
4. 변수를 추가(파생변수를 생성) 해보자.
mpg$total <-(mpg$cty + mpg$hwy)/2
mpg$test <-ifelse(mpg$total >= 20, "pass", "fail")
5. 빈도를 확인하고 시각화해보자
table(mpg$test)
qplot(mpg$test)