언어/R

3. 데이터 전처리

차가운오미자 2021. 6. 15. 16:21

 

데이터 전처리는 데이터를 사용하기 전 변형해야 하는데 이를 전처리라고 한다.

구체적으로, 

1) 데이터를 필요에 따라 추출하거나

2) 종류별로 나누거나

3) 데이터를 합치는 가공

등을 의미한다.

 

데이터 전처리에는 dplyr 패키지를 사용한다.

filter()

select()

Arrange()

mutate() : 변수 추가

summarise() : 통계치

group_by()

left_join()

bind_rows()

이 함수들은 모두 %>% 연산자를 이용하여 데이터에 적용한다. %>% 은 Ctrl+Shift+M 으로 자동완성할 수 있다.

 

1. filter(조건)

은 조건에 따라 데이터를 추출하는 것

library(dprly)
library(readxl)
exam <- read_excel("df_exam.xlsx")

#use filter

# only get data whose class is 1
exam2 <- exam%>%filter(class==1)
exam2

하나의 데이터에 여러 필터를 씌울 수 있다. (중첩 가능!)

# double filters
exam3 <- exam %>% filter(class==1) %>% filter(math>80)
exam3

 

 

조건을 & 또는 | 으로 (and, or 연산) 여러가지를 줄 수도 있다. ! 을 이용해서 not 연산도 가능하다.

R에서 사용하는 연산자들 
논리연산자 기능 산술연산자 기능
< 작다 + 더하기
<= 작거나 같다 - 빼기
> 크다 * 곱하기
>= 크거나 같다 / 나누기
== 같다 ^, ** 제곱
!= 같지 않다 %/%
| or %% 나머지
& and    
%in% 각각 매칭시켜서 확인    

예시

  • 자동차 배기량에 따른 고속도로 연비를 알아본다. displ(배기량)이 4이하인 자동차와 5이상인 자동차 중 어떤 자동차의 hwy(고속도로연비)가 평균적으로 더 높은가?
  • (힌트) filter ( ) 를 이용해 displ 변수가 특정 값을 지닌 행을 추출해 계산을 진행해 본다
    # 1.
    mpg <- as.data.frame(ggplot2::mpg)
    mpg_copy <- mpg
    
    underfour <- mpg_copy %>% filter(displ<=4)
    overfive <- mpg_copy %>% filter(displ>=5)
    
    mean(underfour$hwy)
    mean(overfive$hwy)

     -> 4이하인 애들의 연비가 더 높다. 

  • “chevrolet”, “ford”, “honda” 자동차의 고속도로 연비 평균을 알아보려고 한다. 이 회사들의 데이터들을 추출한 후 hwy 평균을 구해라.
    View(mpg_copy) #check each manufacturer's name
    chevrolet <- mpg_copy %>% filter(manufacturer=="chevrolet")
    dim(chevrolet)
    ford <- mpg_copy %>% filter(manufacturer=="ford")
    honda <- mpg_copy %>% filter(manufacturer=='honda')
    
    mean(chevrolet$hwy)
    mean(ford$hwy)
    mean(honda$hwy)​

 

 

2. select(변수)

select(변수) 는 변수에 따라 데이터를 추출한다.

#2. select(변수)
math = exam %>%  select(math) #필요한 column만 추출
math_class = exam %>% select(math, class)
minus_math = exam %>% select(-math) #math 빼고 저장

math
math_class
minus_math

select(math)는 math 칼럼만 추출함.

select(math, class)는 math 칼럼과 class 칼럼을 추출함.

select(-math)는 math를 제외한 나머지 칼럼들을 추출함.

 

원래대로라면 math 앞에 exam$을 붙여야할 것 같지만 %>% 연산자 뒤의 함수들은 exam과 같은 data에 종속되기 때문에 따로 붙이지 않는게 정석이다.

 

3. arrange(변수)

arrange(변수)는 변수로 정렬을 한다. 올림차순이 기본이다. 따라서 내림차순을 위해서는 desc() 함수를 사용해야 한다.

d

arrange(desc(변수)) 기억!

arrange(변수1, 변수2) 이면 변수1으로 우선 정렬한 후, 이를 바탕으로 변수2로 정렬한다.

 

4. mutate(새로운변수 = 기존변수연산식)

mutate(새로운변수 = 기존변수연산식) 은 파생변수를 만드는 함수이다. 원래

데이터$새 변수<- 기존변수연산식 (exam$total <- exam$math+exam$english) 이런식으로 만들었지만 mutate를 사용할 수도 있다.

#4. mutate
exam %>% mutate(total = math+english+korean)
exam %>% mutate(total = math+english+korean) %>% arrange(total)

 

5. group_by(변수)

group_by(변수) 는 변수의 값에 따라 grouping 하는 함수이다.

#5. group_by
exam %>% group_by(class)

 

6. summarize(함수)

summarize(함수)는 함수에 따른 통계량을 보여준다. (통계 요약) 주로 group_by와 함께 쓰여서 각 group별 값들을 묶어서 보여줄 수 있다.

#6. summarize
exam %>% 
  group_by(class) %>% 
  summarize(mean_math = mean(math),
            sum_math = sum(math),
            n = n(),
            sd = sd(math))

summarize에 쓰일 수 있는 함수는 다음과 같다:

함수 의미
mean() 평균
sd() 표준편차
sum()
median() 중간값
min() 최소값
max() 최대값
n() 빈도

 

7. 실습

1. Mpg 데이터의 class는 “suv”, “compact” 등 자동차를 일곱 종류로 분류한 변수다. 어떤 차종의 도시 연비가 높은지 class별 cty 평균을 구해 보시오. 그리고 그 평균 순서대로 나열해보시오. 

#7. 실습
mpg %>% 
  group_by(class) %>% 
  summarise(mean_class = mean(cty)) %>% 
  arrange(mean_class)

2. 어떤 회사 자동차의 hwy 가 가장 높은지 알아보려고 합니다. Hwy 평균이 가장 높은 회사 세 곳을 출력하세요.

mpg를 제조사(manufacturer)별로 그룹핑 후에 각 그룹별 hwy의 평균을 man_hwy로 저장, 이를 정렬한 후에 top 3 그룹을 프린트한다.

mpg %>% group_by(manufacturer) %>% 
  summarise(man_hwy=mean(hwy)) %>% 
  arrange(man_hwy) %>% 
  head(3)

 

3. 어떤 회사에서 “compact”를 가장 많이 생산하는지 알아보려 합니다. 각 회사별 compact 차종 수를 내림차순으로 정렬해 출력하세요.

mpg를 제조사별로 그룹핑 후에 class가 compact인 아이들만 걸러낸다. 그 후 compact인 애들의 수를 그룹별로 세어 (n()함수) num_compact라고 지정한다. 그 후 num_compact로 각 그룹들을 정렬한다.

mpg %>%
  group_by(manufacturer) %>% 
  filter(class=='compact') %>% 
  summarise(num_compact = n()) %>% 
  arrange(desc(num_compact))

 

 

8. 데이터 합치기

(left_join(데이터1, 데이터2, by=조건), bind_rows(데이터1,데이터2)

필요에 따라 여러 데이터프레임을 합쳐서 사용해야 할 수도 있다. 두 가지 방법이 있는데, 칼럼들을 합치는 left_join()과 bind_rows() 두 함수가 존재한다.

 

- left_join(데이터1, 데이터2, by=조건) 은 데이터 두 개를 옆으로 합치는 방법이다. 칼럼이 다른 경우에 사용할 수 있다. by는 겹치는 칼럼이다.

- bind_rows(데이터1, 데이터2)는 위아래로 합치는 거라고 생각하면 된다. 칼럼은 같은데 instance가 늘어나는 경우이다.

#8. join
test1 <- data.frame(id=c(1, 2, 3, 4, 5), midtearm = c(80, 70, 90, 100, 80))
test2 <- data.frame(id=c(1, 2, 3, 4, 5, 6), fianl = c(40, 80, 70, 90, 100, 80))
test3 <- data.frame(id = c(6, 7, 8, 9, 10), midterm = c(80, 80, 30, 40, 50), final = c(10, 20, 30, 40,50))
left_join(test1, test2, by = 'id')
bind_rows(test1, test3)

 

left_join을 통해 id가 같지만 칼럼이 다른 두 데이터 프레임을 합쳐주었다. 위의 코드에는 instance가 하나가 더 있는데, 이는 불균형할 경우 left_join()함수가 어떻게 처리하는 지를 보기 위해서 넣은 것이다. 실행해보면 id=6, final=10인 instance는 자동 생략된다.

 

bind_rows()를 통해 id가 다르고 midterm이라는 칼럼이 공통적인 데이터 프레임을 이어붙여보았다.

 

값이 없는 곳은 NA로 채워졌다.

 

9. 실습2

ggplot의 midwest 데이터를 이용한다.

  • popadults는 해당 지역의 성인인구, poptotal은 전체 인구를 나타냅니다. midwest 데이터에 ‘전체인구대비 미성년 인구 백분율‘ 변수를 추가하세요.
  • 미성년 인구 백분율이 가장 높은 상위 5개 county의 미성년 인구 백분율을 출력하세요.
  • 미성년 비율 등급 변수(ratio 40 이상 = large, ratio 30이상, 40미만이면 middle, 30미만은 small)를 추가하고, 각 등급에 몇 개의 지역이 있는지 알아보세요.
# 9. 실습2
midwest <- as.data.frame(ggplot2::midwest)
#1) 
midwest <- midwest %>% mutate(ratio = ((poptotal-popadults)/poptotal)*100)
#2)
midwest %>% 
  select(county, ratio) %>% 
  arrange(desc(ratio)) %>%
  head(3)
#3)
midwest$child_percentage <- ifelse(midwest$ratio>=40, "large", ifelse(midwest$ratio>=30, "middle", "small"))

midwest %>% 
  group_by(child_percentage) %>% 
  summarise(n = n())

(1) mutate()을 통해 ratio라는 '전체인구대비 미성년 인구 백분율' 파생변수를 추가해주었다.

(2) select()를 통해 county와 ratio만을 뽑아냈다. 그 후 ratio에 따라 내림차순으로 county를 정렬해주었고, head(3)를 통해서 top3 비율높은 county를 프린트했다.

(3) ifelse()문을 통해서 ratio가 40이상인 경우엔 large, 40미만 30이상인 경우엔 middle, 30미만은 small이라는 값을 가지는 num이라는 등급을 나타내는 파생변수를 만들었다. (등급이 영어로 뭔지 생각이 안나서 num이라고 한것.... ㅠㅠ) 그런 후에 이 등급(num)에 따라 그룹핑 해주었고, 이중 num(등급)만을 추출해주었고, summarise(n())을 이용해서 각 num별로 갯수를 세었다.

 

 

 

'언어 > R' 카테고리의 다른 글

[TS] foreign package is not available  (0) 2021.06.15
4. 그래프 그리기  (0) 2021.06.15
2. 미국 인구 데이터(midwest) 실습  (0) 2021.06.15
1. 변수, Data frame, 간단한 데이터 분석  (0) 2021.06.15
0. R, R Studio설치 및 기본  (0) 2021.06.15