Carregando a base:
load("../dados/sp_2019.RData")
load("../dados/escolas_com_dados.RData")
Relembrando a estrutura:
head(sp_2019)
Não temos um referencial específico para isso, vamos checar nas demais colunas
sp_2019 %>%
distinct(tipo_categoria, categoria_profissional)
Os dados fornecidos só nos apontam a qualificação dos profissionais. Entretanto, como será visto a seguir, os profissionais listados estão associados à secretaria de educação, o que indica possivelmente que são concursados.
Como visto no ponto 1, não há classificação da carreira, apenas nível de habilitação do professor e o salário.
Vamos antes verificar se há casos assim.
duplicatas <- sp_2019 %>%
mutate(nome_cod = paste0(nome, codigo_do_local_de_exercicio, ano, mes)) %>%
group_by(nome_cod) %>%
filter(n() > 1) %>%
ungroup()
duplicatas %>%
summarise(nomes_distintos = n_distinct(nome), entradas_distintas = n_distinct(nome_cod))
Há 2.860 funcionários com dois (ou mais) pagamentos na mesma escola e no mesmo mês do mesmo ano. Para descobrir o que está acontecendo, podemos ter uma pista ao importar os dados obtidos do Portal de Transparência municipal de São Paulo ( http://transparencia.prefeitura.sp.gov.br/funcionalismo/ ). Entretanto, esse arquivo não informa quando foi gerado. Por isso vamos, vamos usar o portal de Dados Abertos para obter o csv referente a dezembro de 2019, o último mês analisado por nós. http://dados.prefeitura.sp.gov.br/dataset/remuneracao-servidores-prefeitura-de-sao-paulo
dados_abertos <- read_delim("../dados/remuneracao12-2019atiliminar20200103.csv",
";", escape_double = FALSE, locale = locale(decimal_mark = ",",
encoding = "ISO-8859-1"), trim_ws = TRUE) %>%
janitor::clean_names()
##
## -- Column specification --------------------------------------------------------
## cols(
## Exceção = col_double(),
## `Nome completo` = col_character(),
## `Cargo Base` = col_character(),
## `Cargo em Comissão` = col_character(),
## `Remuneração do Mês` = col_number(),
## `Demais Elementos da Remuneração` = col_number(),
## `Remuneração Bruta` = col_number(),
## Unidade = col_character(),
## `Tp. Log` = col_character(),
## Logadrouro = col_character(),
## Número = col_double(),
## Complemento = col_character(),
## Jornada = col_character()
## )
Agora vamos dar um merge
merged <- duplicatas %>%
filter(ano == 2019 & mes == 'Dezembro') %>% # mesmo mês do arquivo baixado
left_join(dados_abertos, by = c('nome' = 'nome_completo'))
Vamos ver os cargos que aparecem agora
merged %>%
distinct(cargo_base)
É possível notar que há cargos administrativos (Diretor de escola, Coordenardor pedagogico). Vamos ver a remuneração desses:
merged %>%
filter(cargo_base == 'DIRETOR DE ESCOLA') %>%
head()
Só há 6 linhas, e é possível observar que os três que aparecem estão duplicados. Ou seja, não há um caso (em dezembro de 2019) onde o diretor tem uma remuneração como professor e outra como diretor. As duplicatas são referentes ao mesmo cargo nesse caso. Mas é interessante que a soma das duas remunerações do SIOPE extrapolam o valor de remuneração bruta apresentado nos dados abertos da prefeitura.
Vamos ignorar a questão do diretor e explorar a base mais abertamente para ver o que descobrimos:
merged %>%
head(30)
É possível notar que tem uma certa intercalação na coluna “jornada”. No arquivo de dados abertos, essa coluna costuma mostrar as horas do servidor, só tendo o preenchimento diferenciado para os profissionais da educação. Como temos a carga horária pelo SIOPE, aparentemente não há distinção nas horas para o profissional ser JEI FORMACAO ou JB DOCENTE. Com isso, cabe investigar o que poderia explicar essa duplicata e a diferença entre as duas linhas.
Ainda assim, é possível notar que há casos como o de “ADINA APARECIDA CAPATTO”, que possui cargo_base diferenciado (PROFESSOR ENSINO FUNDAMENTAL II E MEDIO CAT 3 ; PROFESSOR ED INFANTIL E ENS FUNDAMENTAL CAT 3) no mesmo mês e local. Curiosamente, a coluna “Categoria profissional” também muda:
merged %>%
filter(nome == 'ADINA APARECIDA CAPATTO')
Em resumo, a resposta para essa pergunta é não. Cada linha foi tratada de forma individualizada.
Foram incluídos professores com carga horária de 15, 23, 30 e 40h semanais. A única exclusão feita referia-se a valores abaixo de um salário mínimo. O gráfico abaixo mostra como ficou a distribuição dos valores por hora.
sp_2019 %>%
mutate(total_pago = gsub("\\.","", total_a_b_c)) %>%
mutate(total_pago = gsub(",","\\.", total_pago)) %>%
mutate(total_pago = as.numeric(total_pago)) %>%
mutate(valor_hora = total_pago/(carga_horaria*4)) %>%
mutate(valor_ajustado = ifelse(total_pago > 33000, 33000/(carga_horaria*4), valor_hora)) %>%
ggplot(aes(x=carga_horaria, y=valor_ajustado, fill=as.factor(carga_horaria))) +
geom_violin()
Para identificar as escolas geograficamente periféricas, vamos calcular a distância euclidiana de cada escola até a Praça da Sé (centro geográfico de Sâo Paulo).
escolas_dist <- escolas_com_cod %>%
mutate(dif_lat = as.numeric(latitude) + 23.550531400378656,
dif_long = as.numeric(longitude) + 46.633829132143376,
dist_eucli = sqrt((dif_lat^2) + (dif_long^2)))
Agora vamos listar os outliers, tanto com base na média da hora quanto na mediana
out_medias <- boxplot(escolas_dist$media_hora_anual)$out
out_medianas <- boxplot(escolas_dist$mediana_hora_anual)$out
Outliers com base na mediana da hora cuja distância euclidiana do centro é maior que 0.07
escolas_dist %>%
filter(dist_eucli > 0.07 & mediana_hora_anual %in% out_medianas)
Entre essas escolas, a EMEI MANOEL FIEL FILHO se destaca com o maior IPVS (3,6) em São Rafael.
Outliers com base na mediana da hora cuja distância euclidiana do centro é maior que 0.07
escolas_dist %>%
filter(dist_eucli > 0.07 & media_hora_anual %in% out_medias)
Para as escolas outliers na média da hora paga, se destcam aquelas localizadas em Jardim Angela, com 4 outliers nesse distrito.
escolas_com_class <- escolas_dist %>%
mutate(etapa = case_when(grepl(local_de_exercicio, "^EMEI") ~ "EMEI",
grepl("^CEI", local_de_exercicio) ~ "CEI",
grepl("^CEMEI", local_de_exercicio) ~ "CEMEI",
grepl("^CEU CEI", local_de_exercicio) ~ "CEU CEI",
grepl("^CEU EMEI", local_de_exercicio) ~ "CEU EMEI",
grepl("^CEU EMEF", local_de_exercicio) ~ "CEU EMEF",
grepl("^CIEJA", local_de_exercicio) ~ "CIEJA",
grepl("^EMEF", local_de_exercicio) ~ "EMEF",
grepl("^EMEI", local_de_exercicio) ~ "EMEI"))
Distribuição da média das horas anuais de acordo com a etapa de cada escola. Cada observação representação uma escola.
escolas_com_class%>%
ggplot(aes(x=etapa, y=media_hora_anual, fill=as.factor(etapa))) +
geom_violin() +
geom_boxplot(width = 0.3, alpha=0.2) +
coord_flip()
Distribuição da mediana das horas anuais de acordo com a etapa de cada escola. Cada observação representação uma escola.
escolas_com_class%>%
ggplot(aes(x=etapa, y=mediana_hora_anual, fill=as.factor(etapa))) +
geom_violin() +
geom_boxplot(width = 0.3, alpha=0.2) +
coord_flip()
É possível notar que os CIEJAS se destacam com valores mais altos, tanto na média quanto na mediana, enquanto os CEMEIS se destacam com os valores mais baixos. Comparando EMEF com EMEI, no entanto, não parece ter diferenças substanciais na média, apesar de EMEIS possuírem escolas com médias mais altas.