Tag

produção industrial Archives - Análise Macro

Relatório AM #37 - Produção Industrial

By | Indicadores

A produção industrial é uma pesquisa realizada mensalmente pelo IBGE, como forma de acompanhar o comportamento das indústrias do Brasil. A pesquisa revela informações importantes sobre o nível de atividade e os rumos do crescimento econômico do país. No relatório AM de hoje mostramos como pode ser fácil capturar os dados, tratá-los e comunicar os resultados de forma automática e reprodutível dentro do R.

## Cria função para calcular variação dos índices

var_indice <- function(x, lag) {
w <- (x/dplyr::lag(x, lag) - 1)*100
return(w)
}


## Cria função para calcular a variação acumulada dos índices

acum_i <- function(data, n){

data_ma_n <- RcppRoll::roll_meanr(data, n)

data_lag_n <- dplyr::lag(data_ma_n, n)

data_acum_n = (((data_ma_n/data_lag_n)-1)*100)

return(data_acum_n)

}

# Cria um vetor de cores para utilizar nos gráficos

colours <- c("#282f6b", "#b22200", "#eace3f", "#224f20")

# Pacotes utilizados
library(tidyverse)
library(sidrar)
library(RcppRoll)


# Coleta a PIM com ajuste sazonal

pim_aj <- get_sidra(api='/t/3653/n1/all/v/3134/p/all/c544/all/d/v3134%201') %>%
mutate(date = parse_date(`Mês (Código)`, format = "%Y%m")) %>%
select(date,
atividades = "Seções e atividades industriais (CNAE 2.0)",
value = "Valor") %>%
pivot_wider(names_from = atividades,
values_from = value) %>%
as_tibble()


## variação na margem

var_marg <- pim_aj %>%
mutate(across(where(is.numeric), ~ var_indice(.x, lag = 1))) %>%
slice(-1)

var_marg_long <- var_marg %>%
pivot_longer(cols = -date,
names_to = "variable")

# Variação Marginal {-}

## Visualização dos dados - Variação Marginal
filter(var_marg_long, date > "2018-12-31" &
variable %in% c('1 Indústria geral',
'2 Indústrias extrativas',
'3 Indústrias de transformação',
"3.29 Fabricação de veículos automotores, reboques e carrocerias")) %>%
ggplot(aes(x= date, y = value, colour = variable))+
geom_line(aes(colour= variable))+
scale_fill_manual(values=colours)+
scale_colour_manual(values=colours)+
geom_hline(yintercept = 0, colour='black', linetype='dashed')+
facet_wrap(~variable, scales = 'free')+
theme(legend.position = 'none',
strip.text = element_text(size=7, face='bold'),
axis.text.x = element_text(size=6),
plot.title = element_text(size=10, face='bold'),
plot.subtitle = element_text(size=8, face='italic'))+
scale_x_date(breaks = date_breaks("3 month"),
labels = date_format("%m/%y"))+
theme(axis.text.x=element_text(angle=45, hjust=1))+
labs(x='', y='',
title='Produção Industrial',
subtitle = 'Variação contra o mês imediatamente anterior (%)',
caption='Fonte: analisemacro.com.br com dados do IBGE')

É extremamente fácil coletar, tratar e visualizar dados no R. Além de gráficos da variação mensal da PIM, é possível também criar gráficos da variação interanual e variação acumulada no R. Também é fácil a criação de tabelas bem formatas e estilizadas. Tudo isso você pode aprender com o nosso Curso de Análise de Conjuntura, onde ensinamos a teoria e prática com o R.

___________________________

 

 

Gerando previsões desagregadas de séries temporais

By | Data Science

Frequentemente, séries temporais podem ser desagregadas em vários atributos de interesse. Por exemplo1, o número total de veículos produzidos no país ao longo do tempo pode ser dividido em veículos comerciais leves, caminhões, ônibus, etc. Cada uma dessas categorias pode ainda ser desagregada em outros níveis, por regiões, por fabricante, etc., caracterizando o que pode ser chamado de "séries temporais hierárquicas".

Essa riqueza de informação e dados possibilita (e pode ser de interesse) gerar previsões desagregadas das séries, de modo que os pontos de previsão das séries desagregadas possam ser analisados individualmente e que, quando agregados de alguma forma, sejam coerentes com os valores agregados da série.

De modo geral, podemos representar o exemplo como:

Ou seja, para qualquer observação no tempo t, as observações no nível inferior da hierarquia serão agregadas para formar as observações da série acima.

Previsão hierárquica

Existem várias abordagens para gerar previsões hierárquicas com séries temporais, a mais comum e intuitiva é a bottom-up (de baixo para cima), onde primeiro geramos as previsões para cada série no nível inferior e, em seguida, somamos os pontos de previsão para obter previsões da série acima.

Por outro lado, a abordagem top-down (de cima para baixo) envolve primeiro a geração de previsões para a série agregada e, em seguida, desagregá-la na hierarquia utilizando proporções (geralmente baseadas na série histórica).

Ainda existem outras abordagens como a do Minimum Trace e suas variantes, sendo que cada uma tem seus prós e contras. Para se aprofundar no tema veja Forecasting: principles and practice de Hyndman, R.J., & Athanasopoulos, G. (2021), que apresenta detalhes sobre as abordagens disponíveis.

Exemplo: dados de produção da ANFAVEA

Mensalmente a ANFAVEA disponibiliza séries temporais da produção, licenciamento, exportação, etc. de veículos. Os dados são desagregados pelas categorias citadas acima e neste exemplo iremos explorar alguns métodos de gerar modelos de previsão para as séries de produção de veículos.

Primeiro, para reproduzir o código certifique-se de que tenha os seguintes pacotes em sua instalação do R:

# Carregar pacotes/dependências
library(magrittr)
library(GetBCBData)
library(dplyr)
library(tsibble)
library(fabletools)
library(ggplot2)
library(lubridate)
library(fable)

Para importar as séries podemos usar o banco de dados do Banco Central (BCB) através do pacote GetBCBData, bastando apontar os códigos de coleta obtidos diretamente no site da instituição.

raw_anfavea <- GetBCBData::gbcbd_get_series(
id = c(
"Total" = 1373,
"Comerciais leves" = 1374,
"Caminhões" = 1375,
"Ônibus" = 1376
),
first.date = "1993-01-01",
use.memoise = FALSE
)

Além disso fazemos o tratamento necessário para obter um objeto de classe tsibble, pois precisamos desse formato para a próxima etapa de modelagem e previsão:

anfavea <- raw_anfavea %>%
dplyr::select("date" = "ref.date", "variable" = "series.name", "value") %>%
dplyr::mutate(date = tsibble::yearmonth(.data$date)) %>%
tsibble::as_tsibble(key = "variable", index = "date")
anfavea

Uma rápida visualização dos dados sempre é importante:

anfavea %>%
fabletools::autoplot(value) +
ggplot2::facet_wrap(
~variable, 
scales = "free_y"
) +
ggplot2::labs(
title = "Produção de veículos desagregada - Brasil",
x = NULL,
y = "Unidades",
caption = "Dados: ANFAVEA | Elaboração: analisemacro.com.br"
) +
ggplot2::theme(legend.position = "none")

Para gerar previsões hierárquicas usaremos a família de pacotes do tidyverts (você não leu errado), que possibilita um fluxo de trabalho em apenas 5 passos:

1) Transforme os dados para um objeto tsibble contendo as séries desagregadas do nível inferior (em nosso exemplo todas exceto o "Total");

2) Utilize fabletools::aggregate_key() para definir a estrutura de agregação;

3) Especifique um modelo a ser estimado com fabletools::model() para cada série e suas desagregações;

4) Utilize fabletools::reconcile() para indicar uma abordagem (bottom-up, top-down, etc.) para gerar previsões desagregadas coerentes de acordo com o modelo;

5) Por fim, use a função fabletools::forecast() para gerar previsões para toda a estrutura de agregação.

Especificando a hierarquia da série:


prod_veiculos <- anfavea %>%
dplyr::filter(!variable == "Total") %>%
fabletools::aggregate_key(variable, value = sum(value, na.rm = TRUE))
prod_veiculos

Estimar modelos restringindo a amostra e apontar abordagens de previsão hierárquica:


fit <- prod_veiculos %>%
dplyr::filter(lubridate::year(.data$date) <= 2017) %>%
fabletools::model(baseline = fable::ETS(value)) %>%
fabletools::reconcile(
bottom_up = fabletools::bottom_up(baseline),
top_down = fabletools::top_down(baseline),
ols = fabletools::min_trace(baseline, method = "ols")
)
fit

Gerar previsões fora da amostra:


fcst <- fabletools::forecast(fit, h = "2 years")
fcst

Visualizar previsões geradas (produção agregada e desagregada):


fcst %>%
fabletools::autoplot(
dplyr::filter(
prod_veiculos,
dplyr::between(
lubridate::year(.data$date),
2015,
2019
)
),
level = NULL,
size = 1.1
) +
ggplot2::facet_wrap(
~variable,
scales = "free_y"
) +
ggplot2::labs(
title = "Previsão hierárquica da produção de veículos",
y = "Unidades",
x = NULL
)

Calcular métricas de acurácia:


fcst %>%
dplyr::filter(fabletools::is_aggregated(variable)) %>%
fabletools::accuracy(prod_veiculos) %>%
dplyr::arrange(RMSE)

O objeto fcst de classe fable contém as previsões baseline bem como as previsões coerentes de cada abordagem, para as três categorias de veículos desagregadas e para a produção total. Vale enfatizar que as previsões agregadas baseline serão diferentes das previsões agregadas pela abordagem bottom_up, por exemplo.

Dado a escala das séries em diferentes níveis de agregação serem bastante diferentes, devido à agregação, deve-se tomar cuidado ao avaliar as métricas de acurácia. Acima exibimos a acurácia para a série agregada (produção total) conforme cada abordagem/modelo.

Neste caso, agregar as previsões baseline usando a abordagem top-down resultou em previsões mais precisas em comparação com a abordagem bottom-up.

Por fim, vale destacar que o objetivo desse exercício não contempla nenhum aprofundamento ou preocupação com a especificação econométrica, ajuste ou acurácia do(s) modelo(s), focando apenas na implementação prática de previsões hierárquicas.

 

Referências

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

Athanasopoulos, G., Ahmed, R. A., & Hyndman, R. J. (2009). Hierarchical forecasts for Australian domestic tourism. International Journal of Forecasting, 25, 146–166.

Gross, C. W., & Sohl, J. E. (1990). Disaggregation methods to expedite product line forecasting. Journal of Forecasting, 9, 233–254.

Hyndman, R. J., Ahmed, R. A., Athanasopoulos, G., & Shang, H. L. (2011). Optimal combination forecasts for hierarchical time series. Computational Statistics and Data Analysis, 55(9), 2579–2589.

Panagiotelis, A., Athanasopoulos, G., Gamakumara, P., & Hyndman, R. J. (2021). Forecast reconciliation: A geometric view with new insights on bias correction. International Journal of Forecasting, 37(1), 343–359.

Wickramasuriya, S., Athanasopoulos, G., & Hyndman, R. (2019). Optimal forecast reconciliation for hierarchical and grouped time series through trace minimization. Journal of the American Statistical Association, 114(526), 804–819.


1 Outros exemplos comuns de séries temporais que podem ser desagregadas são: IPCA, IGP-M, Contas Nacionais, produção industrial, consumo de energia elétrica, etc.

 

Análise da produção industrial em 2020

By | Comentário de Conjuntura

Hoje o IBGE divulgou o resultado da produção industrial em dezembro. Com efeito, começamos a conhecer os resultados do nível de atividade ao longo de 2020. Nesse Comentário de Conjuntura, fazemos uma análise dos principais aspectos da pesquisa com uso do R. O código completo está disponível para os membros do Clube AM.

Para começar, nós carregamos os pacotes de R que utilizaremos.


library(tidyverse)
library(lubridate)
library(tstools)
library(sidrar)
library(zoo)
library(scales)
library(gridExtra)
library(tsibble)
library(timetk)
library(knitr)

Com os pacotes carregados, podemos coletar os dados diretamente do SIDRA/IBGE para o RStudio com o código abaixo.


# Produção Física por Seção e Atividades
## Número-Indice com ajuste sazonal
tabela_sa = get_sidra(api='/t/3653/n1/all/v/3134/p/all/c544/all/d/v3134%201') %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Seções e atividades industriais (CNAE 2.0)", Valor) %>%
spread("Seções e atividades industriais (CNAE 2.0)", Valor) %>%
as_tibble()

## Número-Índice sem ajuste sazonal
tabela = get_sidra(api='/t/3653/n1/all/v/3135/p/all/c544/all/d/v3135%201') %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Seções e atividades industriais (CNAE 2.0)", Valor) %>%
spread("Seções e atividades industriais (CNAE 2.0)", Valor) %>%
as_tibble()

O código acima importa os números índices com e sem ajuste sazonal da produção industrial. A seguir, podemos criar métricas de crescimento que avaliam o comportamento da produção industrial geral e das atividades industriais.


## Variação na Margem
tabela_sa_ts = ts(tabela_sa[,-1], start=c(year(tabela_sa$date[1]),
month(tabela_sa$date[1])), freq=12)
margem = (tabela_sa_ts/stats::lag(tabela_sa_ts,-1)-1)*100
colnames(margem) <- colnames(tabela_sa[,-1])
margem = tk_tbl(margem, preserve_index = TRUE,
rename_index = 'date')
margem_long = margem %>%
gather(variavel, valor, -date)

## Variação Interanual
tabela_ts = ts(tabela[,-1], start=c(year(tabela$date[1]),
month(tabela$date[1])), freq=12)
interanual = (tabela_ts/stats::lag(tabela_ts,-12)-1)*100
colnames(interanual) <- colnames(tabela[,-1])
interanual = tk_tbl(interanual, preserve_index = TRUE,
rename_index = 'date')
interanual_long = interanual %>%
gather(variavel, valor, -date)

## Variação acumulada em 12 meses
anual = acum_i(tabela_ts,12) %>%
as_tibble() %>%
mutate(date = tabela$date) %>%
drop_na() %>%
select(date, everything())

anual_long = anual %>%
gather(variavel, valor, -date)

A variação na margem pode ser vista a seguir.

Produção Industrial: variação na margem
Mês Indústria Geral Indústria Extrativa Indústria de Transformação
jul 2020 8.62 8.81 9.30
ago 2020 3.49 1.60 3.52
set 2020 2.79 -5.35 3.87
out 2020 1.02 -2.88 1.58
nov 2020 1.12 -4.56 1.78
dez 2020 0.88 3.70 1.53

Os números na margem indicam que houve uma recuperação após o crash causado pela pandemia do coronavírus. Ocorre que as variações na margem estão cada vez menores, o que pode indicar uma perda de fôlego nessa recuperação. Os gráficos a seguir ilustram.

A suavização do crescimento ocorre com a comparação com o mesmo período do ano anterior. A tabela a seguir ilustra.

Produção Industrial: variação interanual
Mês Indústria Geral Indústria Extrativa Indústria de Transformação
jul 2020 -2.57 1.35 -3.22
ago 2020 -2.39 -1.86 -2.51
set 2020 3.81 -4.18 4.84
out 2020 0.31 -6.17 1.14
nov 2020 2.61 -9.09 4.23
dez 2020 8.32 -3.94 10.16

Os dados da comparação interanual mostram como a recuperação ainda é bastante lenta e insuficiente para gerar uma comparação positiva com o ano anterior. Os gráficos a seguir ilustram.

Isso fica mais claro quando suavizamos ainda mais as taxas de crescimento, com a taxa acumulada em 12 meses. Os gráficos a seguir ilustram.

Como mostram os gráficos, a recuperação da indústria ainda não é muito clara. Não houve uma recuperação em V do setor, o que deve acentuar a preocupação com o nível de atividade em 2021.

Nos próximos dias, o IBGE divulga os resultados de dezembro para o Comércio e para os Serviços. Ademais, o BCB divulga o IBC-BR, o que nos ajudará a ter uma visão completa sobre o que ocorreu com o nível de atividade nas pesquisas de alta frequência.

Membros do Clube AM têm acesso a todos os resultados dessas pesquisas, que contam com scripts automáticos ensinados no nosso Curso de Análise de Conjuntura usando o R.

_______________________

Análise da Produção Industrial com o R

By | Comentário de Conjuntura

O IBGE divulgou hoje pela manhã o resultado da Produção Industrial referente a setembro. A coletatratamento apresentação dos dados da pesquisa com o R é ensinada no nosso Curso de Análise de Conjuntura usando o R. A seguir, apresento uma parte do código que gera a apresentação disponível ao final do post.

O script começa carregando alguns pacotes:


library(tidyverse)
library(lubridate)
library(tstools)
library(sidrar)
library(zoo)
library(scales)
library(gridExtra)
library(tsibble)
library(timetk)
library(knitr)

Na sequência, importamos os dados da indústria geral e das atividades da indústria de transformação diretamente do SIDRA/IBGE com o pacote sidrar. Tanto o número índice encadeado quanto o número índice ajustado sazonalmente.


# Produção Física por Seção e Atividades
## Número-Indice com ajuste sazonal
tabela_sa = get_sidra(api='/t/3653/n1/all/v/3134/p/all/c544/all/d/v3134%201') %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Seções e atividades industriais (CNAE 2.0)", Valor) %>%
spread("Seções e atividades industriais (CNAE 2.0)", Valor) %>%
as_tibble()

## Número-Indice sem ajuste sazonal
tabela = get_sidra(api='/t/3653/n1/all/v/3135/p/all/c544/all/d/v3135%201') %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Seções e atividades industriais (CNAE 2.0)", Valor) %>%
spread("Seções e atividades industriais (CNAE 2.0)", Valor) %>%
as_tibble()

Feito isso, podemos criar algumas métricas de crescimento com o código abaixo.


## Variação na Margem
tabela_sa_ts = ts(tabela_sa[,-1], start=c(year(tabela_sa$date[1]),
month(tabela_sa$date[1])), freq=12)
margem = (tabela_sa_ts/stats::lag(tabela_sa_ts,-1)-1)*100
colnames(margem) <- colnames(tabela_sa[,-1])
margem = tk_tbl(margem, preserve_index = TRUE,
rename_index = 'date')
margem_long = margem %>%
gather(variavel, valor, -date)

## Variação Interanual
tabela_ts = ts(tabela[,-1], start=c(year(tabela$date[1]),
month(tabela$date[1])), freq=12)
interanual = (tabela_ts/stats::lag(tabela_ts,-12)-1)*100
colnames(interanual) <- colnames(tabela[,-1])
interanual = tk_tbl(interanual, preserve_index = TRUE,
rename_index = 'date')
interanual_long = interanual %>%
gather(variavel, valor, -date)

## Variação acumulada em 12 meses
anual = acum_i(tabela_ts,12) %>%
as_tibble() %>%
mutate(date = tabela$date) %>%
drop_na() %>%
select(date, everything())

anual_long = anual %>%
gather(variavel, valor, -date)

Uma vez que conseguimos criar as métricas de crescimento, podemos apresentar as mesmas. Primeiro, em tabelas.

Produção Industrial: variação na margem
Mês Indústria Geral Indústria Extrativa Indústria de Transformação
abr 2020 -19.52 -0.46 -23.41
mai 2020 8.71 -5.00 13.29
jun 2020 9.59 5.02 10.41
jul 2020 8.62 9.21 9.30
ago 2020 3.61 3.09 3.65
set 2020 2.55 -3.73 3.87

Como se vê, a indústria geral tem apresentado seguidas variações positivas desde maio. O gráfico a seguir ilustra a retomada.


Essa retomada na margem, diga-se, aos poucos deve ser sentida nas outras métricas. Os gráficos abaixo mostram a recuperação quando se considera a variação interanual.

Mais lentamente, contudo, veremos uma recuperação sendo sentida na variação acumulada em 12 meses, como pode ser visto nos gráficos a seguir.

(*) A análise completa está disponível no nosso Curso de Análise de Conjuntura usando o R.

Nível de Atividade pós-pandemia

By | Comentário de Conjuntura

Uma das perguntas mais importantes da atual conjuntura econômica diz respeito ao formato da recuperação pós-pandemia. Os primeiros números das pesquisas de alta frequência de nível de atividade, em particular, da Pesquisa Mensal do Comércio, da Pesquisa Mensal de Serviços e da Produção Industrial Mensal, dão algumas pistas para a resposta. A análise dessas pesquisas faz parte do nosso Curso de Análise de Conjuntura usando o R. Nesse Comentário de Conjuntura, faço uma breve análise sobre os dados.

O gráfico acima, por exemplo, ilustra o comportamento do Comércio Varejista, no seu corte ampliado. Tudo indica que a recuperação nesse setor sofreu forte influência dos incentivos garantidores de renda promovidos pelo governo. Em particular, pelo auxílio emergencial. Isso proporcionou a tão sonhada recuperação em V. Na margem, o Varejo Ampliado - que inclui automóveis e material de construção - avançou fortemente desde maio.

A apresentação completa da PMC que eu ensino os nossos alunos a fazer, automatizando todo o processo de coleta e tratamento dos dados pode ser vista aqui.

Infelizmente, entretanto, não é possível dizer que esse comportamento do Varejo define uma tendência para a economia como um todo. Veja, por exemplo, o comportamento dos Serviços. Ainda que também haja sinais de recuperação na margem, com avanço nos meses de junho e julho, a comparação interanual ainda permanece em terreno bastante negativo.

A apresentação completa da PMS que eu ensino os nossos alunos a fazer, automatizando todo o processo de coleta e tratamento dos dados pode ser vista aqui.

A produção industrial, por seu turno, apresenta comportamento semelhante: recuperação na margem, mas ainda no negativo na comparação interanual.

A apresentação completa da Produção Industrial que eu ensino os nossos alunos a fazer, automatizando todo o processo de coleta e tratamento dos dados pode ser vista aqui.

Tudo isso dito, é possível dizer que há sim uma recuperação em curso do nível de atividade, após a maior crise sanitária em 100 anos. Mas, infelizmente, parece que ela não vai ser tão rápida quanto gostaríamos.

Para terminar, gostaria de convidá-los para uma aula ao vivo que darei na próxima terça-feira, 29/09, sobre Dados Econômicos no R. Para garantir o seu acesso à aula, se inscreva aqui

 

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

Assinar Gratuitamente