데이터 과학자 VS 데이터 분석가



포스팅은 아래 영문 블로그의 내용을 요약 발췌하여 작성함을 알려드립니다.

따라서 포스팅에 올려지는 모든 그림과 도표 등의 내용은 아래 영문 링크를 들어가셔도 동일하게 보실 있습니다.

http://www.kdnuggets.com/2016/11/data-scientists-vs-data-analysts-part-1.html


 빅데이터 분야에서 데이터 과학자와 데이터 분석가에 대한 구분은 끊임없이 존재하였으나, 부분을 명확하게 나누어 이야기 하는 사람은 많지 않았습니다. 그래서 David Sheehan 작성한 블로그 내용을 기반으로 데이터 과학자와 데이터 분석가에 대한 구분을 해보도록 하겠습니다


데이터 과학자의 일반적인 기술이라고 하면 파이썬과 R 대표적으로 이야기 할수 있습니다. 하지만 데이터 과학자의 업무와 유사한 데이터 분석가의 업무에 대해서 어떻게 차이가 나는지 정량적인 분석을 통해 비교를 해보려고 합니다.

정량적인 분석을 위해서 해외 구직사이트 indeed 사이트의 데이터를 분석하고자 합니다. Indeed 무료이며 간단한 api 가지고 있습니다 이름과 이메일만 있다면 API 쿼리 하는 것은 크게 어렵지 않다고 합니다.

David Sheehan 런던의 데이터 과학자와 데이터 분석가의 직업을 아래와 같이 비교하였습니다.

---------------------------------------------------------------

## if you haven't already installed jobbR

# devtools::install_github("dashee87/jobbR")


## loading the packages we'll need

require(jobbR)

require(ggplot2)


# collecting data scientist jobs in London from the Indeed API

dataScientists <- jobSearch(publisher = "yourpublisherID", query = "data+scientist",

country = "uk", location = "london", all = TRUE)


# collecting data analyst jobs in London from the Indeed API

dataAnalysts <- jobSearch(publisher = "yourpublisherID", query = "data+analyst",

country = "uk", location = "london", all = TRUE)

---------------------------------------------------------------

이렇게 indeed데이터를 api 통해서 긁어오면 모든 데이터가 데이터 과학자 혹은 데이터 분석가 있는 것은 아닙니다.

철자의 유사성으로 인해서 연구과학자 (research Scientist) 등과 초급 증군 인턴등의 자리 또한 제외할수 있도록 프로그램을 작성해봅니다.

---------------------------------------------------------------

# removing junior and senior roles

dataScientists <- dataScientists[grepl("data scientist",dataScientists$results.jobtitle,

ignore.case = TRUE) & !grepl("senior|junior|lead|manage|intern|analyst|graduate",

dataScientists$results.jobtitle,ignore.case = TRUE),]


dataAnalysts <- dataAnalysts[grepl("data analyst", dataAnalysts$results.jobtitle,

ignore.case = TRUE) & !grepl("senior|junior|lead|manage|intern|scientist|graduate",

dataAnalysts$results.jobtitle,ignore.case = TRUE),]

---------------------------------------------------------------

API 문서에 의해 중복문서가 없다고 예상할 있지만, 데이터의 품질을 높이기 위해서 데이터를 중복 제거하도록 후처리 해봅니다.

---------------------------------------------------------------

dataScientists <- dataScientists[! duplicated(dataScientists$results.jobkey),]
dataAnalysts <- dataAnalysts[! duplicated(dataAnalysts$results.jobkey),]

---------------------------------------------------------------

결과를 정리해서 아래와 같이 수량을 우선 나타내어 봅니다.

---------------------------------------------------------------

# number of job posts per role
lapply(list(dataScientists, dataAnalysts), nrow)

--------------------------------------------------------------------------

## [[1]]
## [1] 188
##
## [[2]]
## [1] 202


새롭게 대두된 데이터 과학자가 어렵고 기술적이기 때문에 아주 많이 차이가 것이라고 예상했음에도 불구하고,

위의 결과는 데이터 과학자와 데이터분석가보다 조금 적게 나왔음을 확인할 있습니다. 데이터 과학자의 구인이 생각보다 많다는 것을 확인했다고 할수 있습니다.


월급비교


Indeed APi 월급에 대한 정보를 제공하지 않습니다. 그래서 JobbR 패키지를 활용해서 직업설명에 나타나 있는 월급여 설명 부분을 긁어모아서 데이터를 모아보았습니다.

물론 어떠한 광고도 정확한 월급을 적어놓지는 않았지만 대략적인 파악은 가능하다고 생각하고 데이터를 모았습니다.

---------------------------------------------------------------
# get salary figures for all data scientist positions
dsSalary <- lapply(dataScientists$results.url, function(x)getSalary(x,"GBP"))
dsSalary <- do.call(rbind, dsSalary)
# get salary figures for all data analyst positions
daSalary <- lapply(dataAnalysts$results.url, function(x)getSalary(x,"GBP"))
daSalary <- do.call(rbind, daSalary)
# quick look at our salary dataset
head(daSalary)
---------------------------------------------------------------
##      status  period currency minSal maxSal
## 1 Permanent    year      GBP  27000  30000
## 2   unknown unknown      GBP     NA     NA
## 3 Permanent    year      GBP  32042  36548
## 4   unknown unknown      GBP     NA     NA
## 5   unknown unknown      GBP     NA     NA

## 6 Permanent    year      GBP  45000  50000



프로그래밍이 완벽하지 않아서 데이터 결손치 NA 많이 있음을 확인할수 있습니다. 따라서 결손치를 제외하고 연봉부분만 발췌하면 아래와 같이 결과를 확인할수 있습니다.

---------------------------------------------------------------
# filtering out jobs with no advertised salary or retaining those with annual salaries
dsSalary <- dsSalary[! is.na(dsSalary$minSal) & dsSalary$period=="year",]
daSalary <- daSalary[! is.na(daSalary$minSal) & daSalary$period=="year",]
# number of positions with an advertised annual salary
lapply(list(dsSalary, daSalary), nrow)
---------------------------------------------------------------
## [[1]]
## [1] 69
##
## [[2]]
## [1] 75




또한 연봉의 최저값과 최고값의 범위를 광고하는 구인광고가 많으므로 , 중간값을 대표값으로 지정하여 데이터를 분석하고자 합니다.

dsSalary$Sal <- mapply(function(x,y){(x+y)/2}, dsSalary$minSal, dsSalary$maxSal)
daSalary$Sal <- mapply(function(x,y){(x+y)/2}, daSalary$minSal, daSalary$maxSal)


모든 데이터가 확보된 상태라서 아래와 같이 기본적인 그래프를 그려보았습니다.

.

dsSalary$type <- "Data Scientist"
daSalary$type <- "Data Analyst"
ggplot(rbind(dsSalary, daSalary), aes(Sal, colour = type)) + stat_ecdf(size = 1) +
geom_text(size=8, aes(100000, .3, label = "Data Analyst", color = "Data Analyst")) +
geom_text(size=8, aes(100000, .2, label = "Data Scientist", color= "Data Scientist")) +
labs(title = "Annual Salary: Data Analysts vs Data Scientists",
x = "Annual Salary (GBP)", y = "Cumulative Proportion") +
theme(axis.title = element_text(size = 14,face = "bold"),
plot.title = element_text(size = 16,face = "bold"), legend.position = "none",
axis.text = element_text(size = 11))


아래 그림은 누적 분포도를 표현한것이며, 도표를 보면 데이터 분석가가 데이터 과학자보다 적은 연봉을 받는다는 것을 확인할수 있습니다.


특히 데이터 과학자 중간지점은 6만파운드 가르키는데 반면, 데이터 분석과는 3만파운드 미만을 지나고 있어 월급차이가 극명하게 난다고 이야기 할수 있습니다.


Indeed API (jobbR 패키지 사용)에서 작업 데이터를 추출하고 정리하여 간단한 그래프를 작성하여 데이터 과학자와 데이터 분석가 간의 급여 격차를 보여주었습니다.

 2 부에서는 직무 기술에 초점을 두고 자연어 처리기술을 사용하여 자신의 광고 기술 세트를 기반으로 데이터 과학자 데이터 분석가 위치를 예측하고자 합니다.


블로그 포스팅 저작자의 사이트는 아래와 같습니다.

https://dashee87.github.io/data%20science/data-scientists-vs-data-analysts-part-1



해외 블로거의 포스트를 기반으로 간단한 분석과 데이터를 이용해서 그래프를 그린 것을 보고 흥미롭다는 생각을 하게 됩니다.

R 적재적소에 쓰는 모습이 타의 귀감이 되어서 저에게 의미가 되었던 글이 아니었나 싶습니다.


+ Recent posts