Financiamento e Desempenho na Pós-Graduação Brasileira: Uma Análise Integrada dos Discentes Stricto Sensu e da Concessão de Bolsas da CAPES

1 Introdução

A pós-graduação stricto sensu (Mestrado e Doutorado) constitui o principal pilar da produção científica, tecnológica e de inovação no Brasil. Coordenado e avaliado pela CAPES (Coordenação de Aperfeiçoamento de Pessoal de Nível Superior), o Sistema Nacional de Pós-Graduação (SNPG) forma dezenas de milhares de mestres e doutores anualmente, ao mesmo tempo em que enfrenta desafios históricos relacionados à assimetria regional, à retenção de talentos, ao tempo de titulação e à distribuição eficiente de recursos públicos de fomento (bolsas de estudo).

Compreender como o corpo discente está distribuído pelo país e como a concessão de bolsas da CAPES se relaciona com o porte, a excelência acadêmica (Conceito CAPES) e as taxas de sucesso (titulação vs. evasão) dos programas de pós-graduação é uma questão central para a ciência de dados aplicada a políticas públicas educacionais.

(Navegue pelas abas abaixo para explorar detalhadamente cada dimensão introdutória deste estudo).

1.1 Declaração do Problema

Qual é o problema endereçado e por que devemos nos interessar por ele?

O financiamento público da ciência no Brasil opera sob restrições orçamentárias constantes, exigindo que agências de fomento como a CAPES aloquem dezenas de milhares de bolsas de estudo entre milhares de Programas de Pós-Graduação (PPGs) distribuídos em um território continental marcado por desigualdades socioeconômicas e científicas. Nesse cenário, surgem questões críticas que frequentemente carecem de respostas empíricas integradas:

  1. Cobertura e Equidade de Fomento: Como se dá a relação entre o volume de alunos efetivamente matriculados em um programa de pós-graduação e a quantidade de bolsas concedidas pela CAPES? Existem disparidades severas de cobertura entre as macrorregiões brasileiras (ex.: Norte/Nordeste vs. Sudeste/Sul) ou entre Grandes Áreas do Conhecimento?
  2. Eficiência Acadêmica e Evasão: Qual é o perfil demográfico e acadêmico dos pós-graduandos brasileiros, quanto tempo levam para defender suas dissertações e teses, e em que medida o suporte financeiro via bolsas e o Conceito CAPES do programa estão associados a maiores taxas de titulação e menores índices de abandono/desligamento?
  3. Alocação Estratégica vs. Institucional: Como os diferentes mecanismos de fomento da CAPES — programas institucionais regulares (como DS, PROEX e PROSUP) versus programas estratégicos e induzidos (como PDPG e editais temáticos) — atendem às demandas de Mestrado e Doutorado?

Interessar-se por este problema é fundamental porque mais de 90% da produção científica nacional ocorre dentro dos programas de pós-graduação stricto sensu. Se os recursos de fomento forem mal distribuídos ou insuficientes, o país sofre com a “fuga de cérebros”, o aumento da evasão estudantil na pós-graduação e o aprofundamento das desigualdades científicas regionais.

1.2 Abordagem e Metodologia

Como planejamos abordar essa declaração de problema?

Para investigar essas questões de forma rigorosa e reprodutível, adotamos uma abordagem quantitativa e exploratória baseada na integração de duas bases de dados oficiais de dados abertos da CAPES:

  1. Base de Discentes da Pós-Graduação Stricto Sensu (Coleta Sucupira - Ano-Base 2021): Conjunto de microdados no nível do indivíduo contendo 419.905 registros e 37 variáveis, abrangendo todos os alunos matriculados, titulados, desligados ou que abandonaram cursos de Mestrado e Doutorado (acadêmicos e profissionais) no Brasil.
  2. Base de Concessão de Bolsas da CAPES por IES e Programa (Referência 2022): Conjunto de dados agregados contendo 13.815 registros e 17 variáveis, detalhando as 98.285 bolsas concedidas pela CAPES por Instituição de Ensino Superior (IES), Programa de Pós-Graduação, Nível (Mestrado, Doutorado, Pós-Doutorado) e Programa de Fomento.

A metodologia empregada segue o fluxo clássico da Ciência de Dados (Data Science Pipeline):

  • Importação e Padronização (Data Ingestion & Normalization): Leitura otimizada de arquivos de grande porte separados por ponto e vírgula (;) em codificação ISO-8859-1 (Latin-1), padronização de textos e conversão de datas no padrão SAS/Oracle (DDMMMYYYY:HH:MM:SS) para objetos Date nativos do R.
  • Saneamento e Tratamento de Peculiaridades (Data Cleaning): Identificação e recodificação de valores ausentes codificados textualmente (como "NÃO SE APLICA" e "NI" — Não Informado), filtragem de registros inconsistentes e tipagem adequada de fatores ordenados (como o Conceito CAPES de 1 a 7).
  • Reformulação e Engenharia de Atributos (Reshaping & Feature Engineering): Transformação de dados entre os formatos longo (long) e largo (wide) com pivot_wider() e pivot_longer(), separação e união de variáveis compostas, e criação de indicadores analíticos inéditos no nível do Programa de Pós-Graduação (CD_PROGRAMA_IES) e Nível Acadêmico.
  • Integração Relacional (Data Merging): Cruzamento (relational join) entre o quadro discente agregado dos programas e as concessões de bolsas da CAPES, permitindo mensurar diretamente a razão de bolsas por aluno ativo, a taxa de titulação e a taxa de evasão.

1.3 Técnicas Propostas

Quais técnicas e ferramentas específicas sustentarão a solução do problema?

A arquitetura técnica deste estudo combina manipulação avançada de dados com recursos modernos de visualização estática e interativa em R:

  • Agregação Multinível e Cruzamento Relacional: Como os microdados de discentes não informam individualmente o recebimento de bolsa (por restrições de sigilo e arquitetura da Plataforma Sucupira), propomos uma técnica de agregação multinível por chave composta (CD_PROGRAMA_IES + NIVEL_PADRAO). Agregamos os 419.905 discentes nos 4.696 programas de pós-graduação e cruzamos com os 3.814 programas contemplados na base de bolsas (atingindo mais de 99,3% de interseção dos programas financiados).
  • Reformulação Estrutural (Pivoting): Utilização de pivotagem para desdobrar as concessões de bolsas por modalidade de fomento (Institucional vs. Estratégico) e por situação acadêmica (Matriculado, Titulado, Evadido), viabilizando o cálculo de taxas de conversão e cobertura.
  • Criação de Indicadores Compostos: Desenvolvimento de variáveis derivadas essenciais, tais como:
    • Idade Estimada e Tempo Efetivo de Curso: Derivados das datas de nascimento, matrícula e situação.
    • Taxa de Cobertura de Bolsas (TAXA_COBERTURA_BOLSAS): Razão entre o total de bolsas CAPES concedidas ao programa/nível e o total de discentes ativos/matriculados naquele programa/nível.
    • Taxa de Evasão (TAXA_EVASAO) e Taxa de Sucesso na Titulação (TAXA_TITULACAO): Proporções calculadas sobre o corpo discente para avaliar a eficiência acadêmica de cada PPG.
  • Visualização Interativa e Tabelas Dinâmicas: Emprego de gráficos construídos com ggplot2 e convertidos para objetos interativos via plotly, além de tabelas paginadas, pesquisáveis e ordenáveis via pacote DT, permitindo que o leitor explore tanto o panorama macroeconômico quanto o desempenho específico de qualquer universidade ou programa do país.

1.4 Potenciais Clientes e Impacto

Como esta análise ajudará os potenciais clientes e partes interessadas (stakeholders)?

Os resultados, indicadores e produtos interativos gerados por esta análise oferecem valor direto para quatro grupos principais de clientes:

  1. Gestores Públicos da CAPES, MEC e Fundações Estaduais de Amparo à Pesquisa (FAPs): Poderão identificar “desertos de financiamento” — regiões, estados ou áreas estratégicas onde programas com bom desempenho acadêmico possuem baixa cobertura de bolsas por aluno — subsidiando a calibração de novos editais de fomento (como o PDPG).
  2. Pró-Reitorias de Pós-Graduação (PRPGs) e Coordenadores de PPGs nas IES: Terão em mãos um benchmarking nacional do tempo médio de titulação, das taxas de abandono e do volume de bolsas recebidas por programas de mesmo Conceito CAPES e Grande Área, auxiliando no planejamento estratégico para a Avaliação Quadrienal da CAPES.
  3. Estudantes de Graduação e Futuros Pós-Graduandos: Poderão consultar a base consolidada para tomar decisões de carreira mais informadas ao escolher onde cursar seu Mestrado ou Doutorado, avaliando objetivamente a nota do programa, o tempo típico de conclusão e a probabilidade de obtenção de bolsa da CAPES.
  4. Pesquisadores em Ciência de Dados, Cientometria e Economia da Educação: Contarão com um protocolo documentado e reprodutível de limpeza, higienização e pareamento das bases abertas da Plataforma Sucupira/CAPES, superando as barreiras técnicas de codificação e granularidade que costumam dificultar o uso integrado desses dados.

2 Pacotes Requeridos

Para garantir a total reprodutibilidade deste estudo, todos os pacotes utilizados em todas as etapas do projeto são carregados antecipadamente nesta seção. Caso algum pacote não esteja presente no ambiente local, o bloco de código abaixo verifica e realiza sua instalação automática antes do carregamento.

# Lista de pacotes necessários para a análise e geração do relatório
pacotes_necessarios <- c(
  "rmdformats", # Templates HTML avançados para R Markdown (readthedown)
  "dplyr",      # Gramática de manipulação, filtragem, agrupamento e junção de dados
  "tidyr",      # Reformulação estrutural de dados (pivot_wider, pivot_longer, unite, separate)
  "readr",      # Leitura rápida e controlada de arquivos tabulares (CSV)
  "stringr",    # Manipulação, limpeza e padronização de cadeias de caracteres (strings)
  "lubridate",  # Tratamento, conversão e aritmética de datas e fusos horários
  "forcats",    # Manipulação de variáveis categóricas e fatores ordenados
  "ggplot2",    # Criação de visualizações gráficas baseadas na Gramática dos Gráficos
  "plotly",     # Construção de gráficos interativos para exploração web
  "DT",         # Geração de tabelas HTML interativas (DataTables) com busca e paginação
  "knitr",      # Motor de renderização dinâmica de relatórios e tabelas estáticas (kable)
  "kableExtra", # Estilização avançada de tabelas HTML/Bootstrap
  "scales"      # Formatação de escalas numéricas, percentuais e monetárias nos gráficos
)

# Instala automaticamente pacotes que ainda não estejam instalados na máquina
pacotes_faltantes <- pacotes_necessarios[!(pacotes_necessarios %in% installed.packages()[, "Package"])]
if (length(pacotes_faltantes) > 0) {
  install.packages(pacotes_faltantes, repos = "https://cloud.r-project.org")
}

# Carrega todos os pacotes silenciosamente na sessão R
invisible(lapply(pacotes_necessarios, library, character.only = TRUE))

3 Preparação dos Dados

Nesta seção, apresentamos a origem oficial dos conjuntos de dados, detalhamos suas características estruturais e peculiaridades de coleta, executamos um processo sistemático e documentado de limpeza, transformação e integração em R, e exibimos o conjunto de dados limpo acompanhado do resumo consolidado de suas variáveis de interesse.

3.1 Fonte Original dos Dados

Os dois conjuntos de dados utilizados neste projeto são públicos, gratuitos e provenientes do Portal de Dados Abertos da CAPES (Coordenação de Aperfeiçoamento de Pessoal de Nível Superior), autarquia vinculada ao Ministério da Educação (MEC), integrados também ao Portal Brasileiro de Dados Abertos (dados.gov.br):

  1. Discentes da Pós-Graduação Stricto Sensu no Brasil (2021):
  2. Concessão de Bolsas da CAPES por Instituição de Ensino Superior — IES (2022):

3.2 Explicação Minuciosa dos Dados de Origem

Antes de qualquer manipulação algorítmica, é indispensável compreender a natureza institucional, o momento de coleta, a dimensionalidade original e as peculiaridades técnicas de cada base de dados bruta.

3.2.1 Base 1: Microdados de Discentes (Plataforma Sucupira)

  • Propósito Original: Registrar individualmente o vínculo e o histórico acadêmico de todos os estudantes de pós-graduação stricto sensu do Brasil para fins do Censo da Pós-Graduação e da Avaliação Quadrienal da CAPES (ciclo 2021–2024), coletados anualmente junto às coordenadorias de cada PPG por meio do módulo Coleta da Plataforma Sucupira.
  • Período de Coleta e Atualização: Os dados referem-se ao Ano-Base de 2021 (AN_BASE = 2021), com extração e consolidação oficial disponibilizada pela CAPES em 31 de março de 2025 (conforme indicado no sufixo do arquivo 2025-03-31).
  • Dimensões Originais: O arquivo bruto possui 419.905 observações (linhas) e 37 variáveis (colunas). Cada linha representa o vínculo de um discente em um programa de pós-graduação naquele ano-base.
  • Peculiaridades Técnicas e Registro de Valores Ausentes:
    • Formato e Codificação: Arquivo separado por ponto e vírgula (;) e codificado em ISO-8859-1 (Latin-1), padrão legado de sistemas governamentais brasileiros.
    • Anonimização Parcial (LGPD): O documento de identificação (NR_DOCUMENTO_DISCENTE) encontra-se mascarado no formato ***.734.169-**, mas o identificador único numérico do indivíduo no sistema (ID_PESSOA) é preservado.
    • Codificação Textual de Valores Ausentes ("NÃO SE APLICA" e "NI"): Em vez de células vazias (NA), a base utiliza a string "NÃO SE APLICA" em 337.215 linhas (80,3% da base) para as variáveis NM_TESE_DISSERTACAO e NM_ORIENTADOR_PRINCIPAL, e o valor numérico 0 para QT_MES_TITULACAO. Isso ocorre porque essas informações só são preenchidas para os 82.690 alunos com situação "TITULADO" no ano-base; para alunos ainda "MATRICULADO" (321.147), "DESLIGADO" (10.962) ou que "ABANDONOU" (4.823), o sistema preenche "NÃO SE APLICA" e 0 meses. Há ainda 1 registro com "NI" em NM_PAIS_NACIONALIDADE_DISCENTE e 13.706 valores ausentes (NA) na coluna CD_ENTIDADE_EMEC (referentes a institutos de pesquisa como FIOCRUZ, INPA e IMPA, que são credenciados na CAPES, mas não possuem código e-MEC de graduação).
    • Conceito CAPES Alfanumérico (CD_CONCEITO_PROGRAMA): Embora a escala de notas da CAPES vá de 1 a 7, a coluna é do tipo caractere (chr) porque contém 1.281 registros com o conceito "A" (atribuído a cursos recém-aprovados em fase de implantação que ainda equivalem ao conceito mínimo 3).
    • Datas no Padrão SAS/Oracle (DDMMMYYYY:HH:MM:SS): As variáveis DT_MATRICULA_DISCENTE e DT_SITUACAO_DISCENTE estão gravadas como texto com abreviação do mês em inglês e carimbo de hora zerado (ex.: "06AUG2020:00:00:00"), exigindo parsing específico.

3.2.2 Base 2: Concessão de Bolsas da CAPES por IES e Programa

  • Propósito Original: Dar transparência ativa à distribuição de bolsas de estudo e pesquisa financiadas pela CAPES (Sistemas SCBA/SICAPES), discriminando quantas cotas foram pagas por instituição, programa de pós-graduação, modalidade de fomento e nível acadêmico.
  • Período de Coleta e Atualização: Os dados referem-se ao Ano de Referência de 2022 (AN_REFERENCIA = 2022), com extração consolidada em 01 de março de 2023 (2023-03-01). (Nota metodológica: como o vínculo discente de 2021 na Sucupira reflete a base instalada de alunos e o conceito vigente que baliza a distribuição de cotas do ciclo seguinte, o pareamento entre o corpo discente de 2021 e a concessão de bolsas de 2022 é estruturalmente consistente, apresentando 99,3% de compatibilidade nos códigos de programas).
  • Dimensões Originais: O arquivo bruto contém 13.815 observações (linhas) e 17 variáveis (colunas), totalizando 98.285 bolsas concedidas (sendo 50.699 de Doutorado, 44.019 de Mestrado, 3.542 de Pós-Doutorado e 25 na categoria Outros).
  • Peculiaridades Técnicas e Registro de Valores Ausentes:
    • Granularidade Múltipla por Programa: Um mesmo Programa de Pós-Graduação (CD_PROGRAMA) aparece em múltiplas linhas caso receba bolsas de diferentes programas de fomento (SG_PROGRAMA_FOMENTO, como DS, PROEX, PROSUP, PDPG-FAP, etc.) ou para diferentes níveis (NM_NIVEL_PADRAO).
    • Valores Ausentes Codificados como "NI" (Não Informado): Embora não existam células vazias (NA) no arquivo bruto, uma inspeção minuciosa revela 47 linhas onde CD_PROGRAMA == "NI" e 428 linhas onde NM_PROGRAMA, NM_GRANDE_AREA, NM_AREA_AVALIACAO e NM_AREA_CONHECIMENTO estão preenchidos como "NI". Isso ocorre em concessões de programas especiais de fomento (como Pós-Doutorado institucional ou projetos interinstitucionais) alocadas diretamente à IES sem vínculo a um PPG específico.

3.3 Etapas de Importação e Limpeza dos Dados

A seguir, será mostrada as etapas de impórtação, limpeza e filtragem dos dados. ### Etapa 1: Importação Controlada dos Arquivos Brutos

Importamos ambos os arquivos CSV utilizando read.csv2() com codificação latin1 e stringsAsFactors = FALSE, garantindo a correta interpretação dos caracteres acentuados da língua portuguesa e preservando os códigos identificadores como texto/inteiros sem distorção.

# 1. Importação da base bruta de Discentes (Coleta Sucupira - 2021)
discentes_bruto <- read.csv2(
  file = "datasets/br-capes-colsucup-discentes-2021-2025-03-31 (1).csv",
  fileEncoding = "latin1",
  stringsAsFactors = FALSE,
  na.strings = c("", "NA")
)

# 2. Importação da base bruta de Concessão de Bolsas (CAPES - 2022)
bolsas_bruto <- read.csv2(
  file = "datasets/br-capes-concessao-bolsas-ies-2022-2023-03-01.csv",
  fileEncoding = "latin1",
  stringsAsFactors = FALSE,
  na.strings = c("", "NA")
)

# Verificação imediata das dimensões brutas importadas
tibble(
  Conjunto_de_Dados = c("1. Discentes Stricto Sensu (Bruto)", "2. Concessão de Bolsas CAPES (Bruto)"),
  Observacoes_Linhas = c(nrow(discentes_bruto), nrow(bolsas_bruto)),
  Variaveis_Colunas = c(ncol(discentes_bruto), ncol(bolsas_bruto))
) %>%
  kable(
    col.names = c("Conjunto de Dados Importado", "Nº de Linhas (Observações)", "Nº de Colunas (Variáveis)"),
    format.args = list(big.mark = ".", decimal.mark = ","),
    caption = "Tabela 2: Dimensões originais dos conjuntos de dados imediatamente após a importação."
  ) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Tabela 2: Dimensões originais dos conjuntos de dados imediatamente após a importação.
Conjunto de Dados Importado Nº de Linhas (Observações) Nº de Colunas (Variáveis)
  1. Discentes Stricto Sensu (Bruto)
419.905 37
  1. Concessão de Bolsas CAPES (Bruto)
13.815 17

3.3.1 Etapa 2: Limpeza, Padronização e realização de cálculos a partir dos Microdados dos Discentes

Por que realizamos estas operações de limpeza na base de discentes?

  1. Seleção de Variáveis Relevantes: Das 37 colunas originais, removemos metadados internos de fotografia de banco de dados (ID_ADD_FOTO_PROGRAMA, ID_ADD_FOTO_PROGRAMA_IES), identificadores pessoais sensíveis ou mascarados (NM_DISCENTE, NR_DOCUMENTO_DISCENTE, TP_DOCUMENTO_DISCENTE) e colunas redundantes, mantendo as variáveis analíticas essenciais.
  2. Recodificação de Valores Ausentes Implícitos ("NÃO SE APLICA" e "NI"): Conforme diagnosticado na seção 3.2, QT_MES_TITULACAO == 0 para alunos não titulados não significa que o aluno concluiu o curso em zero meses, mas sim que o tempo de titulação ainda não se aplica. Manter zeros distorceria severamente a média de tempo de titulação. Portanto, convertemos QT_MES_TITULACAO para NA sempre que NM_SITUACAO_DISCENTE != "TITULADO" ou quando o valor for <= 0, e recodificamos "NI" em nacionalidade para NA.
  3. Conversão de Datas Não Normalizadas (DT_MATRICULA_DISCENTE e DT_SITUACAO_DISCENTE): Os textos no formato "06AUG2020:00:00:00" possuem nomes de meses em inglês. Extraímos os primeiros 9 caracteres ("06AUG2020") e convertemos para a classe Date usando as.Date(..., format = "%d%b%Y") com LC_TIME = "C".
  4. Normalização de Conceito CAPES (CONCEITO_NUM) e Criação de Novas Variáveis:
    • Convertimos o conceito "A" (cursos novos autorizados) para o valor numérico 3 (nota base de entrada no SNPG) e criamos a variável numérica CONCEITO_CAPES_NUM (de 1 a 7), além da variável categórica de excelência (PERFIL_EXCELENCIA: notas 6 e 7 como “Excelência Internacional (6-7)”, 4 e 5 como “Consolidado (4-5)”, e 1 a 3 como “Em Consolidação (1-3)”).
    • União e Harmonização de Nível Acadêmico: Enquanto a base de discentes distingue "MESTRADO", "MESTRADO PROFISSIONAL", "DOUTORADO" e "DOUTORADO PROFISSIONAL", a base de bolsas classifica apenas em "MESTRADO" e "DOUTORADO". Criamos a variável padronizada NIVEL_PADRAO agrupando Mestrado Acadêmico/Profissional em "MESTRADO" e Doutorado Acadêmico/Profissional em "DOUTORADO" para viabilizar a mesclagem exata entre as bases.
    • Cálculo da Idade do Discente (IDADE_DISCENTE): Criada a partir da diferença entre o ano-base (AN_BASE = 2021) e o ano de nascimento (AN_NASCIMENTO_DISCENTE), filtrando eventuais registros com idades biologicamente implausíveis (< 18 ou > 90 anos).
    • União de Variáveis (LOCAL_IES): Unimos a sigla da UF (SG_UF_PROGRAMA) e a sigla da instituição (SG_ENTIDADE_ENSINO) em um identificador legível (UF_IES, ex.: "PE - UFPE").
# Salva a configuração de locale atual e usa locale "C" temporariamente para ler meses em inglês (JAN, FEB, AUG...)
locale_antigo <- Sys.getlocale("LC_TIME")
Sys.setlocale("LC_TIME", "C")
#> [1] "C"
discentes_limpo <- discentes_bruto %>%
  # 1. Seleção das variáveis analíticas de interesse
  select(
    AN_BASE, ID_PESSOA, CD_PROGRAMA_IES, NM_PROGRAMA_IES,
    CD_ENTIDADE_CAPES, SG_ENTIDADE_ENSINO, NM_ENTIDADE_ENSINO,
    CS_STATUS_JURIDICO, DS_DEPENDENCIA_ADMINISTRATIVA,
    NM_REGIAO, SG_UF_PROGRAMA, NM_MUNICIPIO_PROGRAMA_IES,
    NM_GRANDE_AREA_CONHECIMENTO, NM_AREA_AVALIACAO,
    NM_MODALIDADE_PROGRAMA, DS_GRAU_ACADEMICO_DISCENTE,
    CD_CONCEITO_PROGRAMA, AN_NASCIMENTO_DISCENTE, DS_FAIXA_ETARIA,
    NM_PAIS_NACIONALIDADE_DISCENTE, ST_INGRESSANTE, NM_SITUACAO_DISCENTE,
    DT_MATRICULA_DISCENTE, DT_SITUACAO_DISCENTE, QT_MES_TITULACAO
  ) %>%
  # 2. Padronização de strings e tratamento de ausentes codificados como texto
  mutate(
    NM_PROGRAMA_IES = str_squish(str_to_upper(NM_PROGRAMA_IES)),
    SG_ENTIDADE_ENSINO = str_squish(str_to_upper(SG_ENTIDADE_ENSINO)),
    NM_PAIS_NACIONALIDADE_DISCENTE = na_if(NM_PAIS_NACIONALIDADE_DISCENTE, "NI"),
    
    # 3. Conversão das datas do padrão SAS ("06AUG2020:00:00:00") para classe Date
    DT_MATRICULA = as.Date(str_sub(DT_MATRICULA_DISCENTE, 1, 9), format = "%d%b%Y"),
    DT_SITUACAO  = as.Date(str_sub(DT_SITUACAO_DISCENTE, 1, 9), format = "%d%b%Y"),
    
    # 4. Normalização do Conceito CAPES ("A" equivale a curso recém-aprovado nota 3)
    CONCEITO_CAPES_NUM = as.integer(ifelse(CD_CONCEITO_PROGRAMA == "A", "3", CD_CONCEITO_PROGRAMA)),
    PERFIL_EXCELENCIA = case_when(
      CONCEITO_CAPES_NUM >= 6 ~ "Excelência Internacional (6 e 7)",
      CONCEITO_CAPES_NUM >= 4 ~ "Consolidado (4 e 5)",
      TRUE                    ~ "Em Consolidação (1 a 3 / A)"
    ),
    
    # 5. Harmonização do Nível Acadêmico para cruzamento com a base de Bolsas
    NIVEL_PADRAO = case_when(
      str_detect(DS_GRAU_ACADEMICO_DISCENTE, "DOUTORADO") ~ "DOUTORADO",
      str_detect(DS_GRAU_ACADEMICO_DISCENTE, "MESTRADO")  ~ "MESTRADO",
      TRUE ~ "OUTROS"
    ),
    
    # 6. Criação da variável de Idade do Discente e Tempo de Titulação Válido (apenas titulados)
    IDADE_DISCENTE = AN_BASE - AN_NASCIMENTO_DISCENTE,
    IDADE_DISCENTE = ifelse(IDADE_DISCENTE < 18 | IDADE_DISCENTE > 90, NA_integer_, IDADE_DISCENTE),
    MESES_TITULACAO_VALIDO = ifelse(NM_SITUACAO_DISCENTE == "TITULADO" & QT_MES_TITULACAO > 0,
                                    QT_MES_TITULACAO, NA_integer_)
  ) %>%
  # 7. União de variáveis (UF + Sigla da IES) para identificação rápida
  unite("UF_IES", SG_UF_PROGRAMA, SG_ENTIDADE_ENSINO, sep = " - ", remove = FALSE) %>%
  # Remove as colunas de data brutas em texto após a conversão
  select(-DT_MATRICULA_DISCENTE, -DT_SITUACAO_DISCENTE)

# Restaura o locale original do sistema
Sys.setlocale("LC_TIME", locale_antigo)
#> [1] "Portuguese_Brazil.utf8"

3.3.2 Etapa 3: Limpeza, Filtragem e Reformulação da Base de Bolsas

Por que realizamos estas operações na base de bolsas?

  1. Filtragem de Registros Não Vinculados a Programas Stricto Sensu: Na base de bolsas, existem 47 registros com CD_PROGRAMA == "NI" (bolsas avulsas não alocadas a um PPG) e concessões de "PÓS-DOUTORADO" (2.595 linhas) e "OUTROS" (23 linhas), que não correspondem a discentes de Mestrado e Doutorado stricto sensu. Filtramos os registros com CD_PROGRAMA != "NI" e NM_NIVEL_PADRAO %in% c("MESTRADO", "DOUTORADO") para garantir consistência de escopo ao mesclar com a base de discentes (mantendo também um objeto separado com o total geral da IES quando necessário).
  2. Separação de Variável Composta (CD_PROGRAMA): O código de um programa na CAPES (ex.: "40015017007P5") é uma chave composta onde os 8 primeiros dígitos ("40015017") identificam a Entidade/IES e os 5 últimos ("007P5") identificam a sequência do programa e seu dígito verificador. Utilizamos separate() para demonstrar a decomposição estrutural dessa variável.
  3. Reformulação de Longo para Largo (pivot_wider): Como a base de bolsas está em formato longo (múltiplas linhas para um mesmo programa/nível devido aos diferentes programas de fomento e tipos INSTITUCIONAL vs. ESTRATÉGICO), aplicamos uma agregação seguida de pivot_wider() para transformar as categorias de TP_PROGRAMA em colunas separadas (BOLSAS_INSTITUCIONAL e BOLSAS_ESTRATEGICO), além de calcular o TOTAL_BOLSAS_CAPES e a quantidade de linhas de fomento distintas (QTD_FONTES_FOMENTO) por Programa e Nível.
# Limpeza, separação e reformulação (Long -> Wide) da base de Bolsas CAPES
bolsas_por_programa_nivel <- bolsas_bruto %>%
  # 1. Filtra registros válidos de programas Stricto Sensu (Mestrado e Doutorado)
  filter(
    CD_PROGRAMA != "NI",
    NM_NIVEL_PADRAO %in% c("MESTRADO", "DOUTORADO"),
    QT_BOLSAS_CONCEDIDAS > 0
  ) %>%
  # 2. Demonstração de separação do código composto do programa (8 dígitos IES + 5 caracteres do PPG)
  separate(
    col = CD_PROGRAMA,
    into = c("CD_IES_EXTRAIDO", "SUFIXO_PPG"),
    sep = 8,
    remove = FALSE
  ) %>%
  # 3. Padroniza o texto do tipo de programa de fomento para pivotagem
  mutate(
    TIPO_FOMENTO_CLEAN = ifelse(TP_PROGRAMA == "INSTITUCIONAL", "BOLSAS_INSTITUCIONAL", "BOLSAS_ESTRATEGICO")
  ) %>%
  # 4. Agrupa por Programa, Nível e Tipo de Fomento
  group_by(CD_PROGRAMA, NM_NIVEL_PADRAO, TIPO_FOMENTO_CLEAN) %>%
  summarise(
    BOLSAS_SOMA = sum(QT_BOLSAS_CONCEDIDAS, na.rm = TRUE),
    FONTES_DISTINTAS = n_distinct(SG_PROGRAMA_FOMENTO),
    .groups = "drop"
  ) %>%
  # 5. Reformulação de formato Longo (Long) para Largo (Wide) com pivot_wider
  pivot_wider(
    id_cols = c(CD_PROGRAMA, NM_NIVEL_PADRAO),
    names_from = TIPO_FOMENTO_CLEAN,
    values_from = BOLSAS_SOMA,
    values_fill = list(BOLSAS_SOMA = 0)
  ) %>%
  # 6. Criação da variável de total de bolsas concedidas (Institucional + Estratégico)
  mutate(
    TOTAL_BOLSAS_CAPES = BOLSAS_INSTITUCIONAL + BOLSAS_ESTRATEGICO,
    PROP_BOLSAS_ESTRATEGICAS = round((BOLSAS_ESTRATEGICO / TOTAL_BOLSAS_CAPES) * 100, 2)
  )

3.3.3 Etapa 4: Mesclagem (Merge) dos Conjuntos de Dados e Criação de Indicadores Analíticos

Por que agregamos os discentes por Programa/Nível e mesclamos com a base de bolsas?

Para responder ao problema central do projeto — a relação entre o financiamento da CAPES e o desempenho/cobertura dos programas de pós-graduação — precisamos integrar as duas bases na mesma unidade de análise: Programa de Pós-Graduação × Nível Acadêmico (CD_PROGRAMA_IES + NIVEL_PADRAO).

Nesta etapa:

  1. Agregamos os 419.905 discentes por programa e nível (MESTRADO e DOUTORADO), contabilizando o número de discentes segundo sua situação (MATRICULADO, TITULADO, ABANDONOU, DESLIGADO), o número de ingressantes no ano, a idade média e a mediana/média do tempo de titulação (em meses).
  2. Realizamos a junção relacional (left_join) com a base reformulada de bolsas (bolsas_por_programa_nivel). Para os programas/níveis que não receberam cotas de bolsas no período (ex.: mestrados profissionais privados ou programas sem bolsas alocadas), preenchemos os contadores de bolsas com 0.
  3. Criamos variáveis analíticas derivadas fundamentais:
    • TOTAL_DISCENTES: Total de discentes vinculados ao programa/nível no ano-base.
    • DISCENTES_EVADIDOS: Soma dos alunos com status "ABANDONOU" + "DESLIGADO".
    • TAXA_TITULACAO_PCT: Percentual de discentes que defenderam a dissertação/tese no ano em relação ao total de vinculados.
    • TAXA_EVASAO_PCT: Percentual de discentes evadidos (abandono ou desligamento) em relação ao total de vinculados.
    • BOLSAS_POR_100_MATRICULADOS (Índice de Cobertura de Bolsas): Quantidade de bolsas CAPES concedidas para cada 100 alunos ativamente matriculados no programa/nível.
    • DEFICIT_DESCOBERTOS_ESTIMADO: Estimativa absoluta da diferença entre o número de alunos ativamente matriculados e o total de bolsas CAPES concedidas ao programa (truncado em zero quando o número de cotas anuais supera os matriculados remanescentes no final do ano-base).
# 1. Agregação dos microdados de Discentes ao nível de Programa (PPG) e Nível (Mestrado/Doutorado)
discentes_agregado <- discentes_limpo %>%
  group_by(
    CD_PROGRAMA_IES, NM_PROGRAMA_IES, CD_ENTIDADE_CAPES,
    SG_ENTIDADE_ENSINO, NM_ENTIDADE_ENSINO, UF_IES,
    CS_STATUS_JURIDICO, DS_DEPENDENCIA_ADMINISTRATIVA,
    NM_REGIAO, SG_UF_PROGRAMA, NM_MUNICIPIO_PROGRAMA_IES,
    NM_GRANDE_AREA_CONHECIMENTO, NM_AREA_AVALIACAO,
    NM_MODALIDADE_PROGRAMA, CD_CONCEITO_PROGRAMA,
    CONCEITO_CAPES_NUM, PERFIL_EXCELENCIA, NIVEL_PADRAO
  ) %>%
  summarise(
    TOTAL_DISCENTES       = n(),
    QTD_MATRICULADOS      = sum(NM_SITUACAO_DISCENTE == "MATRICULADO", na.rm = TRUE),
    QTD_TITULADOS         = sum(NM_SITUACAO_DISCENTE == "TITULADO", na.rm = TRUE),
    QTD_ABANDONO          = sum(NM_SITUACAO_DISCENTE == "ABANDONOU", na.rm = TRUE),
    QTD_DESLIGADOS        = sum(NM_SITUACAO_DISCENTE == "DESLIGADO", na.rm = TRUE),
    QTD_INGRESSANTES      = sum(ST_INGRESSANTE == "SIM", na.rm = TRUE),
    IDADE_MEDIA_DISCENTES = round(mean(IDADE_DISCENTE, na.rm = TRUE), 1),
    TEMPO_MEDIO_TITULACAO = round(mean(MESES_TITULACAO_VALIDO, na.rm = TRUE), 1),
    TEMPO_MEDIANO_TITUL   = round(median(MESES_TITULACAO_VALIDO, na.rm = TRUE), 1),
    .groups = "drop"
  )

# 2. Mesclagem (Left Join) entre a base agregada de Discentes e a base reformulada de Bolsas CAPES
dados_integrados_ppg <- discentes_agregado %>%
  left_join(
    bolsas_por_programa_nivel,
    by = c("CD_PROGRAMA_IES" = "CD_PROGRAMA", "NIVEL_PADRAO" = "NM_NIVEL_PADRAO")
  ) %>%
  # 3. Tratamento de NAs pós-junção (programas sem bolsas recebem 0) e criação de indicadores compostos
  mutate(
    BOLSAS_INSTITUCIONAL     = replace_na(BOLSAS_INSTITUCIONAL, 0),
    BOLSAS_ESTRATEGICO       = replace_na(BOLSAS_ESTRATEGICO, 0),
    TOTAL_BOLSAS_CAPES       = replace_na(TOTAL_BOLSAS_CAPES, 0),
    PROP_BOLSAS_ESTRATEGICAS = replace_na(PROP_BOLSAS_ESTRATEGICAS, 0),
    
    # Variáveis derivadas de desempenho e financiamento
    DISCENTES_EVADIDOS          = QTD_ABANDONO + QTD_DESLIGADOS,
    TAXA_TITULACAO_PCT          = round((QTD_TITULADOS / TOTAL_DISCENTES) * 100, 2),
    TAXA_EVASAO_PCT             = round((DISCENTES_EVADIDOS / TOTAL_DISCENTES) * 100, 2),
    BOLSAS_POR_100_MATRICULADOS = ifelse(QTD_MATRICULADOS > 0,
                                         round((TOTAL_BOLSAS_CAPES / QTD_MATRICULADOS) * 100, 2),
                                         NA_real_),
    DEFICIT_BOLSAS_MATRICULADOS = pmax(0, QTD_MATRICULADOS - TOTAL_BOLSAS_CAPES),
    RECEBE_BOLSA_CAPES          = factor(ifelse(TOTAL_BOLSAS_CAPES > 0, "Sim", "Não"), levels = c("Sim", "Não")),
    
    # Conversão das principais variáveis categóricas em Fatores Ordenados
    PERFIL_EXCELENCIA = factor(
      PERFIL_EXCELENCIA,
      levels = c("Em Consolidação (1 a 3 / A)", "Consolidado (4 e 5)", "Excelência Internacional (6 e 7)"),
      ordered = TRUE
    ),
    NM_REGIAO = factor(NM_REGIAO, levels = c("SUDESTE", "SUL", "NORDESTE", "CENTRO-OESTE", "NORTE"))
  )

3.4 Apresentação Condensada do Conjunto de Dados Final

Com os dados devidamente limpos, padronizados e integrados, obtivemos a base analítica final dados_integrados_ppg, composta por 7.883 unidades de curso (Programa × Nível) distribuídas em 4.696 Programas de Pós-Graduação e 514 Instituições de Ensino e Pesquisa, consolidando as informações dos 419.905 discentes e das bolsas concedidas pela CAPES.

# Seleciona as colunas nucleares para visualização condensada e limita às primeiras 100 linhas (<= 200 linhas)
amostra_condensada <- dados_integrados_ppg %>%
  arrange(desc(TOTAL_BOLSAS_CAPES), desc(TOTAL_DISCENTES)) %>%
  slice_head(n = 100) %>%
  select(
    CD_PROGRAMA_IES, UF_IES, NM_REGIAO, NM_PROGRAMA_IES,
    NM_GRANDE_AREA_CONHECIMENTO, NIVEL_PADRAO, CONCEITO_CAPES_NUM,
    TOTAL_DISCENTES, QTD_MATRICULADOS, QTD_TITULADOS, DISCENTES_EVADIDOS,
    TEMPO_MEDIO_TITULACAO, TOTAL_BOLSAS_CAPES, BOLSAS_INSTITUCIONAL,
    BOLSAS_ESTRATEGICO, BOLSAS_POR_100_MATRICULADOS
  )

datatable(
  amostra_condensada,
  rownames = FALSE,
  filter = "top",
  caption = htmltools::tags$caption(
    style = "caption-side: top; text-align: left; font-weight: bold; color: #2c3e50;",
    "Tabela 3: Visualização condensada do conjunto de dados limpo e integrado (Top 100 cursos por volume de bolsas CAPES — exibindo 10 linhas por página)."
  ),
  colnames = c(
    "Cód. PPG", "UF - IES", "Região", "Nome do Programa",
    "Grande Área", "Nível", "Nota CAPES",
    "Total Alunos", "Matriculados", "Titulados", "Evadidos",
    "Tempo Médio Tit. (Meses)", "Total Bolsas CAPES", "Bolsas Inst.",
    "Bolsas Estrat.", "Bolsas / 100 Matric."
  ),
  options = list(
    pageLength = 10,
    lengthMenu = c(5, 10, 25, 50),
    scrollX = TRUE,
    autoWidth = TRUE,
    language = list(
      search = "Buscar:",
      lengthMenu = "Exibir _MENU_ registros por página",
      info = "Mostrando _START_ a _END_ de _TOTAL_ registros (Amostra de 100 linhas)",
      paginate = list(previous = "Anterior", `next` = "Próximo")
    )
  )
)

3.5 Resumo Consolidado das Variáveis de Interesse

Em vez de imprimir saídas brutas de console como str() ou summary(), apresentamos a seguir uma síntese narrativa com estatísticas calculadas dinamicamente em código embutido (inline R code), seguida de uma Tabela Consolidada de Dicionário e Resumo Estatístico das Variáveis de Interesse

3.5.1 Síntese Narrativa dos Dados Limpos

No panorama nacional consolidado para o ensino stricto sensu, o Brasil conta com 419.905 discentes vinculados distribuídos em 4.696 Programas de Pós-Graduação (7.883 cursos ao separar Mestrado e Doutorado). A idade média do pós-graduando brasileiro é de 34.3 anos (mediana de 32 anos, variando do 1º quartil de 28 ao 3º quartil de 39 anos). Entre os alunos que concluíram seus cursos no período (82.690 titulados), o tempo médio até a defesa é de 28.6 meses no Mestrado e 52 meses no Doutorado. Quanto ao fomento direto vinculado aos programas stricto sensu, foram integradas 98.050 bolsas ativas de Mestrado e Doutorado, resultando em uma média de 12.4 bolsas por curso (mediana de 11 bolsas, com máximo de 117 bolsas em um único curso).

3.5.2 Tabela de Resumo Consolidado das Variáveis

Tabela 4: Resumo consolidado das variáveis de interesse nos conjuntos de dados limpos e integrados.
Variável Tipo / Escala Descrição Funcional Resumo Estatístico Consolidado (Base Limpa)
CD_PROGRAMA_IES Caractere (Chave) Código identificador único do Programa de Pós-Graduação na CAPES (13 caracteres). 4.696 programas únicos em 514 instituições (IES).
NM_REGIAO Fator (5 níveis) Macrorregião geográfica brasileira onde o programa está sediado. Sudeste: 44,5% dos cursos ; Sul: 21,6% ; Nordeste: 19,3% ; Centro-Oeste: 8,6% ; Norte: 5,9%.
DS_DEPENDENCIA_ADMINISTRATIVA Caractere (2 categorias) Natureza administrativa da IES mantenedora do programa (Pública vs. Privada). Pública: 84,6% dos discentes (Federal: 59,7%, Estadual: 24,6%, Municipal: 0,4%) ; Privada: 15,4%.
NM_MODALIDADE_PROGRAMA Caractere (2 categorias) Modalidade do programa de pós-graduação (Acadêmico vs. Profissional). Acadêmico: 84,5% dos discentes (84,9% dos cursos) ; Profissional: 15,5% dos discentes.
NM_GRANDE_AREA_CONHECIMENTO Caractere (9 áreas) Grande Área do Conhecimento segundo a árvore de avaliação da CAPES. 9 Grandes Áreas (destaque em Multidisciplinar, Ciências Humanas, Saúde e Engenharias).
NIVEL_PADRAO Caractere (2 níveis) Nível acadêmico padronizado do curso (Mestrado ou Doutorado). Mestrado: 5.181 cursos (62,5% dos alunos) ; Doutorado: 2.702 cursos (37,5% dos alunos).
CONCEITO_CAPES_NUM Inteiro (Escala 1 a 7) Nota da avaliação CAPES do programa convertida para escala numérica (1 a 7). Média: 4,5 ; Mediana: 4 ; IIQ: [4 – 5] ; Min–Máx: [1 – 7]
PERFIL_EXCELENCIA Fator Ordenado (3 níveis) Classificação do programa em faixas de consolidação acadêmica e excelência internacional. Em Consolidação (1-3): 17,0% dos cursos ; Consolidado (4-5): 64,5% ; Excelência (6-7): 18,5%.
IDADE_DISCENTE Numérico (Discente) Idade do pós-graduando no ano-base (calculada a partir do ano de nascimento). Média: 34,3 anos ; Mediana: 32 anos ; IIQ: [28 – 39] ; Min–Máx: [18 – 88]
MESES_TITULACAO_VALIDO Numérico (Discente Titulado) Tempo decorrido (em meses) desde a matrícula até a defesa para os alunos titulados. Média: 34,6 meses ; Mediana: 30 meses ; IIQ: [26 – 42] ; Min–Máx: [1 – 247]
TOTAL_DISCENTES Inteiro (Curso/PPG) Total de discentes vinculados ao curso (soma de matriculados, titulados e evadidos). Média: 53,3 alunos ; Mediana: 45 alunos ; IIQ: [30 – 65] ; Min–Máx: [1 – 885]
QTD_MATRICULADOS Inteiro (Curso/PPG) Total de discentes com matrícula ativa em andamento no curso ao final do ano-base. Média: 40,7 matr. ; Mediana: 34 matr. ; IIQ: [22 – 51] ; Min–Máx: [0 – 710]
TAXA_TITULACAO_PCT Numérico Contínuo (%) Proporção de discentes vinculados ao curso que defenderam dissertação/tese no ano. Média: 19,9% ; Mediana: 19% ; IIQ: [11,5 – 27,3] ; Min–Máx: [0 – 100]
TAXA_EVASAO_PCT Numérico Contínuo (%) Proporção de discentes vinculados que abandonaram ou foram desligados do curso. Média: 4,1% ; Mediana: 2,4% ; IIQ: [0 – 5,4] ; Min–Máx: [0 – 100]
TOTAL_BOLSAS_CAPES Inteiro (Curso/PPG) Total de bolsas da CAPES (Institucionais + Estratégicas) concedidas ao curso. Média: 12,4 bolsas ; Mediana: 11 bolsas ; IIQ: [4 – 18] ; Min–Máx: [0 – 117]
PROP_BOLSAS_ESTRATEGICAS Numérico Contínuo (%) Percentual das bolsas do curso provenientes de editais estratégicos/induzidos da CAPES. Média: 10,7% ; Mediana: 0% ; IIQ: [0 – 14,3] ; Min–Máx: [0 – 100]
BOLSAS_POR_100_MATRICULADOS Numérico Contínuo (Índice) Razão de bolsas concedidas pela CAPES para cada 100 alunos ativamente matriculados. Média: 45,8 ; Mediana: 31 ; IIQ: [13,2 – 51,5] ; Min–Máx: [0 – 6.200]