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)-503
Regressão 905.84 561.62 58.62
Piecewise regression 907.27 562.50 59.50
K-means + regressão 893.01 553.66 50.66

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 503 em 2021.

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.

2 Dados e pré-processamento

Os dados utilizados são oriundos dos indicadores do TCU 2021, no ano-base 2021. 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, em 2021, o total equivalente de TAE da UFERSA soma \(503\) servidores. Somando a este número o total equivalente de terceirizados (309.5, sendo 308 terceirizados em regime de 40 horas e 1.5 em regime de 20 horas), obtemos o valor de 812.5 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{503}{812.5} \approx 0,62 \]

Ou seja, ao obter nossas gap de servidores, para o caso da UFERSA, multiplicamos este valor por \(0.62\) 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 0 2 0,5 1
30 h. 16 0 16 0,75 12
40 h. 512 22 490 1 490
Total 530 22 522 - 503

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")
dados <- read_csv("C:/Users/kassi/Desktop/servidores_progepe/data/Serie_Historica_Indicadores_TCU.csv")
# #View(dados)

# selecionando as colunas de interesse:

dados %>% filter(Ano == 2020) %>% 
  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

3 Análises

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

dados_filtrado$razao %>% summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.856   7.528   9.141  10.057  11.529  31.718

3.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)

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 10174.27 1311.50 1139.09 172.41
UFABC 9741.30 1074.50 1102.11 -27.61
UFAC 6016.81 895.60 784.05 111.55
UFAL 25074.64 1225.50 2411.57 -1186.07
UFAM 26724.59 2246.75 2552.47 -305.72
UFBA 32023.27 2974.90 3004.97 -30.07
UFC 32839.70 2190.25 3074.69 -884.44
UFCA 2507.15 516.25 484.33 31.92
UFCG 13348.00 1473.00 1410.12 62.88
UFCSPA 4719.60 360.95 673.27 -312.32
UFERSA 7443.00 812.50 905.84 -93.34
UFES 20538.05 1674.68 2024.15 -349.47
UFESBA 3790.25 119.50 593.90 -474.4
UFF 36920.20 3645.30 3423.16 222.14
UFFS 7738.05 846.63 931.04 -84.41
UFG 22222.38 2707.63 2167.99 539.64
UFGD 6824.36 814.25 853.01 -38.76
UFJF 19834.11 2272.20 1964.03 308.17
UFLA 13233.00 1069.00 1400.30 -331.3
UFMA 18099.78 1910.80 1815.92 94.88
UFMG 42529.31 4703.50 3902.18 801.32
UFMS 19705.10 1847.00 1953.01 -106.01
UFMT 15802.70 1594.00 1619.75 -25.75
UFOB 2547.62 395.25 487.78 -92.53
UFOP 9978.00 1083.25 1122.33 -39.08
UFOPA 3564.89 605.66 574.66 31
UFPA 32725.07 2842.95 3064.90 -221.95
UFPB 27213.75 3601.50 2594.24 1007.26
UFPE 37810.92 4111.00 3499.23 611.77
UFPel 10340.61 1287.00 1153.30 133.7
UFPI 27231.66 1278.03 2595.77 -1317.74
UFPR 23168.92 4115.71 2248.82 1866.89
UFRA 5182.83 675.00 712.83 -37.83
UFRB 7611.55 657.07 920.24 -263.17
UFRGS 43790.27 3885.00 4009.86 -124.86
UFRN 35160.69 3526.25 3272.90 253.35
UFRPE 12520.60 1644.50 1339.46 305.04
UFRR 4113.14 710.00 621.48 88.52
UFRRJ 10128.39 1562.00 1135.17 426.83
UFS 18045.34 1763.00 1811.27 -48.27
UFSC 26888.46 2941.25 2566.46 374.79
UFSCar 17326.38 1423.13 1749.87 -326.74
UFSM 21720.48 2490.80 2125.12 365.68
UFT 9756.25 1206.60 1103.39 103.21
UFTM 6508.32 1094.75 826.02 268.73
UFU 19592.91 2632.35 1943.43 688.92
UFV 14492.90 2554.25 1507.90 1046.35
UFVJM 6552.00 1056.75 829.75 227
UnB 41078.26 2803.25 3778.26 -975.01
UNIFAL 7030.35 678.85 870.60 -191.75
UNIFAP 7518.98 591.95 912.33 -320.38
UNIFEI 4817.13 573.00 681.60 -108.6
UNIFESP 24233.60 1796.00 2339.74 -543.74
UNIFESSPA 5073.15 474.50 703.46 -228.96
UNILA 3476.99 522.60 567.15 -44.55
UNILAB 3183.16 464.00 542.06 -78.06
UNIPAMPA 6575.84 1158.00 831.79 326.21
UNIR 7626.43 650.23 921.51 -271.28
UNIVASF 3556.00 695.25 573.90 121.35
UTFPR 22946.79 1122.50 2229.85 -1107.35

3.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 12312.17 10740.25
## 
## Coefficients of the linear terms:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 106.15206  275.69470   0.385   0.7017  
## x             0.10763    0.04054   2.655   0.0103 *
## U1.x         -0.02902    0.04196  -0.692       NA  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 532.2 on 56 degrees of freedom
## Multiple R-Squared: 0.7866,  Adjusted R-squared: 0.7752 
## 
## Boot restarting based on 6 samples. Last fit:
## Convergence attained in 2 iterations (rel. change 7.1775e-11)
# 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 10174.27 1311.50 1201.25 110.25
UFABC 9741.30 1074.50 1154.64 -80.14
UFAC 6016.81 895.60 753.76 141.84
UFAL 25074.64 1225.50 2434.65 -1209.15
UFAM 26724.59 2246.75 2564.36 -317.61
UFBA 32023.27 2974.90 2980.90 -6
UFC 32839.70 2190.25 3045.08 -854.83
UFCA 2507.15 516.25 376.01 140.24
UFCG 13348.00 1473.00 1512.79 -39.79
UFCSPA 4719.60 360.95 614.14 -253.19
UFERSA 7443.00 812.50 907.27 -94.77
UFES 20538.05 1674.68 2078.02 -403.34
UFESBA 3790.25 119.50 514.11 -394.61
UFF 36920.20 3645.30 3365.86 279.44
UFFS 7738.05 846.63 939.03 -92.4
UFG 22222.38 2707.63 2210.43 497.2
UFGD 6824.36 814.25 840.68 -26.43
UFJF 19834.11 2272.20 2022.68 249.52
UFLA 13233.00 1069.00 1503.75 -434.75
UFMA 18099.78 1910.80 1886.34 24.46
UFMG 42529.31 4703.50 3806.81 896.69
UFMS 19705.10 1847.00 2012.54 -165.54
UFMT 15802.70 1594.00 1705.76 -111.76
UFOB 2547.62 395.25 380.36 14.89
UFOP 9978.00 1083.25 1180.12 -96.87
UFOPA 3564.89 605.66 489.85 115.81
UFPA 32725.07 2842.95 3036.07 -193.12
UFPB 27213.75 3601.50 2602.81 998.69
UFPE 37810.92 4111.00 3435.89 675.11
UFPel 10340.61 1287.00 1219.15 67.85
UFPI 27231.66 1278.03 2604.22 -1326.19
UFPR 23168.92 4115.71 2284.84 1830.87
UFRA 5182.83 675.00 664.00 11
UFRB 7611.55 657.07 925.41 -268.34
UFRGS 43790.27 3885.00 3905.94 -20.94
UFRN 35160.69 3526.25 3227.54 298.71
UFRPE 12520.60 1644.50 1447.74 196.76
UFRR 4113.14 710.00 548.86 161.14
UFRRJ 10128.39 1562.00 1196.31 365.69
UFS 18045.34 1763.00 1882.06 -119.06
UFSC 26888.46 2941.25 2577.24 364.01
UFSCar 17326.38 1423.13 1825.54 -402.41
UFSM 21720.48 2490.80 2170.97 319.83
UFT 9756.25 1206.60 1156.25 50.35
UFTM 6508.32 1094.75 806.67 288.08
UFU 19592.91 2632.35 2003.72 628.63
UFV 14492.90 2554.25 1602.79 951.46
UFVJM 6552.00 1056.75 811.37 245.38
UnB 41078.26 2803.25 3692.74 -889.49
UNIFAL 7030.35 678.85 862.85 -184
UNIFAP 7518.98 591.95 915.45 -323.5
UNIFEI 4817.13 573.00 624.64 -51.64
UNIFESP 24233.60 1796.00 2368.53 -572.53
UNIFESSPA 5073.15 474.50 652.19 -177.69
UNILA 3476.99 522.60 480.39 42.21
UNILAB 3183.16 464.00 448.77 15.23
UNIPAMPA 6575.84 1158.00 813.93 344.07
UNIR 7626.43 650.23 927.01 -276.78
UNIVASF 3556.00 695.25 488.90 206.35
UTFPR 22946.79 1122.50 2267.37 -1144.87
##View(res_segmentado)

3.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 == "2") -> 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 = 7, color = "#ffffff", background = "black")
Valores estimados para o Grupo da UFERSA e gap de servidores
IFES ATI original predito gap
FURG 10174.27 1311.50 1165.86 145.64
UFABC 9741.30 1074.50 1122.61 -48.11
UFAC 6016.81 895.60 750.53 145.07
UFCA 2507.15 516.25 399.91 116.34
UFCG 13348.00 1473.00 1482.92 -9.92
UFCSPA 4719.60 360.95 620.94 -259.99
UFERSA 7443.00 812.50 893.01 -80.51
UFESBA 3790.25 119.50 528.09 -408.59
UFFS 7738.05 846.63 922.48 -75.85
UFGD 6824.36 814.25 831.20 -16.95
UFLA 13233.00 1069.00 1471.44 -402.44
UFOB 2547.62 395.25 403.95 -8.7
UFOP 9978.00 1083.25 1146.26 -63.01
UFOPA 3564.89 605.66 505.58 100.08
UFPel 10340.61 1287.00 1182.48 104.52
UFRA 5182.83 675.00 667.21 7.79
UFRB 7611.55 657.07 909.84 -252.77
UFRPE 12520.60 1644.50 1400.27 244.23
UFRR 4113.14 710.00 560.35 149.65
UFRRJ 10128.39 1562.00 1161.28 400.72
UFT 9756.25 1206.60 1124.10 82.5
UFTM 6508.32 1094.75 799.63 295.12
UFVJM 6552.00 1056.75 803.99 252.76
UNIFAL 7030.35 678.85 851.78 -172.93
UNIFAP 7518.98 591.95 900.60 -308.65
UNIFEI 4817.13 573.00 630.68 -57.68
UNIFESSPA 5073.15 474.50 656.26 -181.76
UNILA 3476.99 522.60 496.80 25.8
UNILAB 3183.16 464.00 467.44 -3.44
UNIPAMPA 6575.84 1158.00 806.38 351.62
UNIR 7626.43 650.23 911.33 -261.1
UNIVASF 3556.00 695.25 504.69 190.56
 

Desenvolvido por Kássio Camelo

kassio.silva@ufersa.edu.br