데이터 분석 시 주어진 원데이터를 그대로 활용하기 보다는 분석의 목표에 적합하게 계속해서 데이터 형태를 수정보완 해주어야 합니다. 오늘은 원데이터의 변수를 기준으로 파생변수를 추가하는 방법에 대해 정리해보겠습니다. :-)
사용할 예제 데이터는 R에 기본으로 내장되어 있는 women
입니다. 파생변수를 만들기에 앞서 women
데이터의 요약을 확인해봅시다. (> 요약함수 포스팅 바로 가기)
> dplyr::glimpse(women)
Observations: 15
Variables: 2
$ height <dbl> 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72
$ weight <dbl> 115, 117, 120, 123, 126, 129, 132, 135, 139, 142, 146, 150, 154, 159,…
> summary(women)
height weight
Min. :58.0 Min. :115.0
1st Qu.:61.5 1st Qu.:124.5
Median :65.0 Median :135.0
Mean :65.0 Mean :136.7
3rd Qu.:68.5 3rd Qu.:148.0
Max. :72.0 Max. :164.0
이 데이터는 height
와 weight
의 두 수치형 변수로 구성되어 있군요! 여기서 summary의 min과 max를 보면 두 변수 모두 둘다 우리나라에서 쓰이는 cm와 kg 기준은 아닌 것을 알 수 있습니다. R의 help를 참고하면 height
는 인치 weiht
는 파운드 기준 이라고 하네요!
이렇게 파악한 데이터 내용을 참고하여 아래의 파생 변수들을 만들어 보도록 하겠습니다. 😀😊🤓
🍀 기존 변수 이름 변경
🍀 cm와 kg 기준의 새로운 height
및 weight
변수를 추가하고 이를 활용한 bmi 파생변수 생성
🍀 키를 두가지 기준으로 나눈 파생변수 추가
🍀 bmi 지수를 다섯가지 기준으로 나눈 파생변수 추가
가장 먼저, 본 포스팅은 dplyr 패키지를 활용할 것이기 때문에 tidyverse
를 로드 해주셔야 합니다! > library(tidyverse)
dplyr
패키지의 rename
함수를 활용합니다.> women %>% # 데이터 지정
+ dplyr::rename(height_in = height, # 수정할 변수명 = 기존 변수명
+ weight_lb = weight) # 수정할 변수명 = 기존 변수명
height_in weight_lb
1 58 115
2 59 117
3 60 120
4 61 123
5 62 126
6 63 129
7 64 132
8 65 135
9 66 139
10 67 142
11 68 146
12 69 150
13 70 154
14 71 159
15 72 164
rename
을 추천드립니다.> colnames(women) <- c("height_in", "weight_in")
height_cm
, weight_kg
, bmi
의 세 파생변수 추가dplyr
패키지의 mutate
함수를 사용하겠습니다.round
함수를 통해 조정해주었습니다. > round(숫자, digits = 표시할 자릿수)
height_cm
변수와 weight_kg
변수를 먼저 추가하고 가장 마지막 줄에 추가해주어야 합니다! 1 in = 2.54 cm
1 lb = 0.453592 kg
bmi = 체중(kg) ÷ {키(m) x 키(m)}
> women2 %>% # 위 기존 변수 이름 변경한 버전을 women2에 저장해주었어요.
dplyr::mutate(height_cm = round(height_in * 2.54, digits = 0),
weight_kg = round(weight_lb * 0.453592, digits = 0),
bmi = round(weight_kg / {{height_cm*0.01} * {height_cm*0.01}}, digits = 0))
# 1. 세가지 변수 추가 : mutate(추가할 변수 명 = 변수 내용)
# 2. 각 변수별 소수점 자릿수 지정 : mutate(추가할 변수 명 = round(변수 내용, digits = 표시할 자릿수)
# 참고) bmi 계산에서 키는 m 기준이므로 cm기준의 변수에 *0.01 해줌
height_in weight_lb height_cm weight_kg bmi
1 58 115 147 52 24
2 59 117 150 53 24
3 60 120 152 54 23
4 61 123 155 56 23
5 62 126 157 57 23
6 63 129 160 59 23
7 64 132 163 60 23
8 65 135 165 61 22
9 66 139 168 63 22
10 67 142 170 64 22
11 68 146 173 66 22
12 69 150 175 68 22
13 70 154 178 70 22
14 71 159 180 72 22
15 72 164 183 74 22
height_cm
변수의 평균값은 165.1 이네요.평균이상
과 평균 미만
으로 데이터를 나눈 변수를 만들어보겠습니다.ifelse
함수를 활용했습니다. > ifelse(test, yes, no)
> summary(women2) # 평균수치 살펴보기
height_in weight_lb height_cm weight_kg bmi
Min. :58.0 Min. :115.0 Min. :147.0 Min. :52.00 Min. :22.0
1st Qu.:61.5 1st Qu.:124.5 1st Qu.:156.0 1st Qu.:56.50 1st Qu.:22.0
Median :65.0 Median :135.0 Median :165.0 Median :61.00 Median :22.0
Mean :65.0 Mean :136.7 Mean :165.1 Mean :61.93 Mean :22.6
3rd Qu.:68.5 3rd Qu.:148.0 3rd Qu.:174.0 3rd Qu.:67.00 3rd Qu.:23.0
Max. :72.0 Max. :164.0 Max. :183.0 Max. :74.00 Max. :24.0
> women2 %>%
+ dplyr::mutate(height_new = ifelse(height_cm >= 165.1, "평균이상", "평균미만"))
height_in weight_lb height_cm weight_kg bmi height_new
1 58 115 147 52 24 평균미만
2 59 117 150 53 24 평균미만
3 60 120 152 54 23 평균미만
4 61 123 155 56 23 평균미만
5 62 126 157 57 23 평균미만
6 63 129 160 59 23 평균미만
7 64 132 163 60 23 평균미만
8 65 135 165 61 22 평균미만
9 66 139 168 63 22 평균이상
10 67 142 170 64 22 평균이상
11 68 146 173 66 22 평균이상
12 69 150 175 68 22 평균이상
13 70 154 178 70 22 평균이상
14 71 159 180 72 22 평균이상
15 72 164 183 74 22 평균이상
women
데이터의 bmi 지수는 22~24 사이에 있어요. 그래서 파생변수를 만드는 의미는 없으나 공부를 위해 코드를 만들어 볼게요.cut
함수를 활용하였습니다. 저체중 : BMI ~ 19.9
정상 : BMI 20~24.9
과체중(1도 비만) : BMI 25~29.9
비만(2도 비만) : BMI 30~39.9
고도비만 : BMI 40
> women2 %>%
+ dplyr::mutate(bmi_new = cut(x = bmi, # 기준 데이터
+ breaks = c(0, 20, 25, 30, 40, 100), # 구간 : 0~20, 20~25, 25~30 ... 만약 특정 규칙이 있다면 a * 1:3 <= 이런 형태로도 가능
+ right = FALSE, # '=' 를 왼쪽과 오른쪽 중 어디로 할지 : 0 <= bmi < 20을 원한다면 왼쪽에 '='가 있으므로 FALSE로 지정
+ labels = c("저체중", "정상", "과체중", "비만", "고도비만"), # 각 구간별 이름
+ ordered_result = TRUE)) # 순서형 factor로 만들어주고 싶다면 TRUE
height_in weight_lb height_cm weight_kg bmi height_new bmi_new
1 58 115 147 52 24 평균미만 정상
2 59 117 150 53 24 평균미만 정상
3 60 120 152 54 23 평균미만 정상
4 61 123 155 56 23 평균미만 정상
5 62 126 157 57 23 평균미만 정상
6 63 129 160 59 23 평균미만 정상
7 64 132 163 60 23 평균미만 정상
8 65 135 165 61 22 평균미만 정상
9 66 139 168 63 22 평균이상 정상
10 67 142 170 64 22 평균이상 정상
11 68 146 173 66 22 평균이상 정상
12 69 150 175 68 22 평균이상 정상
13 70 154 178 70 22 평균이상 정상
14 71 159 180 72 22 평균이상 정상
15 72 164 183 74 22 평균이상 정상
🍎 위 모든 것을 한번에 코드로 써보기
> women2 <- women %>%
+ dplyr::rename(height_in = height,
+ weight_lb = weight) %>%
+ dplyr::mutate(height_cm = round(height_in * 2.54, digits = 0),
+ weight_kg = round(weight_lb * 0.453592, digits = 0),
+ bmi = round(weight_kg / {{height_cm*0.01} * {height_cm*0.01}}, digits = 0),
+ height_new = ifelse(height_cm >= 165.1, "평균이상", "평균미만"),
+ bmi_new = cut(x = bmi,
+ breaks = c(0, 20, 25, 30, 40, 100),
+ right = FALSE,
+ labels = c("저체중", "정상", "과체중", "비만", "고도비만"),
+ ordered_result = TRUE))
이상입니다.✨