1 Introdução

Este relatório apresenta uma análise exploratória e inferencial da pós-graduação stricto sensu brasileira entre 2021 e 2024, com base nos dados públicos da CAPES/Sucupira. Foram analisadas 28,977 entradas de cursos e 1,705,745 registros de discentes, distribuídos em cinco regiões e nove grandes áreas do conhecimento.


2 Q1 — Proporção de IES públicas e privadas

2.1 Visão geral por ano

prop_ano <- cursos |>
  count(ano_base, tipo_ies) |>
  group_by(ano_base) |>
  mutate(prop  = n / sum(n),
         label = scales::percent(prop, accuracy = 0.1)) |>
  ungroup()

prop_ano |>
  select(ano_base, tipo_ies, n, label) |>
  pivot_wider(names_from = tipo_ies,
              values_from = c(n, label)) |>
  kableExtra::kbl(
    caption = "Número e proporção de cursos por tipo de IES e ano",
    col.names = c("Ano", "N Privada", "N Pública",
                  "% Privada", "% Pública")
  ) |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed")
  )
Número e proporção de cursos por tipo de IES e ano
Ano N Privada N Pública % Privada % Pública
2021 1254 5907 17.5% 82.5%
2022 1217 5812 17.3% 82.7%
2023 1251 6048 17.1% 82.9%
2024 1271 6217 17.0% 83.0%
ggplot(prop_ano, aes(x = factor(ano_base), y = prop, fill = tipo_ies)) +
  geom_col(position = "fill", width = 0.6) +
  geom_text(aes(label = label),
            position = position_fill(vjust = 0.5),
            color = "white", fontface = "bold", size = 4) +
  scale_y_continuous(labels = scales::percent_format()) +
  scale_fill_manual(values = c("Pública" = "#2C7BB6", "Privada" = "#D7191C")) +
  labs(title = "Proporção de cursos de pós-graduação stricto sensu",
       subtitle = "Públicas × Privadas por ano (2021–2024)",
       x = "Ano", y = "Proporção", fill = "Tipo de IES") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")
Proporção de cursos por tipo de IES (2021–2024)

Proporção de cursos por tipo de IES (2021–2024)

2.2 Por região

prop_regiao <- cursos |>
  count(regiao, tipo_ies) |>
  group_by(regiao) |>
  mutate(prop  = n / sum(n),
         label = scales::percent(prop, accuracy = 0.1))

ggplot(prop_regiao,
       aes(x = reorder(regiao, prop), y = prop, fill = tipo_ies)) +
  geom_col(position = "fill", width = 0.6) +
  geom_text(aes(label = label),
            position = position_fill(vjust = 0.5),
            color = "white", fontface = "bold", size = 3.5) +
  coord_flip() +
  scale_y_continuous(labels = scales::percent_format()) +
  scale_fill_manual(values = c("Pública" = "#2C7BB6", "Privada" = "#D7191C")) +
  labs(title = "Proporção de cursos por região (acumulado 2021–2024)",
       x = NULL, y = "Proporção", fill = "Tipo de IES") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")
Proporção de cursos por região

Proporção de cursos por região

2.3 Por grande área do conhecimento

prop_area <- cursos |>
  filter(!is.na(grande_area)) |>
  count(grande_area, tipo_ies) |>
  group_by(grande_area) |>
  mutate(prop  = n / sum(n),
         label = scales::percent(prop, accuracy = 0.1))

ggplot(prop_area,
       aes(x = reorder(grande_area, prop), y = prop, fill = tipo_ies)) +
  geom_col(position = "fill", width = 0.6) +
  geom_text(aes(label = label),
            position = position_fill(vjust = 0.5),
            color = "white", fontface = "bold", size = 3.5) +
  coord_flip() +
  scale_y_continuous(labels = scales::percent_format()) +
  scale_fill_manual(values = c("Pública" = "#2C7BB6", "Privada" = "#D7191C")) +
  labs(title = "Proporção de cursos por grande área do conhecimento",
       subtitle = "Acumulado 2021–2024",
       x = NULL, y = "Proporção", fill = "Tipo de IES") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")
Proporção de cursos por grande área

Proporção de cursos por grande área

2.4 Conclusão Q1

A pós-graduação stricto sensu brasileira é predominantemente pública. Em 2021, 82,5% dos cursos pertenciam a IES públicas, proporção que cresceu levemente até 83,0% em 2024, indicando uma leve retração da participação privada ao longo do período. A variação regional é expressiva: o Norte concentra 95,9% dos cursos em IES públicas, enquanto o Sul apresenta a maior participação privada (26,7%). Por área, Ciências Sociais Aplicadas destaca-se com 37,0% de cursos privados, reflexo do peso de programas de Administração, Direito e Economia nesse segmento.


3 Q2 — Conceito CAPES, tempo de titulação e evasão

3.1 Estatísticas por conceito

q2_df |>
  group_by(conceito) |>
  summarise(
    `Programas`       = n(),
    `Tempo médio (anos)` = round(mean(tempo_med_anos, na.rm = TRUE), 2),
    `Tempo mediano`   = round(median(tempo_med_anos, na.rm = TRUE), 2),
    `Evasão média`    = scales::percent(mean(taxa_evasao, na.rm = TRUE),
                                        accuracy = 0.1),
    `Evasão mediana`  = scales::percent(median(taxa_evasao, na.rm = TRUE),
                                        accuracy = 0.1),
    .groups = "drop"
  ) |>
  kableExtra::kbl(caption = "Indicadores por conceito CAPES") |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed")
  )
Indicadores por conceito CAPES
conceito Programas Tempo médio (anos) Tempo mediano Evasão média Evasão mediana
3 3884 0.57 0.55 6.1% 3.4%
4 7142 0.60 0.58 4.4% 3.0%
5 4179 0.65 0.64 3.4% 2.6%
6 1646 0.67 0.66 3.0% 2.2%
7 1048 0.69 0.68 2.9% 2.1%

3.2 Conceito × tempo de titulação

ggplot(q2_df |> filter(!is.na(tempo_med_anos)),
       aes(x = factor(conceito), y = tempo_med_anos)) +
  geom_boxplot(fill = "#4393C3", alpha = 0.7,
               outlier.shape = 16, outlier.alpha = 0.3) +
  stat_summary(fun = mean, geom = "point",
               shape = 18, size = 3, color = "#D6604D") +
  labs(
    title    = "Tempo médio de titulação por conceito CAPES",
    subtitle = paste0("r = ", round(cor_tempo$estimate, 3),
                      " | p < 0,001"),
    x        = "Conceito CAPES",
    y        = "Tempo médio de titulação (anos)",
    caption  = "Losango vermelho = média"
  ) +
  theme_minimal(base_size = 13)
Tempo médio de titulação por conceito CAPES

Tempo médio de titulação por conceito CAPES

3.3 Conceito × taxa de evasão

ggplot(q2_df, aes(x = factor(conceito), y = taxa_evasao)) +
  geom_boxplot(fill = "#D6604D", alpha = 0.7,
               outlier.shape = 16, outlier.alpha = 0.3) +
  stat_summary(fun = mean, geom = "point",
               shape = 18, size = 3, color = "#2C7BB6") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  labs(
    title    = "Taxa de evasão por conceito CAPES",
    subtitle = paste0("r = ", round(cor_evasao$estimate, 3),
                      " | p < 0,001"),
    x        = "Conceito CAPES",
    y        = "Taxa de evasão",
    caption  = "Losango azul = média"
  ) +
  theme_minimal(base_size = 13)
Taxa de evasão por conceito CAPES

Taxa de evasão por conceito CAPES

3.4 Conclusão Q2

Existe relação estatisticamente significativa entre o conceito CAPES e ambos os indicadores analisados. Programas com conceito mais alto apresentam maior tempo médio de titulação (r = 0.152, p < 0,001), o que reflete maior exigência acadêmica. A relação com a taxa de evasão é negativa (r = -0.161, p < 0,001): programas mais bem avaliados retêm melhor seus alunos. Ambos os coeficientes são fracos em magnitude, o que é esperado em bases grandes, ou seja, a significância estatística não implica efeito prático forte, mas confirma tendências reais no sistema.


4 Q3 — Perfil discente: acadêmico × profissional

4.1 Estatísticas descritivas

discentes |>
  filter(modalidade %in% c("Acadêmico", "Profissional")) |>
  group_by(modalidade) |>
  summarise(
    N                    = scales::comma(n()),
    `Idade média`        = round(mean(idade, na.rm = TRUE), 1),
    `Idade mediana`      = round(median(idade, na.rm = TRUE), 1),
    `Tempo médio (anos)` = round(mean(tempo_titulacao_anos, na.rm = TRUE), 2),
    `% Titulado`         = paste0(round(mean(situacao == "Titulado") * 100, 1), "%"),
    `% Evadido`          = paste0(round(mean(situacao == "Evadido") * 100, 1), "%"),
    `% Matriculado`      = paste0(round(mean(situacao == "Matriculado") * 100, 1), "%"),
    .groups = "drop"
  ) |>
  kableExtra::kbl(caption = "Perfil discente por modalidade") |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed")
  )
Perfil discente por modalidade
modalidade N Idade média Idade mediana Tempo médio (anos) % Titulado % Evadido % Matriculado
Acadêmico 1,422,194 34.2 32 0.63 20.2% 3.7% 76%
Profissional 283,551 38.8 38 0.54 22.1% 4.9% 72.9%

4.2 Distribuição de idade e tempo de titulação

cores <- c("Acadêmico" = "#4393C3", "Profissional" = "#F4A582")

p1 <- discentes |>
  filter(!is.na(idade),
         modalidade %in% c("Acadêmico", "Profissional")) |>
  ggplot(aes(x = idade, fill = modalidade)) +
  geom_density(alpha = 0.6) +
  scale_fill_manual(values = cores) +
  labs(title = "Distribuição de idade",
       subtitle = paste0("Wilcoxon p < 0,001"),
       x = "Idade (anos)", y = "Densidade", fill = NULL) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")

p2 <- discentes |>
  filter(!is.na(tempo_titulacao_anos), tempo_titulacao_anos > 0,
         modalidade %in% c("Acadêmico", "Profissional")) |>
  ggplot(aes(x = tempo_titulacao_anos, fill = modalidade)) +
  geom_density(alpha = 0.6) +
  scale_fill_manual(values = cores) +
  labs(title = "Tempo de titulação",
       subtitle = paste0("Wilcoxon p < 0,001"),
       x = "Anos", y = "Densidade", fill = NULL) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")

p3 <- discentes |>
  filter(situacao %in% c("Titulado", "Evadido", "Matriculado"),
         modalidade %in% c("Acadêmico", "Profissional")) |>
  count(modalidade, situacao) |>
  group_by(modalidade) |>
  mutate(prop  = n / sum(n),
         label = scales::percent(prop, accuracy = 0.1)) |>
  ggplot(aes(x = modalidade, y = prop, fill = situacao)) +
  geom_col(position = "fill", width = 0.6) +
  geom_text(aes(label = label),
            position = position_fill(vjust = 0.5),
            color = "white", fontface = "bold", size = 4) +
  scale_y_continuous(labels = scales::percent_format()) +
  scale_fill_manual(values = c("Titulado"    = "#2C7BB6",
                               "Matriculado" = "#ABD9E9",
                               "Evadido"     = "#D7191C")) +
  labs(title = "Situação discente por modalidade",
       x = NULL, y = "Proporção", fill = "Situação") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")

patchwork::wrap_plots(p1, p2, p3, ncol = 1)

4.3 Conclusão Q3

As diferenças entre modalidades acadêmica e profissional são estatisticamente significativas em todos os indicadores analisados (Wilcoxon, p < 0,001). Discentes profissionais são em média 4,6 anos mais velhos (38,8 vs 34,2 anos), reflexo do perfil de quem já está inserido no mercado de trabalho. O tempo médio de titulação é levemente menor nos programas profissionais (0,54 vs 0,63 anos), coerente com a natureza mais aplicada desses cursos. A taxa de evasão é ligeiramente maior no segmento profissional (4,9% vs 3,7%).


5 Q4 — Evolução temporal por região (2021–2024)

5.1 Evolução de cursos e discentes

p1 <- ggplot(evolucao_cursos,
             aes(x = ano_base, y = n_cursos,
                 color = regiao, group = regiao)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  scale_x_continuous(breaks = 2021:2024) +
  scale_y_continuous(labels = scales::comma_format()) +
  scale_color_manual(values = cores_regiao) +
  labs(title = "Número de cursos por região",
       x = "Ano", y = "Cursos", color = "Região") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")

p2 <- ggplot(evolucao_discentes,
             aes(x = ano_base, y = n_discentes,
                 color = regiao, group = regiao)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  scale_x_continuous(breaks = 2021:2024) +
  scale_y_continuous(labels = scales::comma_format()) +
  scale_color_manual(values = cores_regiao) +
  labs(title = "Número de discentes por região",
       x = "Ano", y = "Discentes", color = "Região") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")

patchwork::wrap_plots(p1, p2, ncol = 1)

5.2 Variação relativa 2021–2024

variacao |>
  arrange(desc(variacao_pct)) |>
  mutate(variacao_pct = paste0(variacao_pct, "%"),
         discentes_2021 = scales::comma(discentes_2021),
         discentes_2024 = scales::comma(discentes_2024)) |>
  kableExtra::kbl(
    caption  = "Variação no número de discentes por região (2021→2024)",
    col.names = c("Região", "Discentes 2021", "Discentes 2024", "Variação (%)")
  ) |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed")
  )
Variação no número de discentes por região (2021→2024)
Região Discentes 2021 Discentes 2024 Variação (%)
Norte 23,608 26,821 13.6%
Nordeste 82,376 90,103 9.4%
Centro-Oeste 33,246 35,523 6.8%
Sudeste 195,378 195,488 0.1%
Sul 85,297 84,953 -0.4%

5.3 Conclusão Q4

O período 2021–2024 revela uma tendência de descentralização da pós-graduação brasileira. Norte (+13,6%), Nordeste (+9,4%) e Centro-Oeste (+6,8%) registraram crescimento expressivo no número de discentes, enquanto Sudeste (+0,1%) e Sul (-0,4%) praticamente estagnaram. O volume absoluto ainda é dominado pelo Sudeste, mas o dinamismo está nas regiões historicamente menos atendidas, sugerindo expansão do acesso à pesquisa de pós-graduação no interior do país.


6 Q5 — Comparação por área do conhecimento

6.1 Tabela comparativa

q5_df |>
  arrange(desc(n_programas)) |>
  mutate(
    n_discentes            = scales::comma(n_discentes),
    tempo_medio            = paste0(tempo_medio, " anos"),
    taxa_evasao            = paste0(taxa_evasao, "%"),
    prop_estrangeiros      = paste0(prop_estrangeiros, "%"),
    discentes_por_programa = scales::comma(discentes_por_programa)
  ) |>
  kableExtra::kbl(
    caption   = "Indicadores por grande área do conhecimento (2021–2024)",
    col.names = c("Grande área", "Programas", "Discentes",
                  "Tempo médio", "Evasão", "Estrangeiros",
                  "Discentes/programa")
  ) |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    font_size = 12
  )
Indicadores por grande área do conhecimento (2021–2024)
Grande área Programas Discentes Tempo médio Evasão Estrangeiros Discentes/programa
Multidisciplinar 872 273,830 0.58 anos 4.06% 0.9% 314.0
Ciências Da Saúde 755 251,285 0.65 anos 2.46% 1.29% 332.8
Ciências Humanas 711 296,257 0.61 anos 2.58% 1.01% 416.7
Ciências Sociais Aplicadas 676 243,925 0.6 anos 3.79% 0.81% 360.8
Engenharias 473 172,367 0.56 anos 6.51% 1.92% 364.4
Ciências Agrárias 450 121,735 0.67 anos 4.03% 2.29% 270.5
Ciências Exatas E Da Terra 363 143,060 0.59 anos 7.02% 2.68% 394.1
Ciências Biológicas 323 92,994 0.68 anos 3.03% 2.13% 287.9
Lingüística, Letras E Artes 245 110,292 0.6 anos 2.54% 1.04% 450.2

6.2 Heatmap comparativo

q5_heat <- q5_df |>
  select(grande_area, tempo_medio, taxa_evasao,
         prop_estrangeiros, discentes_por_programa) |>
  mutate(across(where(is.numeric), ~ scale(.x)[, 1])) |>
  pivot_longer(-grande_area, names_to = "indicador", values_to = "z")

ggplot(q5_heat, aes(x = indicador, y = grande_area, fill = z)) +
  geom_tile(color = "white", linewidth = 0.5) +
  geom_text(aes(label = round(z, 1)),
            size = 3.5, fontface = "bold") +
  scale_fill_gradient2(low      = "#D73027",
                       mid      = "white",
                       high     = "#4575B4",
                       midpoint = 0,
                       name     = "z-score") +
  scale_x_discrete(labels = c(
    "tempo_medio"            = "Tempo\ntitulação",
    "taxa_evasao"            = "Taxa\nevasão",
    "prop_estrangeiros"      = "Prop.\nestrangeiros",
    "discentes_por_programa" = "Discentes\npor programa"
  )) +
  labs(title    = "Heatmap de indicadores por grande área",
       subtitle = "Azul = acima da média | Vermelho = abaixo da média",
       x = NULL, y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid      = element_blank(),
        axis.text.x     = element_text(hjust = 0.5),
        legend.position = "right")
Heatmap de indicadores por área (z-score)

Heatmap de indicadores por área (z-score)

6.3 Conclusão Q5

As áreas diferem substancialmente em todos os indicadores. Ciências Biológicas e Ciências Agrárias lideram no tempo de titulação (0,68 e 0,67 anos), reflexo de pesquisas experimentais mais longas. Ciências Exatas e da Terra apresentam a maior taxa de evasão (7,02%), seguidas de Engenharias (6,51%). A internacionalização é maior em Ciências Exatas (2,68%) e Ciências Agrárias (2,29%). Linguística, Letras e Artes destaca-se pela maior densidade de discentes por programa (450), sugerindo programas maiores e mais abrangentes.


7 Considerações finais

As análises revelam um sistema de pós-graduação em transformação. A predominância pública permanece estável, mas há sinais claros de descentralização regional. A qualidade dos programas, medida pelo conceito CAPES, associa-se positivamente ao tempo de formação e negativamente à evasão. As diferenças entre modalidades acadêmica e profissional são consistentes e significativas. Por fim, as áreas do conhecimento apresentam perfis bastante distintos, o que reforça a necessidade de políticas diferenciadas para cada segmento da pós-graduação brasileira.


## R version 4.6.0 (2026-04-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Portuguese_Portugal.utf8  LC_CTYPE=Portuguese_Portugal.utf8   
## [3] LC_MONETARY=Portuguese_Portugal.utf8 LC_NUMERIC=C                        
## [5] LC_TIME=Portuguese_Portugal.utf8    
## 
## time zone: America/Fortaleza
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] broom_1.0.13     rstatix_0.7.3    patchwork_1.3.2  kableExtra_1.4.0
##  [5] scales_1.4.0     janitor_2.2.1    lubridate_1.9.5  forcats_1.0.1   
##  [9] stringr_1.6.0    dplyr_1.2.1      purrr_1.2.2      readr_2.2.0     
## [13] tidyr_1.3.2      tibble_3.3.1     ggplot2_4.0.3    tidyverse_2.0.0 
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.10        generics_0.1.4     xml2_1.5.2         stringi_1.8.7     
##  [5] hms_1.1.4          digest_0.6.39      magrittr_2.0.5     evaluate_1.0.5    
##  [9] grid_4.6.0         timechange_0.4.0   RColorBrewer_1.1-3 fastmap_1.2.0     
## [13] jsonlite_2.0.0     backports_1.5.1    Formula_1.2-5      viridisLite_0.4.3 
## [17] textshaping_1.0.5  jquerylib_0.1.4    abind_1.4-8        cli_3.6.6         
## [21] rlang_1.2.0        withr_3.0.2        cachem_1.1.0       yaml_2.3.12       
## [25] otel_0.2.0         tools_4.6.0        tzdb_0.5.0         vctrs_0.7.3       
## [29] R6_2.6.1           lifecycle_1.0.5    snakecase_0.11.1   car_3.1-5         
## [33] pkgconfig_2.0.3    bslib_0.11.0       pillar_1.11.1      gtable_0.3.6      
## [37] glue_1.8.1         systemfonts_1.3.2  xfun_0.57          tidyselect_1.2.1  
## [41] rstudioapi_0.18.0  knitr_1.51         farver_2.1.2       htmltools_0.5.9   
## [45] labeling_0.4.3     carData_3.0-6      rmarkdown_2.31     svglite_2.2.2     
## [49] compiler_4.6.0     S7_0.2.2