## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## 
## 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)
## Rows: 73
## Columns: 31
## $ Instituição                  <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS", "UNIV…
## $ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA D…
## $ 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, 0…
## $ per_comaluno_A1              <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, 2…
## $ per_comaluno_A2              <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, 1…
## $ 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, 3…
## $ 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(
    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)

Análise Exploratória dos Dados

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

Variable type: logical

skim_variable n_missing complete_rate mean count
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
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 = docentes, y = producao)) + 
  geom_point()

Parece que existe uma relação. logo, Vamos criar um modelo então:

modelo1 = lm(producao ~ docentes, data = cacc)

tidy(modelo1, conf.int = TRUE, conf.level = 0.95)
glance(modelo1)

Para visualizar o modelo:

cacc_augmented = cacc %>% 
  add_predictions(modelo1) 

cacc_augmented %>% 
  ggplot(aes(x = docentes)) + 
  geom_line(aes(y = pred), colour = "brown") + 
  geom_point(aes(y = producao)) + 
  labs(y = "Produção do programa")

Se considerarmos que temos apenas uma amostra de todos os programas de pós em CC no Brasil, o que podemos inferir a partir desse modelo sobre a relação entre número de docentes permanentes e produção de artigos em programas de pós?

Normalmente reportaríamos o resultado da seguinte maneira, substituindo VarIndepX e todos os x’s e y’s pelos nomes e valores de fato:

Regressão múltipla foi utilizada para analisar se VarIndep1 e VarIndep2 tem uma associação significativa com VarDep. Os resultados da regressão indicam que um modelo com os 2 preditores no formato VarDep = XXX.VarIndep1 + YYY.VarIndep2 explicam XX,XX% da variância da variável de resposta (R2 = XX,XX). VarIndep1, medida como/em [unidade ou o que é o 0 e o que é 1] tem uma relação significativa com o erro (b = [yy,yy; zz,zz], IC com 95%), assim como VarIndep2 medida como [unidade ou o que é o 0 e o que é 1] (b = [yy,yy; zz,zz], IC com 95%). O aumento de 1 unidade de VarIndep1 produz uma mudança de xxx em VarDep, enquanto um aumento…

Pelo que, eis a minha versão do texto:


Regressão linear simples foi utilizada para analisar se o número de docentes permanentes tem uma associação significativa com a produção de artigos (periódicos A1, A2 e B1) de um programa de pós-graduação em Ciência da Computação. Os resultados da regressão indicam que um modelo no formato producao = -41,32 + 4,81.docentes explica 81,5% da variância da variável de resposta (R² = 0,815). O número de docentes permanentes, medido em unidades de docentes, tem uma relação significativa e positiva com a produção de artigos (b = [4,27; 5,36], IC com 95%). O aumento de 1 docente permanente no programa produz uma mudança média de +4,81 artigos na produção do programa.


Dito isso, Na prática, este resultado confirma algo bastante intuitivo: programas maiores (com mais docentes permanentes) produzem, em termos absolutos, mais artigos. A relação é forte (R² = 0,815) provavelmente porque produção é, em boa medida, uma soma de contribuições individuais — cada docente publica seus próprios artigos, então quanto mais docentes um programa tem, mais “unidades produtoras” ele tem somando resultados, de forma quase mecânica. Isso é justamente o motivo pelo qual produção total não é uma boa métrica para comparar a qualidade ou o desempenho dos programas entre si: um programa pode produzir muito simplesmente por ser grande, sem que isso signifique que cada docente individualmente seja mais produtivo. É exatamente esse problema que motiva a análise de produtividade (produção por docente) feita mais adiante.


Mais fatores

modelo2 = lm(producao ~ docentes + mestrados_pprof + doutorados_pprof + tem_doutorado, 
             data = cacc_md)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

E se considerarmos também o número de alunos?

modelo2 = lm(producao ~ docentes + mestrados + doutorados, data = cacc)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

Visualizar o modelo com muitas variáveis independentes fica mais difícil

para_plotar_modelo = cacc %>% 
  data_grid(producao = seq_range(producao, 10), # Crie um vetor de 10 valores no range
            docentes = seq_range(docentes, 4),  
            # mestrados = seq_range(mestrados, 3),
            mestrados = median(mestrados),
            doutorados = seq_range(doutorados, 3)) %>% 
  add_predictions(modelo2)

glimpse(para_plotar_modelo)
## Rows: 120
## Columns: 5
## $ producao   <dbl> 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.000…
## $ docentes   <dbl> 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 27.91667, 47…
## $ mestrados  <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,…
## $ doutorados <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152,…
## $ pred       <dbl> 3.199123, 79.257725, 155.316327, 72.026777, 148.085378, 224…
para_plotar_modelo %>% 
  ggplot(aes(x = docentes, y = pred)) + 
  geom_line(aes(group = doutorados, colour = doutorados)) + 
  geom_point(data = cacc, aes(y = producao, colour = doutorados))

Considerando agora esses três fatores, podemos dizer o seguinte:

EXPLICAÇÃO: Regressão múltipla foi utilizada para analisar se docentes permanentes, dissertações de mestrado e teses de doutorado têm uma associação significativa com a produção de artigos. Os resultados da regressão indicam que um modelo com os 3 preditores no formato producao = -14,43 + 3,50.docentes - 0,20.mestrados + 1,00.doutorados explica 87,1% da variância da variável de resposta (R² = 0,871, R² ajustado = 0,865), um pouco mais que o modelo com apenas docentes (R² = 0,815). Docentes permanentes, medido em número de docentes, tem uma relação significativa e positiva com a produção (b = [2,58; 4,42], IC com 95%), assim como o número de teses de doutorado defendidas (b = [0,64; 1,37], IC com 95%). Já o número de dissertações de mestrado tem uma relação significativa, porém negativa e pequena, com a produção (b = [-0,36; -0,03], IC com 95%), quando controlamos pelos outros dois fatores.

Isso sugere que, quando dois programas têm o mesmo número de docentes e de doutorados, aquele com mais dissertações de mestrado tende a produzir (ligeiramente) menos artigos em periódicos de alto extrato, possivelmente porque orientação de mestrado consome tempo docente sem contribuir tanto quanto a orientação de doutorado para publicações em periódicos A1/A2/B1 (mestrandos publicam relativamente mais em conferências). Já teses de doutorado têm um efeito positivo considerável: cada doutorado formado está associado, em média, a +1 artigo de alto extrato no programa, o que faz sentido dado que orientações de doutorado no Brasil frequentemente resultam em coautorias em periódicos bem avaliados.

Vale notar que, ao ajustar esse mesmo modelo apenas nos programas com doutorado (cacc_md) incluindo também a variável tem_doutorado, o coeficiente de tem_doutorado não pôde ser estimado (fica NA): como filtramos para programas que têm doutorado, essa variável passa a ser constante dentro do subconjunto e a regressão não consegue estimar seu efeito ali. Isso ilustra na prática o cuidado que devemos ter ao comparar/combinar programas com e sem doutorado, mencionado no enunciado do laboratório.


Agora 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 julgo serem relevantes se relacionam com a produtividade dos programas. Criei um modelo que avalie como pelo menos 3 fatores se relacionam com a produtividade de um programa. reutilizei fatores que já defini e analizei para produção. tudo cuidadosamente 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)

abaixo, Produção do modelo e um texto que comente (i) o modelo, como o anterior, e (ii) as implicações - o que aprendemos sobre como funcionam programas de pós no brasil?.

Escolha dos fatores

produtividade já é uma razão (producao / docentes), então evitei incluir de volta docentes puro como algo redundante com ela — mas docentes não é uma função linear de produtividade (é o denominador, não uma soma de termos já presentes), então ele continua sendo um fator legítimo e interessante: ele nos diz se programas maiores são mais ou menos eficientes por docente, e não apenas mais produtivos em termos absolutos (o que já vimos no modelo 1).

Os três fatores escolhidos para o modelo principal (usando todos os 73 programas) são:

  • docentes (número de docentes permanentes): mede o porte do programa;
  • tem_doutorado (o programa oferece doutorado ou não): variável categórica sobre a maturidade/estrutura do programa;
  • mestrados_pprof (dissertações de mestrado por docente permanente): mede a carga de orientação de mestrado por professor.

Como o enunciado adverte, doutorados_pprof é sempre 0 nos programas sem doutorado — combiná-lo diretamente com tem_doutorado no mesmo modelo com todos os programas tornaria as duas variáveis quase redundantes e a comparação enganosa (não é que a orientação de doutorado é “zero” nesses programas, é que ela não existe). Por isso, no modelo com todos os programas usamos apenas o indicador tem_doutorado, e analisamos doutorados_pprof separadamente, olhando só para os programas que de fato têm doutorado (onde a variável tem uma variação que faz sentido comparar).

modelo_produtividade = lm(produtividade ~ docentes + mestrados_pprof + tem_doutorado,
                           data = cacc)

tidy(modelo_produtividade, conf.int = TRUE, conf.level = 0.95)
glance(modelo_produtividade)
cacc %>%
  ggplot(aes(x = tem_doutorado, y = produtividade)) +
  geom_boxplot(fill = paleta[4]) +
  geom_jitter(width = 0.1, alpha = .5) +
  labs(x = "Programa tem doutorado?", y = "Produtividade (artigos A1/A2/B1 por docente)")

cacc %>%
  ggplot(aes(x = docentes, y = produtividade, colour = tem_doutorado)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(x = "Docentes permanentes", y = "Produtividade", colour = "Tem doutorado")
## `geom_smooth()` using formula = 'y ~ x'


Regressão múltipla foi utilizada para analisar se o número de docentes permanentes, a carga de mestrandos por docente e a existência de doutorado no programa têm uma associação significativa com a produtividade (artigos em periódicos A1/A2/B1 por docente permanente). Os resultados da regressão indicam que um modelo com os 3 preditores no formato produtividade = 0,95 + 0,032.docentes + 0,037.mestrados_pprof + 1,34.tem_doutorado[Sim] explica 47,9% da variância da produtividade (R² = 0,479, R² ajustado = 0,457). O número de docentes permanentes tem uma relação significativa e positiva, ainda que pequena, com a produtividade (b = [0,009; 0,055], IC com 95%): cada docente a mais no programa está associado a um aumento médio de 0,03 artigo/docente na produtividade. O fato de o programa ter doutorado tem uma relação forte, positiva e significativa com a produtividade (b = [0,77; 1,91], IC com 95%): programas com doutorado produzem, em média, 1,34 artigo a mais por docente do que programas equivalentes sem doutorado. Já a quantidade de dissertações de mestrado por docente não teve relação significativa com a produtividade (b = [-0,09; 0,17], IC com 95%, p = 0,58).

Como o enunciado do laboratório chama atenção para o cuidado ao comparar programas com e sem doutorado (nos quais doutorandos é sempre zero), fiz também uma análise complementar considerando apenas os 34 programas que têm doutorado, trocando tem_doutorado (que aqui não varia) por doutorados_pprof (doutorandos titulados por docente):

modelo_produtividade_doutorado = lm(produtividade ~ docentes + mestrados_pprof + doutorados_pprof,
                                     data = cacc_md)

tidy(modelo_produtividade_doutorado, conf.int = TRUE, conf.level = 0.95)
glance(modelo_produtividade_doutorado)
cacc_md %>%
  ggplot(aes(x = doutorados_pprof, y = produtividade)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, colour = paleta[5]) +
  labs(x = "Doutorados titulados por docente", y = "Produtividade")
## `geom_smooth()` using formula = 'y ~ x'

Dentro do subconjunto de programas com doutorado, o modelo (produtividade = 2,44 + 0,006.docentes + 0,021.mestrados_pprof + 0,67.doutorados_pprof) explica 28,5% da variância da produtividade (R² = 0,285, R² ajustado = 0,213) — um poder explicativo bem menor que o modelo geral, o que já era esperado, já que a maior fonte de variação (ter ou não ter doutorado) foi removida ao restringirmos a amostra. Nesse subgrupo, nem docentes (b = [-0,027; 0,040], p = 0,71) nem mestrados_pprof (b = [-0,19; 0,24], p = 0,84) têm relação significativa com a produtividade. Já doutorados_pprof tem uma relação significativa e positiva (b = [0,13; 1,21], IC com 95%, p = 0,018): cada doutorando titulado a mais por docente está associado a um aumento médio de 0,67 artigo/docente na produtividade.


O que aprendemos sobre como funcionam os programas de pós em Ciência da Computação no Brasil?

O achado mais forte é que ter doutorado é o fator mais associado a produtividade: muito mais do que o tamanho do programa (docentes) ou a carga de mestrandos. Isso não é surpreendente: programas com doutorado passaram por uma avaliação prévia da CAPES para serem credenciados a oferecê-lo, então “ter doutorado” funciona como um proxy de maturidade/qualidade consolidada do programa (corpo docente mais experiente, infraestrutura, redes de colaboração, financiamento), coisas que tendem a se traduzir em publicações de maior extrato per capita. fa O segundo achado interessante é que, quando olhamos para os programas que já têm doutorado, o que continua diferenciando a produtividade não é mais o tamanho do programa nem a quantidade de mestrandos, mas sim quantos doutorandos cada docente forma. Ou seja, dentro do universo dos programas “maduros” (com doutorado), o que separa os mais produtivos dos menos produtivos é a intensidade da orientação de doutorado por professor, e não o número de docentes ou de dissertações de mestrado em si. Isso é consistente com a ideia de que doutorandos são coautores frequentes em periódicos de alto extrato, funcionando quase como um multiplicador de produtividade docente — mas também pode refletir causalidade reversa/seleção: docentes já mais produtivos atraem e retêm mais doutorandos.

Em nenhum dos dois modelos a carga de mestrandos por docente teve relação significativa com produtividade, sugerindo que, ao contrário do doutorado, orientar mais ou menos mestrandos (dentro da faixa observada nesses programas) não está fortemente associado a mais ou menos artigos em periódicos bem avaliados, talvez porque a produção de mestrandos se concentre mais em conferências (que não entram nessa métrica de produtividade).

Por fim, é importante frisar a diferença entre os dois modelos de produção (seção anterior) e os de produtividade (esta seção): docentes, mestrados e doutorados sozinhos explicam muito bem a produção total de um programa (R² ≈ 0,87), simplesmente porque programas maiores produzem mais em termos absolutos. Mas quando dividimos pelo número de docentes para medir produtividade, esse poder explicativo cai bastante (R² ≈ 0,48, ou 0,29 só entre programas com doutorado) — ou seja, o tamanho de um programa muito pouco nos diz sobre o quão eficiente/produtivo ele é por docente. O que realmente parece diferenciar programas eficientes de programas menos eficientes é a maturidade do programa (ter doutorado) e a intensidade da orientação de doutorado, não a quantidade de gente envolvida.