People-Analytics201

직무기술서 유사도분석을 통한 내부 인재 추천 본문

People Insight

직무기술서 유사도분석을 통한 내부 인재 추천

2023. 4. 10. 00:26

본 포스팅은 PA201 구성원 "조희진"님에 의해 작성된 글입니다.


개요

모집/선발 단계에서 활용 가능한 비정형 데이터(텍스트 데이터 등)를 살펴보고, 최근 많은 회사들이 어려운 시장 상황을 극복하기 위해 비용 절감 방안을 강구하고 있다는 점에서 효율적인 채용 방법이 무엇이 있을까 생각해보았습니다.

지원자에 대한 풍부한 정보, 최종 선발 후 조직 적응도 측면에서 안정적인 결과를 기대할 수 있는 사내공모 제도에서 텍스트 데이터를 활용하는 방안으로 ‘Sentence-BERT로 직무기술서 간 유사도 분석을 통한 사내공모’ 방안에 대해 이야기 해보려고 합니다.


1. ‘채용(모집/선발)’ 단계의 비정형 데이터

모집/선발 단계를 아울러 채용 단계에 속한다고 생각했을 때, 어떤 비정형 데이터(텍스트, 음성, 이미지 등)를 활용할 수 있을까요..?

우리 회사의 평판, 이미지를 분석할 때 사용할 수 있는 잡플래닛, 온라인 기사&댓글에서 부터 정식 채용의 마지막 관문인 수습 평가 데이터까지 여러 비정형 데이터를 수집할 수 있을 것 같습니다.

(인적성 단계에서 생성되는 비정형 데이터는 떠오르지 않습니다.. 혹시 아이디어가 있으신 분은 자유롭게 의견 부탁 드립니다! 🙂 )

구분 세부활동 비정형 데이터
모집 기업 홍보
채용 홍보
a) 기업 평판 사이트(잡플래닛,블라인드)
b) 기업 뉴스 & 기사
    - 댓글
c) 직무기술서 (모집공고)
    -  자사 vs. 타사
    -  회사 vs. 지원자
선발 서류심사 a) 인적정보
b) 경력사항
c) 자기소개서
d) 사진
인적성 인적성 시험  
면접 인성면접
직무면접
a) 면접질문
b) 면접관 주관식 코멘트
c) 지원자 답변내용(음성, 텍스트)
d) 면접 영상 (AI 면접)
면접 경험 설문 a) 서베이 주관식
수습 수습평가 a) 업무 일지
b) 평가자의 피드백

저희 회사는 B2B 사업을 주로 하다 보니, 채용 시장에서 기업 인지도가 높지 않은 편이라.. ‘모집’에 대한 고민을 많이 하는 편입니다.

그런데 최근 비상경영 체제를 선포하면서 일부 포지션 외에는 외부 충원을 중단하였습니다.
인력이 필요한 팀들은 있는데.. 외부 충원을 줄이다 보니 자연스럽게 내부 모집을 고려하게 되었습니다.

여기서 잠깐!

모두들 내부 모집/외부 모집의 특징들을 아시겠지만, 살짝 살펴보고 가시죠.


2. 모집 방법(내부 모집 / 외부 모집)

 1) 내부 모집

의의   조직 내부의 인력을 대상으로 하는 모집
  Ex. 사내공모제도(Job Posting), 기능목록(Skill inventory)활용, 승계 계획(Succession Planning)
장점   - 인력의 정확한 평가 가능
  - 시간/비용이 적게 소모됨
  - 승진 기회의 확대
  - 종업원 사기 진작, 만족도 증가, 자기개발 유도
  - 외부 모집의 리스크 회피
단점   - 제한된 인재 선택의 폭
  - 조직의 폐쇄성 증가
  - 인력 수요의 양적 충족이 안됨
  - 내부 교육 훈련 비용 증가
  - 인기 있는 자리에 대한 과다한 경쟁 발생
  - 탈락자들의 불만

 2) 외부 모집

의의   조직 외부에서 지원자를 모집하는 것
  Ex. 구인 광고, 온라인 모집, 직업 소개소, 대학교 추천, 사내 추천 등
장점   - 넓은 인재 선택의 폭
  - 새로운 인물을 통한 분위기 쇄신
  - 인력 수요의 양적 충족 가능
  - 새로운 지식과 경험의 유입
  - 이미 자격을 갖추고 있는 인재를 모집하여 교육 비용과 시간 절감
단점   - 시간과 비용 소모
  - 내부 인력의 승진 기회 박탈, 사기 저하
  - 조직문화 부적응으로 인한 이탈 가능성
  - 외부 인력 유입에 따른 리스크 발생 가능성

 


3. 내부 모집 : 인재 추천

최근 회사 비상경영으로 외부 채용으로 인한 비용을 줄이고자,
조직 적응도가 높은 내부 인재를 적재적소에 배치하는 방안을 우선적으로 검토하려는 니즈가 높아졌습니다.

하지만, 인사팀에서 사내 공모 공고를 올려도 지원자가 별로 없습니다.. 왜 일까요..?


1) 사내 공모 (직원 주도적)

  1. 모집 직무에 관심도가 높은 직원이 신청
  2. 현 팀장과의 관계(눈치)로 신청하지 못하는 구성원도 있음

2) 인재 추천 (회사 주도적)

  1. 회사가 직접 해당 직무에 적합한 인재를 찾음으로써, 여러가지 사정으로 사내공모에 신청하지 못하는 구성원들도 사내 공모에 참여할 수 있도록 유도 가능

여기서 ‘선택을 직원에 맡기는 기존의 사내 공모 방식에 더하여,
회사가 직업 적합한 인재를 찾아보고 제안하는 과정도 함께 이루어지면 어떨까?’ 라는 생각을 해보게 되었습니다.


4. 직무기술서 유사도분석을 통한 내부 인재 물색

회사 직원들의 직무기술서를 검토하면 인사 담당자가 경험을 바탕으로 유사 직무를 파악하는 것보다
더욱 폭넓게 인재를 검토할 수 있을 것입니다.
(이 글을 쓰면서 서칭 하다보니, 최근 국내 전력 분야 공기업에서 발표한 사례가 있었습니다. )

1) 유사도 분석 방향

직무 경험 데이터 vs. 모집 대상 직무기술서 간 유사도 분석

2) 직무 경험 데이터

  1. 이력서 경력기술서
  2. 과거 직무기술서
  3. 현재 직무기술서

3) 분석 방법론

  1. 자연어 임베딩 방법
    • 임베딩이란 위와 같이 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 과정 전체를 의미합니다.
      (이기창, 한국어 임베딩(2019))
    • 그 중에서도 BERT(Bidirectional Encoder Representations from Transformers)와 GPT(Generative Pre-trained
      Transformer)는 구글의 Transformer를 활용하고 있는 것으로 알려져 있습니다.
     BERT와 GPT는 학습 방법에 차이가 있어서, 각각의 잘하는 것도 다릅니다. 보다 더 자세한 내용이 궁금하신 분들은 다음의 자료들을
    살펴보시면 좋을 것 같습니다.


    Bag of Words 가정 분포가정 언어모델 기반
      BoW(TF) TF-IDF   Word2Vec Doc2Vec   ELMo, BERT, GPT
      어떤 단어가 많이 쓰였는가   어떤 단어가 같이 쓰였는가  

    BERT의 연산을 거친 후의 출력 임베딩은 문장의 문맥을 모두 참고한 문맥을 반영한 임베딩이 된다고 합니다. 문맥을 반영하고 있다는 특징 덕분에 텍스트 유사도 분석, 텍스트 분류에서 높은 성능을 보인다고 알려져 있습니다.


  2. Sentence BERT (SBERT)
    • BERT의 문장 임베딩의 성능을 우수하게 개선시킨 모델
    • 코사인 유사도나 맨하튼, 유클리디안 거리와 같은 유사도 측정법을 사용하여 의미론적으로 유사한 문장이 탐색 됨

4) 실습 예시

  1. 실습 데이터 
     캐글 데이터 (Text Analytics Explained-Job Description Data)
     재직 중인 회사에서는 직무기술서를 만드는 중이라… 캐글 데이터를 활용하였습니다
     원 데이터는 약 24만개 정도이나, 약 1만개 정도만 활용하였습니다
    • Data Shape: (244768, 12)
    • Columns : Id,Title,FullDescription,LocationRaw,LocationNormalized,ContractType,ContractTime,Company,Category,SalaryRaw,SalaryNormalized,SourceName

  2. 코드
     SBERT는 허깅페이스를 통해 다양한 모델들을 활용할 수 있어서, 간단한 코드로 구현이 가능합니다.
     제가 사용한 SBERT 모델 외에도 학습 데이터 범위 등에 따라 다양한 모델이 있어, 모델을 선택할 수 있습니다.
       한국어 SBERT 모델도 있으니, 한 번 테스트 해보세요!
       (저는 회사에서 성과몰입도 주관식 설문 주제 분류 작업에 한국어 SBERT를 사용하였는데, 문맥을 잘 반영한다고 느꼈습니다. :) )
import pandas as pd
import csv
from sklearn.cluster import KMeans
from sentence_transformers import SentenceTransformer

#모델 선택
#model = SentenceTransformer('jhgan/ko-sroberta-multitask')
model = SentenceTransformer('sentence-transformers/xlm-r-100langs-bert-base-nli-stsb-mean-tokens')

#데이터 import
df= pd.read_csv("/content/drive/MyDrive/Colab Notebooks/JD_Train.csv", encoding='unicode_escape')

#데이터 null값 처리
df.isnull().sum()
df[['Category', 'SalaryRaw', 'SalaryNormalized', 'SourceName']].dropna()

#텍스트에 SBERT 임베딩하기
df['embedding'] = df.apply(lambda row: model.encode(row.FullDescription), axis = 1) 
#코사인 유사도 함수
from numpy import dot
from numpy.linalg import norm
import urllib.request

def cos_sim(A, B):
  return dot(A, B)/(norm(A)*norm(B))

# 질문 문장 임베딩 및 코사인유사도 함수
# 가장 유사도가 높은 사람 한명 보여줌

def return_answer(question):
    embedding = model.encode(question)
    df['score'] = df.apply(lambda x: cos_sim(x['embedding'], embedding), axis=1)
    JobD_max = df.loc[df['score'].idxmax()]['FullDescription']
    JobD_min = df.loc[df['score'].idxmin()]['FullDescription']
    return JobD_max, JobD_min
# 새로운 job description 으로 테스트 해보기

test_sent = 'Engineering Systems Analyst / Mathematical Modeller. Our client is a highly successful and respected Consultancy providing specialist software development MISER, PIONEER, Maths, Mathematical, Optimisation, Risk Analysis, Asset Management, Water Industry, Access, Excel, VBA, SQL, Systems . Engineering Systems Analyst / Mathematical Modeller. Salary  ****K****K negotiable Location Dorking, Surrey'

return_answer(test_sent)
  • 유사도가 가장 높은 직무기술서
'Senior Application Developer  .Net MVC WCF SQL Surrey ****k Recognised internationally as a leading engineering company our client seeks a senior applications developer.  Experience working on commercially available off the shelf products within a software solutions house.  Degree in software engineering or similar.  Experience working in an agile development team employing SCRUM.  Experience of working within an environment employing TDD (Test Driven Development).  Technical Skills: o IDE  Visual Studio 2010  Team Foundation Server o Languages  C  XML / XSD  JavaScript / jQuery / Ajax / JSON  HTML / CSS o Database  ANSI SQL / PLSQL on ORACLE ****g  ANSI SQL / TSQL on SQL Server 2008 o Frameworks  .Net **** Framework  Spring .Net  MVC ****  WCF  nHibernate or equivalent ORM o Testing Frameworks  Microsoft Testing Framework / nUnit or equivalent o Application Server  IIS o Additional Skills / Knowledge  Orion Rhapsody or equivalent Integration Engine  XML Spy  LINQ  WIF  Rhino Mocks  App Fabric This is a great opportunity to join a leading software team working with the latest technologies and methodologies, looking to interview ASAP',
  • 유사도가 가장 낮은 직무기술서
'Restless Development, the youthled international development agency, has doubled the size of its operations and reach of its programmes in the past three years. Restless Development rsquo;s innovative youthled development model has been repeatedly'

유사도가 높은 직무기술서와 낮은 직무기술서를 보시면 문맥상 유사도에서 차이가 있음을 확인할 수 있습니다.
SBERT가 문맥 인식를 잘 하는지 좀 더 살펴보기 위해, Kmeans 클러스터링을 해보았습니다.
유사한 데이터끼리 묶어 줄 수 있을지 궁금합니다.
먼저, 엘보우 (elbow) 기법을 활용하여 적정한 클러스터 수를 확인한 후, 데이터 마다 라벨링 해보겠습니다.

  • Kmeans 클러스터링 해보기
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import math
# 엘보우(elbow)

def elbow(X):
  sse = []
  for i in range(1, 11):
    km = KMeans(n_clusters=i, init='k-means++', random_state=0)
    km.fit(X)
    sse.append(km.inertia_)

  plt.plot(range(1,11), sse, marker='o')
  plt.xlabel('Num of Clusters')
  plt.ylabel('SSE')
  plt.show()
corpus = df['FullDescription']
embeddings = model.encode(corpus)
elbow(embeddings)
import numpy as np
from sklearn.metrics import silhouette_samples, silhouette_score

km = KMeans(n_clusters=3, init='k-means++', random_state=0).fit(embeddings)
df['cluster'] = km.labels_

엘보우 결과를 보고, 딱 무엇이 적당하다! 라고 판단하기가 어려웠습니다..
우선 적합하다고 생각되는 3개 클러스터로 분류해보기로 하였습니다.

클러스터 데이터수
0 3994
1 3128
2 1985

클러스터별 title만 10개씩 뽑아서 보았을 때…
클러스터 0은 매니저 등 관리 업무 관련 직무로 이루어져 있는 것으로 보이고,
클러스터 1은 개발자, 기술 관련 직무로 이루어진 것 같습니다.
클러스터 2는 클러스터 0과 클러스터 1의 내용이 혼재 되어 있는 것으로 보입니다.
따라서 클러스터 수를 좀 더 조정해볼 필요가 있겠습니다.

클러스터 0 클러스터 1 클러스터 2
Door to Door Field Sales Manager PL/SQL Developer Support Worker Care/Education
Treasury Accountant Third Patry Development Manager Covering 3 Sites Care Worker/Care Assistant Jobs in Gravesend & Dartford
Assistant Accountant Commodity Lead Maintenance Person
Transport Clerk Access Field Technician Property Manager
SetterOut Draughtsman Regional Partnership Officer Home Manager  Learning Disability Care Group
Warehouse Manager Support Worker (LB****) Project Support Worker
Regional General Manager  Transport Recruitment Consultant  Education  ITN Mark Education Project Support Worker
Distribution Manager Web Developer  PHP/Magento Enterprise  4055k Working Foreman  Civils
Reablement Support Worker Pre Sales Engineer / Lead 3rd Line Server Engineer  ****k  Farnham Contracts Manager  Social Housing  Decent Homes
Sales Executive  Face to Face Health and Safety Advisor (Science Museum) Support Worker (EAST120113)

5) 활용 방안 및 한계점

우리 회사 직원의 이력서상 경력기술서, 우리 회사 내의 경험 기술서, 현재 직무기술서 등
직원의 직무경험과 관련된 텍스트 데이터를 모아두고, 충원이 필요한 포지션의 직무기술서와 비교하여
적합한 인재를 서칭할 수 있을 것 입니다.

사람에 대한 편견없이 직무 기반으로 검토하여, 검토 대상 pool에 올리고,
추가적으로 직원들의 역량, 기술, 팀 상황 등을 적합한지 고려하여,
회사가 주도적으로 포지션을 제안함으로써 내부 인재를 찾는 데에 도움이 될 것이라 생각합니다.

다만, 이번 실험은 영문 job description으로 실험하였기 때문에,
한국 직무기술서로 유의미한 결과가 도출되는지 실험해볼 필요가 있습니다.

또한, 직무기술서 분류 시 클러스터 수를 설정할 때에 엘보우 기법 뿐만 아니라
분석가가 보다 구체적인 분류 목적을 설정하고, 그에 적합한 클러스터 수를 설정해볼 필요도 있을 것으로 생각됩니다.


Reference

[인적자원관리] 9. 모집의 원천과 방법 및 모집의 대체(간접고용) (jennie-businessadministration.com)

 

[인적자원관리] 9. 모집의 원천과 방법 및 모집의 대체(간접고용)

1. 모집의 기초 - 정원계획에 의해 필요인력의 수와 종류가 결정되면 조직은 가장 효과적인 방법에 의해 조직 내외에서 유능한 인재들을 확보(모집 및 선발)해야 함 - 동양적 인적자원관리에서는

jennie-businessadministration.com

SBERT(SentenceBERT) 논문 리뷰 (velog.io)

 

SBERT(SentenceBERT) 논문 리뷰

Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks(2019) 논문을 읽고 내용 요약 및 정리

velog.io

17-02 버트(Bidirectional Encoder Representations from Transformers, BERT) - 딥 러닝을 이용한 자연어 처리 입문 (wikidocs.net)

 

17-02 버트(Bidirectional Encoder Representations from Transformers, BERT)

* 트랜스포머 챕터에 대한 사전 이해가 필요합니다. ![](https://wikidocs.net/images/page/35594/BERT.PNG) BERT(Bidire…

wikidocs.net

17-07 센텐스버트(Sentence BERT, SBERT) - 딥 러닝을 이용한 자연어 처리 입문 (wikidocs.net)

 

17-07 센텐스버트(Sentence BERT, SBERT)

BERT로부터 문장 임베딩을 얻을 수 있는 센텐스버트(Sentence BERT, SBERT)에 대해서 다룹니다. ## 1. BERT의 문장 임베딩 BERT로부터 문장 벡터를…

wikidocs.net

이기창, 한국어 임베딩(2019) ELMO, BERT, GPT, 그리고 ViT (tistory.com)

 

ELMO, BERT, GPT, 그리고 ViT

본격적인 글에 앞서 이 글은 CV를 연구중인 사람이 쓴 NLP 정리 글이다. 따라서 큼직한 내용의 이해를 목표로 하며 작성자의 주관적인 내용이 많이 포함될 수 있다. 위 사진... 나이대가 조금 있는

rollingpig.tistory.com

Comments