4장. 고수들이 자주 쓰는 R 코드 소개
Ch1. dplyr 패키지 및 %>%의 쓰임 소개
R에는 매우 많은 명령어가 존재하며, 그 중 다수의 코드는 같은 기능을 하지만 명령어만 다를 뿐입니다. 작성자의취향에 따라 자유롭게 작성할 수 있는 자유가 있습니다. 하지만 이는 R을 처음 배우는 입장에서는 매우 어렵게 다가옵니다. 고수들이 자기 스타일대로 짜둔 코드들을 입문자들이 이해하기는 어려우며, 이는 곧 입문자들이 많은 시간을 투자하여도, 코드 공부가 제대로 되지 않는 문제가 생깁니다.
이번 챕터의 목적은 통계값을 뽑아낼 때 자주 쓰이는 명령어들을 정리하면서, 같은 기능을 하는 코드들도 다뤄보도록 하겠습니다. 아마, 여기까지 따라오셨다면 이제 R코드의 구조는 다 이해하실 거라고 생각합니다.
이번 챕터에서 주로 다룰 패키지는 다음과 같습니다.
library(dplyr)
library(reshape)
##
## Attaching package: 'reshape'
## The following objects are masked from 'package:plyr':
##
## rename, round_any
## The following object is masked from 'package:dplyr':
##
## rename
dplyr 및 reshape 패키지는 매우 자주 쓰이는 패키지 입니다. 주로 이 패키지들을 위주로 다뤄보도록 하겠습니다.
데이터 불러오기
데이터 다운로드 링크: [https://www.kaggle.com/liujiaqi/hr-comma-sepcsv
HR = read.csv("C:/R/HR_comma_sep.csv")
dplyr 소개
시작에 앞서…
- apply라는 함수는 많은 코드에서 볼 수 있는 함수입니다.
- apply(데이터, 1, function) 의 포맷으로 작성되는데 1일 경우는 row(행)별로, 2일 경우는 열 별로 함수가 적용되어 결과값이 나타나게 됩니다.
- apply(HR[,1:2],1,mean)코드는 간단하게 rowMeans의 간단한 함수로 대체될 수가 있습니다.
# apply
print("apply")
## [1] "apply"
head(apply(HR[,1:2],1,mean))
## [1] 0.455 0.830 0.495 0.795 0.445 0.455
# rowMeans
print("rowMeans")
## [1] "rowMeans"
head(rowMeans(HR[,1:2]))
## [1] 0.455 0.830 0.495 0.795 0.445 0.455
# 결과값이 같게 나오는 것을 확인 가능
- dplyr 패키지는 널리 쓰이는데, 그 이유는 다음과 같은 기능이 있기 때문입니다.
- %>% : 파이프라인이라고 합니다. 용도는 다음과 같습니다.
print("dplyr")
## [1] "dplyr"
HR[,1:2] %>%
rowMeans() %>%
head()
## [1] 0.455 0.830 0.495 0.795 0.445 0.455
해당 결과는 방금 위에서 실행한 head(rowMeans(HR[,1:2])) 와 똑같이 나오는 것을 볼 수 있습니다.
즉, function(DATA) 의 형식을 DATA %>% function() 의 형식으로 바꿔주는 것을 목표라고 할 수 있습니다.
행별로 계산하지 않고, 열별로 계산을 해보도록 하겠습니다.
- head(rowMeans(HR[,1:2]))의 명령어 실행 순서는 다음과 같습니다.
HR[,1:2] 계산
rowMeans(HR[,1:2]) 계산
head(rowMeans(HR[,1:2])) 계산
즉, 여러개의 function을 동시에 사용할 때, R코드는 가장 안쪽에서 부터 실행이 됩니다. 코드가 복잡해질 경우, 작성이 힘들어지는 불편함이 존재하기 때문입니다.
하지만 dplyr의 %>%를 사용하면, 코드가 실행되는 순서대로 함수들을 배치시킬 수가 있습니다. 그것이 dplyr의 최고 강점이라고 할 수 있습니다.
변수 별로 계산할 경우도 함께 해보겠습니다.
print("apply")
## [1] "apply"
apply(HR[,1:5],2,mean) # 열 단위
## satisfaction_level last_evaluation number_project
## 0.6128335 0.7161017 3.8030535
## average_montly_hours time_spend_company
## 201.0503367 3.4982332
print("colMeans")
## [1] "colMeans"
colMeans(HR[,1:5])
## satisfaction_level last_evaluation number_project
## 0.6128335 0.7161017 3.8030535
## average_montly_hours time_spend_company
## 201.0503367 3.4982332
print("dplyr")
## [1] "dplyr"
HR[,1:5] %>%
colMeans()
## satisfaction_level last_evaluation number_project
## 0.6128335 0.7161017 3.8030535
## average_montly_hours time_spend_company
## 201.0503367 3.4982332
이제 %>%의 목적이 어떤 것인지 아시겠나요?? dplyr의 %>%는 언뜻 보면 매우 어려워 보이지만, 생각보다 간단한 것을 알 수 있습니다. 그럼 계속 기존 R코드와 %>%를 사용했을 때의 차이점을 비교해보도록 하겠습니다.
- 데이터 집계 내기
# Summarise
summarise(HR, MEAN_SATISFACTION = mean(satisfaction_level),
MAX_SATISFACTION = max(satisfaction_level),
N = length(satisfaction_level))
## MEAN_SATISFACTION MAX_SATISFACTION N
## 1 0.6128335 1 14999
HR %>%
summarise(MEAN_SATISFACTION = mean(satisfaction_level),
MAX_SATISFACTION = max(satisfaction_level),
N = length(satisfaction_level))
## MEAN_SATISFACTION MAX_SATISFACTION N
## 1 0.6128335 1 14999
- subset 후 ddply를 적용했을때 %>% 활용법
library(plyr)
HR2_O = ddply(subset(HR,left == 1),c("sales"),summarise,
MEAN_SATISFACTION = mean(satisfaction_level),
MAX_SATISFACTION = max(satisfaction_level),
N = length(satisfaction_level))
head(HR2_O)
## sales MEAN_SATISFACTION MAX_SATISFACTION N
## 1 accounting 0.4025980 0.91 204
## 2 hr 0.4333953 0.91 215
## 3 IT 0.4118681 0.92 273
## 4 management 0.4228571 0.90 91
## 5 marketing 0.4531527 0.90 203
## 6 product_mng 0.4815657 0.91 198
HR2_D = HR %>%
subset(left == 1) %>%
group_by(sales) %>%
dplyr::summarise(MEAN_SATISFACTION = mean(satisfaction_level),
MAX_SATISFACTION = max(satisfaction_level),
N = length(satisfaction_level))
head(HR2_D)
## # A tibble: 6 x 4
## sales MEAN_SATISFACTION MAX_SATISFACTION N
## <fct> <dbl> <dbl> <int>
## 1 accounting 0.403 0.91 204
## 2 hr 0.433 0.91 215
## 3 IT 0.412 0.92 273
## 4 management 0.423 0.9 91
## 5 marketing 0.453 0.9 203
## 6 product_mng 0.482 0.91 198
- 새로운 변수를 추가하고 싶을 때는 mutate 사용
HR3_D = HR2_D %>%
mutate(percent = MEAN_SATISFACTION / MAX_SATISFACTION)
- ggplot2에 dplyr 적용
library(ggplot2)
HR2_D %>%
ggplot() +
geom_bar(aes(x=sales,y=MEAN_SATISFACTION,fill=sales), stat="identity") +
geom_text(aes(x=sales, y= MEAN_SATISFACTION+0.05,label=round(MEAN_SATISFACTION,2))) +
xlab("부서") + ylab("평균 만족도") +
theme(axis.text.x = element_text(angle = 45, size = 8.5,color = "black", face = "plain", vjust = 1, hjust = 1))
여기까지 따라오셨다면, 이제 연습량에 따라서 R코드를 나름 자유자재로 다룰 수 있을 것입니다. 다음 TEST는 최종 TEST입니다. 그 후에는 본격적인 Modeling을 시작하도록 하겠습니다.