## ── 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
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,…
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)
skimr::skim(cacc)
| 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.
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.
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?.
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 só 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.