Ciência de dados e a Avaliação dos Programas de Pós Graduação no Brasil

Augusto Schmidt
Indeorum
Published in
7 min readJul 29, 2020

Recentemente, com a alteração das demandas e métricas de avaliação sobre os Programas da Pós-Graduação (PPG) das Instituições de Ensino Superiores (IES), as atividades de autoavaliação e de planejamento estratégico dos PPGs tornaram-se ainda mais importantes.

Na Indeorum realizamos diversas análises para nossos clientes executarem a sua autoavaliação. São diversas IES e FAPs (Fundações de Amparo a Pesquisa) que contam com esse serviço. Hoje vamos mostrar um pouco de como você pode fazer sua autoanálise.

É importante explicar que todo curso feito após a conclusão de uma graduação é uma pós-graduação. As diferenças que ocorrem entre uma e outra pós-graduação são os segmentos em que elas são divididas. Stricto sensu são cursos de mestrado, mestrado profissional e doutorado e os cursos Lato sensu são cursos como MBA e especialização.

Portanto, para analisar os dados de pós-graduação, inicialmente devem ser definidos indicadores e métricas. Na maioria dos casos são quantitativas, usadas para quantificar ou operacionalizar um conceito abstrato de interesse dos gestores. Esses indicadores, então, servirão como recurso metodológico para possibilitar a análise de um ou mais aspectos da realidade acadêmica dos PPGs ou as mudanças que estão se processando nela.

A ciência de dados pode nos ajudar a responder algumas das respostas que envolvem esse escopo, processando grandes quantidades de dados, descrevendo o comportamento dos dados e criando de forma gráfica as representações, para melhor visualização para os gestores dos PPGs tomarem decisões baseado em indicadores.

Na área de ciência de dados, quando falamos de dados quantitativos, há diversas metodologias que podem ser utilizadas para análise dos dados exploratória das produções intelectuais de um determinado PPG ou, até mesmo, de uma determinada área de pesquisa do PPG. Abaixo seguem alguns dos principais passos para uma análise eficaz dos dados, com alguns exemplos no contexto de análise de dados acadêmicos e algumas metodologias.

AQUISIÇÃO DOS DADOS

Para este trabalho, os dados utilizados para avaliação são adquiridos diretamente da Plataforma Lattes, sobre os pesquisadores envolvidos no PPG que está sendo avaliado. Eles estão dispostos em bancos de dados internos para aquisição mais dinâmica e armazenados em arquivos xml, que a própria plataforma disponibiliza.

Abaixo segue um exemplo, onde foi necessária a aquisição dos dados de atuações profissionais dos egressos de um PPG. Para responder a pergunta de quantos egressos trabalham em IES e quantos não trabalham em IES, foi necessário o pré-processamento dos dados xml providos pelo Lattes para adquirir estas informações, já que inicialmente não eram guardados em nenhuma base de dados interna.

O algoritmo foi criado em ruby devido a necessidade de manipulação de arquivos xml de forma rápida, função que a gem nokogiri efetua de forma muito eficaz.

require ‘nokogiri’
require ‘date’
require ‘csv’
require ‘rails’
def get_last_update(doc)last_update = doc.xpath(“//CURRICULO-VITAE/@DATA-ATUALIZACAO”)if last_update.size() < 0
return nil
end
last_update = last_update[0].to_slast_update = Date.strptime(last_update,”%d%m%Y”)return last_update
end
def get_current_activities(doc)# jobs = doc.xpath(“//ATUACAO-PROFISSIONAL[@SEQUENCIA-IMPORTANCIA <= 5]”)
jobs = doc.xpath(“//ATUACAO-PROFISSIONAL”)
current_activities = []jobs.each do |job|
institution_name = job.xpath(‘@NOME-INSTITUICAO’).to_s.parameterize(separator: “ “).upcase
current_jobs = job.xpath(“VINCULOS[@ANO-FIM=’’]”)
if current_jobs.size > 0
current_activities << institution_name
end
end
return current_activities
end
students = CSV.read(‘dados_completos_nome_lattesid_subarea.csv’)
students.shift
CSV.open(“atuacoes.csv”, “wb”) do |csv|
csv << [“NOME”, “LATTES_ID”, “SUBAREA”, “ATUALIZADO_EM”, “TRABALHA_EM”]
students.each do |student|filename = “xmls/”+student[1]+”.xml”
if !File.file?(filename)
next
end
doc = File.open(filename) { |f| Nokogiri::XML(f) }last_update = get_last_update(doc)
current_activities = get_current_activities(doc)
# NOME LATTES_ID SUBÁREA
csv << [student[0], student[1], student[2], last_update, current_activities]
endend

ANÁLISE INICIAL DE DADOS

A análise inicial de dados é realizada de forma independente da análise feita para abordar as questões de pesquisa. As deficiências nesses primeiros passos podem resultar em métodos estatísticos inapropriados ou conclusões incorretas. Nesse estágio, deve ser delineada uma estrutura concisa para análise inicial de dados, onde os exemplos de relatórios em publicações são fornecidos e, então, é feita uma abordagem sistemática e cuidadosa da análise.

essa etapa da análise deve-se fazer a definição do período no qual será analisado pelo cientista de dados responsável pelo projeto. Esta informação pode estar determinada desde a etapa de aquisição de dados ou, até mesmo, definida dentro do dataset que está sendo trabalhado, dividindo o subset somente a série temporal em que será explorada.

Abaixo segue um exemplo em python de como é criada um subset do dataset principal com o tamanho dos dados do período de 01/01/2020 até 01/04/2020.

start_date = '2020-01-01' 
end_date = '2020-04-01'
mask = (df_works_in_uni['ATUALIZADO_EM'] > start_date) & (df_works_in_uni['ATUALIZADO_EM'] <= end_date)

ANÁLISE EXPLORATÓRIA

A análise exploratória de dados refere-se ao processo crítico de realizar investigações iniciais sobre dados, de modo a descobrir padrões, identificar anomalias, testar hipóteses e verificar suposições com a ajuda de estatísticas resumidas e representações gráficas. É uma estratégia de análise de dados que enfatiza manter a mente aberta para possíveis alternativas com relação a forma de tratar os dados e analisá-los.

PROCESSAMENTO DE LINGUAGEM NATURAL

A natureza dos dados em produções intelectuais são em grande parte textuais, com entradas representando nomes de autores, produções, onde e quando foram publicadas, os vínculos institucionais e diversos outros fatores que compõem uma autoria. Por serem inseridos manualmente por diversas pessoas, é natural que informações semelhantes sejam representadas de diferentes formas, assim como é esperado que padrões não sejam estáveis. Para automatizar a organização, a classificação e o entendimento de todos os dados disponíveis — para que assim possamos extrair conhecimento dos mesmos — precisamos ensinar computadores a ler, interpretar e trabalhar com as informações disponíveis. Aqui, o processamento de linguagem natural é utilizado para que sistemas computacionais possam aprender a interpretar textos escritos por humanos e, ainda, possam processar todo o conteúdo de maneira automática e eficiente.

Nesta etapa, são apresentados algoritmos de pré-processamento das variáveis textuais para categorizá-las de acordo a regras específicas. O exemplo abaixo mostra como foi utilizado levenshtein para descobrir os egressos que trabalham em universidades:

def match(activities):

for i in range(len(activities)):
for j in range(len(ies)):
# Primeiro testa se o nome contém universidade ou faculdade
if ("UNIVERSIDADE" in activities[i]) or ("UNIVERSITY" in activities[i]) or ("FACULDADE" in activities[i]):
return True
# Senão, busca na lista de IES
if Levenshtein.ratio(activities[i], ies[j]) >= 0.89:
return True

return False

def works_in_university(activities):

matches = []

for i in range(len(activities)):
r_activities = eval(activities[i])
matches.append(match(r_activities))

return matches

df_works_in_uni = df_researchers.loc[df_researchers["TRABALHA_EM_UNIVERSIDADE"]]
df_works_in_uni

Exemplo de dados retornados:

ALGORITMOS DE CLUSTERIZAÇÃO

Esta etapa é utilizada quando é necessária encontrar estruturas inerentes aos dados e as relações que as diversas informações possuem umas com as outras. Os algoritmos são usados para encontrar semelhanças entre os dados que temos e novas informações a serem adicionadas futuramente, o que auxilia em tarefas como desambiguação, organização e representação das estruturas de coautorias na base de dados. É entendido que entidades dentro de um mesmo cluster sejam semelhantes entre si e diferentes das entidades dos outros clusters, possibilitando as tarefas supracitadas acima.

VISUALIZAÇÃO DE DADOS

Após o estudo dos dados e encontradas as respostas para as perguntas que necessitam ser respondidas, os dados devem ser descritos de uma forma mais visual e compreensível para o gestor da área de educação do PPG. Para facilitar o processo de entendimento das informações e geração de insights, é necessário utilizar bibliotecas específicas para criação de gráficos.

Abaixo segue um exemplo de como a informação pode ser disposta com a biblioteca seaborn em python:

sns.set_context("talk")
sns.set_style("whitegrid")
plt.figure(figsize=(8,8))

ax = sns.barplot(data=data, palette="husl")

ax.set(ylabel='Número de Egressos')

for index, row in data.iterrows():
ax.text(0,row["Não atuam em IES"], round(row["Não atuam em IES"],2), ha="center")
ax.text(1,row["Atuam em IES"], round(row["Atuam em IES"],2), ha="center")


plt.title("Atuação de Egressos em IES")

Outra pergunta que pode ser feita é quais dos Lattes dos docentes, dentro do contexto de quem trabalha ou não em IES, é qual a porcentagem dos docentes está com o currículo Lattes atualizado nos últimos 6 meses.

data = pd.DataFrame(data)

sns.set_context("talk")
sns.set_style("whitegrid")
# plt.figure(figsize=(8,8))

ax = sns.barplot(data=data, palette="husl", orient="h")

ax.set(xlabel='Número de Egressos')

for p in ax.patches:
percentage = '{:.1f}%'.format(100 * p.get_width()/total_university)
x = p.get_x() + p.get_width() + 0.02
y = p.get_y() + p.get_height()/2
ax.annotate(percentage, (x, y), ha="right")


plt.title("Atualização do Lattes dos atuantes em IES")

print("Possuem Lattes atualizado nos últimos 6 meses:", str(total_uni_updated))
print("Não possuem Lattes atualizado nos últimos 6 meses:", str(total_university-total_uni_updated))

Ainda, podemos diminuir mais o escopo dos dados, trazendo a porcentagem dos Lattes atualizado entre o período de 01/2020 até 03/2020:

data = pd.DataFrame(np.array([[total_uni_updated_2, total_university-total_uni_updated_2]]),
columns=['Possuem Lattes atualizado em 2020', 'Não possuem Lattes atualizado em 2020'])

data = pd.DataFrame(data)

sns.set_context("talk")
sns.set_style("whitegrid")
# plt.figure(figsize=(8,8))

ax = sns.barplot(data=data, palette="husl", orient="h")

ax.set(xlabel='Número de Egressos')

for p in ax.patches:
percentage = '{:.1f}%'.format(100 * p.get_width()/total_university)
x = p.get_x() + p.get_width() + 0.02
y = p.get_y() + p.get_height()/2
ax.annotate(percentage, (x, y), ha="right")


plt.title("Atualização do Lattes dos atuantes em IES")

print("Possuem Lattes atualizado em 2020:", str(total_uni_updated_2))
print("Não possuem Lattes atualizado em 2020:", str(total_university-total_uni_updated_2))

Podemos trazer informações também sobre o volume de publicações dentro do PPG ao longo dos anos.

E também, a visualização de indicadores pode ser demonstrada pelo Qualis das publicações científicas por grande área de conhecimento dentro do PPG, para melhores informações de quais áreas não estão produzindo o bastante e quais estão produzindo.

Com isso, essas são só algumas metodologias métricas e insights possíveis dentro de um projeto de ciência de dados, voltado para área de educação superior e visando ajudar na avaliação dos programas de pós-graduação. Cabe ao cientista de dados e a coordenação do programa fazerem as perguntas corretas para os dados e os mesmos responderão da melhor forma possível.

Essa foi uma pequena amostra de como fazemos grandes análises para nossos clientes e parceiros. Entre em contato com a equipe da Indeorum ou conheça o Cientum, nossa ferramenta para autoanálise do seu PPG.

--

--