Kaggle IBM HR Data를 활용하여
들어가며
이번 ‘HR analytics 끄적끄적’에서는 Chat GPT와 R을 활용하여 IBM HR Analytics Employee Attrition & Performance Data를 분석해 보고자 합니다. 이를 통해 직원 이직에 영향을 미치는 요인들을 찾아보고, 이를 기반으로 조직의 인사관리에 도움이 될 수 있는 정보를 살펴보고자 합니다. 로지스틱 회귀분석, 변수 중요도 및 ROC 커브와 AUC 값을 활용하여 이직 여부를 예측하는 모델을 구축하였으며, 이를 통해 조직이 이직률을 낮추고 생산성 향상할 수 있는 방안에 대해서 생각해 보았습니다.
Chat GPT가 나오기 전에는 기초적인 통계나 데이터 분석에 대한 지식을 가지고 있더라도 R 코딩을 따로 배우지 않으면 R을 활용한 데이터분석을 실시하기가 어려웠습니다. 그러나 Chat GPT가 등장함에 따라 GPT에게 R 코드 작성을 도움을 받아 훨씬 수월하게 데이터분석을 시행할 수 있게 되었습니다.
사실 이번 ‘HR Analytics 끄적끄적’은 통계와 R 코딩에 대한 기초적인 지식이 따로 없으신 분들께는 내용이 많이 어려울 수 있습니다. 따라서 ‘HR Analytics 끄적끄적’에서 R를 활용한 HR 데이터 분석을 다뤄야 할까 지속적으로 고민해 왔습니다. 하지만 파이썬 또는 R를 활용한 데이터 분석은 ‘HR Analytics’에서 가장 중요한 부분이기에 고민 끝에 이 부분도 지속적으로 다루기로 하였습니다.
‘HR Analytics 끄적끄적’ 이번 챕터의 목표는 Chat GPT가 등장함에 따라 파이썬 또는 R를 활용한 데이터 분석의 진입장벽이 많이 낮아졌다는 것을 보여드리는 것에 있습니다. 이번 챕터를 보시면서 R를 활용해 보신적은 없지만 R 데이터 분석에 관심이 있는 분들께서는 아래 ‘혼자 공부하는 R 데이터 분석’ 동영상 강의를 추천드립니다. R 프로그램 활용에 아직 미숙한 분들이 보기에 매우 좋은 강의입니다. 저도 아래 유튜브 동영상을 보면서 R 사용법을 습득하는데 크게 도움을 받았습니다.
1. Kaggle 플랫폼
Kaggle은 데이터 과학자들이 경쟁하고 협력하여 데이터를 분석하고 모델을 개발할 수 있는 온라인 플랫폼입니다. 여기서 직원 이직 데이터는 기업의 인적 자원 관리에 큰 영향을 미치는 중요한 요소로 각종 기업의 인사 담당자들이 관심을 가지고 있는 주제입니다. 이 데이터셋은 직원들의 이직률을 분석하고 이직을 예측하는 데 사용됩니다.
2. IBM HR Analytics Employee Attrition & Performance Data
1) IBM HR Analytics Employee Attrition & Performance Data란?
IBM의 HR부서에서 직원의 이직률 및 성과를 분석하기 위해 사용되는 데이터셋입니다. 다음 홈페이지에 접속하여 IBM HR Analytics Employee Attrition & Performance Data를 다운로드하고 C드라이브 Rdata 폴더에 해당 파일을 넣습니다. 그리고 R studio에서 해당 폴더를 기본폴더로 지정해 줍니다. 기본폴더 지정법은 아래와 같습니다.
setwd("c:/Rdata")
2) IBM HR Analytics Employee Attrition & Performance Data의 구성
IBM HR Analytics Employee Attrition & Performance Data는 Age, Attrition, BusinessTravel 등 총 35개 변수를 포함하고 있어, 이를 통해 직원들의 이직 여부, 직무 만족도, 근속 연수 등과 같은 다양한 측면을 분석할 수 있습니다. 35개 변수의 세부적인 내용은 아래 표와 같습니다.
Age: 직원의 나이 Attrition: 직원의 이직 여부 (Yes or No) BusinessTravel: 직원의 출장 빈도 (Non-Travel, Travel_Rarely, Travel_Frequently) DailyRate: 직원의 일일 급여 Department: 직원이 속한 부서 (Research & Development, Sales, Human Resources) DistanceFromHome: 직원의 집으로부터 회사까지의 거리 Education: 직원의 학력 수준 (1: Below College, 2: College, 3: Bachelor, 4: Master, 5: Doctor) EducationField: 직원의 전공 분야 EmployeeCount: 직원 수 (모든 값이 1로 동일) EmployeeNumber: 직원의 고유 번호 EnvironmentSatisfaction: 직원의 업무 환경 만족도 (1: Low, 2: Medium, 3: High, 4: Very High) Gender: 직원의 성별 (Male, Female) HourlyRate: 직원의 시간당 급여 JobInvolvement: 직원의 직무 참여도 (1: Low, 2: Medium, 3: High, 4: Very High) JobLevel: 직원의 직급 JobRole: 직원의 직무 JobSatisfaction: 직원의 직무 만족도 (1: Low, 2: Medium, 3: High, 4: Very High) MaritalStatus: 직원의 결혼 여부 (Single, Married, Divorced) MonthlyIncome: 직원의 월급 MonthlyRate: 직원의 월별 급여 총액 NumCompaniesWorked: 직원이 근무한 회사 수 Over18: 직원이 18세 이상인지 여부 (모든 값이 Y로 동일) OverTime: 직원의 초과 근무 여부 (Yes, No) PercentSalaryHike: 직원의 급여 인상 비율 PerformanceRating: 직원의 성과 평가 등급 (1: Low, 2: Good, 3: Excellent, 4: Outstanding) RelationshipSatisfaction: 직원의 동료와의 관계 만족도 (1: Low, 2: Medium, 3: High, 4: Very High) StandardHours: 직원의 표준 근무 시간 (모든 값이 80으로 동일) StockOptionLevel: 직원의 주식 옵션 수준 (0, 1, 2, 3) TotalWorkingYears: 직원의 총 근무 연수 TrainingTimesLastYear: 지난해 직원이 받은 교육 횟수 WorkLifeBalance: 직원의 일-생활 균형 만족도 (1: Bad, 2: Good, 3: Better, 4: Best) YearsAtCompany: 직원이 현재 회사에서 근무한 기간 YearsInCurrentRole: 직원이 현재 역할에서 근무한 기간 YearsSinceLastPromotion: 직원의 마지막 승진 이후 경과된 기간 YearsWithCurrManager: 직원이 현재 관리자와 함께 일한 기간 |
3. Chat GPT과 R을 사용한 IBM 직원 이직 영향 요인 분석
1) Logistic Regression 분석
로지스틱 회귀 분석은 종속변수가 이진(binary) 형태일 때 예측 모델링을 할 수 있는 분석 방법 중 하나입니다. 본 분석도 종속변수(Attrition: 직원의 이직 여부 (Yes or No))가 이진형태이므로 로지스틱 회귀분석을 사용하도록 하겠습니다.
로지스틱 회귀 분석을 통해 이직 여부와 각 독립 변수 간의 관계를 파악하고, 이를 바탕으로 이직 여부를 예측하는 모델을 만들 수 있습니다. 이를 통해 기업에서 이직률이 높은 원인을 파악하고, 이를 개선하여 인력의 유지 및 생산성 향상을 도모할 수 있습니다. 로지스틱 회귀 분석은 독립 변수와 종속 변수 간의 로그 오즈비(log-odds ratio)를 모델링하여 예측 모델을 만듭니다. 이를 통해 각 독립 변수의 영향력을 파악하고, 이를 시각화하여 보여줄 수 있습니다. 또한 ROC 커브와 AUC 값을 통해 예측 모델의 성능을 평가할 수 있습니다.
위 질문을 통해 R 분석 코드 받고 난 후 R를 실행하면서 에러가 나는 경우 에러 메세지를 다시 Chat GPT에 피드백을 전달하며 R 코드를 작성하였습니다. 지속적인 대화를 통해 최종 아래와 같은 코드 내역을 Chat GPT로부터 받았으며 네모 상자에 있는 R 코드 자료는 모두 Chat GPT가 작성해 준 코드입니다.
Kaggle에 있는 Data의 경우 유명한 Data이기 때문에 별도의 변수 설명 없이도 Data 명을 알려주면 Chat GPT가 바로 R 코딩을 진행해 줍니다. 하지만 별도의 Data를 사용하여 분석을 시행하는 경우에는 데이터를 긁어서 Chat GPT에게 데이터 특성을 알려주는 작업을 추가로 진행하여야 합니다.
# 데이터 불러오기 attrition_data <- read.csv(“WA_Fn-UseC_-HR-Employee-Attrition.csv”) |
위 데이터 불러오기에서 “WA_Fn-UseC_-HR-Employee-Attrition.csv”는 기본폴더에 저장한 Kaggle에서 다운로드한 파일명을 의미합니다. 기본폴더를 확인하여 파일명이 맞는지 확인해야 합니다.
# 필요한 패키지 설치하기 불러오기 # 필요한 패키지 불러오기 |
- dplyr : 데이터를 필터링, 정렬, 그룹화, 요약 및 변형하는 등의 주요 기능을 제공하는 패키지입니다. dplyr이 제공하는 기능들은 일반적으로 데이터 분석에서 자주 사용되는 작업들이므로, 이를 사용하면 데이터 처리 과정이 훨씬 편리해집니다.
- pROC : R 프로그래밍 언어에서 ROC 곡선(Receiver Operating Characteristic curve)과 AUC(Area Under the Curve) 값을 계산하기 위한 패키지입니다.
- magrittr : R에서 함수형 프로그래밍(functional programming)을 쉽게 할 수 있도록 도와주는 패키지입니다. 이 패키지는 %>% 연산자를 포함하여 여러 유용한 함수형 연산자를 제공합니다. %>% 연산자는 기본적으로 함수를 순차적으로 연결해 주는 파이프(pipe) 개념을 적용하여, 코드의 가독성을 높이고 작성할 수 있는 함수형 프로그래밍의 편의성을 증대시켜 줍니다.
위 왼쪽 화면이 Chat GPT 코드 생성화면, 오른쪽 화면은 R Studio 화면입니다. Chat GPT 대화창에서 Copycode를 클릭한 후 R Studio 왼쪽 위 창인 Script에 붙여 넣기를 하면 코드가 복사가 됩니다. Script 창에 코드가 입력되었다고 해서 바로 실행이 되지 않습니다. 시행하려는 부분을 드래그한 후 오른쪽 위 Run 아이콘을 클릭하거나 ctrl + enter를 누르면 해당 내용이 왼쪽아래 Console 창에 표시되고 시행이 되게 됩니다.
# 분석에 필요한 변수만 선택 selected_data <- attrition_data %>% select(Attrition, Age, BusinessTravel, Department, EducationField, Gender, JobLevel, JobRole, MaritalStatus, MonthlyIncome, OverTime, TotalWorkingYears, YearsAtCompany) |
전체 35개 변수에서 왜 13개 변수를 선택했는지에 대해서 Chat GPT에게 질문하였습니다. Chat GPT는 분석의 효율성과 설명을 높이기 위해서 35개 변수중 13개 변수를 선택했다고 답변을 줍니다.
# 데이터 전처리 selected_data$Attrition <- ifelse(selected_data$Attrition == “Yes”, 1, 0) selected_data$OverTime <- ifelse(selected_data$OverTime == “Yes”, 1, 0) selected_data$BusinessTravel <- as.factor(selected_data$BusinessTravel) selected_data$Department <- as.factor(selected_data$Department) selected_data$EducationField <- as.factor(selected_data$EducationField) selected_data$Gender <- as.factor(selected_data$Gender) selected_data$JobRole <- as.factor(selected_data$JobRole) selected_data$MaritalStatus <- as.factor(selected_data$MaritalStatus) |
위 코드는 데이터 전처리를 하는 코드입니다. 이 데이터는 분석에 앞서 사용자들이 이해하기 쉬운 형태로 가공되어야 합니다. 이 코드에서는 Attrition 변수를 이진 변수(0 또는 1)로 변환하고, OverTime 변수도 이진 변수로 변환하였습니다. 또한 BusinessTravel, Department, EducationField, Gender, JobRole, MaritalStatus 변수들도 각각의 카테고리 값을 가지므로, factor 형태로 변환하여 나중에 분석에서 사용하기 쉽도록 하였습니다. 따라서 이전에는 문자열로 이루어져 있던 변수들이 이제는 범주형 변수로 변환되었습니다.
# 데이터 분할 set.seed(123) train_index <- sample(1:nrow(selected_data), size = 0.7 * nrow(selected_data)) train_data <- selected_data[train_index, ] test_data <- selected_data[-train_index, ] |
아래 내용은 위 질문에 대해서 Chat GPT가 정리한 내용입니다.
랜덤 시드 설정
- set.seed(123) : 이 부분은 랜덤 시드를 설정하는 코드입니다. 시드를 설정하면 실험 결과의 재현성을 보장할 수 있습니다. 즉, 같은 시드 값을 사용하면 같은 결과를 얻을 수 있습니다.
데이터 분할
- train_index <- sample(1:nrow(selected_data), size = 0.7 * nrow(selected_data)) : 이 코드는 전체 데이터에서 무작위로 70%의 인덱스를 선택합니다. 이 인덱스는 훈련 데이터를 나누는 데 사용됩니다.
- train_data <- selected_data[train_index, ] : 이 코드는 앞에서 선택한 인덱스를 사용하여 훈련 데이터를 만듭니다.
- test_data <- selected_data[-train_index, ] : 이 코드는 훈련 데이터에 포함되지 않은 나머지 데이터를 테스트 데이터로 지정합니다.
# 로지스틱 회귀분석 모델 구축 log_model <- glm(Attrition ~ ., data = train_data, family = “binomial”) summary(log_model) |
로지스틱 회귀분석 모델 시행
- log_model <- glm(Attrition ~ ., data = train_data, family = “binomial”) : 이 코드는 로지스틱 회귀분석 모델을 구축합니다. Attrition을 종속 변수로 하고, .은 독립 변수로 모든 다른 변수를 사용함을 의미합니다. family = “binomial”은 로지스틱 회귀를 수행함을 나타냅니다.
- summary(log_model) : 이 코드는 구축된 로지스틱 회귀분석 모델의 요약 정보를 출력합니다. 이 정보에는 각 변수의 추정된 계수, 표준 오차, z 값, p 값 등이 포함됩니다. 이를 통해 각 변수가 종속 변수에 어떤 영향을 미치는지, 그리고 통계적으로 유의한 지 여부를 판단할 수 있습니다.
상단 표에 나타난 값들은 다음과 같은 의미를 가지고 있습니다.
- 추정치(Estimate) : 각 변수의 추정된 계수입니다. 이 값은 각 변수의 종속 변수에 대한 영향력을 나타냅니다.
- 표준 오차(Std. Error) : 추정치의 표준 오차입니다. 이 값은 추정치의 불확실성을 나타냅니다.
- z 값(z value) : 추정치를 표준 오차로 나눈 값입니다. 이 값은 각 변수가 회귀 모델에서 얼마나 중요한지를 나타내는 지표입니다.
- Pr(>|z|) : z 값에 대한 p 값입니다. 이 값이 작을수록 해당 변수가 통계적으로 유의미한 영향을 미칩니다. 일반적으로 0.05 미만인 경우 유의하다고 판단합니다.
표에서 별표(*)가 붙은 변수들은 유의수준 0.05 이하로 통계적으로 유의미한 영향을 미친다고 볼 수 있습니다. 아래 변수는 직원 이직과 관련이 있는 것으로 판단됩니다.
- 나이 (Age) : 나이가 많을수록 이직률이 낮아집니다. 즉, 연령이 높은 직원들은 이직 가능성이 낮아집니다.
- 자주 출장 가는 경우 (BusinessTravelTravel_Frequently) : 자주 출장을 가는 직원들은 이직률이 높아집니다. 따라서 출장 빈도가 높은 직원들은 이직 가능성이 더 높습니다.
- 생명과학 전공 (EducationFieldLife Sciences) : 생명과학 전공 직원들은 이직률이 낮습니다. 이는 생명 과학을 전공한 직원들의 이직 가능성이 낮다는 것을 의미합니다.
- 의료분야 전공 (EducationFieldMedical) : 의료전공 직원들도 이직률이 낮습니다. 이는 의료전공 직원들의 이직 가능성이 낮다는 것을 의미합니다.
- 기타전공 (EducationFieldOther) : 기타전공 직원들은 이직률이 낮습니다. 이는 기타전공 직원들의 이직 가능성이 낮다는 것을 의미합니다.
- 연구실 기술자 (JobRoleLaboratory Technician) : 연구실 기술자 직책의 직원들은 이직률이 높아집니다. 이는 연구실 기술자들이 이직 가능성이 높다는 것을 의미합니다.
- 싱글 (MaritalStatusSingle) : 싱글인 직원들은 이직률이 높아집니다. 즉, 미혼 직원들은 이직 가능성이 높아집니다.
- 초과 근무 (OverTime) : 초과 근무를 하는 직원들은 이직률이 높아집니다. 따라서 초과 근무를 하는 직원들은 이직 가능성이 높아집니다.
이러한 분석 결과를 바탕으로, 회사는 이직률을 낮추기 위해 나이가 많은 직원들의 업무를 지원하거나, 출장 빈도를 줄이고, 직책별 업무 부담을 줄이고, 미혼 직원들의 복지를 개선하며, 초과 근무를 최소화하는 방안 등을 고려할 수 있습니다.
2) ROC curve 도출 및 시각화
로지스틱 회귀 모델의 성능을 평가하기 위한 방법 중 하나가 ROC(Receiver Operating Characteristic) 곡선입니다. ROC 커브는 이진 분류 모델의 예측 성능을 시각화한 그래프로, 분류 모델이 예측한 확률값의 임계값을 변화시키면서 FPR(False Positive Rate)과 TPR(True Positive Rate)을 계산하여 그려집니다.
FPR은 실제 음성 중 모델이 잘못 예측한 비율이고, TPR은 실제 양성 중 모델이 정확하게 예측한 비율입니다. ROC 커브의 면적인 AUC(Area Under the Curve)는 0.5부터 1까지의 값을 가지며, 1에 가까울수록 성능이 우수한 모델이라고 판단됩니다.
# ROC 커브 구하기 roc_data <- roc(test_data$Attrition, predict(log_model, newdata = test_data, type = “response”)) |
R이 작성해 준 코드에 대해서 자세한 내용을 알고 싶을 때는 해당 코드를 다시 Chat GPT에게 물어보면 해당 코드에 대해서 자세하게 알려줍니다.
# ROC 커브 시각화 plot(roc_data, main = “ROC Curve for Employee Attrition”, col = “#0072B2”) lines(x = c(0,1), y = c(0,1), col = “gray”, lty = “dashed”) legend(“bottomright”, legend = paste(“AUC =”, round(auc(roc_data),2)), col = “black”, bty = “n”) |
로지스틱 회귀분석을 통한 ROC 커브 구하는 과정은, 데이터를 트레이닝 셋과 테스트 셋으로 나눈 후, 트레이닝 셋을 이용해 로지스틱 회귀 모델을 학습시키고 유의미한 요인을 도출합니다.
학습된 모델을 이용해 테스트 셋의 결과를 예측하고, 각 관측치에 대한 예측 확률을 얻어 ROC 커브를 구합니다. ROC 커브는 해당 분석 틀이 얼마나 종속변수를 잘 예측하는지를 나타내는 그래프입니다.
AUC는 ROC 곡선 아래 면적(Area Under the Curve)을 나타내는 지표입니다. ROC 곡선은 분류 모델의 예측력을 판단하는 지표 중 하나로, TPR(True Positive Rate)과 FPR(False Positive Rate)의 변화에 따른 모델의 성능을 나타내는 곡선입니다. AUC 값은 0과 1 사이의 값을 가지며, 1에 가까울수록 모델의 예측력이 높다는 것을 의미합니다. 일반적으로 0.5 이상이면 성능이 괜찮은 것으로 판단됩니다.
위 그림에서 살펴볼 수 있듯이 구성원 퇴직예측 분석은 AUC 값이 0.75이므로 모델의 예측력이 높은 편에 속하며, 어느 정도 좋은 성능을 보이고 있다고 할 수 있습니다.
나가며
이번 분석을 통해 Chat GPT와 R을 활용한 IBM 직원 이직 영향 요인 분석 방법과 결과를 살펴보았습니다. Chat GPT의 R 코드와 설명 덕분에, 기존 방식보다 효율적이고 정확한 분석을 진행할 수 있었고, 이를 통해 조직 인사관리에 도움이 되는 유용한 정보를 얻을 수 있었습니다. 앞으로도 Chat GPT와 R을 활용한 데이터 분석과 예측 모델링을 통해 조직의 인사관리에 도움이 될 수 있도록 다루어 볼 예정입니다.
이번 ‘HR Analytics 끄적끄적’ 챕터를 통해 Chat GPT가 R을 활용한 데이터 분석의 진입장벽을 크게 낮추어 주었다는 것을 확인할 수 있었습니다. 기초적인 R 활용 강의를 듣고 나서 Chat GPT와 함께 데이터를 분석하면, R 데이터 분석을 쉽게 활용할 수 있을 것으로 예상됩니다. 일반적으로 HR Analyst는 Data Scientist가 HR 도메인으로 전환하는 경우보다, 이미 HR 도메인 지식을 갖춘 인원이 데이터 분석 기법을 습득하여 현업에 활용하는 것이 더 흔한 경우입니다.
Chat GPT는 HR 업무에 종사하는 인사담당자들이 보다 쉽게 데이터 분석으로 진입할 수 있게 도와주며, 진입장벽을 낮춰주고 있습니다. 저 역시 R 활용에 능숙하지 않지만, Chat GPT의 도움을 받아 R을 할용한 HR Analytics를 수행할 수 있었습니다. 앞으로도 다양한 기법을 Chat GPT의 도움을 받아 수행할 예정이며 이 과정을 지속적으로 공유할 예정입니다. 이를 통해 많은 인사담당자들이 좀 더 쉽게 데이터 분석을 실시하고 데이터 기반 의사결정을 실현하여 효과적인 인사관리에 조금이나 도움이 될 수 있길 기대합니다.
Reference
- [‘혼공알이’ 콘텐츠]
- [Kaggle 사이트]
- [kaggle IBM HR Analytics Employee Attrition & Performance Data 사이트]
- [파이프 마임 Tstory] 머신런닝 혼동행렬(Confusion Matrix)
- [공돌이의 수학정리노트 (Angelo’s Math Notes)] ROC curve
김창일 님이 브런치에 게재한 글을 편집한 뒤 모비인사이드에서 한 번 더 소개합니다.