대충벌레 블로그
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인 행을 선택한다

<go />
exam %>% filter(class==1)

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

<go />
exam %>% filter(class != 1)

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

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

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

 

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

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

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

 

<go />
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 중 어떤 회사의 도시 연비가 높은지 구해보자 

 

<go />
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 전체 평균을 구하시오

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

 

열 추출하기! select()

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

영어 성적만 추출할땐

<go />
exam %>% select (english)

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

<go />
exam %>% select(math,science)

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

<go />
exam %>% select(-math)

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

<go />
exam %>% filter (class==1 ) %>% select(class,english) # 실행 결과 class english 1 1 98 2 1 97 3 1 86 4 1 98

 

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

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

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

<go />
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 데이터에서 수학점수를 기준으로 오름차순으로 정렬

<go />
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)를 해주면 됩니다.

<go />
exam %>% arrange(desc(math))

 

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

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

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

 

파생 변수 생성 : mutate( ) 

 

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

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

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

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

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

<go />
exam_1 <- exam %>% mutate(total=(math+english+science)) exam_1 %>% mutate(mean=total/3)

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

 

<go />
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개 출력해 봅시다.

<go />
exam_1 %>% arrange(total) %>% head(10)

 

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

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

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

 

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

 

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

<go />
mpg1 %>% arrange(desc(mean)) %>% head(4)

 

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

 

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

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

<go />
mean(exam$math)

summarise() 함수 사용시 

<go />
exam %>% summarise(mean_math=mean(math))

 

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

<go />
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 데이터에서 반별 수학점수의 합계, 평균, 중앙값과 학생수를 출력해봅시다.

 

<go />
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() : 빈도 가 있습니다.

 

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

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

 

<go />
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위까지 출력해 봅시다.

 

<go />
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의 평균만 구하면 됩니다.

<go />
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 평균이 높은순으로 정렬해 봅시다.

 

<go />
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곳을 출력해봅시다.

<go />
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 차의 수를 내림차순으로 정렬하시오

<go />
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

대충벌레 블로그

@대충벌레

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