재미난 공부들/People Analytics 공부 기록

퇴사 예측 Basic (LogisticRegression을 활용한 Attrition Prediction)

HR & 빅데이터 2022. 6. 6. 16:09

*edit: classification report 오류 수정 (06/09/22)

오늘은 퇴사 예측 모델을 만들어 볼 계획이다. EDA과정을 충분히 거치고 진행하면 더 좋겠지만 우선 아주 러프하게 모델만 돌려보도록 하자.

사용할 데이터는 IBM에서 배포한 Attirition 데이터, 캐글에서 가장 유명한 데이터다!
총 1470 (명) X 35 (개의 column)으로 되어있다.


 

데이터는 간단한 전처리 과정과 필요없는 컬럼을 제거하고 1470 X 31 개만 남겼다.
사용할 모델은 LogisticRegression 로지스틱회귀모델이다. 이름은 회귀이지만 사실 기능적으로 Classifier분류모델 이다. 범주형/연속형 X변수를 통해 Y이진분류를 할 수 있다.


첫번째, 기본(Baseline) 버전.

위는 해당 데이터프레임의 컬럼들을 리스트로 나타낸 것이다.
형광펜 친 Attrition(퇴사여부)를 Y로 두고 나머지는 모두 X로 넣어 모델을 만들었다.

  • No. observations전체 자료 수: 2,623
  • Df Residuals잔차 자유도: 2,606
  • Df Model모델자유도: 16
  • Pseudo R-squ. 설명력: 0.3427


로지스틱회귀분석은 선형회귀분석처럼 설명력이 대단히 의미있다고 보지 않는다. 오늘은 유의미한 변수를 찾아 베이스라인 성능을 높이는것이 소기의 목적이므로 모델 정확도 위주로 봐보도록 하겠다.



자, 여기서 더 발전을 해 나가야 하니 변수를 한번 추려보도록 하겠다.

유의수준을 0.05 정도로 잡고 연관성 있는 변수를 추려내보려고 한다.
=실제 연관이 없는데도 불구하고, 실수로 연관성 있다고 나올 리스크가 5% 이하(혹은 그 주변)인 변수 라고 생각하면 된다.

그 결과 Department, Education field, Education, Hourly Rate, Job level, Performancerate 등을 삭제할 수 있었고, 다음과 같이 두 번째 모델을 출력할 수 있었다. JobRole 과 Marital Status 에도 5%이하 범주가 보이나 이부분은 나중에 처리하고 일단 앞에 언급한 컬럼들만 삭제해보도록 하겠다.


두 번째, 변수 일부 삭제 버전

Classification report 출력

제거 결과, 큰 차이가 없다. 퇴사한 경우에서의 f1-score가 조금 높아지기는 했다.

세 번째, 파생변수 생성 후 적용하기

이번에는 데이터를 건드려보도록 하겠다.
JobRole과 MatritalStatus에서 눈에 띄는 범주들이 있다.

1. JobRole
: 1) 인사담당자 2) 실험실 테크니션 3) 세일즈 Executive & 4) 세일즈 Representative 총 네 개의 롤들에서 '퇴사'와 유의미한 관련성이 보인다. 따라서 해당 롤들을 '퇴사하기 쉬운 롤' 이라고 가정한다. JobRole_label이라는 새로운 변수를 만들어 해당 4개의 롤이라면 '1'을, 아니라면 '0'을 부여한다.

1470명중 '퇴사하기 쉬운 롤'인 사람은 720명이다

 


자, 그리고 잠시 궁금증을 해결해보도록 하겠다. Sales Representative 와 Sales Executive의 차이이다. Sales가 들어간 두개의 직무가 둘다 퇴사와 관련성이 높다니 궁금하지 않은가? 롤의 차이인지 레벨의 차이인지 (Executive가 때에 따라서 더 윗단계일 수 있을 것 같아서) 모르겠어서 일단 간단히 봐보도록 한다.

Executive가 4배가량 많다. 더 높은 레벨인데 더 많다고?

 

또한 그들이 더 많은 월급(으로 통칭하자)을 받는다.



해당 집단의 Role의 체계가 어떤지는 모르겠으나 Executive가 Representative보다 수도 많고, 돈도 더 많이 받는다. Representative를 짧게 끝내고 Executive로 넘어가는 시스템인가? 잘 모르겠다^^;


또한, Sales Representative의 p-value가 0.0이었다.. odds ratio를 뽑아서 보면 좋겠지만 이 포스팅에서는 간단히 시각화만 해보도록 하겠다. 한눈에 봐도 Sales Representative의 Attirition수가 non-attrition수에 거의 가깝게 가 있는 것을 확인할 수 있겠다.

Role별 전체 머릿수 대비 퇴사자 수. 주황색이 퇴사자



자.. 간단한 궁금증을 해결했으니, 다시 본론으로 돌아가서 Marital Status도 라벨링 해보겠다.

2. MatritalStatus

: Single에서 '퇴사'와 유의미한 관련성이 보인다. 따라서 싱글 = 퇴사가 쉬운 상태라고 가정하고 Single_label 변수를 새로 만들어 싱글이라면 1을, 아니면 0을 부여한다.

1470명 중 퇴사하기 쉬운 싱글상태 직원은 470명이다.


자, 이렇게 변수를 조정한 뒤 다시 모델을 돌려보도록 하겠다.
그 결과는 아래와 같았다.


다시한번 Baseline과 최종 모델 성능을 비교해보자.

Baseline

 

최종 모델

 

  • 88퍼센트의 모델 정확도 (모델이 퇴사할 사람, 퇴사안할사람을 알맞게 맞출 확률)
  • 데이터 불균형으로 인해 퇴사자에 대한 특성 학습 부족
  • 퇴사한 사람 100명을 놓고 이 기계에게 퇴사여부를 물어보면 100명중 44명에게 퇴사자라는 답을 내림
  • 반면 퇴사하지 않은 사람 100명을 놓고 물어보면 97명에게 퇴사하지 않았다는 답을 내림
  • 기계가 "이사람 퇴사 안한 사람이에요" 라고 100번 말했다면 이중 89번은 정답
  • 기계가 "이사람 퇴사 한 사람이에요"라고 100번 말했다면 이중 74번은 정답

 

 

 

*아래는 본 내용 + 심화 (정확도 올리기) 를 다루는 유튜브 동영상입니다.

궁금하신 분들은 전체 과정을 확인해 보세요~! 

심화) 정확도 올리기

 

기본) 이진분류모델 만들기