A maior comunidade de Cientistas de dados do Brasil realizou uma pesquisa com 1.765 membros para conhecer mais sobre eles.
É a maior pesquisa brasileira deste segmento e trouxe muito valor para a área.
Foram aplicadas 36 perguntas. Desde perguntas básicas sobre o perfil de cada um até perguntas mais específicas da área, como:
área de atuação, área de formação, tempo de experiência, ferramentas e linguagens utilizadas no trabalho e até a faixa salarial.
Qual é o salário médio da categoria e quais variáveis estão muito relacionadas ao seu valor?
Qual é a linguagem de programação mais utilizada pelos Cientistas de dados?
Qual é a linguagem de programação utilizada pelos Cientistas de dados que ganham mais $$$??
Para responder essas e várias outras perguntas, analisei as principais informações da pesquisa.
Você conhece o gráfico MAPTREE?
Vou mostrar esse gráfico que é muito pouco utilizado, mas é ideal em alguns casos. Ele te ajudará muito na exploração das informações. Leia até o final do post para não perder.
O banco de dados completo está disponível em:
kaggle.com/datahackers/pesquisa-data-hackers-2019
library(readr)
library(treemap)
# devtools::install_github("timelyportfolio/d3treeR")
library(d3treeR)
library(knitr)
library(rpart)
library(rattle)
library(rpart.plot)
library(RColorBrewer)
library(shiny)
library(plyr)
library(dplyr)
library(magrittr)
library(readr)
library(FSelector)
library(treemap)
datahackers <- read_csv("datahackers.csv")
datahackers<-select(datahackers,`('P1', 'age')`,`('P2', 'gender')`,`('P5', 'living_state')`,`('P8', 'degreee_level')`,
`('P10', 'job_situation')`,`('P12', 'workers_number')`,`('P13', 'manager')`,`('P16', 'salary_range')`,
`('P17', 'time_experience_data_science')`,`('P19', 'is_data_science_professional')`,`('P21', 'sql_')`,`('P21', 'r')`,
`('P21', 'python')`,`('D3', 'anonymized_degree_area')`,
`('D4', 'anonymized_market_sector')`,`('D6', 'anonymized_role')`)
labs <- c(paste(c(0,19,25,30,35,40,45,50),c(18,24,29,34,39,44,49,54),
sep = "-"), paste(55, "+", sep = ""))
datahackers$age<- cut(datahackers$`('P1', 'age')`, breaks = c(0,19,25,30,35,40,45,50,55,Inf), labels = labs, right = FALSE)
names(datahackers)<-c("Idade_raw","Genero","Estado","Escolaridade","Empregado","No. funcionarios empresa","Gerente","Faixa salarial",
"Tempo de experiencia em DS","Cientista de dados","SQL","R","python","Area de formacao","Area de atuacao","Cargo","Idade")
datahackers$salario<-as.numeric(mapvalues(datahackers$`Faixa salarial`,
from=c("Menos de R$ 1.000/mês","de R$ 1.001/mês a R$ 2.000/mês","de R$ 2.001/mês a R$ 3000/mês",
"de R$ 3.001/mês a R$ 4.000/mês","de R$ 4.001/mês a R$ 6.000/mês","de R$ 6.001/mês a R$ 8.000/mês",
"de R$ 8.001/mês a R$ 12.000/mês","de R$ 12.001/mês a R$ 16.000/mês","de R$ 16.001/mês a R$ 20.000/mês",
"de R$ 20.001/mês a R$ 25.000/mês","Acima de R$ 25.001/mês",NA),
to=c(500,1500,2500,3500,5000,7000,10000,14000,18000,22500,30000,NA)))
# LINGUAGENS DE PROGRAMAÇÃO
# R
freq_R<-data.frame(table(datahackers$R)) %>% filter(Var1==1)%>% select(Freq)
freq_SQL<-data.frame(table(datahackers$SQL)) %>% filter(Var1==1)%>% select(Freq)
freq_python<-data.frame(table(datahackers$python)) %>% filter(Var1==1)%>% select(Freq)
linguagem<-data.frame(lang=c("R","SQL","python"),Freq=rbind(freq_R,freq_SQL,freq_python))
kable(arrange(linguagem,-Freq))
| lang | Freq |
|---|---|
| python | 784 |
| SQL | 714 |
| R | 318 |
A linguagem de programação mais utilizada pelos membros da comunidade é o Python. Sabemos que a linguagem de programação escolhida é muito relacionada a origem do programador. Então mais a frente veremos a origem/área de formação dos respondentes da pesquisa.
R_salario <- datahackers %>%
group_by(R) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario) %>%
filter(R==1) %>%
select(media_salario)
SQL_salario <- datahackers %>%
group_by(SQL) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario) %>%
filter(SQL==1) %>%
select(media_salario)
python_salario <- datahackers %>%
group_by(python) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario) %>%
filter(python==1) %>%
select(media_salario)
linguagem_salario<-data.frame(lang=c("R","SQL","python"),Freq=rbind(R_salario,SQL_salario,python_salario))
kable(arrange(linguagem_salario,-media_salario))
| lang | media_salario |
|---|---|
| R | 7879 |
| python | 7076 |
| SQL | 7069 |
Apesar de serem maioria, os programadores da linguagem python ganham menos que os programadores da linguagem R. Isso já havia sido identificado em outras pesquisas, inclusive mundiais. Veja em:
businessinsider.com/the-top-coding-languages-with-the-highest-salary-2020-4
#R
datahackers_R<-filter(datahackers,R==1)
datahackers_R<-aggregate(R ~`Area de formacao`,datahackers_R,length)
#SQL
datahackers_sql<-filter(datahackers,SQL==1)
datahackers_sql<-aggregate(SQL ~`Area de formacao`,datahackers_sql,length)
#Python
datahackers_py<-filter(datahackers,python==1)
datahackers_py<-aggregate(python ~`Area de formacao`,datahackers_py,length)
area_linguagem<-join(datahackers_R,datahackers_sql)
area_linguagem<-join(area_linguagem,datahackers_py)
area_linguagem$R<-paste0(round(area_linguagem$R*100/sum(area_linguagem$R),0),"%")
area_linguagem$SQL<-paste0(round(area_linguagem$SQL*100/sum(area_linguagem$SQL),0),"%")
area_linguagem$python<-paste0(round(area_linguagem$python*100/sum(area_linguagem$python),0),"%")
kable(area_linguagem)
| Area de formacao | R | SQL | python |
|---|---|---|---|
| Ciências Sociais | 2% | 1% | 1% |
| Computação / Engenharia de Software / Sistemas de Informação | 39% | 58% | 57% |
| Economia/ Administração / Contabilidade / Finanças | 12% | 10% | 9% |
| Estatística/ Matemática / Matemática Computacional | 19% | 8% | 8% |
| Marketing / Publicidade / Comunicação / Jornalismo | 2% | 1% | 2% |
| Outras | 6% | 4% | 4% |
| Outras Engenharias | 18% | 16% | 17% |
| Química / Física | 1% | 2% | 2% |
Obviamente, podemos ter um cientista da computação que prefere a linguagem R e um estatístico que prefira python. Mas há uma tendência pelo contrário.
Profissionais com origens na área computacional tem grande tendência em usar o python. Isso por ser uma linguagem genérica, que não é específica para Data Science. Ou seja, provavelmente já era uma linguagem que usavam antes de entrar para a área de Ciência de dados.
Para as demais áreas, há um predomínio de uso da linguagem R, já que ela é mais fácil de ser aprendida e é específica para a Ciência de Dados.
A linguagem SQL é totalmente complementar às linguagens R e Python, sendo usada em conjunto com uma delas.
#### sabem SQL e R ou Python
# R e SQL
# % de quem sabe SQL dentre quem sabe R
datahackers_R<-filter(datahackers,R==1)
cat("Entre os entrevistados que usam a linguagem R, ",round(sum(datahackers_R$SQL)*100/sum(datahackers_R$R),1),"% também usam SQL.",sep="")
## Entre os entrevistados que usam a linguagem R, 77.4% também usam SQL.
# Python e SQL
# % de quem sabe SQL dentre quem sabe Python
datahackers_py<-filter(datahackers,python==1)
cat("Entre os entrevistados que usam a linguagem Python, ",round(sum(datahackers_py$SQL)*100/sum(datahackers_py$python),1),"% também usam SQL.",sep="")
## Entre os entrevistados que usam a linguagem Python, 77.9% também usam SQL.
# Idade
hist(datahackers$Idade_raw,xlab="Idade",ylab = "Frequência",main="Histograma de idade")

# Escolaridade
Escolaridade_freq<-data.frame(table(datahackers$Escolaridade))
kable(arrange(Escolaridade_freq,-Freq))
| Var1 | Freq |
|---|---|
| Graduação/Bacharelado | 578 |
| Pós-graduação | 527 |
| Estudante de Graduação | 374 |
| Mestrado | 201 |
| Doutorado ou Phd | 50 |
| Não tenho graduação formal | 34 |
| Prefiro não informar | 1 |
kable(datahackers %>%
group_by(Escolaridade) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Escolaridade | media_salario |
|---|---|
| Doutorado ou Phd | 12632 |
| Mestrado | 9061 |
| Não tenho graduação formal | 7734 |
| Pós-graduação | 7622 |
| Graduação/Bacharelado | 5759 |
| Estudante de Graduação | 2712 |
| Prefiro não informar | 2500 |
Os estados com poucas respostas foram omitidos pelos organizadores da pesquisa para garantir a privacidade dos respondentes.
# Localização
#estado
Estado_freq<-data.frame(table(datahackers$Estado))
kable(arrange(Estado_freq,-Freq))
| Var1 | Freq |
|---|---|
| São Paulo (SP) | 669 |
| Minas Gerais (MG) | 316 |
| Rio de Janeiro (RJ) | 147 |
| Paraná (PR) | 117 |
| Santa Catarina (SC) | 83 |
| Rio Grande do Sul (RS) | 69 |
| Espírito Santo (ES) | 27 |
kable(datahackers %>%
group_by(Estado) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Estado | media_salario |
|---|---|
| São Paulo (SP) | 7088 |
| NA | 6473 |
| Rio de Janeiro (RJ) | 6339 |
| Espírito Santo (ES) | 5841 |
| Minas Gerais (MG) | 5448 |
| Paraná (PR) | 5412 |
| Rio Grande do Sul (RS) | 5288 |
| Santa Catarina (SC) | 4880 |
# Tipo de emprego
Empregado_freq<-data.frame(table(datahackers$Empregado))
kable(arrange(Empregado_freq,-Freq))
| Var1 | Freq |
|---|---|
| Empregado (CTL) | 1073 |
| Empreendedor ou Empregado (CNPJ) | 234 |
| Estagiário | 131 |
| Somente Estudante (graduação) | 85 |
| Desempregado, buscando recolocação | 69 |
| Servidor Público | 60 |
| Trabalho na área Acadêmica/Pesquisador | 45 |
| Somente Estudante (pós-graduação) | 36 |
| Freelancer | 23 |
| Prefiro não dizer | 6 |
| Desempregado e não estou buscando recolocação | 3 |
kable(datahackers %>%
group_by(Empregado) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Empregado | media_salario |
|---|---|
| Servidor Público | 8575 |
| Empreendedor ou Empregado (CNPJ) | 8479 |
| Prefiro não dizer | 6917 |
| Empregado (CTL) | 6368 |
| Freelancer | 4000 |
| Estagiário | 1302 |
| Desempregado e não estou buscando recolocação | NaN |
| Desempregado, buscando recolocação | NaN |
| Somente Estudante (graduação) | NaN |
| Somente Estudante (pós-graduação) | NaN |
| Trabalho na área Acadêmica/Pesquisador | NaN |
# É gerente?
Gerente_freq<-data.frame(table(datahackers$Gerente))
kable(arrange(Gerente_freq,-Freq))
| Var1 | Freq |
|---|---|
| 0 | 1222 |
| 1 | 305 |
kable(datahackers %>%
group_by(Gerente) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Gerente | media_salario |
|---|---|
| 1 | 9503 |
| 0 | 5513 |
| NA | NaN |
# Tempo de experiência
tempo_freq<-data.frame(table(datahackers$`Tempo de experiencia em DS`))
kable(arrange(tempo_freq,-Freq))
| Var1 | Freq |
|---|---|
| Menos de 1 ano | 445 |
| de 1 a 2 anos | 343 |
| de 2 a 3 anos | 244 |
| Não tenho experiência na área de dados | 221 |
| de 4 a 5 anos | 186 |
| de 6 a 10 anos | 179 |
| Mais de 10 anos | 147 |
kable(datahackers %>%
group_by(`Tempo de experiencia em DS`) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Tempo de experiencia em DS | media_salario |
|---|---|
| Mais de 10 anos | 10827 |
| de 6 a 10 anos | 9555 |
| de 4 a 5 anos | 8494 |
| de 2 a 3 anos | 6284 |
| de 1 a 2 anos | 5106 |
| Não tenho experiência na área de dados | 4623 |
| Menos de 1 ano | 3929 |
# É cientista de dados?
cientista_freq<-data.frame(table(datahackers$`Cientista de dados`))
kable(arrange(cientista_freq,-Freq))
| Var1 | Freq |
|---|---|
| 1 | 915 |
| 0 | 850 |
Entre os membros da comunidade Data Hackers, 915 respondentes afirmaram desempenhar funções típicas de um Cientista de Dados.
kable(datahackers %>%
group_by(`Cientista de dados`) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Cientista de dados | media_salario |
|---|---|
| 1 | 6986 |
| 0 | 5576 |
# Área de formação
formacao_freq<-data.frame(table(datahackers$`Area de formacao`))
kable(arrange(formacao_freq,-Freq))
| Var1 | Freq |
|---|---|
| Computação / Engenharia de Software / Sistemas de Informação | 1013 |
| Outras Engenharias | 247 |
| Economia/ Administração / Contabilidade / Finanças | 174 |
| Estatística/ Matemática / Matemática Computacional | 104 |
| Outras | 92 |
| Marketing / Publicidade / Comunicação / Jornalismo | 47 |
| Química / Física | 28 |
| Ciências Sociais | 25 |
kable(datahackers %>%
group_by(`Area de formacao`) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Area de formacao | media_salario |
|---|---|
| Química / Física | 8974 |
| NA | 7576 |
| Estatística/ Matemática / Matemática Computacional | 7543 |
| Marketing / Publicidade / Comunicação / Jornalismo | 6630 |
| Economia/ Administração / Contabilidade / Finanças | 6267 |
| Outras Engenharias | 6227 |
| Computação / Engenharia de Software / Sistemas de Informação | 6206 |
| Outras | 5475 |
| Ciências Sociais | 5056 |
# Cargo
cargo_freq<-data.frame(table(datahackers$Cargo))
kable(arrange(cargo_freq,-Freq))
| Var1 | Freq |
|---|---|
| Desenvolvedor ou Engenheiro de Software | 225 |
| Outras | 220 |
| Data Scientist/Cientista de Dados | 167 |
| Data Analyst/Analista de Dados | 163 |
| Business Intelligence/Analista de BI | 150 |
| Data Engineer/Engenheiro de Dados | 130 |
| Business Analyst/Analista de Negócios | 72 |
| Analista de Inteligência de Mercado | 29 |
| Engenheiro | 26 |
| Analista de Marketing | 19 |
| Engenheiro de Machine Learning | 15 |
| DBA/Administrador de Banco de Dados | 14 |
| Estatístico | 11 |
| Economista | 10 |
kable(datahackers %>%
group_by(Cargo) %>%
summarise(media_salario = round(mean(salario,na.rm=T),0)) %>%
arrange(-media_salario))
| Cargo | media_salario |
|---|---|
| NA | 9513 |
| Data Engineer/Engenheiro de Dados | 8227 |
| Engenheiro de Machine Learning | 8000 |
| Engenheiro | 7615 |
| Data Scientist/Cientista de Dados | 6784 |
| Estatístico | 6591 |
| Business Analyst/Analista de Negócios | 5646 |
| Desenvolvedor ou Engenheiro de Software | 5109 |
| Data Analyst/Analista de Dados | 5021 |
| Business Intelligence/Analista de BI | 4870 |
| Outras | 4723 |
| DBA/Administrador de Banco de Dados | 4571 |
| Economista | 4150 |
| Analista de Inteligência de Mercado | 3759 |
| Analista de Marketing | 3079 |
O Map Tree não está entre os gráficos mais utilizados. Talvez porque precise ser dinâmico para ser mais útil e informativo.
Porém, considero que é um dos gráficos mais interessantes quando você trabalha com variáveis prioritariamente categóricas e precisar demonstar a importância de suas variáveis para prever a variável resposta.
A nossa variável de interesse é o salário mensal dos respondentes.
names(datahackers)<-gsub(" ",".",names(datahackers))
datahackers<-select(datahackers,Faixa.salarial,Genero,Estado,Escolaridade,
Empregado,No..funcionarios.empresa,Gerente,
Tempo.de.experiencia.em.DS,Cientista.de.dados,SQL,R,
python,Area.de.formacao,Area.de.atuacao,Cargo,
Idade)
Optei por excluir algumas variáveis nessa análise gráfica:
Empregado -> Saber se a pessoa está empregada ou não é a variável mais importante para prever a média salarial, porém não faz muito sentido prever o salário de pessoas que não estão trabalhando.
Escolaridade e Idade -> Foram excluídas porque apresentaram uma relação muito grande com a variável Tempo de experiência, então optei por deixar apenas esta.
variaveis<-information.gain(formula(datahackers), datahackers)
variaveis$val<-row.names(variaveis)
variaveis <- arrange(variaveis,-attr_importance)
variaveis<-variaveis[!variaveis$val%in%c('Empregado',"Escolaridade","Idade"),]
datahackers_sel<-select(datahackers,variaveis$val[1:3],"Faixa.salarial")
kable(variaveis[1:3,])
| attr_importance | val | |
|---|---|---|
| Tempo.de.experiencia.em.DS | 0.1732980 | Tempo.de.experiencia.em.DS |
| Cargo | 0.1335318 | Cargo |
| Area.de.atuacao | 0.0798440 | Area.de.atuacao |
datahackers_sel<-aggregate(list(count=rep(1,nrow(datahackers_sel))), datahackers_sel, sum)
tree<-treemap(datahackers_sel,
index=c(variaveis$val[1:3],"Faixa.salarial"),
vSize="count",
type="index",
palette = "Set2",
bg.labels=c("white"),
align.labels=list(
c("center", "center"),
c("right", "bottom")
)
)
Como mostrado na tabela acima, serão consideradas as variáveis Tempo de experiência, Cargo e Área de atuação.
d3tree2(tree, rootname = "Todos" )
Faça parte do nosso grupo exclusivo e receba as novidades mais interessantes sobre Data Sciente e R em primeira mão.