계속해서 dplyr 패키지를 이용한 데이터 가공에 대해서 이야기해 보겠습니다. subset과 다른 dplyr의 추가 기능 중 하나는 변수를 가공해서 새로운 변수를 만들 수 있다는 것입니다. 예를 들어 몸무게와 키를 이용해 체질량 지수 (BMI)를 계산하거나 혹은 달러 표시와 원화 표시를 동시에 할 수 있습니다. mutate 기능을 사용한 것으로 여기서는 1달러당 1100원으로 원화를 표시해 보겠습니다. mutate(price_kr=price*1100)%>%의 문법으로 앞에서 봤던 사용법과 크게 다르지 않습니다.
D1%>%
filter(cut=="Ideal")%>% #Ideal 추출
select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
mutate(price_kr=price*1100)%>% #원화표시 가격
arrange(carat) #오름차순 정렬
> D1%>%
+ filter(cut=="Ideal")%>% #Ideal 추출
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ mutate(price_kr=price*1100)%>% #원화표시 가격
+ arrange(carat) #오름차순 정렬
# A tibble: 18 x 6
carat cut color clarity price price_kr
1 0.3 Ideal F VS1 570 627000
2 0.31 Ideal H IF 772 849200
3 0.31 Ideal D VS2 942 1036200
4 0.32 Ideal E VVS1 1020 1122000
5 0.33 Ideal G IF 946 1040600
6 0.33 Ideal H VVS1 713 784300
7 0.41 Ideal J VS1 648 712800
8 0.44 Ideal G SI1 772 849200
9 0.54 Ideal D VS2 1993 2192300
10 0.6 Ideal F VS1 2142 2356200
11 0.62 Ideal H VS1 1808 1988800
12 0.7 Ideal F SI1 2573 2830300
13 0.74 Ideal D VS2 3858 4243800
14 1.01 Ideal D SI2 5206 5726600
15 1.09 Ideal G VVS2 8970 9867000
16 1.09 Ideal J SI2 5034 5537400
17 1.11 Ideal F VS2 9057 9962700
18 1.2 Ideal I VS2 5699 6268900
단순 계산 뿐 아니라 범주형 자료로 만들 수 있습니다. ifelse를 사용해 100만원을 기준으로 high와 low 그룹으로 나눠보겠습니다. mutate(price_group=ifelse(price_kr>1000000,"high","low"))%>%를 추가하면 됩니다.
D1%>%
filter(cut=="Ideal")%>% #Ideal 추출
select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
mutate(price_kr=price*1100)%>% #원화표시 가격
mutate(price_group=ifelse(price_kr>1000000,"high","low"))%>% #가격분류
arrange(carat) #오름차순 정렬
> D1%>%
+ filter(cut=="Ideal")%>% #Ideal 추출
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ mutate(price_kr=price*1100)%>% #원화표시 가격
+ mutate(price_group=ifelse(price_kr>1000000,"high","low"))%>% #가격분류
+ arrange(carat) #오름차순 정렬
# A tibble: 18 x 7
carat cut color clarity price price_kr price_group
1 0.3 Ideal F VS1 570 627000 low
2 0.31 Ideal H IF 772 849200 low
3 0.31 Ideal D VS2 942 1036200 high
4 0.32 Ideal E VVS1 1020 1122000 high
5 0.33 Ideal G IF 946 1040600 high
6 0.33 Ideal H VVS1 713 784300 low
7 0.41 Ideal J VS1 648 712800 low
8 0.44 Ideal G SI1 772 849200 low
9 0.54 Ideal D VS2 1993 2192300 high
10 0.6 Ideal F VS1 2142 2356200 high
11 0.62 Ideal H VS1 1808 1988800 high
12 0.7 Ideal F SI1 2573 2830300 high
13 0.74 Ideal D VS2 3858 4243800 high
14 1.01 Ideal D SI2 5206 5726600 high
15 1.09 Ideal G VVS2 8970 9867000 high
16 1.09 Ideal J SI2 5034 5537400 high
17 1.11 Ideal F VS2 9057 9962700 high
18 1.2 Ideal I VS2 5699 6268900 high
dplyr를 통해 데이터를 쉽게 추출하고 가공할 수 있다는 점은 큰 매력이라고 하겠습니다. 물론 이렇게 가공한 내용은 데이터프레임 이름<- csv="" nbsp="" span="">->
또 다른 중요한 기능은 그룹별 통계를 내서 새로운 데이터 프레임으로 만들 수 있는 기능입니다. group_by()와 summarise()를 통해 그룹별로 분류하고 평균이나 표준 편차 등 중요한 기본 통계량을 계산할 수 있습니다. 여기서는 cut 그룹별로 분류하고 가격을 알아보겠습니다.
D1%>%
select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
group_by(cut)%>% #cut 그룹별 분류
summarise(cut_price=mean(price)) #그룹별 평균 가격
> D1%>%
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ group_by(cut)%>% #cut 그룹별 분류
+ summarise(cut_price=mean(price)) #그룹별 평균 가격
# A tibble: 5 x 2
cut cut_price
1 Fair 3608
2 Good 3850.
3 Very Good 4586
4 Premium 6083.
5 Ideal 2929.
의외로 프리미엄보다 아이디얼의 가격이 낮습니다. 아마도 캐럿 등 다른 요인이 있을 것 같은데 같이 표시해보겠습니다. summarise는 줄을 바꿔서 계속해서 명령을 추가할 수 있습니다.
D1%>%
select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
group_by(cut)%>% #cut 그룹별 분류
summarise(cut_price=mean(price),
cut_carat=mean(carat)) #그룹별 평균 가격 및 캐럿
> D1%>%
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ group_by(cut)%>% #cut 그룹별 분류
+ summarise(cut_price=mean(price),
+ cut_carat=mean(carat)) #그룹별 평균 가격 및 캐럿
# A tibble: 5 x 3
cut cut_price cut_carat
1 Fair 3608 0.87
2 Good 3850. 0.767
3 Very Good 4586 0.895
4 Premium 6083. 1.19
5 Ideal 2929. 0.636
역시 그런 결과가 나왔습니다. Ideal이 캐럿이 작습니다. 이에 여기에 각 값별로 숫자가 얼마나 되는지 알아보겠습니다. N=n()을 이용하면 됩니다.
> D1%>%
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ group_by(cut)%>% #cut 그룹별 분류
+ summarise(cut_price=mean(price),
+ cut_carat=mean(carat),
+ N=n()) #그룹별 평균 비교
# A tibble: 5 x 4
cut cut_price cut_carat N
1 Fair 3608 0.87 2
2 Good 3850. 0.767 9
3 Very Good 4586 0.895 11
4 Premium 6083. 1.19 10
5 Ideal 2929. 0.636 18
이렇게 얻은 통계 데이터를 D3라는 새로운 데이터 프레임으로 만들어보겠습니다.
D3<-d1>%-d1>
select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
group_by(cut)%>% #cut 그룹별 분류
summarise(cut_price=mean(price),
cut_carat=mean(carat),
N=n()) #그룹별 평균 비교
D3
> D3<-d1>%-d1>
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ group_by(cut)%>% #cut 그룹별 분류
+ summarise(cut_price=mean(price),
+ cut_carat=mean(carat),
+ N=n()) #그룹별 평균 비교
>
> D3
# A tibble: 5 x 4
cut cut_price cut_carat N
1 Fair 3608 0.87 2
2 Good 3850. 0.767 9
3 Very Good 4586 0.895 11
4 Premium 6083. 1.19 10
5 Ideal 2929. 0.636 18
앞서 소개한 aggregate 역시 데이터 분석에서 유용하게 쓰일 수 있지만, 이렇게 데이터 프레임으로 저장하기는 어렵습니다. dplyr의 유용성이 여기서 드러납니다.
이제 마지막으로 diamonds 데이터 전체에 대해서도 비슷한 결과가 나오는지 알아보겠습니다. 표준편차까지 추가해서 알아보겠습니다.
diamonds%>%
select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
group_by(cut)%>% #cut 그룹별 분류
summarise(cut_price=mean(price),
cut_carat=mean(carat),
N=n()) #그룹별 평균 비교
> diamonds%>%
+ select(carat,cut,color,clarity,price)%>% # 캐럿, 컷, 칼러, 채도, 가격 추출
+ group_by(cut)%>% #cut 그룹별 분류
+ summarise(cut_price=mean(price),
+ cut_carat=mean(carat),
+ N=n()) #그룹별 평균 비교
# A tibble: 5 x 4
cut cut_price cut_carat N
1 Fair 4359. 1.05 1610
2 Good 3929. 0.849 4906
3 Very Good 3982. 0.806 12082
4 Premium 4584. 0.892 13791
5 Ideal 3458. 0.703 21551
전체 결과를 보니 표본이 전체 경향을 대표하기는 하지만 약간은 다르다는 점을 알 수 있습니다. 아무튼 각 그룹별 통계를 비롯한 여러 가지 데이터를 dplyr로 확인하고 저장할 수 있다는 점이 큰 매력이라고 할 수 있습니다. 다음에는 데이터 가공 및 정리에서 매우 중요한 데이터 합치기에 대해서 설명해 보겠습니다.
댓글
댓글 쓰기