Analisando mais de 9 mil papers econômicos desde 2005

 

Quantos artigos na área de economia são publicados por ano? Quais são os tópicos mais abordados? E as linguagens e softwares mais utilizados? R vs. Python? Descubra as respostas destas perguntas neste texto que faz uma análise exploratória de cerca de 9000 papers econômicos que disponibilizam códigos/dados de 16 revistas/journals, no período de 2005 a 2021.

Principais descobertas sobre a amostra de dados:

  • Há forte tendência de crescimento no nº de publicações anual, porém com queda significativa desde 2019;
  • O número de coautores por paper quase dobrou desde 2005, chegando a 2,63 em 2021;
  • A disponibilidade dos dados utilizados nos papers passou a ser 100% somente a partir de 2020;
  • Stata continua sendo o software mais utilizado, apesar da tendência de queda desde 2013, seguido por MATLAB, Python e R.

Dados

Os dados são provenientes do trabalho incrível realizado por Sebastian Kranz da Ulm University. Em resumo, foi criado um banco de dados de informações sobre papers que disponibilizam códigos/dados. Essa informações incluem ano, título, número de autores, abstract, URL, informações sobre arquivos disponíveis, etc., possibilitando uma pequena análise exploratória de dados. Vale frisar que apesar de ser uma base de dados interessante, os dados representam apenas uma amostra.

Os dados são proveniente de papers publicados nos journals da American Economic Association (AEA), The Review of Economic Studies (REStud) e The Review of Economics and Statistics (REST), além de uma parcela menor (conforme política disponibilidade de dados) proveniente de QJE, JPE, JEEA, Econometrica e JAERE.

Agora vamos ao código!

Pacotes

Para reproduzir os códigos de R do exercício, certifique-se de que tenha os seguintes pacotes instalados/carregados:

library(magrittr)  # CRAN v2.0.1
library(RSQLite)   # CRAN v2.2.1
library(dbmisc)    # github.com/skranz/dbmisc
library(dplyr)     # CRAN v1.0.7
library(ggplot2)   # CRAN v3.3.5
library(ggtext)    # CRAN v0.1.1
library(stringr)   # CRAN v1.4.0
library(scales)    # CRAN v1.1.1
library(tm)        # CRAN v0.7-8
library(wordcloud) # CRAN v2.6

Importação de dados

Para importar os dados para o R, siga os seguintes comandos (não execute caso não queira arquivos temporários baixados para seu computador):

# Link para baixar banco de dados
url_db <- "http://econ.mathematik.uni-ulm.de/ejd/articles.zip"

# Criar pasta temporária
temp_folder <- tempdir()

# Baixar arquivo (zipado)
download.file(
  url      = url_db,
  destfile = paste0(temp_folder, "\\", basename(url_db)),
  mode     = "wb" # talvez você precise mudar esse argumento, dependendo do seu sistema
)

# Descompactar
unzip(
  zipfile = paste0(temp_folder, "\\", basename(url_db)),
  exdir   = temp_folder
)

# Listar arquivos na pasta
file_db <- list.files(temp_folder, pattern = "sqlite", full.names = TRUE)

# Copiar arquivos para diretório atual de trabalho
file.copy(from = file_db, to = getwd(), overwrite = TRUE)
#> [1] TRUE

# Conexão com o banco de dados no R
db <- RSQLite::dbConnect(
  RSQLite::SQLite(),
  list.files(getwd(), pattern = "sqlite")
) %>%
  dbmisc::set.db.schemas(
    schema.file = system.file(
      "schema/articles.yaml",
      package = "EconJournalData"
    )
  )
#> Warning in file(con, "r"): file("") only supports open = "w+" and open = "w+b":
#> using the former

class(db)
#> [1] "SQLiteConnection"
#> attr(,"package")
#> [1] "RSQLite"


# Ler tabela com informações sobre os papers
df_articles <- dbmisc::dbGet(db, "article") %>%
  dplyr::as_tibble()

df_articles
#> # A tibble: 9,051 x 22
#>    id             year  date journ title   vol issue artnum article_url has_data
#>    <chr>         <int> <int> <chr> <chr> <int> <int>  <int> <chr>          <int>
#>  1 aer_108_11_1   2018 17836 aer   Firm~   108    11      1 https://ww~        1
#>  2 aer_108_11_2   2018 17836 aer   Near~   108    11      2 https://ww~        1
#>  3 aer_108_11_3   2018 17836 aer   The ~   108    11      3 https://ww~        1
#>  4 aer_108_11_4   2018 17836 aer   The ~   108    11      4 https://ww~        1
#>  5 aer_108_11_5   2018 17836 aer   Stra~   108    11      5 https://ww~        1
#>  6 aer_108_11_6   2018 17836 aer   Meas~   108    11      6 https://ww~        1
#>  7 aer_108_11_7   2018 17836 aer   Mism~   108    11      7 https://ww~        1
#>  8 aer_108_11_8   2018 17836 aer   Temp~   108    11      8 https://ww~        1
#>  9 aer_108_11_9   2018 17836 aer   The ~   108    11      9 https://ww~        1
#> 10 aer_108_11_10  2018 17836 aer   BKK ~   108    11     10 https://ww~        1
#> # ... with 9,041 more rows, and 12 more variables: data_url <chr>, size <dbl>,
#> #   unit <chr>, files_txt <chr>, downloaded_file <chr>, num_authors <int>,
#> #   file_info_stored <int>, file_info_summarized <dbl>, abstract <chr>,
#> #   readme_file <chr>, repo <chr>, repo_info <chr>

Análise exploratória

A primeira pergunta que queremos responder se trata da quantidade de papers na área da economia que são publicados por ano, nesta amostra de dados. Geramos a visualização abaixo que mostra a evolução anual do nº de papers por journal, assim como o total do ano.

Seria a queda de publicações nos anos recentes um impacto da pandemia da COVID-19?

# Cores para gráficos
colors <- c(
  blue   = "#282f6b",
  red    = "#b22200",
  yellow = "#eace3f",
  green  = "#224f20",
  purple = "#5f487c"
)
colors_aug <- grDevices::colorRampPalette(colors)(16)

# Texto de legenda
am_caption <- "**Dados**: Sebastian Kranz/Ulm University | **Elaboração**: analisemacro.com.br"

# Definir padrão de gráficos
theme_am <- function(){
  ggplot2::theme_light() %+replace%
    ggplot2::theme(
      axis.text        = ggtext::element_markdown(size = 12, face = "bold"),
      axis.title       = ggtext::element_markdown(size = 12, face = "bold"),
      panel.grid.minor = ggplot2::element_blank(),
      legend.title     = ggtext::element_markdown(size = 14, face = "bold"),
      legend.text      = ggtext::element_markdown(size = 12),
      plot.subtitle    = ggtext::element_markdown(size = 16, hjust = 0),
      plot.title       = ggtext::element_markdown(
        size   = 30,
        face   = "bold",
        colour = "#282f6b",
        hjust  = 0,
      ),
      plot.caption     = ggtext::element_textbox_simple(
        size   = 12,
        colour = "grey20",
        margin = ggplot2::margin(10, 5.5, 10, 5.5)
      )
    )
}
ggplot2::theme_set(theme_am())


# Evolução do número de artigos
df_articles %>%
  dplyr::group_by(year, journ) %>%
  dplyr::summarise(articles = dplyr::n(), .groups = "drop") %>%
  dplyr::mutate(journ = stringr::str_to_upper(journ)) %>%
  ggplot2::ggplot(ggplot2::aes(x = year, y = articles, fill = journ)) +
  ggplot2::geom_col() +
  ggplot2::stat_summary(
    ggplot2::aes(x = year, y = articles, label = ..y..),
    fun         = sum,
    geom        = "text",
    vjust       = -0.3,
    size        = 5.5,
    fontface    = "bold",
    inherit.aes = FALSE
  ) +
  ggplot2::scale_fill_manual(values = unname(colors_aug)) +
  ggplot2::scale_x_continuous(breaks = unique(df_articles$year)) +
  ggplot2::labs(
    title    = "EconPapers: Evolução do nº de publicações",
    subtitle = "<br>Amostra de papers publicados com códigos/dados<br>",
    y        = "Quantidade",
    x        = NULL,
    fill     = "Journal",
    caption  = am_caption
  )

Também podemos obter a informação da evolução do número de coautores, em média, nos papers.

Seria essa tendência de crescimento também observada em outras áreas?

# Número médio de autores
df_articles %>%
  dplyr::group_by(year) %>%
  dplyr::summarise(num_auth = mean(num_authors, na.rm = TRUE), .groups = "drop") %>%
  ggplot2::ggplot(ggplot2::aes(x = year, y = num_auth)) +
  ggplot2::geom_line(size = 2, colour = unname(colors[1])) +
  ggplot2::scale_x_continuous(breaks = unique(df_articles$year)) +
  ggplot2::scale_y_continuous(labels = scales::comma_format(big.mark = "", decimal.mark = ",")) +
  ggplot2::labs(
    title    = "EconPapers: nº médio de coautores",
    subtitle = "<br>Amostra de papers publicados com códigos/dados<br>",
    y        = NULL,
    x        = NULL,
    caption  = am_caption
  )

Dentro dessa amostra de dados, que traz somente informações de papers que são publicados com disponibilização de códigos/dados de replicação, podemos também obter a informação da quantidade de papers que têm dados para download. Perceba que as barras em azul estão (felizmente) predominando:

# Artigos com dados disponíveis
df_articles %>%
  dplyr::group_by(year) %>%
  dplyr::count(has_data) %>%
  dplyr::ungroup() %>%
  dplyr::mutate(
    has_data = dplyr::if_else(has_data == 0L, "Indisponível", "Disponível")
  ) %>%
  ggplot2::ggplot(
    ggplot2::aes(
      x = year,
      y = n,
      fill = has_data
    )
  ) +
  ggplot2::geom_col() +
  ggplot2::scale_fill_manual(values = unname(colors)) +
  ggplot2::scale_x_continuous(breaks = unique(df_articles$year)) +
  ggplot2::labs(
    title    = "EconPapers: nº artigos por disponibilidade<br>de dados de replicação",
    subtitle = "<br>Amostra de papers publicados com códigos/dados<br>",
    y        = "Quantidade",
    x        = NULL,
    fill     = "Dados",
    caption  = am_caption
  )

 

Quais são os principais tópicos abordados nesses papers? Como só temos acesso nessa base de dados ao abstract (o que costuma ser uma boa visão geral do paper), podemos montar um núvem de palavras mais frequentes:

# Palavras mais frequentes nos Abstracts
abstract_txt <- df_articles$abstract[is.na(df_articles$abstract) == FALSE] %>%
  tm::VectorSource() %>%
  tm::Corpus()

abstract_txt_clean <- tm::tm_map(abstract_txt, tm::removePunctuation) %>%
  tm::tm_map(tm::content_transformer(tolower)) %>%
  tm::tm_map(tm::removeNumbers) %>%
  tm::tm_map(tm::stripWhitespace) %>%
  tm::tm_map(tm::removeWords, tm::stopwords("english")) %>%
  tm::tm_map(tm::removeWords, "abstract")
#> Warning in tm_map.SimpleCorpus(abstract_txt, tm::removePunctuation):
#> transformation drops documents
#> Warning in tm_map.SimpleCorpus(., tm::content_transformer(tolower)):
#> transformation drops documents
#> Warning in tm_map.SimpleCorpus(., tm::removeNumbers): transformation drops
#> documents
#> Warning in tm_map.SimpleCorpus(., tm::stripWhitespace): transformation drops
#> documents
#> Warning in tm_map.SimpleCorpus(., tm::removeWords, tm::stopwords("english")):
#> transformation drops documents
#> Warning in tm_map.SimpleCorpus(., tm::removeWords, "abstract"): transformation
#> drops documents

wordcloud::wordcloud(
  words        = abstract_txt_clean,
  scale        = c(5, 0.5),
  min.freq     = 70,
  colors       = colors_aug,
  random.order = FALSE,
  use.r.layout = FALSE,
  rot.per      = 0.35
)

Por fim, mas não menos importante, se você é do time que gosta do velho debate “R vs. Python”, prepare-se para quebrar a cara: na área econômica o Stata e MATLAB (infelizmente) predominam, sendo utilizados na maior parcela de papers públicados nesta amostra de dados.

A notícia boa é que parece haver uma tendência de queda do Stata, mesmo que mais 50% dos papers atualmente ainda o utilizam.

Enquanto isso, R e Python estão em um lento crescimento, representando uma parcela muito pequena de utilização nos papers. Suspeito que possam ser ultrapassados pela linguagem Julia nos próximos anos.

# Ler tabela com informações sobre os arquivos dos papers
files_info <- dbmisc::dbGet(db,"files_summary") %>%
  dplyr::as_tibble()


# Número de papers por tipo de arquivo
files_info %>%
  dplyr::left_join(dplyr::select(df_articles, year, id), by = "id") %>%
  dplyr::filter(is_code == 1L) %>%
  dplyr::count(year, file_type, name = "count") %>%
  dplyr::group_by(year) %>%
  dplyr::mutate(share = count / sum(count) * 100) %>%
  dplyr::ungroup() %>%
  dplyr::filter(file_type %in% c("do", "r", "py", "jl", "m")) %>%
  ggplot2::ggplot(
    ggplot2::aes(
      x      = year,
      y      = share,
      colour = file_type
    )
  ) +
  ggplot2::geom_line(size = 1.5) +
  ggplot2::scale_colour_manual(values = unname(colors)) +
  ggplot2::scale_x_continuous(breaks = unique(df_articles$year)) +
  ggplot2::scale_y_continuous(breaks = scales::extended_breaks(n = 10)) +
  ggplot2::labs(
    title    = "EconPapers: utilização de linguagens",
    subtitle = "<br>Linguagens selecionadas, amostra de papers com código disponível, % do total no ano",
    y        = "%",
    x        = NULL,
    caption  = am_caption
  ) +
  ggplot2::guides(
    colour = ggplot2::guide_legend(title = NULL, nrow = 1)
  ) +
  ggplot2::theme(legend.position = "top")

 

O que achou? Este texto é aberto para discussão/sugestões!

Created on 2021-11-04 by the reprex package (v2.0.0)

 

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como usar o Google AI Studio e o Gemini?

Na corrida da IA, novas ferramentas e modelos são lançados quase que diariamente. Neste artigo mostramos como o Google tem competido neste mercado através do AI Studio e do Gemini e damos um exemplo de integração em Python.

Analisando a ancoragem das expectativas de inflação no Python

Se expectativas de inflação ancoradas com a meta são importantes para a economia, analisar o grau de ancoragem é imperativo para economistas e analistas de mercado. Neste exercício mostramos uma forma de aplicar esta análise com uma metodologia desenvolvida pelo FMI. Desde a coleta dos dados, passando pelo modelo e pela visualização de dados, mostramos como analisar a política monetária usando o Python.

Como analisar a DRE de empresas de capital aberto usando o Python

Quando analisamos a demonstração de resultados de uma empresa listada na bolsa de valores, frequentemente recorremos a ferramentas convencionais, que embora sejam úteis, muitas vezes carecem de automação. É aqui que entra o Python. Neste post, exploramos o poder do Python para automatizar o processo de coleta, tratamento e análise dos dados da Demonstração do Resultado do Exercício (DRE) da Eletrobras, utilizando dados fornecidos pela CVM (Comissão de Valores Mobiliários).

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.