[R 데이터 탐색] 4. 데이터 전처리 : 파생변수 추가하기

수진·2020년 2월 18일
1

R

목록 보기
6/12
post-thumbnail

  데이터 분석 시 주어진 원데이터를 그대로 활용하기 보다는 분석의 목표에 적합하게 계속해서 데이터 형태를 수정보완 해주어야 합니다. 오늘은 원데이터의 변수를 기준으로 파생변수를 추가하는 방법에 대해 정리해보겠습니다. :-)

  사용할 예제 데이터는 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  

  이 데이터는 heightweight의 두 수치형 변수로 구성되어 있군요! 여기서 summary의 min과 max를 보면 두 변수 모두 둘다 우리나라에서 쓰이는 cm와 kg 기준은 아닌 것을 알 수 있습니다. R의 help를 참고하면 height는 인치 weiht는 파운드 기준 이라고 하네요!

  이렇게 파악한 데이터 내용을 참고하여 아래의 파생 변수들을 만들어 보도록 하겠습니다. 😀😊🤓

   🍀 기존 변수 이름 변경
   🍀 cm와 kg 기준의 새로운 heightweight 변수를 추가하고 이를 활용한 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함수를 사용하겠습니다.
    • 더불어 추가한 변수의 소숫점이 0자리로 나오도록 round 함수를 통해 조정해주었습니다. > round(숫자, digits = 표시할 자릿수)
    • ⚡여기서 주의사항⚡
      bmi는, kg과 cm 기준의 변수들을 활용할 것이기 때문에, 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 이네요.
    • 그럼 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   평균이상

  

  • BMI를 다섯가지 기준으로 나눈 파생변수 추가
    • 지금 활용하는 women 데이터의 bmi 지수는 22~24 사이에 있어요. 그래서 파생변수를 만드는 의미는 없으나 공부를 위해 코드를 만들어 볼게요.
    • ifelse를 여러번 사용해도 되지만, 구간을 나눌 수 있는 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))

 이상입니다.✨

profile
안녕하세요! 이것저것 하고 있습니다 👩‍🔧

0개의 댓글