Trabalhando com séries temporais no R – Parte II (estatísticas fiscais)

No post anterior (link) demonstrei como importar e definir séries temporais no R quando o vetor de datas não está no formato adequado (no caso de estar formatado como texto, por exemplo). Esse é um problema bastante comum e precisa ser tratado independente do software que o analista está utilizando.

Também destaquei que os canais de acesso à informação (IBGE, Banco Central, Ipeadata, etc.) não seguem um padrão de armazenamento dos dados – geralmente disponibilizam as séries no formato que julgam ser mais conveniente. Mas em alguns casos a formatação dos dados não está relacionada à preferência de quem os divulga. Algumas bases têm de seguir certas normas e padrões internacionais. Esse é o caso das séries de finanças públicas do Banco Central do Brasil.

Devido ao grande número de indicadores, as estatísticas fiscais seguem um padrão de divulgação bastante diferente daquela estrutura que trabalhamos no nosso primeiro exemplo; os dados estão dispostos nas colunas e os rótulos nas linhas. Além disso, na maior parte dos casos não há sequer um vetor de datas e qualquer preocupação de atribuir códigos exclusivos para cada uma das séries, de modo a facilitar a vida do analista quando, em uma mesma base, existem séries com nomes (rótulos) idênticos.

Neste exemplo utilizaremos as séries históricas de Necessidade de Financiamento do Setor Público, disponível na seção de séries temporais do site do Bacen (link). Este conjunto de dados foi escolhido por dois motivos. Primeiro porque atende os três pré-requisitos de base pentelha: (i) dados transpostos, (ii) sem vetor de datas e (iii) ausência de códigos exclusivos em cada indicador. Em segundo lugar, porque este é o assunto do momento – o mundo todo está atento para a forte e rápida deterioração da situação fiscal brasileira, principalmente por conta da incapacidade do governo de cortar gastos, mas também pela queda abrupta da arrecadação federal (afetada sobremaneira pela desaceleração da atividade econômica).

Nosso objetivo é exatamente o mesmo do alcançado no post anterior: deixar a série de dados no formato mais adequado, para posteriormente podermos utilizar todo instrumental de data analysis do R. Também lançaremos mão de um recurso incrível do R: baixar os dados diretamente da fonte e extrair o “zip” para uma pasta temporária do computador. Isso será especialmente útil para aqueles que precisam atualizar mensalmente bases, apresentações gráficas ou modelos econométricos.

O código foi escrito em oito passos. Para não poluirmos os comandos com diversos comentários, descreverei abaixo o que está sendo feito em cada etapa.

  • 1o passo: cria pasta temporária; baixa o arquivo “zip” do site do Bacen e salva na pasta criada; extrai os arquivos para a pasta; cria base “original” com os dados da aba “$-12meses(corrente)”.
  • 2o passo: deleta as linhas e colunas da base “original” onde todas as células estão como “NA”; cria “base1” deixando apenas as linhas com as informações que interessam.
  • 3o passo: cria um vetor de datas baseado no número de colunas (exclusive a coluna A de nomes), definindo apenas a data de início da série; renomeia os rótulos das colunas da “base1” com o vetor de datas, e as linhas com o número de linhas.
  • 4o passo: cria um vetor simples de referência (REF) que “codifica” as linhas para facilitar a escolha dos indicadores; adiciona esse vetor na primeira coluna da “base1”.
  • 5o passo: cria a “base2” convertendo a “base1” para o formato long (mais adequado).
  • 6o passo: converte cada coluna da “base2” para o formato adequado. No vetor de nomes (coluna “Indicador”), remove espaçamento extra (“ Nominal” vira “Nominal”). O vetor de datas é convertido para “aaaa/mm/dd”, o padrão internacional. Já o vetor de Valor é convertido para o formato numérico.
  • 7o passo: cria a “base3”, a partir da “base2”, selecionando o indicador de interesse (REF: 21 = “Primário”), que representa o resultado primário do setor público consolidado no acumulado em 12 meses; divide a coluna de valor por 1.000 (para representar em R$ Bilhões) e inverte o sinal.
library(XLConnect)
library(lubridate)
library(ggplot2)
library(dplyr)
library(reshape2)
library(xlsx)
library(scales)

# 1o PASSO
temp <- tempfile()
download.file("http://www.bcb.gov.br/ftp/notaecon/nfspp.zip", temp)
unzip(temp)
original <- read.xlsx(temp, file = "Nfspp.xls", 
                       sheetName = "$-12meses(corrente)", as.data.frame = TRUE,  
                       encoding = "UTF-8")

unlink(temp)

# 2o PASSO
original <- original[rowSums(is.na(original)) != ncol(original),]
original <- original[,colSums(is.na(original)) != nrow(original)]
base1 <- original[rowSums(is.na(original)) == 0,]

# 3o PASSO
meses <- ncol(base1)-1
datas <- seq.Date(as.Date("2002-11-01"), by = "month", length.out = meses)
colnames(base1) <- c("Indicador", as.character.POSIXt(datas))
row.names(base1) <- 1:nrow(base1)

# 4o PASSO
REF <- row.names(base1)
base1 <- cbind(REF, base1)

# 5o PASSO
base2 <- melt(base1, id = c("REF", "Indicador"), variable.name = "Data", value.name = "Valor")

# 6o PASSO
base2$Indicador <- gsub("\\s+"," ", base2$Indicador) 
base2$Data <- as.POSIXct(parse_date_time(base2$Data, "%Y/%m/%d"))
base2$Valor <- as.numeric(base2$Valor)

# 7o PASSO
selecao <- "21"
base3 <- filter(base2, REF == selecao)
base3$Valor <- base3$Valor/1000*(-1)

8o passo: cria gráfico de linha a partir da “base3”; as opções colocam título, linha reta cruzando o eixo Y no ponto zero, modificam a escala do eixo X para meses e colocam títulos nos eixos.

Pelo gráfico abaixo é possível perceber a forte deterioração do resultado primário do setor público consolidado (que considera o governo federal, os estados e municípios, bem como as empresas estatais não financeiras, exceto a Petrobras e o grupo Eletrobras) desde o final do primeiro trimestre de 2014. É mais do que justificável, portanto, a desconfiança do mercado na capacidade do governo de produzir um superávit primário de R$ 8,747 bilhões (0,15% do PIB) em 2015, uma vez que o resultado acumulado até agosto está negativo em R$ 43,8 bilhões.

# 8o PASSO
graf1 <- ggplot(base3, aes(Data, Valor)) + 
  geom_line(colour = "red", size = .7) + 
  ggtitle("Resultado Primário do Setor Público \n Acum. 12 meses. Elaboração: dadosdadosdados") + 
  theme(plot.title = element_text(lineheight=.9, face="bold")) + 
  geom_hline(yintercept=0, col = "black", linetype = "dashed") +
  scale_x_datetime(breaks = date_breaks("8 months"), labels = date_format("%b/%y")) +
  theme(axis.text.x = element_text(angle = 90))
update_labels(graf1, list(y = "R$ Bilhões", x = ""))

plot of chunk unnamed-chunk-3

Por fim, selecionaremos mais de 1 indicador para colocar no gráfico, e também reduziremos a amostra de análise. Assim poderemos observar composição mais recente do resultado primário por esfera de governo (nível federal e regional).

O resultado final é o destacado no gráfico abaixo.

# Selecionando mais indicadores e reduzindo a amostra  
selecao <- c("22", "27", "30", "31")
base3 <- filter(base2, REF %in% selecao)
base3$Valor <- as.numeric(base3$Valor)
base3$Valor <- base3$Valor/1000*(-1)

amostra <- filter(base3, Data >= "2012-12-01" & Data <= "2015-08-01")
## Warning in data.matrix(data): NAs introduced by coercion
  graf2 <- ggplot(amostra, aes(x=Data, y=Valor, fill=Indicador)) + 
    geom_bar(stat="identity") + 
    ggtitle("Resultado Primário do Setor Público \n Acum. 12 meses. Elaboração: dadosdadosdados") + 
    theme(plot.title = element_text(lineheight=.9, face="bold")) + 
    geom_hline(yintercept=0, col = "black", linetype = "dashed") +
    scale_x_datetime(breaks = date_breaks("2 months"), labels = date_format("%b/%y")) +
    theme(axis.text.x = element_text(angle = 90), legend.position = "bottom") 
  update_labels(graf2, list(y = "R$ Bilhões", x = ""))
## Warning: Stacking not well defined when ymin != 0

plot of chunk unnamed-chunk-4

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s