Você está na página 1de 9

Analisando mais de 9 mil papers econômicos desde 2005

Fernando da Silva, Cientista de Dados


04 de novembro de 2021

Sumário
1 Introdução 2

2 Dados 2

3 Pacotes 2

4 Importação de dados 3

5 Análise exploratória 3

1
1 Introdução
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.

2 Dados
Os dados são provenientes do trabalho incrível realizado por Sebastian Kranz da Ulm University,
encontre os detalhes e mais informações neste link. 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.

Além disso, para quem se interessar, é possível utilizar uma ferramenta online de pesquisa por
palavras chave, título, etc. para encontrar papers com código/dados disponíveis.

Agora vamos ao código!

3 Pacotes
Para reproduzir os códigos de R do exercício, certifique-se de que tenha os seguintes pacotes insta-
lados/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

2
4 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"
)
)

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>

5 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. Caso tenha dúvidas sobre
as siglas, confira este link.

3
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
)

4
EconPapers: Evolução do nº de publicações
Amostra de papers publicados com códigos/dados

800 773 783 766


712 709
692 Journal
618 613 AEJAPP
599 606 AEJMAC
600
AEJMIC
538
AEJPOL
505
AER
AERI
Quantidade

ECTA
400 JAERE
JEEA
323
JEP
JOLE
JPE
200 196 202 208 208 PANDP
QJE
RESTAT
RESTUD

2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
Dados: Sebastian Kranz/Ulm University | Elaboração: analisemacro.com.br

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
)

5
EconPapers: nº médio de coautores
Amostra de papers publicados com códigos/dados

2,60

2,40

2,20

2,00

1,80
2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
Dados: Sebastian Kranz/Ulm University | Elaboração: analisemacro.com.br

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 quanti-
dade 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
)

6
EconPapers: nº artigos por disponibilidade
de dados de replicação
Amostra de papers publicados com códigos/dados

800

600
Quantidade

Dados
400 Disponível
Indisponível

200

2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
Dados: Sebastian Kranz/Ulm University | Elaboração: analisemacro.com.br

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")

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
)

7
reserve contracts households observed present

paid
reduce child
program local

war

late womens

gains assets significantly


develop

analysis
house bidders chinas

suggest

increase within
types

population business college


voterather
monetary help
exit
studies similar preferences experimentleave beliefs

total
search

hold
finding
relative economy
affect women poor rise empirical act

half
period

strong
jobs set best average production
article drugs initial
part public workers

led
examine

peers
entry education aid increases leads
private third

fall
top male differential
must

capital
far
growth countries individuals

allow
financial students
lead

key
points
return
claims

associated
taken
political test

health

benefits plan
detailed
networks
across economic holds

new
still distribution important
second
wagessince
induce unit

network terms
result

market
statistical
free losses stock ones firm

skill iii
equilibrium
markets

versus

can
treated
three
rate productivity
sets
resultscosts form

income
home based

taxes
tests
different
small
using higher

indicate
effective
fact consistent
counties share

city little
obtain

sex default quality


significant

percent

math
rule action

firmswill

force policies work


better

decline world
choose field

find show
used
investment design value

idea

aggregate years
post

debt

risk
lower

impact
– need

loss
end

likely
face several full

use
modeleffect
uses levels
study

vertical
apply
natural large born
oil
theory

policy
whether ideas

well

job
internal line

bias illustrate
first

arises
data
effects

decisions robustchange
consumption
largest start
tfp

tradetime
turn
low

zero demand
social life
air

insurance information

models
rates

now discount
due

prices
school
others main

even cycles

standard power
estimate also
price jel
net
provide

paper
much
one
less
values
hence

correct

limit
great

crisis fully
evidence
error
efforts
thus drug
high

peer

fail
ante

supply care
returns play

panel
rich level
efficiency

however labor asset tax


real black

optimal
times

employment run variation


good
may two
costly
wage

student
among

current
states

causes
fuel
basic structural role
like
yet
cost
party

favor
output behavior agents stable

state
often
dynamic unitedtarget shocks
take credit
auction
choice research
changes
many
treatment

via

law
recent view
estimates welfare earnings major
loan
larger land

interest
girls flow

sector
slow

cycle
given
around per

performance outcomes
long

gap five showsway federal men


support

response future
rules
causal

individual differences analyze


findings increasedlack
media

takes
government unique
conditions positive incentives size number
learn human sellers correlatedfailure earlier sectors become reduces driven

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(

8
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")

EconPapers: utilização de linguagens


Linguagens selecionadas, amostra de papers com código disponível, % do total no ano
do jl m py r

60

50

40
%

30

20

10

2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
Dados: Sebastian Kranz/Ulm University | Elaboração: analisemacro.com.br

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

Você também pode gostar