O objetivo desse arquivo é identificar a melhor forma de obter a média salarial dos professores. Antes de mais nada, é necessário resgatar o dataframe gerado no arquivo anterior.
load('../dados/sp_2019.RData')
Idealmente, precisaríamos verificar se funcionários podem estar lotados em mais de uma escola. Entretanto, como não há outro identificador além do nome, isso não é possível. Por esse motivo, vamos trabalhar com a premissa de que cada funcionário lotado em uma entidade é uma pessoa distinta.
De forma a ter uma comparação adequada, será calculado o valor da hora de cada funcionário. Antes, iremos verificar a distribuição da carga horária de cada funcionário.
sp_2019 %>%
group_by(carga_horaria) %>%
summarise(contagem = n()) %>%
mutate(perc = contagem/sum(contagem))
É possível notar que apenas uma pequena parcela possui 40h de carga horária, com a maioria trabalhando 30h. Para ter certeza que o número de horas trabalhadas não afeta significativamente o valor pago, vamos fazer uma comparação visual. Para isso será necessário criar a coluna de valor da hora.
sp_2019 <- 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))
Agora a identificação visual:
sp_2019 %>%
ggplot(aes(x=carga_horaria, y=valor_hora, fill=as.factor(carga_horaria))) +
geom_violin()
A identificação visual não traz muitas respostas por conta de valores outliers presentes na base. Não parece razoável que uma pessoa tenha, sozinha, conseguido R$ 3.750 a hora. Por isso, vamos explorar esses dados:
sp_2019 %>%
filter(valor_hora > 3750) %>%
kable(align="l") %>%
kable_styling(bootstrap_options = c("striped", "hover"), position = "center") %>%
scroll_box(width = "90%", height = "400px")
ano | mes | nome | codigo_do_local_de_exercicio | local_de_exercicio | carga_horaria | tipo_categoria | categoria_profissional | situacao_profissional | salario_ou_vencimento_basico_r | com_parcela_minima_de_60_percent_do_fundeb | com_parcela_minima_de_40_percent_do_fundeb_b | outras_receitas_c | total_a_b_c | total_pago | valor_hora |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2019 | Março | CELIA APARECIDA LEME | 000000849445 | EMEF JARDIM DA CONQUISTA | 23 | Profissionais do magistério | Docente habilitado em curso de licenciatura plena | Efetivo | 4.972,54 | 51.841,93 | 0,00 | 331.420,33 | 383.262,26 | 383262.3 | 4165.894 |
2019 | Abril | IRENE SANDRA CARIELO MARTINS | 000000202690 | EMEF AROLDO DE AZEVEDO PROF | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 9.151,11 | 72.915,34 | 0,00 | 428.112,43 | 501.027,77 | 501027.8 | 4175.231 |
2019 | Maio | JAIR JORGE DE OLIVEIRA | 000000539641 | CIEJA CENTRO INT ED JOVENS E ADULTOS - CAMPO LIMPO | 30 | Profissionais do magistério | Docente habilitado em curso de licenciatura plena | Efetivo | 9.495,78 | 66.422,78 | 0,00 | 443.909,68 | 510.332,46 | 510332.5 | 4252.770 |
2019 | Junho | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 9.151,11 | 71.638,90 | 0,00 | 430.376,27 | 502.015,17 | 502015.2 | 4183.460 |
2019 | Junho | SONIA APARECIDA VAZ DA SILVA DE JESUS | 000000206092 | EMEI J G DE ARAUJO JORGE | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.916,79 | 58.097,93 | 0,00 | 419.346,73 | 477.444,66 | 477444.7 | 3978.706 |
2019 | Agosto | DENISE GIL | 000000202903 | EMEF PAULO ROLIM LOUREIRO D | 23 | Profissionais do magistério | Docente habilitado em curso de licenciatura plena | Efetivo | 6.863,60 | 48.003,43 | 0,00 | 326.615,23 | 374.618,66 | 374618.7 | 4071.942 |
2019 | Setembro | MARILUCI LOPES | 000000653657 | CEU EMEF PAULO GOMES CARDIM PROF DR | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 7.302,20 | 59.708,74 | 0,00 | 399.119,69 | 458.828,43 | 458828.4 | 3823.570 |
2019 | Outubro | MARIA APARECIDA GREGORIO CONCEICAO | 000002901676 | EMEI PIRAJUSSARA | 40 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 11.162,97 | 90.154,44 | 0,00 | 536.481,55 | 626.635,99 | 626636.0 | 3916.475 |
2019 | Novembro | SONIA APARECIDA VAZ DA SILVA DE JESUS | 000000206092 | EMEI J G DE ARAUJO JORGE | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 9.670,32 | 57.518,02 | 0,00 | 411.426,13 | 468.944,15 | 468944.2 | 3907.868 |
2019 | Janeiro | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.593,14 | 64.886,50 | 0,00 | 394.091,43 | 458.977,93 | 458977.9 | 3824.816 |
Tomando como base a “EMILIA MARIA GARCIA DOS SANTOS” que supostamente recebeu R$ 502 mil em junho de 2019, vamos verificar se esse valor bate com o descrito nos dados abertos pela prefeitura de SP. Segundo os dados fornecidos no portal municipal ( http://dados.prefeitura.sp.gov.br/dataset/remuneracao-servidores-prefeitura-de-sao-paulo ), de fato houve essa remuneração naquele mês.
Ao contrário dos anos anteriores para outros municípios, não parece haver entradas incorretas, como por exemplo funcionários consolidando todos os salários de uma unidade educacional. Ainda assim, há valores atípicos.
Para facilitar, vamos desconsiderar todos os valores acima de 33 mil reais mensais, o teto do funcionalismo em 2019.
sp_2019 <- sp_2019 %>%
mutate(valor_ajustado = ifelse(total_pago > 33000, 33000/(carga_horaria*4), valor_hora))
Vendo agora como fica a distribuição:
sp_2019 %>%
ggplot(aes(x=carga_horaria, y=valor_ajustado, fill=as.factor(carga_horaria))) +
geom_violin()
A tabela abaixo apresenta a mediana e media por grupo:
sp_2019 %>%
group_by(carga_horaria) %>%
summarise(media = mean(valor_ajustado), mediana = median(valor_ajustado)) %>%
kable(align="l") %>%
kable_styling(bootstrap_options = c("striped", "hover"), position = "center") %>%
scroll_box(width = "90%", height = "400px")
carga_horaria | media | mediana |
---|---|---|
15 | 109.75541 | 86.07717 |
23 | 62.51787 | 48.11739 |
30 | 72.63871 | 54.78533 |
40 | 94.30754 | 80.23425 |
É possível notar que os professores com carga de 23h e 30h possuem uma distribuição do valor pago por hora muito similar. Isso também se reflete na média e mediana das duas categorias, que também são próximas. Já os professores com carga de 15 e 40h possuem uma distribuição do pagamento da hora menos afunilada, com médias e medianas consideravalmente afastadas das outras duas categorias. É importante considerar isso na análise conforme pode ser um dos fatores explicativos para diferenças salariais. Ou seja, apesar de uma escola poder ter média salarial por hora maior, se isso for reflexo apenas de mais funcionários com carga de 15h, pode ter implicações em como interpretar esses dados.
Por fim, alguns valores excessivamente baixos também estão presentes, com professores recebendo menos de R$ 998 mensais, o salário mínimo de 2019. Pode ser que esse valor seja decorrente de descontos por conta de greves ou outros fatores. Para evitar distorções, todos os pagamentos abaixo desse valor será desconsiderado
# Para robustez, descomentar
#sp_2019 <- sp_2019 %>%
# mutate(valor_ajustado = ifelse(total_pago < 998, 998/(carga_horaria*4), valor_hora))
sp_2019 <- sp_2019 %>%
filter(total_pago > 997)
Com os valores ajustados, cabe agora gerar uma segunda tabela com as médias salariais por escola.
escolas <- sp_2019 %>%
mutate(bol_15 = ifelse(carga_horaria == 15, 1, 0),
bol_23 = ifelse(carga_horaria == 23, 1, 0),
bol_30 = ifelse(carga_horaria == 30, 1, 0),
bol_40 = ifelse(carga_horaria == 40, 1, 0)) %>%
group_by(codigo_do_local_de_exercicio, mes) %>%
mutate(media_hora = mean(valor_ajustado), soma_15 = sum(bol_15), soma_23 = sum(bol_23), soma_30 = sum(bol_30), soma_40 = sum(bol_40), media_hora_real = mean(valor_hora)) %>%
mutate(mediana_hora = median(valor_hora)) %>%
ungroup() %>%
group_by(codigo_do_local_de_exercicio, local_de_exercicio) %>%
summarise(mediana_hora_anual = median(mediana_hora), media_hora_anual = mean(media_hora), media_15 = mean(soma_15), media_23 = mean(soma_23), media_30 = mean(soma_30), media_40 = mean(soma_40), media_hora_real = mean(valor_hora))
## `summarise()` has grouped output by 'codigo_do_local_de_exercicio'. You can override using the `.groups` argument.
Por último, vamos gerar os dados com a proporção de cada categoria profissional
cat <- sp_2019 %>%
filter(mes == "Janeiro") %>%
janitor::tabyl(codigo_do_local_de_exercicio, categoria_profissional)
colnames(cat)[2:6] <- c("cat_lic", "cat_med", "cat_ped", "cat_efet", "cat_nao")
escolas <- escolas %>%
left_join(cat, by = "codigo_do_local_de_exercicio")
Salvando:
save(escolas, file="../dados/escolas.RData")
Cálculo alternativo para identificar outliers
Uma forma de contornar esse problema é verificar a frequência desses valores para, então, eliminá-los. No caso da Emilia, por exemplo:
sp_2019 %>%
filter(nome == "EMILIA MARIA GARCIA DOS SANTOS") %>%
kable(align="l") %>%
kable_styling(bootstrap_options = c("striped", "hover"), position = "center") %>%
scroll_box(width = "90%", height = "400px")
ano | mes | nome | codigo_do_local_de_exercicio | local_de_exercicio | carga_horaria | tipo_categoria | categoria_profissional | situacao_profissional | salario_ou_vencimento_basico_r | com_parcela_minima_de_60_percent_do_fundeb | com_parcela_minima_de_40_percent_do_fundeb_b | outras_receitas_c | total_a_b_c | total_pago | valor_hora | valor_ajustado |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2019 | Fevereiro | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.593,14 | 14.319,95 | 0,00 | 374,80 | 14.694,75 | 14694.75 | 122.4562 | 122.4562 |
2019 | Março | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.593,14 | 14.319,95 | 0,00 | 356,06 | 14.676,01 | 14676.01 | 122.3001 | 122.3001 |
2019 | Abril | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.593,14 | 14.757,07 | 0,00 | 393,64 | 15.150,71 | 15150.71 | 126.2559 | 126.2559 |
2019 | Maio | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.593,14 | 14.706,87 | 0,00 | 412,39 | 15.119,26 | 15119.26 | 125.9938 | 125.9938 |
2019 | Junho | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 9.151,11 | 71.638,90 | 0,00 | 430.376,27 | 502.015,17 | 502015.17 | 4183.4597 | 275.0000 |
2019 | Julho | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 9.151,11 | 15.654,09 | 0,00 | 255,22 | 15.909,31 | 15909.31 | 132.5776 | 132.5776 |
2019 | Agosto | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 9.151,11 | 15.251,15 | 0,00 | 811,82 | 16.062,97 | 16062.97 | 133.8581 | 133.8581 |
2019 | Janeiro | EMILIA MARIA GARCIA DOS SANTOS | 000000202894 | EMEF LUIS SAIA ARQ | 30 | Profissionais do magistério | Docente habilitado em curso de pedagogia | Efetivo | 8.593,14 | 64.886,50 | 0,00 | 394.091,43 | 458.977,93 | 458977.93 | 3824.8161 | 275.0000 |
Os valores atípicos apareceram apenas em dois meses. Vamos então criar uma estimativa temporária de limite de remuneração e desconsiderar tudo que for pago acima disso para evitar que esses outliers influenciem as médias salariais das escolas.
O cálculo temporário feito será o seguinte:
sp_2019_2 <- sp_2019 %>%
group_by(nome,codigo_do_local_de_exercicio) %>%
mutate(mediana = median(valor_hora), mad = mad(valor_hora), meses = n()) %>%
ungroup %>%
mutate(upper_bound = mediana + 8*mad) %>%
mutate(valor_certo = ifelse(valor_hora > upper_bound, upper_bound, valor_hora))
Vamos ver como fica a distribuição visual agora. Vamos filtrar apenas aqueles professores que possuem mais de 5 meses registrados, visto que isso poderia atrapalhar o cálculo da mediana:
sp_2019_2 %>%
filter(meses > 5) %>%
filter(valor_certo > 275) %>%
nrow()
## [1] 1365
sp_2019 %>%
filter(total_pago > 33000) %>%
nrow()
## [1] 22167