1 Introdução

Foi solicitada uma estimativa do número de TAE necessários na UFERSA. Para chegar neste resultado, utilizamos três métodos: regressão simples, piecewise regression e agrupamento K-means com regressão simples dentro de cada grupo.

Em todos os casos foi verificada uma defasagem no número de servidores necessário para colocar a UFERSA num patamar médio, relativo às outras IFES na amostra, conforme a tabela abaixo:

Método Funcionário equivalente ideal (1) TAE equivalente ideal(2) Gap=(2)-510,75
Regressão 932,43 559,45 48.7
Piecewise regression 989,63 593,65 82,9
K-means + regressão 1002,87 601.72 90,97

Mais do que o quantitativo em si, os resultados obtidos mostram que há uma defasagem no número de funcionários equivalente em relação à média das IFES na amostra, sendo o número de TAE equivalente aproximadamente 510,75 em 2019.

Devemos notar que, neste caso, não estamos fazendo inferência sobre os parâmetros da regressão. Apenas estamos utilizando a reta ajustada como referência do valor esperado do número de TAE dada a quantidade de estudantes. # Dados e pré-processamento

Os dados utilizados são oriundos dos indicadores do TCU em 2019, já que os dados de 2020 ainda não estão disponíveis. O indicador do TCU que avalia a quantidade de Funcionários equivalente em relação ao número de estudantes é

\[\frac{\text{Número de estudantes em tempo integral}}{\text{Funcionário equivalente}}\]

É importante salientar que o indicador Funcionário equivalente inclui os funcionários terceirizados. Não é possível realizar este estudo desconsiderando os terceirizados, uma vez que o TCU recolhe somente os dados agregados de concursados e terceirizados. Para chegar ao número de TAE necessários, supõe-se que seja mantida a proporção entre servidores concursados e terceirizados. No caso da UFERSA, o número equivalente de TAE é obtido de modo proporcional á carga horária. Por exemplo, um servidor de 40 horas conta como 1, enquanto o servidor em regime de 20 horas conta como meio servidor equivalente. Os dados da UFERSA, extraídos da planilha interna de cálculo dos indicadores do TCU é apresentada abaixo:

Assim, o total equivalente de TAE da UFERSA soma \(510,75\). Somando a este número o total equivalente de terceirizados (334 terceirizados em regime de 40 horas), obtemos o valor de 844,75 Funcionários Equivalente. Obtemos então a proporção de TAE equivalente em relação ao total de funcionários da seguinte maneira:

\[\frac{\text{TAE equivalente}}{\text{Funcionário equivalente}} = \frac{510,75}{844,75} \approx 0,60 \]

Ou seja, ao obter nossas gap de servidores, para o caso da UFERSA, multiplicamos este valor por \(0.6\) para chegar ao número de TAE equivalente necessários para que a UFERSA esteja em patamar médio de servidores.

Regime Número de TAE (1) Afastados (2) (1)-(2) Peso Equivalente
20 h. 2 1 1 0,5 0,5
30 h. 21 2 19 0,75 14,25
40 h. 525 29 496 1 496
Total 548 32 516 - 510,75

Ajustamos os modelos de regressão utilizando o número de estudantes em tempo integral (ATI) como variável independente (x) e o número de funcionários equivalente como variável dependente (y). O número de estudantes em tempo integral compreende os estudantes de graduação e pós-graduação. O número de funcionários equivalente utilizado foi aquele em que os servidores lotados nos Hospitais Universitários não é considerado.

Ao ajustar a reta, localizamos o ponto do gráfico correspondente à UFERSA. Se o ponto estiver abaixo da reta, indicamos que, dado o número de alunos, a universidade conta com um quantitativo de servidores abaixo da média.

O valor predito pela regressão para os pontos é obtido e comparado com o valor observado, ou seja, a partir do erro obtemos o saldo (gap) de servidores, onde os valores negativos indicam que a IFES em questão apresenta defasagem de pessoal.

Nas tabelas apresentadas em cada método, temos para cada IFES o total de Alunos em tempo Integral (ATI), o número de Funcionários Equivalente (original) e o número de funcionários ideal, predito pelo modelo (predito). A diferença \(original - predito\) é o gap. Valores em azul mostram IFES com quantidade de servidores acima da média, dado o seu ATI, enquanto os valores em vermelho mostram IFES com déficit de servidores em relação à média. Destacamos a UFERSA em preto.

# Analise da quantidade ideal de servidores
# na ufersa utilizando dados oficiais do TCU

library(readr)
library(dplyr)
library(tibble)
library(tidyr)
library(ggplot2)
library(ggpmisc)
library(MASS)
library(segmented)
library(kableExtra)

# Abrindo os dados --------------------------------------------------------

dados <- read_csv("G:/Drives compartilhados/ESTATISTICA/servidores_progepe/data/Serie_Historica_Indicadores_TCU.csv")
# #View(dados)

# selecionando as colunas de interesse:

dados %>% filter(Ano == 2019) %>% 
  dplyr::select(SiglaIFES,`Número de alunos tempo integral`,`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`) %>% 
  mutate(razao = `Número de alunos tempo integral`/`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`) %>%
  drop_na() -> dados_filtrado # %>% tibble::column_to_rownames(var = "SiglaIFES") 



#dados_filtrado %>% View

2 Análises

# Primeira análise: Aluno em Tempo Integral/Funcionario Equivalente -------

dados_filtrado$razao %>% summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   5.112   7.164   9.629   9.913  11.347  24.901

2.1 Regressão simples

# Segunda análise: grafica ------------------------------------------------

p <- ggplot(dados_filtrado, aes(x=`Número de alunos tempo integral`, 
                                y=`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`))

my.formula <- y ~ x

p + geom_point() + geom_smooth(method=lm, formula = my.formula) + 
  geom_text(position = position_dodge(width=0.9),vjust = -0.5,size=2,
            aes(label=SiglaIFES))

p + geom_point() + geom_smooth(method=lm, formula = my.formula) + 
  stat_poly_eq(formula = my.formula, 
               aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
               parse = TRUE) +
  geom_text(data = subset(dados_filtrado, SiglaIFES %in% c("UFERSA")),
            aes(x=`Número de alunos tempo integral`, 
                y=`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`,
                label = SiglaIFES), position = position_dodge(width=0.9),
            vjust = -0.2, hjust = -.2, size=5, col='red') +
  geom_point(data = subset(dados_filtrado, SiglaIFES %in% c("UFERSA")),
            aes(x=`Número de alunos tempo integral`, 
                y=`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`), 
            col='red', size=3)

# ajustando o modelo de regressao

model <- lm(`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`~
              `Número de alunos tempo integral`,
            data = dados_filtrado)


#model
#summary(model)
1/0.09 # a cada 11 alunos em tempo integral, adicionamos um TAE.
## [1] 11.11111
res = data.frame(IFES = dados_filtrado$SiglaIFES,
                 original = dados_filtrado$`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`,
                 predito = model$fitted.values) %>% 
  mutate(gap = original-predito, 
         ATI = dados_filtrado$`Número de alunos tempo integral`) %>%  
  mutate_if(is.numeric, round, digits = 2)



res %>% 
  mutate(gap = cell_spec(gap, "html", 
                         color = ifelse(gap < 0, "red", "blue"))) %>%
   dplyr::select(IFES, ATI, original, predito, gap) %>%
   kbl(format = "html", escape = F,
       caption = "Número original, valor estimado e gap de servidores") %>%
   kable_minimal(full_width = F) %>% 
  row_spec(row = 11, color = "#ffffff", background = "black")
Número original, valor estimado e gap de servidores
IFES ATI original predito gap
FURG 10250.78 1145.70 1095.87 49.83
UFABC 9976.00 970.75 1071.00 -100.25
UFAC 7462.90 887.75 843.54 44.21
UFAL 19590.34 1254.00 1941.19 -687.19
UFAM 21380.94 1679.25 2103.25 -424
UFBA 35345.00 3383.05 3367.13 15.92
UFC 33478.91 2307.75 3198.23 -890.48
UFCA 2571.35 503.00 400.81 102.19
UFCG 18302.00 2125.25 1824.58 300.67
UFCSPA 4554.77 377.30 580.33 -203.03
UFERSA 8445.00 844.75 932.43 -87.68
UFES 21870.41 1747.95 2147.56 -399.61
UFESBA 1541.50 233.75 307.60 -73.85
UFF 43431.31 4039.00 4099.02 -60.02
UFFS 6405.76 889.18 747.86 141.32
UFG 27573.11 2860.28 2663.70 196.58
UFGD 7170.44 842.00 817.07 24.93
UFJF 21988.46 2457.25 2158.24 299.01
UFLA 12834.99 1160.88 1329.77 -168.89
UFMA 18284.88 1901.25 1823.03 78.22
UFMG 47914.27 4843.60 4504.77 338.83
UFMS 18766.02 1748.75 1866.58 -117.83
UFMT 18846.24 1753.50 1873.84 -120.34
UFOB 2235.72 415.50 370.43 45.07
UFOP 11658.00 1131.75 1223.24 -91.49
UFOPA 5150.79 554.91 634.27 -79.36
UFPA 45015.66 3340.18 4242.42 -902.24
UFPB 30535.08 3677.75 2931.79 745.96
UFPE 42191.34 3716.00 3986.79 -270.79
UFPel 11761.39 1644.75 1232.60 412.15
UFPI 20387.10 1799.75 2013.30 -213.55
UFPR 33740.70 3718.82 3221.93 496.89
UFRA 4990.25 817.00 619.74 197.26
UFRB 7425.05 1172.96 840.12 332.84
UFRGS 45279.31 3942.75 4266.28 -323.53
UFRJ 56009.00 8024.00 5237.41 2786.59
UFRN 35576.67 3586.00 3388.10 197.9
UFRPE 12724.49 1799.25 1319.76 479.49
UFRR 4650.20 706.13 588.97 117.16
UFRRJ 12733.69 1814.00 1320.60 493.4
UFS 21763.96 1760.50 2137.92 -377.42
UFSC 34945.37 3174.50 3330.96 -156.46
UFSCar 18507.63 1370.63 1843.19 -472.56
UFSJ 11035.00 976.63 1166.85 -190.22
UFSM 23932.65 2537.78 2334.21 203.57
UFT 10084.75 1168.73 1080.84 87.89
UFTM 6898.66 1182.75 792.47 390.28
UFU 23669.00 2861.85 2310.34 551.51
UFV 17147.95 2801.00 1720.13 1080.87
UFVJM 7164.94 1172.00 816.57 355.43
UnB 45649.70 2681.00 4299.80 -1618.8
UNIFAL 5487.24 670.85 664.73 6.12
UNIFAP 8371.49 637.40 925.78 -288.38
UNIFEI 8388.23 576.50 927.29 -350.79
UNIFESP 22708.50 1762.25 2223.41 -461.16
UNIFESSPA 3361.00 301.00 472.28 -171.28
UNILA 3249.27 532.75 462.17 70.58
UNILAB 3693.62 681.00 502.39 178.61
UNIPAMPA 7138.14 1174.75 814.15 360.6
UNIR 7892.30 869.65 882.41 -12.76
UNIVASF 5740.00 426.75 687.60 -260.85
UTFPR 28579.57 1147.75 2754.80 -1607.05

2.2 Piecewise Regression

Referência

https://onlinelibrary.wiley.com/doi/abs/10.1002/sim.1545

# Terceira analise: regressão linear segmentada ---------------------------

# piecewise regression
# teste com pacote segmented

dati = data.frame(x = dados_filtrado$`Número de alunos tempo integral`,
                  y = dados_filtrado$`Número de funcionários equivalentes excluindo aqueles a serviço nos Hus`,
                  zz =dados_filtrado$SiglaIFES)

out.lm <- lm(y ~ x, data = dati)
o <- segmented(out.lm, seg.Z = ~x, npsi = 1,
               control = seg.control(display = FALSE))
dat2 = data.frame(x = dati$x, y = broken.line(o)$fit)

# slope(o)
summary.segmented(o)
## 
##  ***Regression Model with Segmented Relationship(s)***
## 
## Call: 
## segmented.lm(obj = out.lm, seg.Z = ~x, npsi = 1, control = seg.control(display = FALSE))
## 
## Estimated Break-Point(s):
##             Est.   St.Err
## psi1.x 45649.77 1831.373
## 
## Meaningful coefficients of the linear terms:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3.322e+02  9.572e+01    3.47 0.000988 ***
## x           7.785e-02  4.537e-03   17.16  < 2e-16 ***
## U1.x        3.227e-01  7.665e-02    4.21       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 437.9 on 58 degrees of freedom
## Multiple R-Squared: 0.9046,  Adjusted R-squared: 0.8997 
## 
## Convergence attained in 5 iter. (rel. change 8.6932e-07)
# o$fitted.values
# coef(o)
# print.segmented(o)

# grafico 1

#plot(dati$x,dati$y)
## add the fitted lines using different colors and styles..
#plot(o,add=TRUE,link=FALSE,lwd=2,col=2:3, lty=c(1,3), conf.level=0.95, 
#     shade=TRUE, col.shade="red")
#lines(o,col=2,pch=19,bottom=FALSE,lwd=2) #for the CI for the breakpoint
#points(o,col=4, link=FALSE)

# grafico 2
q = ggplot(dati, aes(x = x, y = y)) 

q +
  geom_point() +
  geom_line(data = dat2, color = 'blue') +
  geom_text(data = subset(dati, zz %in% c("UFERSA")),
            aes(x=x, 
                y=y,
                label = zz), position = position_dodge(width=0.9),
            vjust = -0.2, hjust = -.2, size=5, col='red') +
  geom_point(data = subset(dati, zz %in% c("UFERSA")),
             aes(x=x, 
                 y=y), 
             col='red', size=3)

res_segmentado = data.frame(IFES = dati$zz,
                 ATI = dati$x,
                 original = dati$y,
                 predito = o$fitted.values) %>% 
  mutate(gap = original-predito,
         ATI = dati$x) %>%  mutate_if(is.numeric, round, digits = 2)



res_segmentado %>% 
  mutate(gap = cell_spec(gap, "html", 
                         color = ifelse(gap < 0, "red", "blue"))) %>%
   dplyr::select(IFES, ATI, original, predito, gap) %>%
   kbl(format = "html", escape = F,
       caption = "Número original, valor estimado e gap de servidores pelo método Piecewise Regression") %>%
   kable_minimal(full_width = F) %>% 
  row_spec(row = 11, color = "#ffffff", background = "black")
Número original, valor estimado e gap de servidores pelo método Piecewise Regression
IFES ATI original predito gap
FURG 10250.78 1145.70 1130.21 15.49
UFABC 9976.00 970.75 1108.82 -138.07
UFAC 7462.90 887.75 913.17 -25.42
UFAL 19590.34 1254.00 1857.29 -603.29
UFAM 21380.94 1679.25 1996.69 -317.44
UFBA 35345.00 3383.05 3083.78 299.27
UFC 33478.91 2307.75 2938.51 -630.76
UFCA 2571.35 503.00 532.37 -29.37
UFCG 18302.00 2125.25 1756.99 368.26
UFCSPA 4554.77 377.30 686.77 -309.47
UFERSA 8445.00 844.75 989.63 -144.88
UFES 21870.41 1747.95 2034.79 -286.84
UFESBA 1541.50 233.75 452.19 -218.44
UFF 43431.31 4039.00 3713.30 325.7
UFFS 6405.76 889.18 830.87 58.31
UFG 27573.11 2860.28 2478.74 381.54
UFGD 7170.44 842.00 890.40 -48.4
UFJF 21988.46 2457.25 2043.98 413.27
UFLA 12834.99 1160.88 1331.39 -170.51
UFMA 18284.88 1901.25 1755.66 145.59
UFMG 47914.27 4843.60 4792.98 50.62
UFMS 18766.02 1748.75 1793.12 -44.37
UFMT 18846.24 1753.50 1799.36 -45.86
UFOB 2235.72 415.50 506.24 -90.74
UFOP 11658.00 1131.75 1239.76 -108.01
UFOPA 5150.79 554.91 733.17 -178.26
UFPA 45015.66 3340.18 3836.64 -496.46
UFPB 30535.08 3677.75 2709.33 968.42
UFPE 42191.34 3716.00 3616.77 99.23
UFPel 11761.39 1644.75 1247.81 396.94
UFPI 20387.10 1799.75 1919.32 -119.57
UFPR 33740.70 3718.82 2958.89 759.93
UFRA 4990.25 817.00 720.68 96.32
UFRB 7425.05 1172.96 910.23 262.73
UFRGS 45279.31 3942.75 3857.16 85.59
UFRJ 56009.00 8024.00 8035.07 -11.07
UFRN 35576.67 3586.00 3101.82 484.18
UFRPE 12724.49 1799.25 1322.78 476.47
UFRR 4650.20 706.13 694.20 11.93
UFRRJ 12733.69 1814.00 1323.50 490.5
UFS 21763.96 1760.50 2026.50 -266
UFSC 34945.37 3174.50 3052.67 121.83
UFSCar 18507.63 1370.63 1773.00 -402.37
UFSJ 11035.00 976.63 1191.26 -214.63
UFSM 23932.65 2537.78 2195.34 342.44
UFT 10084.75 1168.73 1117.28 51.45
UFTM 6898.66 1182.75 869.25 313.5
UFU 23669.00 2861.85 2174.81 687.04
UFV 17147.95 2801.00 1667.15 1133.85
UFVJM 7164.94 1172.00 889.98 282.02
UnB 45649.70 2681.00 3886.00 -1205
UNIFAL 5487.24 670.85 759.37 -88.52
UNIFAP 8371.49 637.40 983.91 -346.51
UNIFEI 8388.23 576.50 985.21 -408.71
UNIFESP 22708.50 1762.25 2100.04 -337.79
UNIFESSPA 3361.00 301.00 593.84 -292.84
UNILA 3249.27 532.75 585.14 -52.39
UNILAB 3693.62 681.00 619.73 61.27
UNIPAMPA 7138.14 1174.75 887.89 286.86
UNIR 7892.30 869.65 946.60 -76.95
UNIVASF 5740.00 426.75 779.04 -352.29
UTFPR 28579.57 1147.75 2557.10 -1409.35
##View(res_segmentado)

2.3 Método 3: K-means + regressão

Neste terceiro método, adotamos o agrupamento K-means e dentro de cada grupo ajustamos um modelo de regressão. Por praticidade, apresentamos apenas a tabela com os dados do grupo em que a UFERSA foi enquadrado.

# K-means + regressão -----------------------------------------------------


library(factoextra)


dados_filtrado %>% dplyr::select(-razao) -> dados_filtrado

dados_filtrado %>% remove_rownames %>% column_to_rownames(var="SiglaIFES") ->
  dados_filtrado_kmeans

# passo 1: determinar o numero de clusters

fviz_nbclust(dados_filtrado_kmeans, kmeans, method = "wss") +
  geom_vline(xintercept = 3, linetype = 2)

# o grafico do cotovelo manda fazermos 3 clusters

set.seed(3285)

k1 <- kmeans(dados_filtrado_kmeans, centers = 3, nstart = 25)

fviz_cluster(k1, data = dados_filtrado_kmeans)

dados_filtrado_kmeans %>% rownames_to_column("zz") -> dados_filtrado_kmeans

# Agora, vamos adicionar a regressão no grafico:
dados_filtrado_kmeans["grupo"] <- k1$cluster
colnames(dados_filtrado_kmeans) <- c("zz", "x", "y", "grupo")
tibble(dados_filtrado_kmeans) %>% hablar::convert(hablar::chr(grupo)) ->
  dados_filtrado_kmeans

ggplot(dados_filtrado_kmeans, aes(x=x, y=y, color=grupo, shape=grupo)) +
  geom_point() + 
  geom_smooth(method=lm) + 
  stat_poly_eq(formula = my.formula, 
               aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
               parse = TRUE) +
  geom_text(data = subset(dados_filtrado_kmeans, zz %in% c("UFERSA")),
            aes(x=x, 
                y=y,
                label = zz), position = position_dodge(width=0.9),
            vjust = -0.2, hjust = -.2, size=5, col='red') +
  geom_point(data = subset(dados_filtrado_kmeans, zz %in% c("UFERSA")),
             aes(x=x, 
                 y=y), 
             col='red', size=3)

# grupo 3
dados_filtrado_kmeans %>% filter(grupo == "3") -> dati2
reg2 = lm(y~x, data = dati2)

res_kmeans = data.frame(IFES = dati2$zz, original = dati2$y, 
                  predito = reg2$fitted.values) %>% 
  mutate(gap = original-predito,
         ATI = dati2$x) %>%  mutate_if(is.numeric, round, digits = 2)


res_kmeans %>% 
  mutate(gap = cell_spec(gap, "html", 
                         color = ifelse(gap < 0, "red", "blue"))) %>%
   dplyr::select(IFES, ATI, original, predito, gap) %>%
   kbl(format = "html", escape = F,
       caption = "Valores estimados para o Grupo da UFERSA e gap de servidores") %>%
   kable_minimal(full_width = F) %>% 
  row_spec(row = 6, color = "#ffffff", background = "black")
Valores estimados para o Grupo da UFERSA e gap de servidores
IFES ATI original predito gap
FURG 10250.78 1145.70 1187.85 -42.15
UFABC 9976.00 970.75 1159.70 -188.95
UFAC 7462.90 887.75 902.27 -14.52
UFCA 2571.35 503.00 401.20 101.8
UFCSPA 4554.77 377.30 604.37 -227.07
UFERSA 8445.00 844.75 1002.87 -158.12
UFESBA 1541.50 233.75 295.70 -61.95
UFFS 6405.76 889.18 793.98 95.2
UFGD 7170.44 842.00 872.31 -30.31
UFLA 12834.99 1160.88 1452.57 -291.69
UFOB 2235.72 415.50 366.82 48.68
UFOP 11658.00 1131.75 1332.00 -200.25
UFOPA 5150.79 554.91 665.43 -110.52
UFPel 11761.39 1644.75 1342.59 302.16
UFRA 4990.25 817.00 648.98 168.02
UFRB 7425.05 1172.96 898.39 274.57
UFRPE 12724.49 1799.25 1441.25 358
UFRR 4650.20 706.13 614.15 91.98
UFRRJ 12733.69 1814.00 1442.19 371.81
UFSJ 11035.00 976.63 1268.18 -291.55
UFT 10084.75 1168.73 1170.84 -2.11
UFTM 6898.66 1182.75 844.47 338.28
UFVJM 7164.94 1172.00 871.75 300.25
UNIFAL 5487.24 670.85 699.89 -29.04
UNIFAP 8371.49 637.40 995.34 -357.94
UNIFEI 8388.23 576.50 997.06 -420.56
UNIFESSPA 3361.00 301.00 482.09 -181.09
UNILA 3249.27 532.75 470.64 62.11
UNILAB 3693.62 681.00 516.16 164.84
UNIPAMPA 7138.14 1174.75 869.00 305.75
UNIR 7892.30 869.65 946.26 -76.61
UNIVASF 5740.00 426.75 725.78 -299.03
 

Desenvolvido por Kássio Camelo

kassio.silva@ufersa.edu.br