brunch

You can make anything
by writing

C.S.Lewis

by 이지섭 Jan 31. 2021

R기초 - 파생변수를 만들어보자

파생변수 만드는 법과 조건문 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)

hist()함수를 이용해 histogram을 그려보자. 나누어진 bin에 해당하는 값들의 빈도를 셀 수 있다. 

"중간값 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)

qplot()함수를 사용해 빈도수를 그래프로 확인할 수 있다. 

#항목별로 막대가 생겼고, 값의 길이만큼 막대로 표현됐다. 



조건문을 중첩시켜보자 

앞에서는 조건을 합/불합 하나만 두고 데이터를 분류했다. 만약 조건을 여러개(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) 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari