데이터 분석으로 개발 직군 스킬 트렌드 엿보기(feat. 채용공고)

이 상인 Lee Sangin
원티드랩 기술 블로그
11 min readApr 27, 2020

최근 원티드의 자체 조사 결과에 따르면 유저들 중 일부는 본인이 앞으로 어떻게 career path를 가꾸어 나가야 하는지 알아보기 위해 원티드를 이용하고 있습니다. 유저들은 원티드 사이트를 통해 어떻게 career path를 가꾸고 필요한 skill stack을 확인할 수 있었을까요? 아래처럼 공고에 작성된 자격 요건을 통해 확인하였을 가능성이 높습니다.

원티드 데이터 엔지니어 채용공고

일반적으로 기업들은 개발직군의 공고를 올릴 때 업무에서 활용되는 skill stack을 명시합니다. 기업이 사용하는 스킬(tool, 서비스 포함; python, git etc.)은 크게 변하지 않기 때문에 본인의 업무와 맞는 스킬을 가지고 있는지, 최근 기업들이 어떠한 스킬을 요구하는지 확인할 수 있습니다. 여기서 더 나아가 본인의 career 행보와 맞는 기업을 발견한다면 이직을 고려해 볼 수도 있습니다.

그렇다면 최근 기업들이 요구하는 스킬은 무엇이 있고, 유저들이 보유한 스킬과 어떤 차이를 보이고 있을까요? 현재 개발직군에서 어떠한 skill stack 보유자를 필요로 하는지, 채용공고의 ‘필수자격요건’ 부분에 적힌 skill들만을 대상으로 하여 분포를 확인하고, 더 나아가 원티드 유저의 skill stack과 비교해보고자 하였습니다.

유저의 스킬셋의 경우 유저가 등록한 프로필을 통해 스킬셋을 쉽게 확인 할 수 있었지만 공고의 경우 문장 내에서 스킬을 추출 할 필요가 있었습니다. 또한, 각 기업별로 스킬명을 다르게 기입하여 이를 통일해야 하기도 하였습니다. 이 과정과 결과를 공유합니다.

스킬 사전 구축

대부분의 공고에서는 스킬은 기본적으로 영문으로 기입하기에 사전에 해당 단어를 추가하는 작업을 진행하였습니다. 또한, 기업별로 띄어쓰기나 대소문자의 사용유무(Spring, Spring framework, spring etc.)에 따라 한 스킬에 대해 여러가지 명칭으로 불릴 수 있습니다. 따라서, 기존 KoNLP 내 woorimalsam 사전에 스킬명을 추가하고, 스킬명을 통일하기 위한 기준 스킬 리스트를 제작하였습니다.

# skill data 가져와서 list 형태로 정제하기 : jd 문장 전처리(skill 명 standard 폼으로 변경)
skill <- read.xlsx("skillSet.xlsx")
skill_list <- skill[,2:ncol(skill)]
skill_list <- lapply(as.list(1:nrow(skill_list)), function(x) skill_list[x,]) # dataframe to list
names(skill_list) <- skill$standard
# head(skill_list)
# 기존 사전에 넣어서 스킬 사전 제작
# dic 용 skill set 만들기
skill_vec <- skill$standard
skill_vec <- as.vector(unlist(skill_vec))
skill_vec <- skill_vec[!is.na(skill_vec)]
#head(skill_vec)
skill_dt <- data.frame(skill = skill_vec, tag = 'ncn')
# 일반 dic(woorimalsam)과 skill_vec 합쳐서 새로운 dic 만들기
# 체언 : 문장에서 주체가 되는 구실을 하는 단어. 조사가 붙고, 관형어의 수식을 받을 수 있음
# 서술성 명사(ncp) : 그 자체가 동작성이나 상태성을 가지는 경우
# 비서술성 명사(ncn) : 동작성, 상태성X
# 국립국어원에서 제공하는 [사전통계](http://opendict.korean.go.kr/service/dicStat)와 다소 상이할 수 있음.
buildDictionary(ext_dic = c("woorimalsam"),user_dic = skill_dt, category_dic_nms = c('industry general'))

문장 내 스킬명 통일

사전과 기준 스킬 리스트를 제작하였다면 다음은 공고를 전처리 할 차례입니다. 명사 추출 전 다양한 형태의 스킬명을 기준 스킬 명으로 통일하였고, 명사 추출 시 일부 오류의 원인이 되는 특수문자들도 함께 전처리를 진행하였습니다.

채용공고 중 일부 — “•” 문자의 경우 지워야 하지만, “C++”내의 기호는 스킬명의 일부이므로 모든 특수문자를 지우면 안됨
preprocessing <- function(dtm=data.frame()){
# 1. 기본 전처리
dtm$jd <- gsub("•"," ",dtm$jd) ; dtm$jd <- gsub("※"," ",dtm$jd)
dtm$jd <- gsub("ㆍ"," ",dtm$jd)
dtm$jd <- gsub("<U+2022>"," ",dtm$jd)
# 2. skill 명을 standard폼으로 변경
for(i in 1:nrow(dtm)){ # i=1
for(j in 1:length(names(skill_list))){ # j=1
dtm[i,5] <- gsub(x=dtm[i,5],
pattern = paste(gsub("([+.])","\\\\\\1",skill_list[[j]]),collapse = "|"),
replacement = names(skill_list)[j])
}
if(i %% 100 ==0) print(i)
}
return(dtm)
}

명사 추출 및 스킬 count

정제된 공고를 extractNoun을 사용하여 명사를 추출한 후, 명시된 스킬 별로 그 수를 집계합니다.

# 명사추출
extractN <- function(dtm=data.frame(), jd_word_list=list()){
#jd_word_list = list()
for(i in 1:nrow(dtm)){ # i=1
toextract <- dtm[i,5]
result <- extractNoun(toextract)
jd_word_list <- c(jd_word_list, list(result))
if(i %% 100 ==0) print(i)
}
return(jd_word_list)
}
skillC <- function(skill=data.frame(), jd_word_list=list()){
# standard 폼의 skill 개수 count
# 1. result용 테이블
skill_count <- data.frame(skill = as.character(skill$standard), count = NA)
skill_count$skill <- as.character(skill_count$skill)

# skill_count
for(i in 1:length(jd_word_list)){ # i=2
to_table <- as.data.frame(table(jd_word_list[[i]]))
colnames(to_table) <- c("var","result_value") ; to_table$var <- as.character(to_table$var)
skill_count <- left_join(skill_count, to_table,by=c("skill"="var"))
skill_count$count <- rowSums(skill_count[2:ncol(skill_count)],na.rm = TRUE)
if(i %% 100 ==0) print(i)
}
return(skill_count)
}
  1. 전체 공고에서 스킬 분포는 어떻게 되는가
채용 공고 내 스킬 분포(국내)

위 그래프는 위 집계된 수치를 나타낸 그래프입니다. 크게 협업 툴과 각 제품 개발에 필요한 프로그래밍 언어로 구성되어 있음을 확인할 수 있습니다. python이 300건이 넘는 수치로 명시된 전체 스킬의 8%를 차지하고, 그 뒤를 Spring Framework, AWS, Git 이 이었습니다. python은 기본적으로 서버 개발 시 많이 활용되어왔고 최근 몇년간 머신러닝이 떠오르면서 핫한 언어로 자리매김했습니다. 협업툴(서비스)인 AWS, Git등을 제외하고 skill set만 확인하면 서버, 프론트, 앱, 개발자의 수요가 많은 것을 알 수 있네요.

2. 해외의 스킬 분포도 비슷한가

채용 공고 내 스킬 분포(해외)

해외에서도 국내와 마찬가지로 javascript, sql, iOS 순으로 스킬이 확인됩니다. 한국에서의 입지가 강한 Spring이 제외되었을 뿐 여전히 서버 개발자 수요가 많다는 것을 알 수 있습니다. 한국에 비해 Ruby가 상위권에 올라온 것도 확인할 수 있는데, (해당 결과에서는 나오지 않았지만) 각 국가별로 확인해보았을 때 대부분 일본에서 해당 언어를 요구하였습니다. Ruby가 아직 모국에서 비교적 건재함을 확인할 수 있습니다.

3. 개발 직군 유저들의 스킬 분포는 어떻게 될까

수요를 확인하였으니 공급을 확인해볼 차례입니다. 원티드 개발 직군 유저들은 어떠한 스킬을 가지고 있을까요? 아래 그래프를 보면 대체로 협업툴보다는 본인이 다룰 수 있는 프로그래밍 언어 위주로 나타난 것을 확인할 수 있습니다. python, spring, mysql과 같이 서버 개발에 요구되는 스킬(언어)과 javascript, reactJS와 같이 프론트엔드 개발에 요구되는 스킬을 보유한 유저가 많은 것이 눈에 띄네요.

유저 스킬 분포(국내)

4. 수요와 공급을 한 눈에 확인해보자

이번에는 기업에서 요구하는 스킬과 유저들이 보유한 스킬을 비교해 보고자 합니다. (한국 기업 및 유저로만 한정) 아래와 같이 채용공고에 적힌 스킬과 유저가 프로필에 등록한 스킬의 분포를 2차원으로 그려보았습니다. 파란색 그래프을 기준으로 왼쪽(위)로 갈수록 공고 수에 비해 유저 수가 많고, 오른쪽(아래)로 갈 수록 공고 수에 비해 유저 수가 적습니다. 예를 들어 javascript와 oracle의 경우 다른 스킬보다 공고 수 대비 유저 수가 많은 것으로 나타납니다. 해당 스킬을 요구하는 기업(공고)들은 다른 스킬대비 보다 많은 유저들을 접할 기회가 있겠네요. 반면, 오른쪽(아래)에 위치한 Ruby나 iOS의 경우 해당 스킬을 보유한 유저에 비해 찾는 기업이 더 많은 것으로 보이네요. 이직을 고려하는 분들 중 해당 스킬을 보유하고 계신다면 좋은 소식을 기대할 수 있을 것 같습니다. :)

공고 x 유저 스킬 분포

마치며

이렇게 간단히 공고의 스킬과 유저의 스킬 분포를 보고 둘을 비교해보았습니다. 많은 공고들이 프론트엔드/서버 개발자를 찾고 있었고, 그만큼 많은 프론트엔드/서버 개발자 유저들이 관련 스킬을 보유하고 있었던만큼, 서로에게 좋은 기업/구직자를 찾았으면 좋겠습니다. 🙇

이번 분석에선 진행하지 않았지만, 아래의 작업들로 본 분석을 보다 발전시킬 수 있습니다.

  1. 레벤슈타인 알고리즘을 사용하여 스킬 셋 목록 및 사전 강화
  2. 이력서 데이터를 참고하여 추가 유저 스킬 데이터 확보
  3. 각 분기 별 스킬 양상 변화

원티드에서는 ‘좋은 일자리와 숨은 인재를 연결하기 위한 가장 효율적이고 인간적인 방법’이란 문제를 풀기 위해 다양한 개발자 여러분을 모시고 있습니다. 원티드의 개발자 포지션에 관심있으신 분들을 위한 채용공고가 오픈되어있으니 많이 찾아주세요.

내가 Python 개발자라면? 원티드 서버 개발자(Python) 공고 보기

원티드 채용공고를 찾고있다면? 원티드 채용공고 확인하기

--

--