Tag

sazonalidade Archives - Análise Macro

Análise exploratória de dados macroeconômicos no R

By | Data Science

Neste post iremos revelar algumas coisas que nunca te contaram sobre análise exploratória e como usá-la para ter uma visão geral aplicada a dados macroeconômicos.

Antes de tudo, precisamos entender onde a análise exploratória de dados - do inglês exploratory data analysis (EDA) - está inserida no contexto de uma análise descritiva ou em modelos que usem dados macroeconômicos. Para tais contextos, é fundamental conhecer os dados antes de partir para qualquer exercício empírico, ou seja, queremos uma fotografia que mostre um panorama geral sobre os dados. Esse primeiro passo é extremamente útil para identificar possíveis "pontos cegos" que gerariam problemas no seu modelo ou que poderiam ser interpretados de forma errônea em sua análise conjuntural, por exemplo.

Em outras palavras, a famosa expressão garbage in, garbage out (lixo entra, lixo sai) resume perfeitamente a importância da análise exploratória. Você precisa saber se os dados a serem utilizados possuem a qualidade (características) necessária para fazer uma análise ou se estão simplesmente cheios de sujeiras (outliers, valores ausentes, quebras, etc.). É neste momento em que você aprenderá mais sobre os dados, identificando padrões e comportamentos, assim como saberá o que precisará fazer (tratamentos) para torná-los úteis.

Mas de que tipo de dados estamos falando?

Em geral, os dados macroeconômicos mais usados possuem uma estrutura de série temporal, mas outras estruturas como dados em painel, microdados, etc. também possuem aplicações em macroeconomia. Focando em séries temporais, pode-se destacar algumas coisas que você deve ficar de olho ao fazer uma análise exploratória de dados:

  • Sazonalidade;
  • Tendência;
  • Autocorrelação;
  • Estacionariedade.

Algumas estatísticas e gráficos que irão te ajudar a inspecionar estes padrões e comportamentos:

  • Média, mediana, desvio padrão e IQR;
  • Gráfico de histograma;
  • Gráfico de linha;
  • Gráfico de sazonalidade;
  • Correlogramas ACF e PACF;
  • Testes de estacionariedade ADF, KPSS e PP.

Parece ser bastante coisa para se preocupar em uma análise exploratória e realmente é - podendo ainda ampliarmos este escopo -, mas se usarmos as ferramentas adequadas podemos colocar tudo isso em prática de maneira rápida e eficiente, direcionando o foco na análise propriamente dita. Na linguagem R, existem diversos pacotes modernos com utilidades para análise exploratória de dados, exploraremos a seguir alguns destes pacotes.

Para reproduzir o exercício a seguir você precisará dos seguintes pacotes de R:

Dados

Para exemplificar uma análise exploratória de dados macroeconômicos, usaremos um conjunto de dados que traz informações sobre indicadores econômicos mensais da economia norte-americana. A fonte dos dados é o FRED e os mesmos já estão salvos em um dataset no R:

Estatísticas descritivas

As medidas de estatística descritiva, como média, desvio padrão, percentis, etc. servem para obter uma visão geral dos dados. É um bom primeiro passo se você não tem expertise sobre a variável com a qual irá desenvolver uma análise. O pacote {skimr} faz esse trabalho de calcular estas estatísticas de uma maneira simples e bem apresentada, basta apontar o objeto com os dados:

Note que, além das estatísticas descritivas, também são apresentadas informações como nº e taxa de valores ausentes, gráfico de histograma, valores mínimos e máximas, etc. - a depender do tipo de variável na qual será computado tais cálculos -, que são informações bastante úteis para identificar possíveis problemas nos dados.

Histograma

Talvez apenas com estatísticas descritivas não seja possível ter uma visão clara sobre o comportamento da variável de interesse, ou seja, como os dados estão distribuídos. Para resolver isso, é conveniente gerar um gráfico de histograma, que pode ser criado com o {ggplot2}:

A visualização gráfica dos dados é muito importante pois nos permite rapidamente identificar nos dados algumas coisas interessantes, como neste caso do histograma. A distribuição dos dados apresenta uma cauda alongada a direita, ou seja, possivelmente há algumas poucas observações dessa variável (duração do desemprego) com valores mais "extremos". A questão que surge é: em qual período do tempo aconteceram estes valores? Ou seja, qual é a tendência da variável?

Tendência

O jeito mais direto de identificar a tendência de uma variável é através de um gráfico de linha. Abaixo geramos um gráfico de linha e adicionamos uma linha de suavização, que pode facilitar o rápido entendimento em alguns casos:

Dessa forma, conseguimos identificar que no período mais recente, ou seja, nas últimas observações a partir de 2010, há uma tendência de aumento no tempo de duração do desemprego, superando o histórico observado nas décadas anteriores. Note que, com apenas dois gráficos e algumas estatísticas descritivas, já conseguimos insumos interessantes para uma análise mais aprofundada.

Sazonalidade

A olho nu no gráfico anterior não parece haver comportamento que indique sazonalidade, mas como poderíamos identificar tal comportamento em uma variável? Novamente, a análise gráfica pode auxiliar nessa tarefa. O gráfico de sazonalidade gerado abaixo basicamente é um gráfico de linha, com a exceção de que o eixo X mostra os dados da sazonalidade observada da variável. No caso de dados em frequência mensal, o eixo X será os meses.

O gráfico facilita identificar mais claramente padrões sazonais, que para essa variável não há, além de ser mais fácil de visualizar em quais anos que o padrão muda.

Estacionariedade

Outro ponto importante, principalmente em contextos de modelagem econométrica, é a estacionariedade da série, ou seja, a média e a variância são constantes ao longo do tempo? Quando em uma variável estes pressupostos não são verdadeiros, dizemos que a série possui raiz unitária (é não-estacionária), de modo que os choques que a variável sofre geram um efeito permanente. Parece ter sido esse o caso da variável em questão, a duração do desemprego. Vimos que as flutuações da variável se alteraram consideravelmente, e isso tem fortes implicações relacionadas a teorias econômicas que tratam de ciclos. Mas, fugindo da teoria, como verificamos de maneira prática se a variável é estacionária? O pacote {forecast} possui uma excelente função permitindo aplicar testes, como o ADF, KPSS e PP, que já retornam o número de diferenças necessárias para a série ser estacionária:

Se o valor retornado for maior do que zero, significa que a série é não-estacionária e precisa ser diferenciada na ordem do valor retornado para ser estacionária.

Autocorrelação

Por fim, outra questão importante em séries temporais é a identificação de possíveis correlações (a relação linear) entre os valores defasados da série. Os correlogramas ACF e PACF podem ajudar neste ponto. Como a série não possui sazonalidade mas possui uma certa tendência, as autocorrelações iniciais tendem a ser grandes e positivas pois as observações próximas no tempo também estão próximas em valor. Assim, a função de autocorrelação (ACF) de uma série temporal com tendência tende a ter valores positivos que diminuem lentamente à medida que as defasagens aumentam.

Se fôssemos, por exemplo, implementar uma modelagem ARIMA nessa série, seria apropriado gerar os correlogramas na série estacionária, ou seja, a variável duração do desemprego na primeira diferença.

Saiba mais

Este exercício buscou navegar pelos principais padrões e comportamentos de dados macroeconômicos, usando ferramentas do R para identificá-los. você pode se aprofundar sobre os assuntos relacionados nestes posts do blog da Análise Macro:

Como extrair componentes de tendência e sazonalidade de uma série temporal

By | Data Science

Tendência e sazonalidade são os componentes não observáveis de uma série temporal que representam, respectivamente, o movimento de longo prazo e o padrão regular (queda/subida) de um determinado período da série de tempo. A extração desses componentes pode ser feita facilmente no R usando a decomposição STL, método desenvolvido por Cleveland et al. (1990).

Algumas vantagens desse método em relação aos métodos clássicos de decomposição, como SEATS e X-11, são:

  • Ao contrário do SEATS e do X-11, a decomposição STL lida com qualquer tipo de sazonalidade, não apenas dados mensais e trimestrais;
  • O componente sazonal pode variar ao longo do tempo e a taxa de mudança pode ser definida pelo usuário;
  • A suavidade do componente tendência-ciclo também pode ser controlada pelo usuário;
  • É robusto em caso de outliers (ou seja, pode ser especificado uma decomposição robusta), de modo que observações incomuns não afetem as estimativas dos componentes, com exceção da série "restante".

Em se tratando de séries de tempo econômicas, parece ser uma ótima opção para diversos contextos, dado que a grande maioria das séries foram afetadas pela pandemia da Covid-19 (além de outros choques usuais no caso da economia brasileira).

Destaca-se ainda que o procedimento pode ser feito de maneira completamente automatizada, graças ao belo trabalho da família de pacotes tidyverts.

Exemplo no R

Abaixo aplicamos a decomposição STL sobre a série temporal que traz a popularidade do termo de busca "vagas de emprego" no Google. É esperado que a série apresente de forma clara um padrão sazonal, dado o impulso frequente de contratações de festas de fim de ano.


# Pacotes -----------------------------------------------------------------

# Carregar pacotes utilizados
library(magrittr)
library(dplyr)
library(gtrendsR)
library(tsibble)
library(fabletools)
library(feasts)
library(ggplot2)

# Coleta de dados ---------------------------------------------------------

# Primeiro coletamos os dados de exemplo provenientes do Google Trends
# de forma online usando API com o pacote gtrendsR

# Termo de busca "vagas de emprego" no Google; índice de 0 a 100 representa
# a popularidade relativa ao longo do tempo
df_vagas <- gtrendsR::gtrends(
keyword = "vagas de emprego",
geo = "BR",
time = "all",
onlyInterest = TRUE
)

# Exibir classe do objeto
class(df_vagas)

# Tratamento de dados -----------------------------------------------------

# Em seguida realizamos alguns tratamentos, selecionando e convertendo as
# colunas, além de transformar o objeto para classe tsibble
vagas <- df_vagas %>%
magrittr::extract2(1) %>%
dplyr::mutate(
date = tsibble::yearmonth(date),
hits = as.numeric(hits),
.keep = "used"
) %>%
tsibble::as_tsibble(index = date)

# Exibindo as primeiras linhas
vagas

# Extrair componentes: sazonalidade e tendência ---------------------------

# Aplica modelo decomposição da série (STL decomposition) e transforma
# resultado para um objeto tabular de classe "dable"
componentes <- vagas %>%
fabletools::model(feasts::STL(hits, robust = TRUE)) %>%
fabletools::components()

# Exibir resultado
componentes

# Plotar resultado
fabletools::autoplot(componentes) +
ggplot2::labs(
title = 'Decomposição STL: termo "vagas de emprego" no Google',
x = NULL,
caption = "Dados: Google | Elaboração: analisemacro.com.br"
)

Os gráficos empilhados acima mostram, em primeiro, a série original do Google Trends, seguida abaixo pelos componentes de tendência e sazonalidade identificados automaticamente pelo método STL, além da série "restante" que informa a variação restante dos dados não identificada como sazonal ou tendencial.

Consulte a documentação de feasts::STL para detalhes sobre especificação dos parâmetros e opções.

Referências

R. B. Cleveland, W. S. Cleveland, J.E. McRae, and I. Terpenning (1990) STL: A Seasonal-Trend Decomposition Procedure Based on Loess. Journal of Official Statistics, 6, 3–73.

Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on <2021-12-02>.

 

Crise Hídrica: uma análise da quantidade de água que chega às usinas

By | Comentário de Conjuntura

Tem sido noticiado pela imprensa, uma vez mais, o risco de desabastecimento de energia elétrica no país. A causa para isso seria o menor volume de chuvas, que estaria impactando o nível dos reservatórios, utilizados para a geração de energia pelas usinas hidrelétricas. A quantidade de água que chega em uma usina, utilizada para a geração de energia, é chamada de energia natural afluente, ou simplesmente ENA. Em modelos de previsão para o preço de curto prazo no mercado de energia, essa variável assume importância fundamental. O Operador Nacional do Sistema Elétrico (ONS), inclusive, disponibiliza uma série histórica bastante consistente para a ENA. Nesse Comentário de Conjuntura, analisamos o comportamento da ENA, tendo como foco comparativo o ano de 2021 com a série histórica.

O script começa importando os dados para o RStudio como abaixo.


library(tidyverse)
library(lubridate)
library(fpp3)

data = read_csv2('ena.csv') %>%
mutate(date = yearmonth(parse_date_time(date, orders = "%d/%m/%Y %H-%M"))) %>%
as_tsibble(index = date)

Um primeiro gráfico com as séries é disponibilizado abaixo.


data %>%
gather(variavel, valor, -date) %>%
ggplot(aes(x=date, y=valor, colour=variavel))+
geom_line()+
facet_wrap(~variavel, scales='free')+
theme(legend.position = 'none',
plot.title=element_text(size=9, face='bold'))+
labs(x='', y='',
title='Energia Natural Afluente (MWmed)',
caption='Fonte: analisemacro.com.br')

Observe, primeiro, que estamos vendo a ENA pelos quatro subsistemas: norte, nordeste, sul e sudeste/centro-oeste. Segundo, as séries apresentam uma sazonalidade bastante pronunciada. Por isso, é importante visualizar essa sazonalidade mais de perto. Isso é feito a seguir.


data %>%
gather(variavel, valor, -date) %>%
gg_season()+
facet_wrap(~variavel, scales='free')+
theme(legend.position = 'none',
plot.title = element_text(size=9, face='bold'))+
labs(x='', y='',
title='Sazonalidade da Energia Natural Afluente (MWmed)',
caption='Fonte: analisemacro.com.br')

Os subsistemas nordeste, sudeste e norte apresentam uma sazonalidade bastante pronunciada, correlacionada ao início do período seco. Já o subsistema sul não tem uma tendência muito clara, a partir dessa visualização.

A seguir, nós comparamos a média histórica com o dado de 2021.

Para começar, nós olhamos para o subsistema sudeste/centro-oeste. As linhas vermelhas representam a média de ENA nos respectivos meses, enquanto a bolinha azul representa o ocorrido em 2021. Observa-se que 2021 está, de fato, abaixo da média histórica para o subsistema sudeste/centro-oeste.

No subsistema nordeste, a situação é similar, à exceção do mês de março, onde a ENA ficou dentro da média histórica.

No susbsistema norte, a situação já é bastante confortável. As ocorrências de 2021 estão acima da média histórica.

No subsistema sul, a vazão começou boa no início do ano, mas tem se mantido abaixo da média histórica a partir de março, o que também indica alguma preocupação.

A análise dos gráficos, de modo geral, gera preocupação. Em particular, o subsistema sudeste/centro-oeste, o principal do país, tem apresentado uma vazão abaixo da média histórica nos meses de 2021, o que gera o sinal de alerta para as autoridades responsáveis pela operação do sistema.

Menor vazão para as usinas hidrelétricas vai implicar, necessariamente, em maior acionamento das termelétricas, o que tem impacto direto no preço da energia elétrica para o consumidor, já que a água é, por definição, o insumo mais barato para a produção de energia.

________________

(*) O script completo desse exercício estará disponível no Clube AM essa semana. 

Dessazonalizando os dados do CAGED com o R

By | Mercado de Trabalho

O governo divulgou nessa semana os dados do Cadastro Geral de Empregados e Desempregados, o famoso CAGED. Com efeito, vi muitas matérias na imprensa sobre o resultado negativo em março de saldo negativo de 43.196 entre admissões e demissões. O problema desse resultado é que, como vemos em nosso Curso de Análise de Conjuntura usando o R, ele está contaminado por um problema típico de séries temporais, chamado sazonalidade, isto é, um comportamento que se apresenta de forma regular ao longo dos anos.

Para ilustrar esse problema, coloco abaixo o saldo do CAGED, que peguei do IPEADATA com o pacote ecoseries.

É nítido no gráfico um comportamento regular da série ao longo dos anos, não é mesmo? Assim, de forma a fazer uma análise precisa do que está acontecendo com a série do CAGED, precisamos primeiro "limpar" a sazonalidade. No R, como vemos em nosso Curso de Análise de Conjuntura usando o R, podemos fazer isso através do pacote seasonal. Fazendo esse tratamento, obtemos os dados do CAGED dessazonalizados como abaixo.

Totalmente diferente, não é mesmo? Com esse gráfico podemos ver que o mercado de trabalho vem ensaiando uma recuperação desde 2015/2016. Ao mesmo tempo, podemos ver que na ponta, de fato, março foi mesmo um mês ruim. A última vez que a série dessazonalizada tinha apresentado um mês negativo havia sido em fevereiro do ano passado.

Essa, diga-se, é a forma correta de fazer a análise dos dados, que você aprende em nosso Curso de Análise de Conjuntura usando o R.

Baixando e tratando dados da Previdência com o R

By | Macroeconometria

Temos enfatizado ao longo dos anos nesse espaço, que saber coletar, tratar, analisar e apresentar dados é essencial para compreender os problemas das mais diversas áreas do conhecimento. Com efeito, temos utilizado a linguagem R, uma ferramenta poderosa voltada para análise de dados, para dar exemplos sobre como lidar com evidência empírica em nosso blog e nos nossos cursos aplicados de R. Nesse post, vamos trazer mais um exemplo, com o tema do momento: a previdência. Para começar, vamos pegar os dados do regime geral da previdência social, disponível no site do Tesouro NacionalO código abaixo ilustra.

library(XLConnect)
### Importar dados e tratá-los
www = 'http://www.tesouro.fazenda.gov.br/documents/10180/246449/Anexos+RTN+Mar17.xlsx/686e2173-97ac-49fa-9e98-1d8f55eb9c1e'
temp = tempfile()
download.file(www, temp, mode='wb')
data = loadWorkbook(temp)
data = readWorksheet(data, sheet = "1.1", header = TRUE,
 colTypes = 'numeric')
data = t(data[c(17,39),-1])
colnames(data) = c('receita', 'despesa')
data = ts(data, start=c(1997,01), freq=12)

Observe que, com o código acima, nós carregamos o pacote XLConnect, uma das muitas opções disponíveis para importar dados do excel para o R. Uma vez feito isso, fazemos o download da planilha, carregamos no R e lemos o arquivo. Depois, um tratamento rápido, para pegar apenas os dados de receita e despesa do regime geral de previdência socialPor fim, transformamos os dados em séries temporais.

Uma vez importados os dados diretamente para o R, nós agora podemos visualizá-los. Para isso, vamos utilizar o pacote ggplot2, um dos pacotes mais poderosos do R para visualização de dados. De modo a ilustrar como o pacote funciona, nós colocamos os dados em um data frame, como no código abaixo.

dates = seq(as.Date('1997-01-01'), as.Date('2017-03-01'), by='1 month')
previdencia = data.frame(time=dates, receita=data[,1],
 despesa=data[,2])

Uma vez que tenhamos colocado os dados em um data frame, uma das estruturas de dados disponíveis no R, nós podemos utilizar o ggplot2O código abaixo ilustra.

ggplot(previdencia, aes(x=time))+
 geom_line(aes(y=receita/1000, colour='Receita'), size=.4)+
 geom_line(aes(y=despesa/1000, colour='Despesa'), size=.4)+
 scale_colour_manual('', values=c('Receita'='darkgreen',
 'Despesa'='red'))+
 theme(legend.position = 'top')+
 scale_x_date(breaks = date_breaks("2 years"),
 labels = date_format("%Y"))+
 xlab('')+ylab('R$ bilhões')+
 labs(title='Receitas vs. Despesas do RGPS',
 caption='Fonte: analisemacro.com.br com dados da STN.')

E o resultado...

Observe que ambas as séries apresentam duas características que saltam aos olhos. Primeiro, elas mostram uma tendência de aumento ao longo do tempo. Segundo, elas mostram um comportamento sazonal bastante explícito. Vamos tratar esses dois "problemas" daqui a pouco. Antes, vamos ver um gráfico de correlação dessas séries com o código abaixo.

ggplot(previdencia, aes(despesa/1000, receita/1000))+
 geom_point(colour='blue', size=5, shape=1)+
 geom_smooth(method = 'lm')+
 xlab('Despesas do RGPS')+
 ylab('Receitas do RGPS')+
 labs(title='Receitas vs. Despesas do RGPS (R$ bilhões)',
 caption='Fonte: analisemacro.com.br com dados da STN.')

E o resultado abaixo...

As séries, naturalmente, estão positivamente correlacionadas. Isso implica em causalidade? É tema que exploraremos na 31ª edição do Clube do Código, que extende a análise desse post. Por aqui, por suposto, vamos tratar os "problemas" de tendência e sazonalizade.

Dessazonalizando os dados 

Antes de mais nada, vamos dessazonalizar os nossos dados usando o pacote seasonal. O código abaixo ilustra.

## Carregar o pacote, definir a pasta do X13-Arima e checar se está tudo ok
library(seasonal)
Sys.setenv(X13_PATH = "C:/Séries Temporais/R/Pacotes/seas/x13ashtml")
checkX13()

## Dessazonalizar as séries
prev = ts(previdencia[,-1], start=c(1997,01), freq=12)
receita_sa = seas(prev[,1])
despesa_sa = seas(prev[,2])
previdencia_sa = data.frame(time=dates, receita=final(receita_sa),
 despesa=final(despesa_sa))

Uma vez dessazonalizadas as séries, podemos plotar um gráfico com código similar ao visto anteriormente.

A tendência, agora, ficou mais clara, não é mesmo? A despeito de alguns outliers existentes - que, de certo, também podem ser tratados com o R. Uma vez dessazonalizados os dados, por suposto, podemos agora ver novamente aquele gráfico de correlação...

A correlação positiva entre as séries ficou maior, não é mesmo?

Retirando a tendência das séries

A outra característica das séries que salta os olhos é a tendência. Podemos retirá-la com o código abaixo.

## Regredir as séries contra uma tendência
fit.rec = lm(previdencia_sa$receita ~ seq(along = previdencia_sa$receita))
fit.desp = lm(previdencia_sa$despesa ~ seq(along = previdencia_sa$despesa))

## Pegar os resíduos da regressão, somados à média da série.
receita.st = residuals(fit.rec)+mean(fitted(fit.rec))
despesa.st = residuals(fit.desp)+mean(fitted(fit.desp))
previdencia_st = data.frame(time=dates, receita=receita.st,
 despesa=despesa.st)

E o gráfico das séries dessazonalizadas e sem tendência é colocado abaixo...

Evolução das séries e relações de longo prazo

O próximo passo é investigar como as séries evoluem ao longo do tempo. Isto é, já sabemos que as séries possuem sazonalidade e têm uma tendência positiva ao longo do tempo. Mas a que taxa crescem? O quanto elas crescem ao longo do tempo acima da inflação? Para responder essas perguntas, precisamos verificar algumas métricas de crescimento mensal, interanual, acumulada em 12 meses, seja em termos nominais ou em termos reais, coisas que vemos no nosso Curso de Análise de Conjuntura usando o R.

Uma análise um pouco mais sofisticada, por suposto, envolve verificar se existe uma relação de longo prazo entre as séries, o que nos leva ao tema da cointegração, uma vez que como pode verificar o leitor, as séries não são estacionárias. Ademais, podemos investigar também a causalidade entre receita e despesa, de modo a definir se podemos afirmar coisas como o aumento da despesa leva a aumento da receita e assim por diante. Perguntas que abordamos em nosso Curso de Séries Temporais usando o R e no nosso Curso de Macroeconometria usando o R.

O exemplo mostra o quanto saber lidar com evidência empírica é importante. Não basta, portanto, criar narrativas, mas é preciso saber o que afinal dizem os dados, não é mesmo? 🙂 

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente