1. 데이터 전처리
데이터 전처리(Data Preprocessing)
- 분석에 적합하게 데이터를 가공하는 작업
- 일부를 추출하거나, 종류별로 나누거나, 여러 데이터를 합치는 등 데이터를 자유롭게 가공할 수 있어야 목적에 맞게 분석 가능
- dplyr은 데이터 전처리 작업에 가장 많이 사용되는 패키지
dplyr 함수 | 기능 |
filter() | 행 추출 |
select() | 열(변수) 추출 |
arrange() | 정렬 |
mutate() | 변수 추가 |
summarise() | 통계치 산출 |
group_by() | 집단별로 나누기 |
left_join() | 데이터 합치기(열) |
bind_rows() | 데이터 합치기(행) |
2. 조건에 맞는 데이터만 추출하기
- dplyr 패키지의 filter()를 이용하면 원하는 데이터를 추출할 수 있음
● dplyr 패키지를 로드한 후 csv_exam.csv 파일을 데이터 프레임으로 만들고 출력
library(dplyr)
exam<-read.csv("csv_exam.csv")
exam
## id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
5 5 2 25 80 65
6 6 2 50 89 98
7 7 2 80 90 45
1) dplyr 패키지의 filter()를 이용해 1반 학생들의 데이터만 출력
#exam에서 class가 1인 경우만 추출해 출력
exam %>% filter(class==1)
## id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
- dplyr 패키지는 %>% 기호(파이프 연산자)를 이용해 함수들을 나열하는 방식으로 코드를 작성
- 위 코드는 exam을 출력하되, class가 1인 행만 추출하라는 조건이 지정되어 있음
- filter()안의 class==1은 'class 변수의 값이 1인 행'을 의미
2) 변수가 특정값이 '아닌 경우'에 해당하는 데이터만 추출
- 등호 앞에 느낌표를 붙여 != 이라고 쓰면 '같지 않다'를 의미하는 기호가 됨
# 1반이 아닌 경우
exam %>% filter(class!=1)
id class math english science
1 5 2 25 80 65
2 6 2 50 89 98
3 7 2 80 90 45
4 8 2 90 78 25
5 9 3 20 98 15
3) 여러 조건을 충족하는 행 추출하기
- '그리고(and)'를 의미하는 기호 &를 사용해 조건을 나열하면 여러 조건을 동시에 충족하는 행을 추출할 수 있음
# 1반이면서 수학 점수가 50점 이상인 경우
exam %>% filter(class == 1 & math >=50)
## id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
4) 여러 조건 중 하나 이상 충족하는 행 추출하기
- '또는(or)'을 의미하는 | 기호를 이용하면 여러 조건 중 하나라도 충족하는 데이터를 추출할 수 있음
# 영어 점수가 90점 미만이거나 과학 점수가 50점 미만인 경우
exam %>% filter(english<90 | science<50)
## id class math english science
1 3 1 45 86 78
2 5 2 25 80 65
3 6 2 50 89 98
4 7 2 80 90 45
5 8 2 90 78 25
6 9 3 20 98 15
5) 추출한 행으로 데이터 만들기
- 새 변수를 만들 때 처럼 <- 기호를 이용하면 추출한 행으로 새로운 데이터를 만들 수 있음
- 데이터를 조건별로 나눠 활용하고자 할 때 이런 형태로 코드 작성
class1 <-exam %>% filter(class==1) # class가 1인 행 추출, class1에 할당
class2<-exam %>% filter(class==2) # class가 2인 행 추출, class2에 할당
mean(class1$math) # 1반 수학 점수 평균 구하기
##[1] 46.25
> mean(class2$math) # 2반 수학 점수 평균 구하기
##[1] 61.25
6) 목록에 해당하는 행 추출하기
- %in% 기호는 변수의 값이 지정한 조건 목록에 해당하는지 확인
exam %>% filter(class %in% c(1,3,5)) # 1,3,5반에 해당하면 추출
## id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
5 9 3 20 98 15
6 10 3 50 98 45
7 11 3 65 65 65
8 12 3 45 85 32
9 17 5 65 68 98
10 18 5 80 78 90
11 19 5 89 68 87
12 20 5 78 83 58
3. 필요한 변수만 추출하기
1) 변수 추출하기
- exam에서 math 변수만 추출
- 데이터 프레임명을 입력한 후 %>%로 select()를 연결
- 괄호 안에는 추출한 변수 이름 입력
exam %>% select(math) #math 추출
## math
1 50
2 60
3 45
4 30
2) 여러 변수 추출하기
- 쉼표를 넣어 변수명을 나열하면 여러 변수를 동시에 추출 가능
exam %>% select(class,math,english) # class, math, english 변수 추출
##class math english
1 1 50 98
2 1 60 97
3 1 45 86
4 1 30 98
3) 변수 제외하기
- 특정 변수만 제외하고 나머지 모든 변수 추출
- 제외할 변수명 앞에 빼기 기호 -를 입력하면 됨
exam %>% select(-math) # math 제외
##id class english science
1 1 1 98 50
2 2 1 97 60
3 3 1 86 78
4 4 1 98 58
5 5 2 80 65
4) dplyr 함수 조합하기
- dplyr 패키지의 함수들은 %>%를 이용해 조합할 수 있다는 장점이 있음
● filter()와 select() 조합
- filter()와 select()를 조합해서 1반 학생의 영어 점수 추출
# class가 1인 행만 추출한 다음 english 추출
exam %>% filter(class==1) %>% select(english)
##english
1 98
2 97
3 86
4 98
● 가독성 있게 줄 바꾸기
- %>%로 코드가 연결되는 부분에서 줄을 바꾸면 함수별로 구분되기 때문에 가독성 있는 코드를 만들 수 있음
- %>% 뒤에서 enter로 줄을 바꾸면 자동으로 일정 간격이 띄어져서 어디까지 dplyr 코드 단락인지 한눈에 파악할 수 있음
exam %>%
filter(class==1) %>%
select(english)
● 일부만 출력하기
- 데이터의 일부를 출력할 때 사용하는 head()를 dplyr에 조합해 사용할 수 있음
- dplyr 구문의 마지막에 %>%로 연결해 head를 입력하면 됨
exam %>%
+ select(id,math) %>% # id,math 추출
+ head # 앞부분 6행까지 추출
## id math
1 1 50
2 2 60
3 3 45
4 4 30
5 5 25
6 6 50
4. 순서대로 정렬하기
1) 오름차순으로 정렬하기
- arrange()에 math를 입력하면 수학 점수가 낮은 사람에서 높은 사람 순으로 오름차순 정렬해 출력
exam %>% arrange(math) # 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
2) 내림차순으로 정렬하기
- 내림차순 정렬하려면 기준 변수를 desc()에 적용
- math가 높은사람부터 낮은 사람 순으로 출력
exam %>% arrange(desc(math)) # math 내림차순 정렬
## id class math english science
1 8 2 90 78 25
2 19 5 89 68 87
3 7 2 80 90 45
4 18 5 80 78 90
5 20 5 78 83 58
- 정렬 기준으로 삼을 변수를 여러 개 지정하려면 쉼표를 이용해 변수명을 나열하면 됨
- 반을 기준으로 오름차순 정렬한 후 각 반에서 수학 점수를 기준으로 오름차순 정렬해 출력
exam %>% arrange(class,math) # class 및 math 오름차순 정렬
##id class math english science
1 4 1 30 98 58
2 3 1 45 86 78
3 1 1 50 98 50
4 2 1 60 97 60
5 5 2 25 80 65
6 6 2 50 89 98
5. 파생변수 추가하기
1) 파생변수 추가하기
- mutate()를 사용하면 기존 데이터에 파생변수를 만들어 추가할 수 있음
- mutate()에 새로 만들 변수명과 변수를 만들 때 사용할 공식을 입력하면 됨
- exam에 세 과목의 점수를 모두 합한 총합 변수를 만들어 추가한후 일부만 출력
exam %>%
mutate(total=math+english+science) %>% #총합 변수 추가
head # 일부 추출
## id class math english science total
1 1 1 50 98 50 198
2 2 1 60 97 60 217
3 3 1 45 86 78 209
4 4 1 30 98 58 186
5 5 2 25 80 65 170
6 6 2 50 89 98 237
2) 여러 파생변수 한 번에 추가하기
- 쉼표를 이용해 새 변수명과 변수를 만드는 공식을 나열하면 됨
exam %>%
+ mutate(total=math+english+science, # 총합 변수 추가
+ mean=(math+english+science)/3) %>% # 총평균 변수 추가
+ head() # 일부 추출
## id class math english science total mean
1 1 1 50 98 50 198 66.00000
2 2 1 60 97 60 217 72.33333
3 3 1 45 86 78 209 69.66667
4 4 1 30 98 58 186 62.00000
5 5 2 25 80 65 170 56.66667
6 6 2 50 89 98 237 79.00000
3) mutate()에 ifelse() 적용하기
- mutate()에 iselse()를 적용하면 조건에 따라 다른 값을 부여한 변수를 추가할 수 있음
exam %>%
+ mutate(test=ifelse(science>=60,"pass","fail")) %>%
+ head()
## id class math english science test
1 1 1 50 98 50 fail
2 2 1 60 97 60 pass
3 3 1 45 86 78 pass
4 4 1 30 98 58 fail
5 5 2 25 80 65 pass
6 6 2 50 89 98 pass
4) 추가한 변수를 dplyr 코드에 바로 활용하기
- 변수를 추가하고 나면 이어지는 dplyr 코드에 바로 활용할 수 있음
- mutate()로 추가한 변수를 arrange()에서 기준으로 삼아 정렬해 일부를 출력
exam %>%
+ mutate(total=math+english+science) %>% #총합 변수 추가
+ arrange(total) %>% # 총합 변수 기준 정렬
+ head # 일부 정렬
##id class math english science total
1 9 3 20 98 15 133
2 14 4 48 87 12 147
3 12 3 45 85 32 162
4 5 2 25 80 65 170
5 4 1 30 98 58 186
6 8 2 90 78 25 193
6. 집단별로 요약하기
- 집단별 평균이나 집단별 빈도처럼 각 집단을 요약한 값을 구할 때는 group_by()와 summarise()를 사용
1) summarise() 사용
- 수학 점수 평균을 구한 후 mean_math()라는 새로운 변수에 할당해 출력하는 기능
exam %>% summarise(mean_math = mean(math)) #math 평균 산출
## mean_math
57.45
- summarise()는 전체를 요약한 값을 구하기보다는 group_by()와 조합해 집단별 요약표를 만들 때 사용
2) 집단별로 요약하기
- group_by()에 변수를 지정하면 변수 항목별로 데이터를 분리
- 여기에 summarise()를 조합하면 집단별 요약 통계량을 산출
- 반별 수학 점수 평균을 산출
exam %>%
+ group_by(class) %>% #class별로 분리
+ summarise(mean_math=mean(math)) #math 평균 산출
# A tibble: 5 × 2
class mean_math
<int> <dbl>
1 1 46.2
2 2 61.2
3 3 45
4 4 56.8
5 5 78
3) 여러 요약 통계량 한 번에 산출하기
- mutate()로 여러 변수를 동시에 추가했던 것과 마찬가지로 summarise()로도 여러 요약 통계량을 한번에 산출 가능
exam %>%
+ group_by(class) %>% # class별로 분리
+ summarise(mean_math=mean(math), #math 평균
sum_math=sum(math), #math 합계
median_math=median(math), #math 중앙값
n=n()) #학생 수
# A tibble: 5 × 5
class mean_math sum_math median_math n
<int> <dbl> <int> <dbl> <int>
1 1 46.2 185 47.5 4
2 2 61.2 245 65 4
3 3 45 180 47.5 4
4 4 56.8 227 53 4
5 5 78 312 79 4
- n()은 데이터가 몇 행으로 되어 있는지 '빈도'를 구하는 기능
4) 각 집단별로 다시 집단 나누기
- group_by()에 여러 변수를 지정하면 집단을 나눈 후 다시 하위 집단으로 나눌 수 있다
ex) mpg 데이터를 이용해 하위 집단별 평균 구하기
회사별로 집단을 나눈 후 다시 구동 방식별로 나눠 도시 연비 평균 구하기
mpg %>%
+ group_by(manufacturer,drv) %>% #회사별, 구동 방식별
+ summarise(mean_cty=mean(cty)) %>% #cty 평균 산출
+ head(10) # 일부 출력
# A tibble: 10 × 3
# Groups: manufacturer [5]
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
5) dplyr 조합하기
- 회사별로 "suv" 자동차의 도시 및 고속도로 통합 연비 평균을 구해 내림차순으로 정렬하고, 1~5위 까지 출력
mpg %>%
+ group_by(manufacturer) %>% # 회사별로 분리
+ filter(class=="suv") %>% # suv 추출
+ mutate(tot=(cty+hwy)/2) %>% # 통합 연비 변수 생성
+ summarise(mean_tot=mean(tot)) %>% # 통합 연비 평균 산출
+ arrange(desc(mean_tot)) %>% # 내림차순 출력
+ head(5) #1~5위까지 출력
# A tibble: 5 × 2
manufacturer mean_tot
<chr> <dbl>
1 subaru 21.9
2 toyota 16.3
3 nissan 15.9
4 mercury 15.6
5 jeep 15.6
7. 데이터 합치기
1) 가로로 합치기
- 다섯명이 중간고사와 기말고사를 봤다고 가정하고, 2개의 데이터 프레임 만들기
# 중간고사 데이터 생성
test1 <-data.frame(id=c(1,2,3,4,5), midter=c(60,80,70,90,85))
# 기말고사 데이터 생성
test2<-data.frame(id=c(1,2,3,4,5), final=c(80,83,65,95,80))
test1 #test1 출력
id midter
1 1 60
2 2 80
3 3 70
4 4 90
5 5 85
test2 # test2 출력
id final
1 1 80
2 2 83
3 3 65
4 4 95
5 5 80
- dplyr 패키지의 left_join()을 이용하면 가로로 합칠 수 있음
- 괄호 안에 합칠 데이터 프레임명을 나열하고, 기준으로 삼을 변수명을 by에 지정
total<-left_join(test1,test2,by="id") #id를 기준으로 합쳐 total에 할당
total #total출력
## id midter final
1 1 60 80
2 2 80 83
3 3 70 65
4 4 90 95
5 5 85 80
2) 다른 데이터를 활용해 변수 추가하기
- left_join()을 응용하면 특정 변수의 값을 기준으로 다른 데이터의 값을 추가할 수 있음
ex)
● 각 반 학생들의 시험 점수를 담은 exam 데이터를 분석하고 있는데, 추가로 반별 담임교사 명단을 얻었다고 가정
- 담임교사 명단 데이터
name<-data.frame(class=c(1,2,3,4,5), teacher=c("Kim","lee","park","choi","jung"))
name
class teacher
1 1 Kim
2 2 lee
3 3 park
4 4 choi
5 5 jung
● name은 class와 teacher 두 변수로 구성
class 변수를 기준으로 삼아 name의 teacher 변수를 name에 추가
exam_new<-left_join(exam,name,by="class")
exam_new
## id class math english science teacher
1 1 1 50 98 50 Kim
2 2 1 60 97 60 Kim
3 3 1 45 86 78 Kim
4 4 1 30 98 58 Kim
5 5 2 25 80 65 lee
6 6 2 50 89 98 lee
7 7 2 80 90 45 lee
8 8 2 90 78 25 lee
9 9 3 20 98 15 park
10 10 3 50 98 45 park
3) 세로로 합치기
- 학생 다섯 명이 먼저 시험을 보고, 나중에 다섯 명이 따로 시험을 봤다고 가정하고 2개의 데이터 프레임 만들기
#학생 1~5번 시험 데이터 생성
group_a<-data.frame(id=c(1,2,3,4,5),test=c(60,80,70,90,85))
#학생 6~10번 시험 데이터 생성
group_b<-data.frame(id=c(6,7,8,9,10), test=c(70,83,65,95,80))
group_a #group_a 출력
id test
1 1 60
2 2 80
3 3 70
4 4 90
5 5 85
group_b #group_b 출력
id test
1 6 70
2 7 83
3 8 65
4 9 95
5 10 80
- bind_rows()를 이용하면 데이터를 세로로 합칠 수 있음
- 괄호 안에 합칠 데이터 프레임을 나열하면 됨
group_all <-bind_rows(group_a,group_b) # 데이터 합쳐서 group_all에 할당
group_all #group_all 출력
## id test
1 1 60
2 2 80
3 3 70
4 4 90
5 5 85
6 6 70
7 7 83
8 8 65
9 9 95
10 10 80
- 데이터를 세로로 합칠 때는 두 데이터의 변수명이 같아야 함
- 만약 변수명이 다르면 rename()을 이용해 동일하게 맞춘 후에 합치면 됨
'데이터 > R 프로그래밍' 카테고리의 다른 글
R 프로그래밍 기초 (4) (0) | 2023.10.16 |
---|---|
R 프로그래밍 기초(2) (0) | 2023.10.13 |
R 프로그래밍 기초 (1) (0) | 2023.10.12 |