Introdução Link para o cabeçalho

Recentemente o site Data Hackers realizou uma pesquisa com pessoas que trabalham com Ciência de Dados. As respostas coletadas pelos questionários foram compilados e disponibilizados no Kaggle. Nesta primeira parte da minha análise irei fazer uma série de análises descritivas, a fim de ter uma noção de como estão algumas características deste mercado.

Preparação dos Dados Link para o cabeçalho

Como em qualquer análise de dados, o primeiro passo é importá-los para o R.

# pacotes necessarios

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
theme_set(theme_bw())

# leitura dos dados 

survey <- read_csv("data/datahackers-survey-2019-anonymous-responses.csv") %>%
	janitor::clean_names()
## Rows: 1765 Columns: 170
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (19): ('P0', 'id'), ('P2', 'gender'), ('P5', 'living_state'), ('P8', 'd...
## dbl (151): ('P1', 'age'), ('P3', 'living_in_brasil'), ('P6', 'born_or_gradua...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

A seguir, processo a coluna p5_living_state, mantendo apenas a sigla do estado em que o respondente mora. Além disso, há dados faltantes para o estado de quem mora no exterior. Portanto, então vou colocar o nível “Exterior” para essas pessoas.

# manter apenas as siglas para os estados e
# completar os NA de p5_living_state com Exterior

survey <- survey %>%
	mutate(p5_living_state = gsub("[\\(\\)]", "", regmatches(p5_living_state, gregexpr("\\(.*?\\)", p5_living_state)))) %>%
	mutate(p5_living_state = ifelse(p5_living_state == "character0", "Exterior", p5_living_state))

A seguir, crio um ordenamento que faça sentido para a variável p16_salary_range:

# criar ordenamento para p16_salary_range

survey <- survey %>%
	mutate(p16_salary_range = fct_explicit_na(p16_salary_range, na_level = "Não Informado")) %>%
	mutate(p16_salary_range = 
	         factor(p16_salary_range,
	                levels = c("Não Informado", 
	                           "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")))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `p16_salary_range = fct_explicit_na(p16_salary_range, na_level =
##   "Não Informado")`.
## Caused by warning:
## ! `fct_explicit_na()` was deprecated in forcats 1.0.0.
## ℹ Please use `fct_na_value_to_level()` instead.

De modo análogo, segue uma ordenação para a variável p8_degree_level:

# criar ordenamento para p8_degree_level

survey <- survey %>%
	mutate(p8_degreee_level = factor(p8_degreee_level, 
	                                levels = c("Prefiro não informar", 
	                                           "Não tenho graduação formal",
	                                           "Estudante de Graduação",
	                                           "Graduação/Bacharelado",
	                                           "Pós-graduação",
	                                           "Mestrado",
	                                           "Doutorado ou Phd")))

A partir de agora inicio a análise dos dados coletados. Como a amostragem não foi feita de maneira probabilística, não há a garantia de que os resultados reportados a seguir sejam extrapoláveis para um grupo de pessoas que não tenha respondido o questionário.

Análise Exploratória Link para o cabeçalho

Como podemos ver no gráfico abaixo, esse é um campo de atuação majoritariamente masculino:

survey %>%
	mutate(p2_gender = fct_explicit_na(p2_gender, "Não Informado")) %>%
	group_by(p2_gender) %>%
	count() %>%
	ggplot(aes(x = p2_gender, y = n)) +
	geom_col() +
	labs(x = "Gênero", y = "Quantidade", title = "Gênero dos Cientistas de Dados Brasileiros")

Além disso, nessa amostra não houve respondentes que trabalhassem no Brasil e fora das regiões Sul ou Sudeste:

survey %>%
	group_by(p5_living_state) %>%
	count() %>%
	ggplot(aes(x = reorder(p5_living_state, -n), y = n)) +
	geom_col() +
	labs(x = "Estado de Residência", y = "Quantidade", title = "Número de Cientistas de Dados por Estado")

A faixa salarial mais comum é entre R$ 4.001 e R$ 6.000 por mês:

survey %>%
	filter(p5_living_state != "Exterior") %>%
	group_by(p16_salary_range) %>%
	count() %>%
	na.omit() %>%
	ggplot(aes(x = p16_salary_range, y = n)) +
	geom_col() +
	labs(x = "Faixa Salarial", y = "Quantidade", title = "Faixa Salarial dos Cientistas de Dados Brasileiros") +
	theme(axis.text.x = element_text(angle = 90, hjust = 1))

São Paulo possui mais gente recebendo melhores salários:

survey %>%
	group_by(p5_living_state, p16_salary_range) %>%
	count() %>%
	ggplot(aes(x = p16_salary_range, y = p5_living_state, fill = n)) +
	geom_tile() +
	labs(x = "Faixa Salarial", y = "Estado de Residência", fill = "Qtde") +
	theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
	scale_fill_viridis_c()

Por fim, as combinações de faixas salariais e formação mais comuns são de R$3.000 a R$12.000 por mês, para pessoas com graduação ou pós-graduação.

survey %>%
	group_by(p8_degreee_level, p16_salary_range) %>%
	count() %>%
	ggplot(aes(x = p16_salary_range, y = p8_degreee_level, fill = n)) +
	geom_tile() +
	labs(x = "Faixa Salarial", y = "Formação", fill = "Qtde") +
	theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
	scale_fill_viridis_c()

No próximo artigo veremos como ajustar um modelo preditivo capaz de prever o salário de um cientista de dados de acordo com algumas variáveis pré-estabelecidas.