기본 콘텐츠로 건너뛰기

6.1.1 고수들이 자수 쓰는 R 코드 소개 1편 (dplyr , %>%)

4장. 고수들이 자주 쓰는 R 코드 소개

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 패키지는 매우 자주 쓰이는 패키지 입니다. 주로 이 패키지들을 위주로 다뤄보도록 하겠습니다.

  1. 데이터 불러오기

    데이터 다운로드 링크: [https://www.kaggle.com/liujiaqi/hr-comma-sepcsv

HR = read.csv("C:/R/HR_comma_sep.csv")
  1. 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]))의 명령어 실행 순서는 다음과 같습니다.
  1. HR[,1:2] 계산

  2. rowMeans(HR[,1:2]) 계산

  3. 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을 시작하도록 하겠습니다.