## ── Attaching packages ──────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✓ ggplot2 3.3.0     ✓ purrr   0.3.3
## ✓ tibble  2.1.3     ✓ dplyr   0.8.4
## ✓ tidyr   1.0.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.4.0
## ── Conflicts ─────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## 
## Attaching package: 'modelr'
## The following object is masked from 'package:broom':
## 
##     bootstrap

Dados da CAPES sobre avaliação da pós-graduação

A CAPES é um órgão do MEC que tem a atribuição de acompanhar a pós-graduação na universidade brasileira. Uma das formas que ela encontrou de fazer isso e pela qual ela é bastante criticada é através de uma avaliação quantitativa a cada x anos (era 3, mudou para 4).

Usaremos dados da penúltima avaliação da CAPES:

cacc_tudo = read_projectdata()

glimpse(cacc_tudo)
## Observations: 73
## Variables: 31
## $ Instituição                  <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS", "UNI…
## $ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA …
## $ Nível                        <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3…
## $ Sigla                        <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI",…
## $ `Tem doutorado`              <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim"…
## $ `Docentes colaboradores`     <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00, 1.00…
## $ `Docentes permanentes`       <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75,…
## $ `Docentes visitantes`        <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75, 0.50…
## $ `Resumos em conf`            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27,…
## $ `Resumos expandidos em conf` <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, 16, 5…
## $ `Artigos em conf`            <int> 390, 284, 115, 73, 150, 269, 179, 0, 120…
## $ Dissertacoes                 <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3,…
## $ Teses                        <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0…
## $ periodicos_A1                <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0,…
## $ periodicos_A2                <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2…
## $ periodicos_B1                <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4,…
## $ periodicos_B2                <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, 0, 0,…
## $ periodicos_B3                <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9, 0, 2…
## $ periodicos_B4                <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0, 4, 5…
## $ periodicos_B5                <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0,…
## $ periodicos_C                 <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1,…
## $ periodicos_NA                <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, …
## $ per_comaluno_A1              <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, …
## $ per_comaluno_A2              <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, …
## $ per_comaluno_B1              <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, 0, 1,…
## $ per_comaluno_B2              <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0…
## $ per_comaluno_B3              <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, 0, 0, 1…
## $ per_comaluno_B4              <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, 0, 2, 0…
## $ per_comaluno_B5              <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, 0, 2, 5…
## $ per_comaluno_C               <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, 0, 11, …
## $ per_comaluno_NA              <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, 0, 17…

Produção e produtividade de artigos

Uma das maneiras de avaliar a produção dos docentes que a CAPES utiliza é quantificando a produção de artigos pelos docentes. Os artigos são categorizados em extratos ordenados (A1 é o mais alto), e separados entre artigos em conferências e periódicos. Usaremos para esse lab a produção em periódicos avaliados com A1, A2 e B1.

cacc = cacc_tudo %>%
  transmute(
    is_CC = grepl("CIÊNCIAS DA COMPUTAÇÃO", Programa, fixed=T) |
            grepl("CIÊNCIA DA COMPUTAÇÃO", Programa, fixed=T),
    Nível = Nível,
    Teses = Teses,
    Dissertacoes = Dissertacoes,
    `Artigos em conf` = `Artigos em conf`,
    per_NA = periodicos_NA + per_comaluno_NA,
    com_aluno = (per_comaluno_A1 + per_comaluno_A2 + per_comaluno_B1),
    periodicos_baixoqualis = periodicos_C + periodicos_NA,
    contribuidores_externos = `Docentes colaboradores` + `Docentes visitantes`,
    docentes = `Docentes permanentes`,
    producao = (periodicos_A1 + periodicos_A2 + periodicos_B1),
    produtividade = producao / docentes,
    mestrados = Dissertacoes,
    doutorados = Teses,
    tem_doutorado = tolower(`Tem doutorado`) == "sim",
    mestrados_pprof = mestrados / docentes,
    doutorados_pprof = doutorados / docentes
  )

cacc_md = cacc %>% 
  filter(tem_doutorado)
cacc %>%
  glimpse()
## Observations: 73
## Variables: 17
## $ is_CC                   <lgl> FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, …
## $ Nível                   <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3, 4, …
## $ Teses                   <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, …
## $ Dissertacoes            <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108,…
## $ `Artigos em conf`       <int> 390, 284, 115, 73, 150, 269, 179, 0, 120, 92,…
## $ per_NA                  <int> 13, 29, 10, 13, 21, 9, 25, 35, 12, 15, 29, 0,…
## $ com_aluno               <int> 13, 8, 10, 2, 5, 36, 14, 0, 6, 0, 30, 0, 1, 8…
## $ periodicos_baixoqualis  <int> 16, 49, 20, 16, 14, 9, 30, 40, 12, 24, 35, 1,…
## $ contribuidores_externos <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.75, 1.50, 7.2…
## $ docentes                <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75, 16.0…
## $ producao                <int> 53, 78, 23, 5, 17, 79, 50, 2, 18, 14, 99, 6, …
## $ produtividade           <dbl> 2.1414141, 5.5714286, 2.3000000, 0.3571429, 1…
## $ mestrados               <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108,…
## $ doutorados              <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, …
## $ tem_doutorado           <lgl> TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, …
## $ mestrados_pprof         <dbl> 4.3636364, 5.5000000, 5.0000000, 1.7857143, 3…
## $ doutorados_pprof        <dbl> 0.5656566, 0.0000000, 0.0000000, 0.0000000, 0…

EDA

skimr::skim(cacc)
Data summary
Name cacc
Number of rows 73
Number of columns 17
_______________________
Column type frequency:
logical 2
numeric 15
________________________
Group variables None

Variable type: logical

skim_variable n_missing complete_rate mean count
is_CC 0 1 0.49 FAL: 37, TRU: 36
tem_doutorado 0 1 0.47 FAL: 39, TRU: 34

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Nível 0 1 3.84 1.17 3.00 3.00 3.00 4.00 7.00 ▇▅▁▁▁
Teses 0 1 14.96 30.98 0.00 0.00 0.00 14.00 152.00 ▇▁▁▁▁
Dissertacoes 0 1 75.79 63.23 0.00 39.00 58.00 103.00 433.00 ▇▃▁▁▁
Artigos em conf 0 1 245.58 182.61 0.00 124.00 199.00 296.00 959.00 ▇▆▂▁▁
per_NA 0 1 24.32 17.39 0.00 13.00 20.00 30.00 90.00 ▇▇▂▁▁
com_aluno 0 1 21.33 35.98 0.00 2.00 8.00 25.00 193.00 ▇▁▁▁▁
periodicos_baixoqualis 0 1 28.73 18.28 0.00 16.00 25.00 38.00 92.00 ▇▇▃▂▁
contribuidores_externos 0 1 4.26 4.11 0.00 1.50 3.00 5.75 22.25 ▇▃▁▁▁
docentes 0 1 20.63 12.27 8.25 11.25 16.75 25.75 67.25 ▇▃▁▁▁
producao 0 1 58.03 65.44 0.00 18.00 42.00 67.00 355.00 ▇▂▁▁▁
produtividade 0 1 2.36 1.37 0.00 1.40 2.27 3.20 5.66 ▆▇▇▅▂
mestrados 0 1 75.79 63.23 0.00 39.00 58.00 103.00 433.00 ▇▃▁▁▁
doutorados 0 1 14.96 30.98 0.00 0.00 0.00 14.00 152.00 ▇▁▁▁▁
mestrados_pprof 0 1 3.66 1.81 0.00 2.57 3.58 4.88 8.19 ▂▇▇▃▂
doutorados_pprof 0 1 0.43 0.73 0.00 0.00 0.00 0.57 2.69 ▇▁▁▁▁
cacc %>% 
  ggplot(aes(x = docentes)) + 
  geom_histogram(bins = 15, fill = paleta[1])

cacc %>% 
  ggplot(aes(x = producao)) + 
  geom_histogram(bins = 15, fill = paleta[2])

cacc %>% 
  ggplot(aes(x = produtividade)) + 
  geom_histogram(bins = 15, fill = paleta[3])

Se quisermos modelar o efeito do tamanho do programa em termos de docentes (permanentes) na quantidade de artigos publicados, podemos usar regressão.

Importante: sempre queremos ver os dados antes de fazermos qualquer modelo ou sumário:

cacc %>% 
  ggplot(aes(x = mestrados, y = produtividade)) + 
  geom_point()

  • Há índicio de um padrão. Porém há também considerável dispersão, o que torna o padrão menos claro. Isso sugere que mestrados é uma possível preditor de interesse, mas cujo impacto talvez seja limitado.
cacc %>% 
  ggplot(aes(x = docentes, y = producao)) + 
  geom_point() +
  facet_wrap(~ Nível, labeller = "label_both")

  • Podemos ver um padrão em função de Nível, isso sugere Nível como um preditor de interesse
cacc %>% 
  ggplot(aes(x = `Artigos em conf`, y = produtividade)) + 
  geom_point()

  • Há índicio de um padrão. Porém há também considerável dispersão, o que torna o padrão menos claro. Isso sugere que Artigos em conf é uma possível preditor de interesse, mas cujo impacto talvez seja limitado.

Análise de Produtividade

Diferente de medirmos produção (total produzido), é medirmos produtividade (produzido / utilizado). Abaixo focaremos nessa análise. Para isso crie um modelo que investiga como um conjunto de fatores que você julga que são relevantes se relacionam com a produtividade dos programas. Crie um modelo que avalie como pelo menos 3 fatores se relacionam com a produtividade de um programa. Pode reutilizar fatores que já definimos e analizamos para produção. Mas cuidado para não incluir fatores que sejam função linear de outros já incluídos (ex: incluir A, B e um tercero C=A+B)

Produza abaixo o modelo e um texto que comente (i) o modelo, tal como os que fizemos antes, e (ii) as implicações - o que aprendemos sobre como funcionam programas de pós no brasil?.

modelo = lm(produtividade ~ `Artigos em conf` + mestrados + Nível, data = cacc)

tidy(modelo,
     conf.int=TRUE,
     conf.level=0.95)

Impacto Positivo / Negativo

  • O model formulou que o preditor Artigos em conf tem um impacto positivo. É intuitivo que produzir mais artigos em conferências indique mais produtividade.
  • O model formulou que o preditor mestrados tem um impacto negativo. Esse resultado é contra intuitivo, um maior grande demais mestrados talvez seja associado a programas de níveis mais baixo. A interpretação não é claro, a priori esperaríamos que o preditor mestrados possuísse um efeito positivo.
  • O model formulou que o preditor Nível tem um impacto positivo. É intuitivo que seja um efeito positivo, quanto mais alto o nível do programa mais alto a produção exigida do programa. E como sabemos, produtividade é derivada de produção.

Significância

  • O intervalo de confiança de nenhum dos preditores cruza o 0, os três preditores são portanto estatisticamente significativos.

Relevância

Os estimados para Artigos em conf e mestrados possuem valores muito baixos, 0.004351066 e -0.008506629 respectivamente. Isso aponta que nenhum dos dois é particularmente relevante. * Em termos da regressão aumentar uma unidade Artigos em conf gera um aumento de 0.004351066 na produtividade, é fácil ver porque o preditor é pouco relevante. * Em termos da regressão aumentar uma unidade mestrados gera uma diminuição de -0.008506629 na produtividade, é fácil ver porque o preditor é pouco relevante.


O estimado para Nível foi de 0.655638162, em termos da regressão aumentar uma unidade Nível gera um aumento de 0.655638162 na produtividade. Nível é claramente nosso preditor mais relevante.

Nossa análise através de regressão linear apontou número de mestrados e número de artigos em conferência como parâmetros pouco relevantes para prever produtividade como descrita no contexto desse relatório.

tidy(modelo,
     conf.int=TRUE,
     conf.level=0.95) %>%
  filter(term != "(Intercept)") %>%
  ggplot(aes(term, estimate, ymin = conf.low, ymax = conf.high)) +
  geom_errorbar(size = 0.8, width= 0.4) +
  geom_point(color = "red", size = 2) +
  geom_hline(yintercept = 0, colour = "darkred") +
  labs(x = "preditor",
       y = "valor estimado  (95% de confiança)")

  • Pela visualização confirmamos que mestrados e Artigos em conf não são tão relevantes em termos práticos, e Nível se destaca como nosso preditor mais relevante.
modelo %>%
  glance()
  • Através do R² vemos que o modelo consegue explicar aproximadamente 63% da variância nos dados.
  • O R² ajustado aponta o modelo explicando aproximadamente 61% da variância nos dados. O R² ajustado menor que o R² original demonstra que temos preditores irrelevantes, pela nossa avaliação apontou mestrados e Artigos em conf como esses `preditores.
para_plotar_modelo = cacc %>%
  
  
  data_grid(produtividade = seq_range(produtividade, 5), # Crie um vetor de 10 valores no range
            `Artigos em conf` = seq_range(`Artigos em conf`, 5),  
            #mestrados = seq_range(mestrados, 5),
            mestrados = median(mestrados),
            Nível = seq_range(Nível, 5),) %>% 
  add_predictions(modelo)

glimpse(para_plotar_modelo)
## Observations: 125
## Variables: 5
## $ produtividade     <dbl> 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0…
## $ `Artigos em conf` <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 239.75, 239.75, 239.7…
## $ mestrados         <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,…
## $ Nível             <dbl> 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 3, 4, …
## $ pred              <dbl> 0.8994103, 1.5550484, 2.2106866, 2.8663248, 3.52196…
para_plotar_modelo %>% 
  ggplot(aes(x = `Artigos em conf`, y = pred)) + 
  geom_line(aes(group = mestrados, colour = mestrados)) + 
  geom_point(data = cacc, aes(y = produtividade, colour = mestrados)) +
  facet_wrap(~ Nível, labeller = "label_both") +
  labs(y = "Predições")

  • Vemos que nosso modelo não prevê particularmente bem produtividade, o que bate com nosso R² em torno de 0.62.
  • O modelo tem sinais de “bias”, ou seja ele é simples demais. Mesmo nosso melhor preditor Nível não é o suficiente para explicar bem a questão de produtividade, isso nos leva a concluir que apesar de ser nosso preditor mais relevante, Nível tem limitações em sua relevância.

Resumo do modelo

Regressão múltipla foi utilizada para analisar se Artigos em conf, Nível e mestrados tem uma associação significativa com produtividade. Os resultados da regressão indicam que um modelo com os 3 preditores no formato produtividade = Artigos em conf + mestrados + Nível explica 62,54% da variância da variável de resposta (R2 = 0,6254). Artigos em conf, medida em unidades de artigotem uma relação significativa com o erro (b = [0.002396278, 0.006305855], IC com 95%), assim como mestrados medida como número inscritos em programa de mestrado (b = [-0.013737694, -0.003275565], IC com 95%), e assim como Nível medida em uma escala númerica indo de 3 a 7 (b = [0.388719886, 0.922556437], IC com 95%). O aumento de 1 unidade de Artigos em conf produz uma mudança de 0.004351066 em produtividade, enquanto um aumento de 1 unidade em mestrados produz uma mudança de 0.008506629 em produtividade, por fim um aumento de 1 unidade em Nível produz uma mudança de 0.655638162 em produtividade.

O que aprendemos

A partir de nossa análise via regressão linear percebemos que nos Programas de Pós Graduação o Nível do Programa dentro do contexto CAPES possui de fato um impacto em sua produtividade. Vimos um efeito relativamente forte, onde programas de nível mais alto tendem a ser mais produtivos.

Vimos que número de mestrados e número de artigos em conferência se demonstraram inexpressivos. Curiosamente, número de mestrados teve um efeito negativo, algo até um tanto quanto contraintuitvo. Mais mestrados representa mais pessoa que podem contribuir, mas também mais pessoas que podem ser ineficientes. Um número excessivo pode também representar de certa forma um programa de menor nível pois é esperado que em um programa de mais alto nível haja doutorados, e se estes não existirem o vácuo seria preenchido por mestrados.