Ch3. 인사관리 데이터를 통한 데이터 핸들링
데이터 핸들링은 분석에서 가장 중요한 부분을 차지하며, 실제 분석에 들이는 시간의 80 ~ 90%는 데이터 핸들링이 차지하는 경우가 많습니다. 먼저, 데이터 핸들링을 할 때 주의해야할 점에 대해 설명을 하도록 하겠습니다.
변수의 특성(척도)
- 분석하고자 하는 변수가 명목형, 순서형, 연속형인지는 아무리 강조해도 모자릅니다.
변수의 분포
- 분석하고자 하는 변수의 분포를 보고 데이터 핸들링 방향을 설정해야 합니다.
- 앞으로 다루게 될 분석에서 쓰이는 선형모형들은 확률변수의 분포를 가정하고 진행하는 경우가 대부분입니다. 만약 분석하고자 하는 확률변수의 분포가 가정되어있는 분포와 같지 않다면 변환을 통해 분포를 맞추어 줘야합니다.
- 분포를 꼼꼼히 파악해야 데이터에서 인사이트를 발굴해 낼 수 있습니다. 의미 없는 분포를 가진 변수는 과감하게 버리고, 의미있는 데이터를 찾는데에 집중할 수 있는 열쇠가 됩니다.
집계된 데이터의 생성, 지표 생성
- 기본적으로 주어진 데이터를 Raw 데이터라고 합니다. 하지만 대부분의 경우 RAW 데이터에서 바로 모델링을 진행하는 경우는 없습니다.
- 데이터를 조건에 따라 뽑아야 될 때도 있고, 연속형 변수를 이산형 변수로 묶어줘야 할 때도 존재합니다.
- 데이터를 분석에 맞게 변경시키는것, 새로운 데이터 셋을 만들어 내는 능력이 필요합니다.
데이터 다운로드 링크: https://www.kaggle.com/liujiaqi/hr-comma-sepcsv
# 코드 실행전에 처리되어 있어야 하는 데이터 전처리
DATA = read.csv('C:/R/HR_comma_sep.csv')
DATA$left = as.factor(DATA$left)
DATA$Work_accident = as.factor(DATA$Work_accident)
DATA$promotion_last_5years = as.factor(DATA$promotion_last_5years)
- 조건에 맞는 값 할당하기 ifelse
- 조건에 맞는 데이터 추출하기 subset
집계된 데이터 만들기
조건에 따라 새로운 집계된 데이터를 만드는 것은 분석할 때 매우 중요한 기법입니다. 엑셀을 사용하시는 분들이라면, 피벗테이블을 자주 만드실 겁니다. R에서는 비슷한 기능을 'plyr' 패키지를 통해 만들 수가 있습니다.
ifelse는 R에서 매우 쓰임이 많은 조건 함수입니다. R에서 사용하는 방법은 엑셀에서의 쓰임과 매우 비슷합니다.
DATA$satisfaction_level_group_1 = #DATA 셋에서 satisfaction_level_group_1 이름의 새로운 변수를 생성
ifelse(DATA$satisfaction_level > 0.5, 'High', 'Low') # satisfaction_level이 0.5보다 크다면 'High', 크지 않다면 'Low' 부여.
# satisfaction_level이 0.8보다 크다면 'High', 0.5 ~ 0.8이면 'Mid', 나머지는 'Low'
DATA$satisfaction_level_group_2 = ifelse(DATA$satisfaction_level > 0.8, 'High',
ifelse(DATA$satisfaction_level > 0.5,'Mid','Low'))
subset 함수는 조건에 맞는 데이터를 추출하는 명령어입니다.
DATA_High = subset(DATA,salary == 'high') # salary가 high인 직원들만 추출하여 DATA_High라는 새로운 데이터 셋을 생성
DATA_High_IT = subset(DATA,salary == 'high' & sales == 'IT') # salary가 high이면서, sales가 IT인 직원들만 추출하여 DATA_High_IT 생성 (교집합)
DATA_High_IT2 = subset(DATA,salary == 'high' | sales == 'IT') # salary가 high이거나, sales가 IT인 직원들을 추출하여 DATA_High_IT2 생성 (합집합)
# install.packages("plyr")
library(plyr)
SS=ddply(DATA, # SS라는 새로운 데이터 셋을 생성
c("sales","salary"),summarise, # sales, salary 별로 요약값들을 계산
M_SF=mean(satisfaction_level), # satisfaction_level의 평균 계산
COUNT=length(sales), # sales, salary 별로 직원 수 Counting
M_WH=round(mean(average_montly_hours),2)) # average_montly_hours 평균 계산
# round( , 2)는 소수점 2째자리까지 끊어서 표현하는 함수
특성에 따라 집계된 데이터로 히트맵을 그릴 수가 있습니다. 명령어는 다음과 같습니다.
# 히트맵 그리기
library(ggplot2)
SS$salary = factor(SS$salary, levels = c("low","medium","high"))
ggplot(SS) + # SS 데이터 지정
geom_tile(aes(x=sales,y=salary,fill=M_WH)) + #x축은 sales, y축은 salary, 색은 평균 근무시간으로 지정
scale_fill_gradientn(colours = c("white", "red"), values = c(0,0.8,1)) +
labs(fill = "평균 근무시간") + xlab("부서") + ylab("연봉 수준") +
theme(axis.text.x=element_text(color = "black", size=11, angle=30, vjust=.8, hjust=0.8))