📊 DATA ANALYSIS/스터디노트

[스터디노트] HR Analytics(이직예측)

bodeok 2024. 5. 23. 14:28

상황

최근 이직 시장이 활발하게 성장함에 따라 A사에 직원들도 줄줄이 퇴사 행렬을 이어가고 있다.  
핵심인재의 유출이 지속되고 있어 회사 입장에서는 큰 문제에 봉착했다.
HR팀은 이를 해결하기 위해 이직 가능성이 높은 핵심인재를 대상으로 관리 프로그램을 운영하려고 한다.

목적

이직 직원수 감소핵심인재 방어업무 로드 평준화

 

데이터 구조

Age Attrition BusinessTravel DailyRate Department DistanceFromHome
나이 이직여부 출장 일당 부서 집까지의거리
Education EducationField EmployeeCount EmployeeNumber EnvironmentSatisfaction Gender
교육수준 전공 직원수 직원번호 환경만족도 성별
HourlyRate JobInvolvement JobLevel JobRole JobSatisfaction MaritalStatus
시급 업무 몰입도 업무레벨 업무역할 업무만족도 결혼여부
MonthlyIncome MonthlyRate NumCompaniesWorked Over18 OverTime PercentSalaryHike
월소득 월급 과거회사경험횟수 18년이상 야근여부 급여인상률
PerformanceRating RelationshipSatisfaction StandardHours StockOptionLevel TotalWorkingYears TrainingTimesLastYear
고과 인간관계만족도 평균근무시간 스톡옵션레벨 경력 작년 훈련횟수
WorkLifeBalance YearsAtCompany YearsInCurrentRole YearsSinceLastPromotion YearsWithCurrManager
워라벨 수준 현 회사 근무년수 현재 업무 년차 마지막 승진일로부터 년차 현재 팀장함께한 년차

 

1,470행, 35열의 데이터 (매우 적네..)

 

분석과정 요약

1. EDA(이직 현황 탐색)
2. 가설 수립 및 검증
3. ML 활용 이직 직원 예측
    -모델 학습 및 평가
    -중요 변수 파악 및 1위 변수 탐색

 

1. EDA(이직 현황 탐색)

df.shape                       #행,열 수 확인
df.info()                        #data type 확인
df.isnull().sum()          #결측치 확인
df.describe()               #이상치 확인

 

  • Attrition 컬럼의 value_counts()를 활용해 이직률 파악 (약 16%)
  • Attrition 컬럼을 모델에서 해석할 수 있도록 1과 0으로 변환
df['Attrition'] = np.where(df['Attrition']== 'Yes', 1, 0)
  • 연령별, 성별, 부서별 이직률 현황 도출

 

 

2. 가설 수립 및 검증

가설1. 업무만족도는 높으나 인간 관계로 인한 이직률이 높을 것이다.
가설2. 근속년수 대비 같은 업무를 한 비중이 높다면 이직률이 높을 것이다.
가설3. 야근을 많이 해도 급여인상률이 높다면 이직률이 낮을 것이다.

 

 

가설1) 업무만족도는 높으나 인간관계로 인한 이직률이 높을 것이다.

 

#'JobSatisfaction', 'RelationshipSatisfaction', 'Attrition' 컬럼 활용
df_gp = df.groupby(['JobSatisfaction'])['Attrition'].agg(['count','sum'])
df_gp['ratio'] = round((df_gp['sum'] / df_gp['count']) * 100, 1

df_gp2 = df.groupby(['JobSatisfaction', 'RelationshipSatisfaction'])['Attrition'].agg(['count','sum'])
df_gp2['ratio'] = round((df_gp2['sum'] / df_gp2['count']) * 100, 1)

df_gp와 df_gp2 결과

 

  • 업무 만족도별 이직률 현황, 업무만족도가 낮을 수록 이직률이 높다.
  • 업무만족도가 높은 직원은 인관관계에 따라 이직률에 영향을 덜 받는것으로 보이고, 업무만족도가 낮은 직원은 인관관계가 나쁠수록 이직률이 증가하는 경향이 보인다.

 

가설2) 근속년수 대비 같은 업무를 한 비중이 높다면 이직률이 높을 것이다.

  • 근속년수 대비 현재업무년차 비중 산출 후 분포 확인
  • 결측에 대하여 0 대체
  • Role_Company 3개의 범주로 그룹화 이직률 산출
df['Role_Company'] = df['YearsInCurrentRole'] / df['YearsAtCompany']
df['Role_Company'].fillna(0, inplace =True)

Role_Company의 분포 및 구간별 이직률

 

  • 근속년수 대비 같은 일을 오래한 경우 이직률이 낮다.

 

가설3) 야근을 많이 해도 급여인상률이 높다면 이직률이 낮을 것이다.

 

  • 야근 여부에 따른 이직률 현황 파악
  • 야근안하는 직원 - 연봉상승률이 높더라도 이직을 안하는 경향을 찾아보기는 힘듬
  • 야근 Yes 직원 Data 분석
df_gp = df.groupby('OverTime')['Attrition'].agg(['count', 'sum'])
df_gp['ratio'] = round((df_gp['sum'] / df_gp['count']) * 100, 1)

df_gp_plot = df_gp.reset_index()
df_gp_plot = df_gp_plot[df_gp_plot['OverTime']=='Yes']

.야근yes 직원의 연봉인상률에 따른 이직률

 

  • 20%상승률 까지는 감소하는 듯하나 22%이상 상승하는 핵심인재의 경우 바로 이직한다.

 

 

3. ML 활용 이직 직원 예측

모델 학습 및 평가

  • 'Age_gp', 'Role_Company_gp', 'Role_Company' 컬럼 제외
  • 범주형변수 LabelEncoding
  • RandomForestClassifier로 분류 예측 후, classification_report패키지를 활용하여 검증 지표 확인
  • roc_auc_score산출 및 roc_curve 시각화
  • 이직 관리프로그램 운영 모수..?

중요변수 파악 및 1위 변수 탐색

  • Feature IMP 분석을 통한 중요변수 파악
  • 1위 변수 TotalWorkingYears_gp 구간화 후 이직률 산출 → 경력이 낮을 수록 이직률이 높다.

 

  • 경력이 낮을 수록 이직률이 높다.

 

결론

  • 이직 가능성이 높은 직원 예측 및 관리 프로그램 운영(매 월 이직 가망 가능성 타겟 고객군 추출 및 관리프로그램 운영)
  • 관리프로그램 운영 후 이직률 모니터링을 통한 성과 측정
  • 매 월 Model에 Input하기 위한 Data mart 생성

위 교육 자료는 zerobase로부터 제공받아 작성되었습니다.