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)
수학점수 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) 가 높은지 알아봅시다.
<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 |