Tag

shiny Archives - Análise Macro

Dashboard de Política Fiscal

By | Indicadores

Acompanhar os resultados fiscais do Brasil devem estar entre os principais pontos de analises feitos por aqueles que desejam acompanhar a conjuntura econômica do país. Investigar os principais resultados fiscais das diferentes esferas do governo, sejam valores nominais ou deflacionados. Para tanto, aqui na Análise Macro, ensinamos nossos alunos não somente a teoria sobre a política fiscal, bem como a construção de um painel de monitoramento para esta área da analise de conjuntura. No post de hoje, mostraremos o Dashboard de Política Fiscal, construído com base no Curso de Análise de Conjuntura com o R.

Nas últimas semanas, realizamos demonstrações sobre os dashboards de nível de atividade econômica e de inflação, produzidos aqui na Análise Macro, no qual também ensinamos nestes posts a como realizar o deploy desses painéis. Demonstramos também nossos Dashboards de Mercado de Trabalho e Política Monetária. Para tanto, mostraremos aqui o Dashboard de Política Fiscal.

Você pode ver o resultado através do seguinte link:https://analisemacro.shinyapps.io/dashboard_fiscal/

Na primeira aba, encontramos a Necessidade de Financiamento do Setor Público para diferentes esfera do governo e em diversas unidades de medidas. Dentre as possibilidades de input do NFSP por esfera de governo, temos:  INSS, Governo Federal, Governo Estadual, Governos Municipais, Empresas Estatais e Setor Público Consolidado. Para as unidades de medida, encontra-se disponíveis: Valores Nominais, Valores Deflacionados, Valores Nominais (12 meses, % do PIB) e Valores Deflacionados (12 meses).

Como possibilidade input, também encontra-se o filtro de período de seleção. Os gráficos dispostos sugerem os diferentes indicadores da NFSP, bem como há uma tabela demonstrando os valores deflacionados em meses para diferentes esferas de governo.

Na segunda aba, encontra-se disponível as diversas contas desagregados do Resultado Primário do governo, em diferente unidades de medidas, sendo estas as mesmas da primeira aba, adicionado a Variação Percentual (12 meses, %).  O interessante desta aba é que é possível baixar as contas (em formato long), em uma planilha .csv.

Na terceira aba, há as contas desagregadas da Dívida Pública, com os gráficos das diferentes métricas de Endividamento Público. Nas Unidades de Medida, encontra-se três possíveis valores: Valores Nominais, Valores Deflacionados e Valores Nominais (% do PIB).

Quer aprender a criar Dashboards com o R?

Nos cursos oferecidos pela Análise Macro, você consegue criar as habilidades necessárias para criar Dashboards com o R utilizando os principais indicadores Econômicos e Financeiros. Veja nossos cursos de Análise de Conjuntura usando o R, Produção de Dashboards, Modelos Preditivos (de Machine Learning) aplicados à Macroeconomia e R para o Mercado Financeiro.

Dashboard de Mercado de Trabalho

By | Indicadores

O Mercado de trabalho configura em uma associação de relações entre demanda e oferta de trabalho e na análise de conjuntura, investigar esta área é de grande importância, devido a riqueza de informações que os indicadores passam sobre a situação socioeconômica do país. Na Análise Macro, realizamos essa investigação da forma mais facilitada possível: com um dashboard! Com base nos painéis interativos produzidos no nosso Curso de Análise de Conjuntura, conseguimos analisar por completo essa área. No post de hoje mostraremos o dashboard de mercado de trabalho.

Nas últimas semanas, realizamos demonstrações sobre os dashboards de nível de atividade econômica e de inflação, produzidos aqui na Análise Macro, no qual também ensinamos nestes posts a como realizar o deploy desses painéis. Para o dashboard de trabalho não é diferente, caso queira realizar o compartilhamento online do painel é possível seguindo os mesmo passos.

Você pode ver o resultado através do seguinte link: https://analisemacro.shinyapps.io/dashboard_trabalho/

Existem três abas no dashboard, contando com a página inicial. Na primeira, que é a página inicial, demonstra a visão geral do mercado de trabalho, exibindo gráfico temporal da variação da taxa do desemprego medida pela PNADc mensal. As caixas exibem os valores dos ocupados e desocupados em milhões, medidos pelo IBGE, bem como o último valor da taxa de desocupados.

Na segunda aba, demonstra o termômetro do PNADc, desagregando o seus principais indicadores, separando-os também por abas.  Na primeira, é medido em milhões de pessoas a População total (PIA), a Força de Trabalho (PEA), o número de Ocupados e Desocupados, as pessoas Fora da Força de Trabalho (PNEA), a Taxa de Desocupação, o Nível de Ocupação e  a Taxa de Participação.

Em Ocupação por categorias, é desagregado as categorias do tipo de emprego pelas pessoas ocupadas. mostrando em milhões o Empregado com e sem Carteira, o Trabalhador Doméstico, o Empregado do Setor Público, o Trabalhador familiar auxiliar, o Empregador e aqueles que trabalham por Conta Própria.

Também é desagregado em relação aos grupos de atividade exercidos pelo trabalhadores, medidos em milhões de pessoas, demonstrando as áreas de Agricultura, Indústria Geral, Construção, Comércio, Transporte, Alojamento e alimentação, entre outros tipos de atividade, que são medidos pela PNADc.

É também possível acompanhar o rendimento dos trabalhadores, em reais, ao longo do tempo. Vemos no dashboard o rendimento médio real e nominal em uma aba de rendimentos, bem como também é possível ver a massar de rendimentos em milhões em outra aba (também real e nominal).

Por fim, vemos ao longo do tempo o Saldo no Novo CAGED a nível nacional, em milhares.

 

Como foi possível ver, o dashboard de mercado de trabalho nos force informações importantes para analisar a conjuntura e os caminhos econômicos percorridos no país, o útil a sua fácil utilização. Aqui na Análise Macro, ensinamos a construir dashboards iguais a este com nossos Curso de Análise de Conjuntura com o R e de Produção de Dashboards.

 

Construindo uma dashboard de ações no R

By | mercado financeiro

O estudo da análise de dados envolve primordialmente transformar dados 'crus' em informação útil, de forma que seja comunicado de forma mais simples possível para que qualquer usuário possa entender. Um meio interessante de transformar esses dados em uma forma simples de visualização é criando uma dashboard. Esse tipo de painel interativo pode ser criado em diferentes áreas de estudos, o que não é diferente para as finanças. No post de hoje, apresentaremos uma dashboard básica para a análise de ações da bolsa de valores criada no R.

A dashboard deverá conter os principais indicadores dos quais o usuário pretende tirar seus insights. Nesta dashboard criada como exemplo, demonstramos o preço da ação, o retorno mensal, o retorno acumulado e o desvio padrão, sendo este um gráfico móvel no qual é possível ter uma estimativa do risco de mercado das ações analisadas. Podemos também colocar inputs dentro dessas dashboard de forma que seja possível ter mais flexibilidade.

Como podem ver na imagem, a barra lateral possui 3 inputs: o nome do ticker da ação (que pode ser encontrado no site do Yahoo Finanças), a data inicial de análise e a janela móvel do desvio padrão (e que funciona somente neste indicador).

Você pode conferir o resultado neste link.

Para criar a dashboard utilizou-se do seguinte YAML:

Com os seguintes pacotes:


library(tidyverse)
library(highcharter)
library(tidyquant)
library(timetk)
library(scales)

A criação da dashboard seguiu como uma junção da Flexdashboard e Shiny, além dos gráficos serem criados através do Highchart.

Sidebar {.sidebar}
=====================================

# Construção dos inputs da barra lateral do dashboard

fluidRow(
column(6,
textInput("stock1", "Stock 1", "VIVT3.SA"))
)


fluidRow(
column(6,
textInput("stock2", "Stock 2", "ITSA4.SA"))
)

fluidRow(
column(6,
textInput("stock3", "Stock 3", "TAEE4.SA"))
)

fluidRow(
column(6,
textInput("stock4", "Stock 4", "BRSR6.SA"))
)

fluidRow(
column(7,
dateInput("date", "Starting Date", "2013-01-01", format = "yyyy-mm-dd"))
)

fluidRow(
column(6,
numericInput("window", "Window", 6, min = 3, max = 20, step = 1))
)

actionButton("go", "Submit")


### Coleta, tratamento e calculos

# Coleta os preços das ações
prices <- eventReactive(input$go, {

symbols <- c(input$stock1, input$stock2, input$stock3, input$stock4)

getSymbols(symbols, src = 'yahoo', from = input$date,
auto.assign = TRUE, warnings = FALSE) %>%
map(~Ad(get(.))) %>%
reduce(merge) %>%
`colnames<-`(symbols)
})

# Transforma os preços xts em mensal

prices_monthly <- eventReactive(input$go, {

prices <- prices()

to.monthly(prices(),
indexAt = "last",
OHLC = FALSE)
})

# Calcula os retornos mensais em xts e wide

asset_returns_xts <- eventReactive(input$go, {

asset_returns_xts <- na.omit(Return.calculate(prices_monthly(),
method = "log"))
})

# Transforma os preços em tibble, mensal e long

prices_monthly_tbl_long <- eventReactive(input$go, {
prices <- prices()

asset_returns_long_tbl<- prices %>%
to.monthly(indexAt = "last",
OHLC = FALSE) %>%
tk_tbl(preserve_index = TRUE,
rename_index = "date") %>%
gather(asset,
prices,
-date)
})

# Calcula os retornos mensais em tibble e long

asset_returns_long_tbl <- eventReactive(input$go, {

prices_monthly_tbl_long <- prices_monthly_tbl_long()

prices_monthly_tbl_long %>%
group_by(asset) %>%
mutate(returns =
(log(prices) - log(lag(prices)))
) %>%
na.omit()
})

# Calcula o retornos acumulado

asset_acum_return_tbl <- eventReactive(input$go, {
asset_returns_long_tbl <- asset_returns_long_tbl()

asset_acum_return_tbl <- asset_returns_long_tbl %>%
group_by(asset) %>%
mutate(acum_return = cumsum(returns))
})

# Calcula o desvio padrão móvel das ações (volatilidade)

rolling_sd_tbl <- eventReactive(input$go, {
rolling_sd_tbl <-
rollapply(asset_returns_xts(),
FUN = sd,
width = input$window) %>%
na.omit() %>%
tk_tbl(preserve_index = TRUE,
rename_index = "date") %>%
gather(asset,
sd,
-date)
})

 

Painel de Acompanhamento
=====================================

Row {data-height=600, .tabset}
-----------------------------------------------------------------------

### Preços

renderHighchart({

hchart(prices_monthly_tbl_long(), type = "line",
hcaes(x = date,
y = prices,
group = asset)) %>%
hc_yAxis(opposite = FALSE) %>%
hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}
R${point.y:.4f}')

})

### Retornos mensais

renderHighchart({

hchart(asset_returns_long_tbl(), type = "column",
hcaes(x = date,
y = returns * 100,
group = asset)) %>%
hc_yAxis(opposite = FALSE,
labels = list(format = "{value}%")) %>%
hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}
{point.y:.4f}% ')

})

### Retornos Acumulados

renderHighchart({

hchart(asset_acum_return_tbl(), type = "line",
hcaes(x = date,
y = acum_return * 100,
group = asset)) %>%
hc_yAxis(opposite = FALSE,
labels = list(format = "{value}%")) %>%
hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}
{point.y:.4f}% ')

})

Row {.tabset .tabset-fade}
-------------------------------------

### Desvio Padrão Móvel

renderHighchart({

hchart(rolling_sd_tbl(), type = "line",
hcaes(x = date,
y = sd * 100,
group = asset)) %>%
hc_yAxis(opposite = FALSE,
labels = list(format = "{value}%")) %>%
hc_tooltip(pointFormat = '{point.x: %Y-%m-%d}
{point.y:.4f}% ')

})

Quer aprender a criar dashboards financeiros? Veja nosso Curso de R para o Mercado Financeiro e Produção de Dashboards.

Criando uma dashboard de análise da inflação

By | Data Science

Quando o objetivo é analisar dados, é necessário utilizar as ferramentas adequadas para tornar os dados brutos em informação que seja útil. Para tal objetivo, uma dashboard pode ser o formato mais conveniente, dado seu poder de customização, compartilhamento e automatização. Nesse contexto, exploramos como exemplo a construção de uma dashboard simples aplicada à análise dos dados de inflação do Brasil, fazendo uso dos principais pacotes do R.

Visão geral

O objetivo geral é construir uma dashboard dinâmica onde seja possível analisar o comportamento histórico dos principais indicadores para acompanhamento de conjuntura do tema inflação, tais como: IPCA, IGP-M, INPC, etc. Além disso, para dar mais autonomia ao usuário final da dashboard, a mesma contará com opções de filtros de datas, indicadores, medidas, etc., tornando possível uma análise mais customizável.

Em resumo, a dashboard terá a seguinte aparência:

Você também pode conferir o resultado completo neste link.

Pacotes e framework

Para construir a dashboard você precisará dos seguintes pacotes disponíveis em sua instalação de R:


# Carregar pacotes
library(shiny)
library(ggplot2)
library(readr)
library(lubridate)
library(dplyr)
library(stringr)
library(forcats)
library(tidyr)
library(scales)
library(ggtext)
library(tsibble)
library(fabletools)
library(feasts)
library(Hmisc)
library(rmarkdown)
library(flexdashboard)

Optou-se por utilizar o framework dos pacotes shiny e flexdashboard, que oferecem uma sistemática de programação reativa e sintaxe simples e amigável, respectivamente, tornando o processo de criação de dashboards dinâmicas mais fácil. Além disso, a dashboard foi hospedada no serviço shinyapps.io e automatizada usando o GitHub Actions (confira neste link um tutorial de uso).

Para aprofundamento e detalhes confira o Curso de Análise de Conjuntura usando o R.

Criando a dashboard

O primeiro passo é criar um projeto do RStudio, para isso use usethis::create_project("nome_do_projeto").

Em seguida, criamos o arquivo principal da dashboard utilizando o template básico oferecido pelo pacote flexdashboard: basta navegar pelos menus File > New File > R Markdown > From Template > Flex Dashboard {flexdashboard} > OK e salvar o arquivo .Rmd na raiz do projeto.

No arquivo editamos os metadados com as definições desejadas para a dashboard, conforme abaixo:


---
title: "Diagnóstico da Inflação"
output:
flexdashboard::flex_dashboard:
orientation: rows
source_code: NULL
social: menu
navbar:
- { icon: "fa-github", href: "https://ENDEREÇO_DO_SITE/", align: right }
- { icon: "fa-linkedin", href: "https://ENDEREÇO_DO_SITE/", align: right }
- { icon: "fa-at", href: "mailto:MEU@EMAIL.COM", align: right }
runtime: shiny
---

Agora podemos começar a trabalhar nos dados e elementos visuais da dashboard. No primeiro chunk do documento (global) especificamos os pacotes, carregamos os dados e definimos objetos úteis a serem utilizados nos gráficos.

Os dados ficam salvos em uma pasta chamada "data" e são atualizados automaticamente por um script independente, visando diminuir dependências e tempo de carregamento da dashboard. Neste link você pode baixar os dados para poder reproduzir o exemplo.


# Carregar pacotes
library(shiny)
library(ggplot2)
library(readr)
library(lubridate)
library(dplyr)
library(stringr)
library(forcats)
library(tidyr)
library(scales)
library(ggtext)
library(tsibble)
library(fabletools)
library(feasts)
library(Hmisc)

# Carregar dados públicos previamente importados via pacotes
tbl_inflation <- readr::read_rds("data/tbl_inflation.rds")

# Objetos úteis na dashboard
colors <- c(
blue = "#282f6b",
red = "#b22200",
yellow = "#eace3f",
green = "#224f20",
purple = "#5f487c",
black = "black"
)

Em seguida, criamos uma linha usando cabeçalho Markdown de nível dois (------------------) e determinamos que esse elemento seja a sidebar da dashboard. Essa barra lateral é, usualmente, onde são exibidos os filtros e opções de interatividade, além de poder servir de espaço para textos informativos. No nosso exemplo, colocamos um texto breve e definimos, conforme chunk abaixo, os inputs que criamos através do shiny para aplicar filtros e manipulações de dados:


# Cria input do tipo "lista de caixas de seleção" com índices de preços como opções
# Objetivo: usuário pode escolher quaL indicador será exibido no gráfico
shiny::selectInput(
inputId = "variavel",
label = shiny::strong("Indicador:"),
choices = unique(tbl_inflation$variable),
selected = unique(tbl_inflation$variable)[1],
multiple = FALSE
)

# Cria input do tipo "calendário" de seleção de data de início e fim
# Objetivo: usar as datas selecionadas para filtrar amostra de dados utilizada no gráfico/cálculos
shiny::dateRangeInput(
inputId = "data",
label = shiny::strong("Data inicial e final:"),
min = min(tbl_inflation$date),
max = max(tbl_inflation$date),
start = min(tbl_inflation$date),
end = max(tbl_inflation$date),
language = "pt-BR",
separator = " - ",
format = "mm/yyyy"
)

# Cria input do tipo "campo numérico" para entrada de um ano para comparação
# Objetivo: comparar medidas (mediana e IQR) com dados observados referente ao ano
shiny::numericInput(
inputId = "ano",
label = shiny::strong("Comparar com o ano:"),
value = lubridate::year(max(tbl_inflation$date)),
min = lubridate::year(min(tbl_inflation$date)),
max = lubridate::year(max(tbl_inflation$date)),
step = 1
)

# Tratamento para atualizar o ano pré-selecionado no input$ano em resposta a uma
# mudança da amostra de dados definida pelo usuário no input$data:
# o objetivo é que quando o usuário diminui a amostra de dados, o ano de comparação
# selecionado não fique fora dessa nova amostra e seja atualizado para um novo
# valor o mais próximo possível dos valores extremos (anos) da nova amostra
shiny::observeEvent(
eventExpr = input$data, # observa mudanças do usuário na amostra de dados
handlerExpr = { # expressões que serão executadas quando input$data mudar

data_inicial <- lubridate::year(input$data[1])
data_final <- lubridate::year(input$data[2])

shiny::updateNumericInput( # atualiza o valor de input$ano quando a mudança é detectada
inputId = "ano",
value = if(!input$ano %in% data_inicial:data_final & data_inicial > input$ano){
data_inicial
} else
if(!input$ano %in% data_inicial:data_final & data_final < input$ano){
data_final
} else input$ano,
min = data_inicial,
max = data_final,
step = 1
)

}
)

# Cria input do tipo "lista de caixas de seleção" com componentes para filtragem
shiny::checkboxGroupInput(
inputId = "componentes",
label = shiny::strong("Componentes:"),
choices = c("% a.m.", "Tendência", "Sazonalidade", "Média"),
selected = c("% a.m.", "Tendência", "Média")
)

Uma vez definidos os inputs, passamos à construção dos outputs que serão dois gráficos neste caso. Para tal, criamos mais duas linhas: a primeira responsável por criar o gráfico dinâmico que compara a sazonalidade dos dados históricos com um determinado ano, especificado pelo usuário; e a segunda é responsável pelo gráfico dinâmico que mostra alguns componentes da série escolhida.

Veja, por exemplo, que o primeiro gráfico é afetado por mudanças no input referente ao filtro de datas, definição de ano de comparação e o indicador escolhido, sendo assim o script exige essas entradas/definições, utiliza esses valores armazenados para tratamento e cálculos nos dados, e, por fim, gera o gráfico de ggplot2 dinamicamente:


# Gerar gráfico dinâmico (se atualiza conforme o input da sidebar)
shiny::renderPlot({

# Use a função req para exigir que os valores do inputs sejam informados pelo usuário,
# isso evita que o R execute o script "ansiosamente"
shiny::req(
input$data,
input$ano %in% lubridate::year(input$data[1]):lubridate::year(input$data[2]),
input$variavel
)


# Valores dos inputs salvos em objetos auxiliar, por conveniência
data_inicial <- lubridate::floor_date(input$data[1])
data_final <- lubridate::floor_date(input$data[2])
data_compara <- input$ano
indicador <- input$variavel


# Script para calcular padrão sazonal mensal conforme inputs do usuário: mediana e IQR
seas_pattern <- tbl_inflation %>%
dplyr::group_by(
variable,
date_m = lubridate::month(.data$date, label = TRUE, locale = "pt_BR.utf8") %>%
stringr::str_to_sentence(locale = "br") %>%
forcats::as_factor()
) %>%
dplyr::filter(date >= data_inicial & date <= data_final) %>%
dplyr::summarise(
iqr = ggplot2::median_hilow(mom, conf.int = 0.5),
.groups = "drop"
) %>%
tidyr::unnest(cols = iqr) %>%
dplyr::rename("median" = "y", "date" = "date_m") %>%
dplyr::left_join(
tbl_inflation %>%
dplyr::filter(
date >= data_inicial & date <= data_final,
lubridate::year(.data$date) == data_compara
) %>%
dplyr::mutate(
date = lubridate::month(.data$date, label = TRUE, locale = "pt_BR.utf8") %>%
stringr::str_to_sentence(locale = "br") %>%
forcats::as_factor()
),
by = c("variable", "date")
) %>%
tidyr::pivot_longer(
cols = -c(variable, date, ymin, ymax),
names_to = "measure",
values_to = "value"
) %>%
dplyr::mutate(
measure = dplyr::recode(
measure,
"median" = "Mediana",
"mom" = as.character(data_compara)
)
) %>%
dplyr::filter(variable == indicador)


# Gerar gráfico dinâmico
seas_pattern %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = value, color = measure, shape = measure, group = measure) +
ggplot2::geom_hline(yintercept = 0) +
ggplot2::geom_ribbon(
ggplot2::aes(
ymin = ymin,
ymax = ymax,
fill = "IQR (CI = 0,5)"
),
alpha = 0.2,
color = NA
) +
ggplot2::geom_line(size = 1.2) +
ggplot2::geom_point(size = 3) +
ggplot2::scale_color_manual(
NULL,
values = c(unname(colors["red"]), unname(colors["black"])),
guide = ggplot2::guide_legend(
override.aes = list(
shape = c(16, NA)
)
)
) +
ggplot2::scale_fill_manual(
NULL,
values = c("IQR (CI = 0,5)" = unname(colors["black"]))
) +
ggplot2::scale_shape_manual(
NULL,
values = c(16, NA)
) +
ggplot2::scale_y_continuous(
breaks = scales::extended_breaks(n = 6),
labels = scales::label_number(decimal.mark = ",", accuracy = 0.01),
minor_breaks = NULL
) +
ggplot2::labs(
title = paste0("**", indicador, "**: padrão sazonal"),
subtitle = paste0(
"% a.m., ",
paste0(
lubridate::year(data_inicial),
"m",
ifelse(
lubridate::month(data_inicial) < 10,
paste0("0", lubridate::month(data_inicial)),
lubridate::month(data_inicial)
),
"-",
lubridate::year(data_final),
"m",
ifelse(
lubridate::month(data_final) < 10,
paste0("0", lubridate::month(data_final)),
lubridate::month(data_final)
)
)
),
x = NULL,
y = NULL,
caption = "**Dados:** FGV e IBGE | **Elaboração:** Fernando da Silva"
) +
ggplot2::theme_light() +
ggplot2::theme(
legend.position = "bottom",
legend.key = ggplot2::element_blank(),
legend.key.width = ggplot2::unit(1, "cm"),
legend.key.height = ggplot2::unit(0.5, "cm"),
legend.text = ggplot2::element_text(size = 12),
plot.title = ggtext::element_markdown(size = 30, colour = colors["blue"]),
plot.subtitle = ggplot2::element_text(size = 16),
plot.caption = ggtext::element_markdown(size = 12),
axis.text = ggplot2::element_text(size = 12),
strip.background = ggplot2::element_blank(),
strip.text = ggplot2::element_text(size = 12, face = "bold", colour = colors["black"])
)

})

Após gerar os elementos visuais, utilize o botão Run Document no RStudio para visualizar o resultado, ou seja, a dashboard propriamente dita.

Os últimos passos envolvem fazer o deploy da dashboard e automatizar a coleta inicial de dados. Consulte as referências inicias para orientação sobre o assunto.

___________________

(*) Para aprofundamento e detalhes confira o Curso de Análise de Conjuntura usando o R.

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

Assinar Gratuitamente