Análise de Coautorias

Sobre

Este documento apresenta código e procedimentos para criar gráficos e análises sobre coautoria de trabalhos de discentes e docentes dos programas de pós-graduação.

Obtendo os dados

Primeiro verifique na seção Dados sobre Discentes da Pós-Graduação Stricto Sensu no Brasil como baixar as planilhas com dados de docentes. Para os exemplos neste documento usaremos os arquivos br-capes-col-prod-2004a2012-2018-08-01-bibliografica-artpe.xlsx, br-capes-colsucup-producao-2013a2016-2020-06-30-bibliografica-artpe.xlsx, br-capes-colsucup-producao-2017a2020-2023-11-30-bibliografica-artpe_parte1.xlsx, br-capes-colsucup-producao-2017a2020-2023-11-30-bibliografica-artpe_parte2.xlsx, br-capes-colsucup-producao-2021a2024-2023-10-31-bibliografica-artpe.xlsx (versões mais atuais quando o documento foi criado). Veja também a Tabela Arquivos com dados sobre Artigos em Periódicos.

Atenção

Os dados usados neste documento são de 2022.

Lendo e filtrando os dados

import pandas as pd
import glob
import re
import warnings
from IPython.display import Markdown

Para cada planilha vamos ler a aba Produção Intelectual da planilha, filtrar alguns campos que não são necessários e separar somente as linhas que tem nomes de autores. Como repetiremos estes passos para cada planilha é melhor definir uma função em Python que recebe o nome do arquivo e retorna um dataframe com os campos e linhas que precisamos:

def preprocessaProducoes(fileName):
    # Lemos a planilha.
    with warnings.catch_warnings():
        warnings.filterwarnings("ignore", category=UserWarning, 
                                module=re.escape('openpyxl.styles.stylesheet'))
        df = pd.read_excel(fileName,engine='openpyxl',sheet_name='Produção Intelectual')
    # Removemos os campos indesejados.    
    keep = ['Ano da Produção', 'Título da Produção', 'Produção Glosada?',
            'Tipo da Produção', 'Subtipo da Produção', 
            'Nome do Detalhamento', 'Valor do Detalhamento',
            'Nome do Autor', 'Categoria do Autor'
             ]
    df = df[keep]
    return df

A biblioteca usada para a leitura de planilhas gera advertências no código, para isto usamos filtros de alertas (veja mais detalhes aqui).

Os dados que precisamos estão todos armazenados em planilhas, uma por ano, em um diretório (a lista de planilhas para este documento pode ser vista aqui):

dir = "Resources/Data/ColetaSucupira/"

Podemos então criar uma lista de arquivos com nomes semelhantes no diretório indicado e uma lista de dataframes para receber os dados:

fileNames = glob.glob(dir+"relatorio_dados_enviados_coleta_20??.xlsx")
dfs = []

Agora podemos ler cada um destes arquivos, filtrar linhas e colunas e anexar o dataframe filtrado à lista de dataframes:

for file in fileNames:
    df = preprocessaProducoes(file)
    dfs.append(df)

Em uma linha concatenaremos todos os dataframes da produção intelectual do conjunto de planilhas:

dfconcatenado = pd.concat(dfs, ignore_index=True)    

Devemos manter somente as produções que não foram glosadas:

#dfconcatenado = dfconcatenado[dfconcatenado['Produção Glosada?'] == 'Não']
#dfconcatenado.drop(columns=['Produção Glosada?'], inplace=True)

Agora temos todas as produções intelectuais de todos os anos que foram coletados na Plataforma Sucupira sobre nosso programa de pós-graduação. Mas estes dados ainda não estão prontos para a análise que queremos fazer: cada registro no dataframe contém informação sobre uma produção e um autor, portanto uma produção com quatro autores está representada em quatro registros.

Podemos entender melhor este dataframe temporário criando um subconjunto dele contendo somente registros do artigo “A PLATFORM FOR LAND USE AND LAND COVER DATA INTEGRATION AND TRAJECTORY ANALYSIS”. Para visualizar melhor este subconjunto visualizando-o como uma tabela (eliminando antes alguns campos redundantes para facilitar a visualização):

reescreva o texto!

def determine_titulo_pub(subtipo, details):
    if subtipo == "ARTIGO EM PERIÓDICO":
        return details.get("ISSN / Título do periódico", None)
    elif subtipo == "TRABALHO EM ANAIS":
        return details.get("Nome do evento", None)
    elif subtipo == "LIVRO":
        return details.get("Título da Obra", None)
    return None
# Initialize a list to hold flattened rows
flattened_data = []

# Group by 'Ano da Produção' and 'Título da Produção' to iterate over each publication
for _, group in dfconcatenado.groupby(['Ano da Produção', 'Título da Produção', 'Subtipo da Produção']):
    # Collect the 'Nome do Detalhamento' and 'Valor do Detalhamento' pairs into a dictionary for easy access
    details = dict(zip(group['Nome do Detalhamento'], group['Valor do Detalhamento']))
    
    # Determine 'TITULO PUB' based on the given conditions
    subtipo = group['Subtipo da Produção'].iloc[0]
    titulo_pub = determine_titulo_pub(subtipo, details)
    
    # Generate a unique ID
    ano_producao = group['Ano da Produção'].iloc[0]
    titulo_producao = group['Título da Produção'].iloc[0]
    unique_id = f"{ano_producao}_{titulo_producao}_{subtipo}"

    # Prepare a flattened row
    flattened_row = {
        "Unique ID": unique_id,
        "Ano da Produção": ano_producao,
        "Título da Produção": titulo_producao,
        "Produção Glosada?": group['Produção Glosada?'].iloc[0],
        "Tipo da Produção": group['Tipo da Produção'].iloc[0],
        "Subtipo da Produção": subtipo,
        "TITULO PUB": titulo_pub
    }
    
    # Adding authors as they are repeated with 'Nome do Autor' and 'Categoria do Autor' columns
    authors = group[['Nome do Autor', 'Categoria do Autor']].dropna()
    flattened_row['Autores'] = authors.to_dict(orient='records')
    
    flattened_data.append(flattened_row)

# Convert the flattened data to a DataFrame
flattened_df = pd.DataFrame(flattened_data)
Markdown(flattened_df.head(10).to_markdown(index=False))
Unique ID Ano da Produção Título da Produção Produção Glosada? Tipo da Produção Subtipo da Produção TITULO PUB Autores
2014_‘MODELAGEM DE TURBULÊNCIA EM CAMADA LIMITE ATMOSFÉRICA / ATMOSPHERIC BOUNDARY LAYER TURBULENCE MODELLING’_APRESENTAÇÃO DE TRABALHO 2014 ‘MODELAGEM DE TURBULÊNCIA EM CAMADA LIMITE ATMOSFÉRICA / ATMOSPHERIC BOUNDARY LAYER TURBULENCE MODELLING’ Não TÉCNICA APRESENTAÇÃO DE TRABALHO [{‘Nome do Autor’: ‘HAROLDO FRAGA DE CAMPOS VELHO’, ‘Categoria do Autor’: ‘Docente’}]
2014_‘TURBULÊNCIA EM EVOLUÇÃO COSMOLÓGICA / TURBULENCE IN COSMOLOGICAL EVOLUTION’_APRESENTAÇÃO DE TRABALHO 2014 ‘TURBULÊNCIA EM EVOLUÇÃO COSMOLÓGICA / TURBULENCE IN COSMOLOGICAL EVOLUTION’ Não TÉCNICA APRESENTAÇÃO DE TRABALHO [{‘Nome do Autor’: ‘HAROLDO FRAGA DE CAMPOS VELHO’, ‘Categoria do Autor’: ‘Docente’}]
2014_8TH BRAZILIAN WORKSHOP ON SYSTEMATIC AND AUTOMATED SOFTWARE TESTING (SAST 2014)_ORGANIZAÇÃO DE EVENTO 2014 8TH BRAZILIAN WORKSHOP ON SYSTEMATIC AND AUTOMATED SOFTWARE TESTING (SAST 2014) Não TÉCNICA ORGANIZAÇÃO DE EVENTO [{‘Nome do Autor’: ‘VALDIVINO ALEXANDRE DE SANTIAGO JUNIOR’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘WILKERSON DE LUCENA ANDRADE’, ‘Categoria do Autor’: ‘Participante Externo’}]
2014_A CLUSTERING SEARCH METAHEURISTIC FOR THE POINT-FEATURE CARTOGRAPHIC LABEL PLACEMENT PROBLEM_ARTIGO EM PERIÓDICO 2014 A CLUSTERING SEARCH METAHEURISTIC FOR THE POINT-FEATURE CARTOGRAPHIC LABEL PLACEMENT PROBLEM Não BIBLIOGRÁFICA ARTIGO EM PERIÓDICO 0377-2217 / European Journal of Operational Research [{‘Nome do Autor’: ‘ROMULO LOUZADA RABELLO’, ‘Categoria do Autor’: ‘Participante Externo’}, {‘Nome do Autor’: ‘GERALDO REGIS MAURI’, ‘Categoria do Autor’: ‘Participante Externo’}, {‘Nome do Autor’: ‘GLAYDSTON MATTOS RIBEIRO’, ‘Categoria do Autor’: ‘Participante Externo’}, {‘Nome do Autor’: ‘LUIZ ANTONIO NOGUEIRA LORENA’, ‘Categoria do Autor’: ‘Docente’}]
2014_A CONSENSUS-BASED SEMI-SUPERVISED GROWING NEURAL GAS_TRABALHO EM ANAIS 2014 A CONSENSUS-BASED SEMI-SUPERVISED GROWING NEURAL GAS Não BIBLIOGRÁFICA TRABALHO EM ANAIS 2014 International Joint Conference on Neural Networks (IJCNN) [{‘Nome do Autor’: ‘VINICIUS ROSA MAXIMO’, ‘Categoria do Autor’: ‘Participante Externo’}, {‘Nome do Autor’: ‘MARCOS GONCALVES QUILES’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘MARIA CRISTINA VASCONCELOS NASCIMENTO’, ‘Categoria do Autor’: ‘Participante Externo’}]
2014_A FORMAL VERIFICATION TOOL FOR UML BEHAVIORAL DIAGRAMS_ARTIGO EM PERIÓDICO 2014 A FORMAL VERIFICATION TOOL FOR UML BEHAVIORAL DIAGRAMS Não BIBLIOGRÁFICA ARTIGO EM PERIÓDICO 0302-9743 / Lecture Notes in Computer Science [{‘Nome do Autor’: ‘LUCIANA BRASIL REBELO DOS SANTOS’, ‘Categoria do Autor’: ‘Discente - Doutorado’}, {‘Nome do Autor’: ‘EDUARDO ROHDE ERAS’, ‘Categoria do Autor’: ‘Participante Externo’}, {‘Nome do Autor’: ‘VALDIVINO ALEXANDRE DE SANTIAGO JUNIOR’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘NANDAMUDI LANKALAPALLI VIJAYKUMAR’, ‘Categoria do Autor’: ‘Docente’}]
2014_A FORMAL VERIFICATION TOOL FOR UML BEHAVIOURAL DIAGRAMS_ARTIGO EM PERIÓDICO 2014 A FORMAL VERIFICATION TOOL FOR UML BEHAVIOURAL DIAGRAMS Não BIBLIOGRÁFICA ARTIGO EM PERIÓDICO 0302-9743 / Lecture Notes in Computer Science [{‘Nome do Autor’: ‘LUCIANA BRASIL REBELO DOS SANTOS’, ‘Categoria do Autor’: ‘Discente - Doutorado’}, {‘Nome do Autor’: ‘EDUARDO ROHDE ERAS’, ‘Categoria do Autor’: ‘Participante Externo’}, {‘Nome do Autor’: ‘VALDIVINO ALEXANDRE DE SANTIAGO JUNIOR’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘NANDAMUDI LANKALAPALLI VIJAYKUMAR’, ‘Categoria do Autor’: ‘Docente’}]
2014_A HYBRID ARCHITECTURE FOR MOBILE GEOGRAPHICAL DATA ACQUISITION AND VALIDATION SYSTEMS_TRABALHO EM ANAIS 2014 A HYBRID ARCHITECTURE FOR MOBILE GEOGRAPHICAL DATA ACQUISITION AND VALIDATION SYSTEMS Não BIBLIOGRÁFICA TRABALHO EM ANAIS XV Brazilian Symposium on Geoinformatics [{‘Nome do Autor’: ‘CLAUDIO HENRIQUE BOGOSSIAN’, ‘Categoria do Autor’: ‘Sem Categoria’}, {‘Nome do Autor’: ‘KARINE REIS FERREIRA GOMES’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘ANTONIO MIGUEL VIEIRA MONTEIRO’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘LUBIA VINHAS’, ‘Categoria do Autor’: ‘Docente’}]
2014_A HYBRID HEURISTIC FOR THE PERMUTATION FLOWSHOP PROBLEM_TRABALHO EM ANAIS 2014 A HYBRID HEURISTIC FOR THE PERMUTATION FLOWSHOP PROBLEM Não BIBLIOGRÁFICA TRABALHO EM ANAIS 5th International Conference on Computational Logistics [{‘Nome do Autor’: ‘EDSON LUIZ FRANCA SENNE’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘ANTONIO AUGUSTO CHAVES’, ‘Categoria do Autor’: ‘Participante Externo’}]
2014_A METHOD FOR DERIVING ORDER COMPATIBLE FUZZY RELATIONS FROM CONVEX FUZZY PARTITIONS_ARTIGO EM PERIÓDICO 2014 A METHOD FOR DERIVING ORDER COMPATIBLE FUZZY RELATIONS FROM CONVEX FUZZY PARTITIONS Não BIBLIOGRÁFICA ARTIGO EM PERIÓDICO 0165-0114 / Fuzzy Sets and Systems [{‘Nome do Autor’: ‘SANDRA APARECIDA SANDRI’, ‘Categoria do Autor’: ‘Docente’}, {‘Nome do Autor’: ‘FLAVIA DE TOLEDO MARTINS BEDE’, ‘Categoria do Autor’: ‘Discente - Doutorado’}]
from itertools import combinations

# Initialize a list to hold pairwise author combinations
author_pairs_data = []

# Iterate over each row in the flattened DataFrame to generate pairs of authors
for _, row in flattened_df.iterrows():
    authors = row['Autores']
    if len(authors) > 1:  # Only process if there are two or more authors
        # Generate all pair combinations of authors
        for author1, author2 in combinations(authors, 2):
            author_pair_entry = {
                "Ano da Produção": row['Ano da Produção'],
                "Título da Produção": row['Título da Produção'],
                "Tipo da Produção": row['Tipo da Produção'],
                "Subtipo da Produção": row['Subtipo da Produção'],
                "Author 1": author1['Nome do Autor'],
                "Categoria Author 1": author1['Categoria do Autor'],
                "Author 2": author2['Nome do Autor'],
                "Categoria Author 2": author2['Categoria do Autor']
            }
            author_pairs_data.append(author_pair_entry)

# Convert the list of author pairs to a DataFrame
author_pairs_df = pd.DataFrame(author_pairs_data)
Markdown(author_pairs_df.head(20).to_markdown(index=False))

# Save the DataFrame to CSV
author_pairs_df.to_csv(dir+"pares.csv", index=False)

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA

OOGA OOGA OOGA