I. Horas

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)

II. Média por escola

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.

III. Categoria profissional

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")

Apêndice

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
  • Fazer comparação com media depois trocar por mediana