대충벌레 블로그
article thumbnail
Published 2021. 1. 20. 18:00
R언어 공부 정리 [4] IT 기술/R
728x90
반응형

R언어 이전 포스트 참고

2021/01/15 - [IT/R] - 분석 , 통계시 유용한 R 언어 설치와 기본 공부 정리

2021/01/18 - [IT/R] - R 언어 공부정리 [2]

2021/01/19 - [IT/R] - R 언어 공부 정리 [3]

 

 

데이터 전처리(Data Processing) , 즉 분석할때 필요한 데이터들을 선택, 가공하는 작업입니다.

필요한 행을 선택하거나 열을 선택하고 이상치나 결측치들을 제거하는것.

 

우선 R언어에서는 dplyr 라는 패키지를 사용합니다. 이 패키지의 주요 함수를 알아보겠습니다.

 

filter() 원하는 행을 추출하는것
select() 원하는 열을 추출하는것
arrange() 원하는 순서에 맞게 정렬하는것
mutate() 새로운 컬럼 변수를 추가하는것
summarize() 통게함수 
group_by()  데이터를 그룹화 시키는것.   [~~ 별  , ~~ 마다]
left_join() 데이터 열을 합치는것
bind_row() 데이터 행을 합치는것

 

우선 저번에 썼었던 exam 데이터 프레임을 사용

exam <- read.csv("csv_exam.csv")

 

 

 

%>% : R에서 데이터의 전달할때는 %>% 라는 기호를 사용한다 . 

약간 리눅스에서 파이프 | 느낌? [ 개인적인 생각 ]

 

행 추출하기! : filter()

 

우선 class 가 1인 행을 추출할때 

exam 이라는 데이터에서 필터로 class가 1인 행을 선택한다

exam %>% filter(class==1)

만약 1반이 아닌행을 추출하고 싶다면

exam %>% filter(class != 1)

수학점수가 50점 이상 , 수학점수가 50점 이상 80점 이하 , 수학점수가 50이상 이거나 영어점수가 70점 이상

반이 1반 2반 3반인 사람들을 추출하고싶을때

수학점수 50 이상
exam %>% filter(math>=50)
수학점수 50과 80 사이
exam %>% filter(math<=80 & math>=50) # & 대신 , 도 사용가능한거 같다
수학점수가 50 이상이거나 영어점수가 70 이상
exam %>% filter(math>=50 | english >= 70)
반이 1반 2반 3반
exam %>% filter(class %in% c(1,2,3)) # %in% 사용

 

ggplot2에 있는 mpg 데이터를 가지고 연습해 보자

mpg에서 자동차 배기량에 따른 연비가 다른지 알아보려고 한다. 

displ이 4 이하인 자동차와 5이상인 자동차중 어떤 자동차가 고속도로 연비(hwy) 가 높은지 알아봅시다.

 

mpg <- data.frame(ggplot2::mpg)

mpg_a <- mpg %>% filter(displ <= 4 ) # displ이 4 이하인 것을 추출

mpg_b <- mpg %>% filter(displ >= 5 ) # displ이 5 이상인것을 추출

mean(mpg_a$hwy) # displ 4이하 hwy 평균
mean(mpg_b$hwy) # displ 5이상 hwy 평균

이번엔 자동차 제조회사에 따라서 도시연비가 다른지 알아보려고 한다. 

audi와 toyota 중 어떤 회사의 도시 연비가 높은지 구해보자 

 

mpg_audi <- mpg %>% filter(manufacturer == "audi") # 아우디 추출
mpg_toyota <- mpg %>% filter(manufacturer == 'toyota') # 토요타 추출
mean(mpg_audi$cty) # 아우디 도시연비 평균
mean(mpg_toyota$cty) # 토요타의 도시연비 평균

 

3번째 문제 chevrolet , ford , honda 자동차의 고속도로 평균 연비를 알아보려고 합니다. 이 회사들의 데이터를 추출한뒤 hwy 전체 평균을 구하시오

mpg_new <- mpg %>% filter(manufacturer %in% c('chevrolet','ford','honda'))
mean(mpg_new$hwy)

 

열 추출하기! select()

exam 데이터에서 필요한 열만 추출할려고 할땐 select()를 이용한다.

영어 성적만 추출할땐

exam %>% select (english)

수학하고 과학만 추출할때는 

exam %>% select(math,science)

수학만 제외하고 보고싶다면

exam %>% select(-math)

이번엔 응용을 해서 1반 사람들의 영어점수를 출력해 보자 

exam %>% filter (class==1 ) %>% select(class,english)

# 실행 결과 
  class english
1     1      98
2     1      97
3     1      86
4     1      98

 

mpg의 데이터 중에서 class 와 cty를 추출해서 새로운 데이터를 생성해 봅시다.

mpg_data <- mpg %>% select(class,cty)
mpg_data

mpg_data를 이용해서 class가 suv인 자동차와 compact인 자동차 중의 평균연비를 알아봅시다.

mpg_suv <- mpg_data %>% filter(class=="suv") # class 가 suv 인 데이터 추출
mpg_compact <- mpg_data %>% filter(class=="compact") #  class 가 compact인 데이터 추출

mean(mpg_suv$cty) # 평균값 
mean(mpg_compact$cty)

 

정렬하기 ! : arrange()

 

exam 데이터에서 수학점수를 기준으로 오름차순으로 정렬

exam %>% arrange(math)

# 실행 결과
    id class math english science
1   9     3   20      98      15
2   5     2   25      80      65
3   4     1   30      98      58
4   3     1   45      86      78
5  12     3   45      85      32
6  13     4   46      98      65
7  14     4   48      87      12
8   1     1   50      98      50
9   6     2   50      89      98
         ...

 

만약 내림차순(역순) 으로 하고싶다면 desc(math)를 해주면 됩니다.

exam %>% arrange(desc(math))

 

mpg 데이터 audi 에서 생산한 자동차중 어떤 자동차의 모델의 hwy가  높은지 알아보려고합니다.

audi에서 생산한 자동차중 hwy 1위부터 5위까지 출력하시오

mpg %>% filter(manufacturer=='audi') %>% arrange(desc(hwy)) %>% head(5)   

 

파생 변수 생성 : mutate( ) 

 

exam에서 수학 영어 과학을 합산한 총점 컬럼 total을 추가하고 6행만 출력해보자

exam %>% mutate(total=(math+english+science)) %>% head()

이번엔 수학 영어 과학의 평균을 나타내는 mean 컬럼을 추가해봅시다

일단은 토탈컬럼을 추가한 데이터프레임을 새로 만들어줍니다.

그리고 mean 변수를 추가해줍니다.

exam_1 <- exam %>% mutate(total=(math+english+science))

exam_1 %>% mutate(mean=total/3)

과학 점수가 60 이상이면 pass 아니면 fail 을 나타내는 test 컬럼을 추가해 봅시다. 

 

exam_1 <- exam_1 %>% mutate(test=ifelse(science>=60,'pass','fail'))
exam_1

# 실행결과 
   id class math english science total test
1   1     1   50      98      50   198 fail
2   2     1   60      97      60   217 pass
3   3     1   45      86      78   209 pass
4   4     1   30      98      58   186 fail
5   5     2   25      80      65   170 pass
6   6     2   50      89      98   237 pass
7   7     2   80      90      45   215 fail
8   8     2   90      78      25   193 fail
9   9     3   20      98      15   133 fail
10 10     3   50      98      45   193 fail
11 11     3   65      65      65   195 pass
12 12     3   45      85      32   162 fail
13 13     4   46      98      65   209 pass
14 14     4   48      87      12   147 fail
15 15     4   75      56      78   209 pass
16 16     4   58      98      65   221 pass
17 17     5   65      68      98   231 pass
18 18     5   80      78      90   248 pass
19 19     5   89      68      87   244 pass
20 20     5   78      83      58   219 fail

총점이 낮은 순서대로 10개 출력해 봅시다.

exam_1 %>% arrange(total) %>% head(10)

 

mpg 데이터의 cty 와 hwy를 합산한 total 컬럼을 출력해 봅시다.

mpg %>% mutate(total = cty+hwy) %>% head()

cty 와 hwy를 합산한 total컬럼의 평균을 구하여 mean 컬럼을 추가하자

 

mpg1 <- mpg1 %>% mutate(mean=total/2) # mean 컬럼 추가

 

이중에서 평균연비가 높은 순서대로 자동차를 4개만 출력해 봅시다.

mpg1 %>% arrange(desc(mean)) %>% head(4)

 

그룹화 시켜서 통계화 작업! : 집단별 group_by() , 요약하기 summarise()

 

이 함수를 사용하기 위해서는 library(dplyr)를 로드해주어야 합니다.

우선 dplyr를 사용하지 않고 exam데이터의 수학점수의 평균을 구하려면 아래와 같은 코드로 작성합니다.

mean(exam$math) 

summarise() 함수 사용시 

exam %>% summarise(mean_math=mean(math))

 

class 별 수학점수의 평균을 구해봅시다 .

exam %>% 
  group_by(class) %>%  # 먼저 반으로 그룹지어서
  summarise(mean_math=mean(math)) # 그룹별 통계를 산출한다
  
 # 실행 결과 
   class mean_math
   <int>     <dbl>
1     1      46.2
2     2      61.2
3     3      45  
4     4      56.8
5     5      78  

 

exam 데이터에서 반별 수학점수의 합계, 평균, 중앙값과 학생수를 출력해봅시다.

 

exam %>%
  group_by(class) %>%
  summarise(sum_math=sum(math),median_math=median(math),mean_math=mean(math),num=n())

그룹함수에는 

mean() : 평균 , sd() : 편차 , sum() : 합계 , mean() : 평균 

median() : 중앙값 , min() : 최소값 , max() 최대값 , n() : 빈도 가 있습니다.

 

group_by와 summarise를 활용한 예시입니다.

mpg 데이터에서 제조사,드라이브별 도시연비의 평균을 구하고 일부만 출력하시오

 

mpg %>%
  group_by(manufacturer,drv) %>%
  summarise(mean_cty=mean(cty)) %>% head(10)
  
  # 실행 결과
     manufacturer drv   mean_cty
   <chr>        <chr>    <dbl>
 1 audi         4         16.8
 2 audi         f         18.9
 3 chevrolet    4         12.5
 4 chevrolet    f         18.8
 5 chevrolet    r         14.1
 6 dodge        4         12  
 7 dodge        f         15.8
 8 ford         4         13.3
 9 ford         r         14.8
10 honda        f         24.4

이번에는 회사별 suv 자동차의 도시 및 고속도로 통합연비 컬럼을 추가하고 평균을 구하여 내림차순으로 

1위부터 5위까지 출력해 봅시다.

 

mpg %>% group_by(manufacturer) %>% filter(class=='suv') %>%
  mutate(total=cty+hwy) %>%
  summarise(mean_tot=mean(total)) %>%
  arrange(desc(mean_tot)) %>% head(5)
  
  # 실행결과 
    manufacturer mean_tot
  <chr>           <dbl>
1 subaru           43.8
2 toyota           32.6
3 nissan           31.8
4 mercury          31.2
5 jeep             31.1

 

mpg 데이터의 class는 suv compact 등 자동차의 특징에 따라서 일곱종류로 분류한 변수입니다.

어떤 차종의 도시연비가 높은지 비교하려고 할때 class별 cty의 평균을 구해봅시다.

 

위의 문제에선 첫번쨰 문장은 그냥 설명입니다 class별 cty의 평균만 구하면 됩니다.

mpg %>% group_by(class) %>% summarise(mean_cty=mean(cty))

# 실행 결과
  class      mean_cty
  <chr>         <dbl>
1 2seater        15.4
2 compact        20.1
3 midsize        18.8
4 minivan        15.8
5 pickup         13  
6 subcompact     20.4
7 suv            13.5

위의 실행 결과는 class값이 알파벳 순으로 정렬되어 나옵니다

어떤 차종의 도시연비가 높은지 쉽게 알아볼수 있도록 cty 평균이 높은순으로 정렬해 봅시다.

 

mpg %>% group_by(class) %>% summarise(mean_cty=mean(cty)) %>% arrange(desc(mean_cty))

# 실행결과
  class      mean_cty
  <chr>         <dbl>
1 subcompact     20.4
2 compact        20.1
3 midsize        18.8
4 minivan        15.8
5 2seater        15.4
6 suv            13.5
7 pickup         13  

어떤 회사의 hwy 연비가 높은지 알아보려고 합니다. hwy 평균이 가장 높은 회사 3곳을 출력해봅시다.

mpg %>% group_by(manufacturer) %>% 
  summarise(hwy_avg=mean(hwy)) %>%
  arrange(desc(hwy_avg)) %>% head(3)
  
  # 실행 결과 
  manufacturer hwy_avg
  <chr>          <dbl>
1 honda           32.6
2 volkswagen      29.2
3 hyundai         26.9

어떤 회사가 compact 차종을 가장 많이 생산하는지 알아보려고 합니다.

각 회사별 compact 차의 수를 내림차순으로 정렬하시오

mpg %>% filter(class=='compact') %>% group_by(manufacturer) %>% 
  summarise(cnt=n()) %>% arrange(desc(cnt)) 
  
  # 실행 결과 
  manufacturer   cnt
  <chr>        <int>
1 audi            15
2 volkswagen      14
3 toyota          12
4 subaru           4
5 nissan           2
반응형

'IT 기술 > R' 카테고리의 다른 글

R언어 공부 정리 [6]  (0) 2021.01.22
R언어 공부 정리 [5]  (0) 2021.01.21
R 언어 공부 정리 [3]  (1) 2021.01.19
R 언어 공부정리 [2]  (2) 2021.01.18
분석 , 통계시 유용한 R 언어 설치와 기본 공부 정리  (0) 2021.01.15
profile

대충벌레 블로그

@대충벌레

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!