Construindo um Dashboard de Indicadores Macroeconômicos

O acompanhamento de variáveis econômicas permite avaliar a conjuntura econômica de uma país. É possível realizar essa tarefa através de um método extremamente produtivo, sem perder tempo coletando os dados, realizando a construção de cálculos, gráficos e tabelas de forma manual: por meio da construção de um Dashboard automatizado. No post de hoje, vamos ensinar a como construir um Dashboard de Indicadores Macroeconômicos com o R.

Análise de Conjuntura e Variáveis Macroeconômicas

O objetivo de lidar com dados Macroeconômicos é verificar o comportamento  e o ciclo econômico de um determinado país em um dado período tempo, afim de realizar comparações com a Teoria Macroeconômica, bem como analisar o efeito de políticas econômicas e eventos extremos.

A Variáveis Econômicas construídas por meio de estatísticas oficiais de entidades de países ou instituições permitem avaliar os dados necessários para se ter um Análise de Conjuntura.

Portanto, instituições financeiras, empresas e policymakers, entre outros agentes, necessitam do uso de Análise de Conjuntura de forma a avaliar o presente e projetar o futuro.

Qual o beneficio de um Dashboard?

Um Dashboard permite manter diversos gráficos, tabelas entre outras formas de visualização de gráficos em um único ou mais painel de forma interativa e dinâmica. A construção desse tipo de painel permite que o analista construa um sistema em que não somente tenha pronto de forma automática a construção de visualizações para realizar Análise de Conjuntura, bem como haja a coleta automática de dados por meio deste sistema.

Conheça nosso Curso de Análise de Conjuntura usando o R e aprenda a construir esse tipo de análise.

Construindo um Dashboard de Mercado de trabalho com o R

Mas como construir um Dashboard? Aqui na Análise Macro ensinamos nossos alunos a construírem Dashboard de diversas variáveis Macroeconômicas, seja do Mercado de Trabalho, Mercado de Crédito, Inflação, Política Fiscal, Política Monetária, Setor Externo, Economia Internacional e Nível de Atividade. Tudo isso é encontrado no curso Análise de Conjuntura com o R.

No post de hoje, vamos ensinar a construir um Dashboard de Mercado de Trabalho. Os passos seguiram abaixo, o objetivo será construir um projeto no R, um arquivo .R, e um arquivo {flexdashboard}.

Arquivo .R contendo a Coleta e Tratamento de Dados

O arquivo .R será utilizado para definir toda a base de coleta de dados do Dashboard. A separação do back com o front (coleta, tratamento e cálculo com a parte visual) é útil não somente como forma de organização, como também é útil para a utilização do Github Actions para tornar o Dashboard automatizado, com coletas de dados programadas, mas isso fica para outro post.

Vamos começar criando o arquivo .R. Vejamos o processo de coleta abaixo.

library(PNADcIBGE)
library(dplyr)
library(tidyr)
library(sidrar)
library(rvest)
library(xml2)
library(httr)
library(openssl)


### Funções e objetos úteis

# Manter atualização automática de dados diária?
atualiza <- TRUE

# Tratar dados da PNADC-Mensal
clean_pnadcm <- function(data, id) {

  data  %>%
    dplyr::select(
      date     = "Trimestre M\u00f3vel (C\u00f3digo)",
      value    = "Valor"
    ) %>%
    dplyr::mutate(
      date = lubridate::ym(date),
      variable = id
    ) %>%
    dplyr::as_tibble()

}


# Criar função para coletar, tratar e salvar dados
get_data <- function(update_data) {

  if (update_data) {

    ## Parâmetros e códigos para coleta de dados
    parametros <- list(
      # Pessoas de 14+ anos (Mil pessoas): ocupados/desocupados na Força de trabalho
      api_ocupados_desocupados = "/t/6318/n1/all/v/1641/p/all/c629/all",

      # Taxa de Desocupação (%)
      api_tx_desocupacao = "/t/6381/n1/all/v/4099/p/all/d/v4099%201",

      # Nível de Ocupação (%)
      api_nivel_ocupacao = "/t/6379/n1/all/v/4097/p/all/d/v4097%201",

      # Taxa de Participação na Força de trabalho (%)
      api_tx_participacao = "/t/5944/n1/all/v/4096/p/all/d/v4096%201",

      # Ocupação por Categorias (Mil pessoas): posição na ocupação e categoria do emprego
      api_categorias = "/t/6320/n1/all/v/4090/p/all/c11913/31722,31723,31724,31727,31731,96170,96171",

      # Grupos de Atividades (Mil pessoas)
      api_grupos = "/t/6323/n1/all/v/4090/p/all/c693/allxt",

      # Rendimento médio real e nominal de todos os trabalhos habitualmente recebidos por mês (R$)
      api_rendimento = "/t/6390/n1/all/v/5929,5933/p/all",

      # Massa de rendimento, real e nominal, de todos os trabalhos habitualmente recebidos por mês (R$ milhões)
      api_massa = "/t/6392/n1/all/v/6288,6293/p/all",

      # Saldo do Novo CAGED (pessoas)
      api_caged = "http://ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='CAGED12_SALDON12')",

      # Microdados da PNADC-T (último trimestre disponível)
      api_pnadc_dates = xml2::read_html("https://sidra.ibge.gov.br/home/pnadct/brasil") %>%
        rvest::html_nodes(".titulo-aba") %>%
        rvest::html_text() %>%
        stringr::str_extract("(Divulgação Trimestral) - \\d{1}. trimestre \\d{4}") %>%
        dplyr::lst(
          quarter = stringr::str_extract(., "\\d{1}") %>% as.numeric(),
          year = stringr::str_extract(., "\\d{4}") %>% as.numeric()
        ),

      # Query variables
      api_pnadc_variables = c("Ano", "Trimestre", "UF", "V1028", "VD4002")
    )



    ## Coleta dos dados

    # Pessoas de 14+ anos (Mil pessoas): ocupados/desocupados na Força de trabalho
    raw_ocupados_desocupados <- sidrar::get_sidra(api = parametros$api_ocupados_desocupados)

    # Taxa de Desocupação (%)
    raw_tx_desocupacao <- sidrar::get_sidra(api = parametros$api_tx_desocupacao)

    # Nível de Ocupação (%)
    raw_nivel_ocupacao <- sidrar::get_sidra(api = parametros$api_nivel_ocupacao)

    # Taxa de Participação na Força de trabalho (%)
    raw_tx_participacao <- sidrar::get_sidra(api = parametros$api_tx_participacao)

    # Ocupação por Categorias (Mil pessoas)
    raw_categorias <- sidrar::get_sidra(api = parametros$api_categorias)

    # Grupos de Atividades (Mil pessoas)
    raw_grupos <- sidrar::get_sidra(api = parametros$api_grupos)

    # Rendimento médio real e nominal de todos os trabalhos habitualmente recebidos por mês (R$)
    raw_rendimento <- sidrar::get_sidra(api = parametros$api_rendimento)

    # Massa de rendimento, real e nominal (R$ milhões)
    raw_massa <- sidrar::get_sidra(api = parametros$api_massa)

    # Saldo do Novo CAGED
    #raw_caged <- ipeadatar::ipeadata(code = parametros$api_caged)
    raw_caged <- httr::GET(parametros$api_caged)




    ## Tratamento dos dados

    # Pessoas de 14+ anos (Mil pessoas): ocupados/desocupados na Força de trabalho
    ocupados_desocupados <- raw_ocupados_desocupados %>%
      dplyr::select(
        date     = "Trimestre M\u00f3vel (C\u00f3digo)",
        variable = "Condi\u00e7\u00e3o em rela\u00e7\u00e3o \u00e0 for\u00e7a de trabalho e condi\u00e7\u00e3o de ocupa\u00e7\u00e3o",
        value   = "Valor"
      ) %>%
      dplyr::mutate(
        date = lubridate::ym(date),
        variable = dplyr::recode(
          variable,
          "Total"                          = "Popula\u00e7\u00e3o total (PIA)",
          "For\u00e7a de trabalho"              = "For\u00e7a de trabalho (PEA)",
          "For\u00e7a de trabalho - ocupada"    = "Ocupados",
          "For\u00e7a de trabalho - desocupada" = "Desocupados",
          "Fora da for\u00e7a de trabalho"      = "Fora da for\u00e7a (PNEA)"
        ),
        value = value / 1000 # converter em milhões de pessoas
      ) %>%
      dplyr::as_tibble()

    # Taxa de Desocupação (%)
    tx_desocupacao <- raw_tx_desocupacao %>%
      clean_pnadcm(id = "Taxa de Desocupa\u00e7\u00e3o")

    # Nível de Ocupação (%)
    nivel_ocupacao <- raw_nivel_ocupacao %>%
      clean_pnadcm(id = "N\u00edvel de Ocupa\u00e7\u00e3o")

    # Taxa de Participação na Força de trabalho (%)
    tx_participacao <- raw_tx_participacao %>%
      clean_pnadcm(id = "Taxa de Participa\u00e7\u00e3o")

    # Juntar dados: Ocupados/Desocupados, Tx. Desocupação, Nível e Tx. Participação
    resumo_pnadcm <- purrr::map_dfr(
      .x = list(ocupados_desocupados, tx_desocupacao, nivel_ocupacao, tx_participacao),
      ~dplyr::bind_rows(.x)
    ) %>%
      dplyr::mutate(variable = forcats::as_factor(variable))

    # Ocupação por Categorias (Mil pessoas)
    categorias <- raw_categorias %>%
      dplyr::select(
        date     = "Trimestre M\u00f3vel (C\u00f3digo)",
        variable = "Posi\u00e7\u00e3o na ocupa\u00e7\u00e3o e categoria do emprego no trabalho principal",
        value    = "Valor"
      ) %>%
      dplyr::mutate(
        date     = lubridate::ym(date),
        variable = stringr::str_remove_all(
          variable,
          "Empregado no setor privado, exclusive trabalhador dom\u00e9stico - "
        ) %>% dplyr::recode(
          "com carteira de trabalho assinada" = "Empregado com carteira",
          "sem carteira de trabalho assinada" = "Empregado sem carteira"
        ) %>%
          forcats::as_factor(),
        value    = value / 1000 # converter em milhões de pessoas
      ) %>%
      dplyr::as_tibble()

    # Grupos de Atividades (Mil pessoas)
    grupos <- raw_grupos %>%
      dplyr::select(
        date     = "Trimestre M\u00f3vel (C\u00f3digo)",
        variable = "Grupamento de atividades no trabalho principal - PNADC",
        value    = "Valor"
      ) %>%
      dplyr::mutate(
        date     = lubridate::ym(date),
        variable = forcats::as_factor(variable),
        value    = value / 1000 # converter em milhões de pessoas
      ) %>%
      dplyr::as_tibble()

    # Rendimento médio real e nominal de todos os trabalhos habitualmente recebidos por mês (R$)
    rendimento <- raw_rendimento %>%
      dplyr::select(
        date     = "Trimestre M\u00f3vel (C\u00f3digo)",
        variable = "Vari\u00e1vel",
        value    = "Valor"
      ) %>%
      dplyr::mutate(
        date     = lubridate::ym(date),
        variable = forcats::as_factor(variable) %>%
          forcats::fct_recode(
            "Rendimento nominal" = "Rendimento m\u00e9dio nominal de todos os trabalhos, habitualmente recebido por m\u00eas, pelas pessoas de 14 anos ou mais de idade, ocupadas na semana de refer\u00eancia, com rendimento de trabalho",
            "Rendimento real" = "Rendimento m\u00e9dio real de todos os trabalhos, habitualmente recebido por m\u00eas, pelas pessoas de 14 anos ou mais de idade, ocupadas na semana de refer\u00eancia, com rendimento de trabalho"
          )
      ) %>%
      dplyr::as_tibble()

    # Massa de rendimento, real e nominal (R$ milhões)
    massa <- raw_massa %>%
      dplyr::select(
        date     = "Trimestre M\u00f3vel (C\u00f3digo)",
        variable = "Vari\u00e1vel",
        value    = "Valor"
      ) %>%
      dplyr::mutate(
        date     = lubridate::ym(date),
        value    = value / 1000, # converter em R$ bilhões
        variable = forcats::as_factor(variable) %>%
          forcats::fct_recode(
            "Massa de rendimento nominal" = "Massa de rendimento nominal de todos os trabalhos, habitualmente recebido por m\u00eas, pelas pessoas de 14 anos ou mais de idade, ocupadas na semana de refer\u00eancia, com rendimento de trabalho",
            "Massa de rendimento real" = "Massa de rendimento real de todos os trabalhos, habitualmente recebido por m\u00eas, pelas pessoas de 14 anos ou mais de idade, ocupadas na semana de refer\u00eancia, com rendimento de trabalho"
          )
      ) %>%
      dplyr::as_tibble()


    # Saldo do Novo CAGED
    # caged <- raw_caged %>%
    #   dplyr::select(date, value) %>%
    #   dplyr::mutate(value = value / 1000) %>% # converter em milhares
    #   dplyr::as_tibble()
    caged <- httr::content(raw_caged)[[2]] %>%
      dplyr::bind_rows() %>%
      dplyr::select(
        "date"  = `VALDATA`,
        "value" = `VALVALOR`
      ) %>%
      dplyr::mutate(
        date = lubridate::as_date(date),
        value = value / 1000 # converter em milhares
      )

    # Criar lista de nomes dos estados do Brasil para gráfico
    states <- tibble(
      states = c(
        "Rondônia", "Acre", "Amazonas", "Roraima", "Pará", "Amapá",
        "Tocantins", "Maranhão", "Piauí", "Ceará", "Rio Grande do Norte",
        "Paraíba", "Pernambuco", "Alagoas", "Sergipe", "Bahia",
        "Minas Gerais", "Espírito Santo", "Rio de Janeiro", "São Paulo",
        "Paraná", "Santa Catarina", "Rio Grande do Sul",
        "Mato Grosso do Sul", "Mato Grosso", "Goiás", "Distrito Federal"
      ),
      code = c(
        "RO", "AC", "AM", "RR", "PA", "AP", "TO", "MA", "PI",
        "CE", "RN", "PB", "PE", "AL", "SE", "BA", "MG", "ES",
        "RJ", "SP", "PR", "SC", "RS", "MS", "MT", "GO", "DF"
      )
    )



    ## Salvar dados

    # Remover objetos desnecessários
    rm(
      list  = c(lsf.str()),
      envir = environment()
    )


    # Salvar
    save(
      list  = ls(),
      file  = file.path("dados.Rdata"),
      envir = environment()
    )

  }

}

get_data(update_data = atualiza)

O código permite coletar diversas variáveis úteis para avaliar o Mercado de Trabalho Brasileiro, isso tudo controlado por meio de uma função que salva os dados dentro de um arquivo .Rdata, que será carregado no arquivo .Rmd para criação de gráficos.

Arquivo .Rmd criado com flexdashboard para construir o visual do Dashboard

A tarefa agora será criar um arquivo .Rmd para constituir o Dashboard. Aqui utilizaremos o {flexdashboard}. Para aqueles que não possuem o pacote, é necessário instalar e criar um arquivo por meio de New File -> R Markdown -> From Template -> Flex Dashboard.

Conheça nosso Curso de Análise de Conjuntura usando o R e aprenda a construir esse tipo de análise.

Uma vez instalado segue-se o código abaixo. Cada bloco representa um chunk do arquivo .Rmd.

# Carregar pacotes
library(rmarkdown)
library(flexdashboard)
library(shiny)
library(dplyr)
library(ggplot2)
library(lubridate)
library(scales)
library(rsconnect)
### Funções e objetos úteis

# Cores para gráficos e tabelas
colors <- c(
blue = "#282f6b",
red = "#b22200",
yellow = "#eace3f",
green = "#224f20",
purple = "#5f487c",
orange = "#b35c1e",
turquoise = "#419391",
green_two = "#839c56",
light_blue = "#3b89bc",
gray = "#666666"
)

# Fonte para gráficos e tabelas
foot_ibge <- "Fonte: analisemacro.com.br com dados do Sidra/IBGE."

 

# Carrega dados salvdos
load("dados.Rdata", envir = .GlobalEnv)

Visão Geral {data-icon="fa-signal"} ===================================== Row {.sidebar data-width=200} -------------------------------------


# Texto informativo na barra lateral
shiny::strong(shiny::h3("Sobre"))
shiny::h5("Essa dashboard permite o monitoramento do Mercado de Trabalho brasileiro usando o ecossistema Shiny para a criação de aplicações web dinâmicas, com dados do IBGE.")
shiny::h5("Desenvolvimento: Análise Macro.")

Row

-------------------------------------

### Ocupados (`r format(max(ocupados_desocupados$date), "%b/%Y")` - IBGE)


# Criar Value Box
ocupados_desocupados %>%
dplyr::filter(variable == "Ocupados" & date == max(date)) %>%
dplyr::mutate(value = paste0(format(round(value, 2), decimal.mark = ","), " milhões")) %>%
dplyr::pull(value) %>%
flexdashboard::valueBox(
value = .,
icon = "fa-users",
color = colors["blue"]
)

### Desocupados (`r format(max(ocupados_desocupados$date), "%b/%Y")` - IBGE)

# Criar Value Box
ocupados_desocupados %>%
dplyr::filter(variable == "Desocupados" & date == max(date)) %>%
dplyr::mutate(value = paste0(format(round(value, 2), decimal.mark = ","), " milhões")) %>%
dplyr::pull(value) %>%
flexdashboard::valueBox(
value = .,
icon = "fa-user-times",
color = colors["red"]
)

### Taxa de Desocupação (`r format(max(tx_desocupacao$date), "%b/%Y")` - IBGE)


tx_desocupacao %>%
dplyr::filter(date == max(date)) %>%
dplyr::mutate(value = format(value, decimal.mark = ",") %>% paste0("%")) %>%
dplyr::pull(value) %>%
flexdashboard::valueBox(
value = .,
icon = "fa-percentage",
color = dplyr::case_when(
. < mean(tx_desocupacao$value) ~ colors["green"],
. > mean(tx_desocupacao$value) ~ colors["red"]
)
)

Row
-------------------------------------
### Gráfico da Taxa de Desocupação {.no-title}

# Gerar gáfico
shiny::renderPlot({
resumo_pnadcm %>% 
dplyr::filter(
variable == "Taxa de Desocupação",
date >= Sys.Date() %m-% lubridate::years(5)
) %>% 
ggplot2::ggplot(ggplot2::aes(x = date, y = value, colour = variable)) +
ggplot2::geom_line(size = 2) +
ggplot2::scale_x_date(
breaks = scales::date_breaks("10 months"), 
labels = scales::date_format("%Y\n(%b)")
) +
ggplot2::scale_colour_manual(values = unname(colors)) +
ggplot2::theme(
legend.position = "none",
plot.title = ggplot2::element_text(size = 16, face = "bold"),
plot.subtitle = ggplot2::element_text(size = 14, face = "italic"),
axis.text.x = ggplot2::element_text(hjust = 0.9),
axis.text = ggplot2::element_text(size = 12), 
plot.caption = ggplot2::element_text(size = 12)
) +
ggplot2::labs(
x = NULL,
y = "%",
title = "Taxa de Desocupação",
subtitle = "PNADC-Mensal",
caption = foot_ibge
)
})

Termômetro PNADC {data-icon="fa-tachometer-alt"}
=====================================

Row {.tabset}
-------------------------------------
### Principais indicadores da PNADC

# Gerar gáfico
shiny::renderPlot({
  resumo_pnadcm %>% 
    dplyr::group_by(variable) %>% 
    dplyr::filter(date >= Sys.Date() %m-% lubridate::years(5)) %>% 
    dplyr::ungroup() %>% 
    dplyr::mutate(
      labels = dplyr::if_else(
        variable %in% unique(resumo_pnadcm$variable)[1:5], "Milhões de pessoas", "%"
        )
      ) %>% 
    ggplot2::ggplot(ggplot2::aes(x = date, y = value, colour = variable)) +
    ggplot2::geom_line(size = 2) +
    ggplot2::facet_wrap(~variable~labels, scales = "free_y") +
    ggplot2::scale_y_continuous(labels = scales::label_number(accuracy = 1)) +
    ggplot2::scale_x_date(
      breaks = scales::date_breaks("15 months"), 
      labels = scales::date_format("%Y\n(%b)")
    ) +
    ggplot2::scale_colour_manual(values = unname(colors)) +
    ggplot2::theme(
      legend.position = "none",
      strip.text      = ggplot2::element_text(size = 14, face = "bold"),
      plot.title      = ggplot2::element_text(size = 16, face = "bold"),
      plot.subtitle   = ggplot2::element_text(size = 14, face = "italic"),
      axis.text.x     = ggplot2::element_text(hjust = 0.9),
      axis.text       = ggplot2::element_text(size = 12), 
      strip.text.x    = ggplot2::element_text(margin = margin(1, 0, 1, 0)), 
      plot.caption    = ggplot2::element_text(size = 12)
      ) +
    ggplot2::labs(
       x        = NULL,
       y        = NULL,
       title    = "Visão Geral do Mercado de Trabalho",
       subtitle = "Indicadores da PNADC-Mensal",
       caption  = foot_ibge
       )
})

### Ocupação por categorias

# Gerar gáfico
shiny::renderPlot({
  categorias %>% 
    dplyr::group_by(variable) %>% 
    dplyr::filter(date >= Sys.Date() %m-% lubridate::years(5)) %>% 
    dplyr::ungroup() %>% 
    ggplot2::ggplot(ggplot2::aes(x = date, y = value, colour = variable)) +
    ggplot2::geom_line(size = 2) +
    ggplot2::facet_wrap(~variable, scales = "free_y") +
    ggplot2::scale_x_date(
      breaks = scales::date_breaks("15 months"), 
      labels = scales::date_format("%Y\n(%b)")
    ) +
    ggplot2::scale_colour_manual(values = unname(colors)) +
    ggplot2::theme(
      legend.position = "none",
      strip.text      = ggplot2::element_text(size = 14, face = "bold"),
      plot.title      = ggplot2::element_text(size = 16, face = "bold"),
      plot.subtitle   = ggplot2::element_text(size = 14, face = "italic"),
      axis.text       = ggplot2::element_text(size = 12), 
      axis.text.x     = ggplot2::element_text(hjust = 0.9),
      axis.title.y    = ggplot2::element_text(size = 12),
      plot.caption    = ggplot2::element_text(size = 12)
      ) +
    ggplot2::labs(
       x        = NULL,
       y        = "Milhão de pessoas",
       title    = "Categorias do emprego de pessoas ocupadas",
       subtitle = "Indicadores da PNADC-Mensal",
       caption  = foot_ibge
       )
})

### Grupos de atividades

# Gerar gáfico
shiny::renderPlot({
  grupos %>% 
    dplyr::group_by(variable) %>% 
    dplyr::filter(date >= Sys.Date() %m-% lubridate::years(5)) %>% 
    dplyr::ungroup() %>% 
    ggplot2::ggplot(ggplot2::aes(x = date, y = value, colour = variable)) +
    ggplot2::geom_line(size = 2) +
    ggplot2::facet_wrap(
      ~variable, 
      scales = "free_y",
      ncol = 3, 
      labeller = ggplot2::label_wrap_gen(41)
      ) +
    ggplot2::scale_x_date(
      breaks = scales::date_breaks("15 months"), 
      labels = scales::date_format("%Y\n(%b)")
    ) +
    ggplot2::scale_colour_manual(values = unname(colors)) +
    ggplot2::theme(
      legend.position = "none",
      strip.text      = ggplot2::element_text(size = 14, face = "bold"),
      plot.title      = ggplot2::element_text(size = 16, face = "bold"),
      plot.subtitle   = ggplot2::element_text(size = 14, face = "italic"),
      axis.text       = ggplot2::element_text(size = 12), 
      axis.text.x     = ggplot2::element_text(hjust = 0.9), 
      axis.title.y    = ggplot2::element_text(size = 12),
      plot.caption    = ggplot2::element_text(size = 12)
      ) +
    ggplot2::labs(
       x        = NULL,
       y        = "Milhão de pessoas",
       title    = "Grupos de atividade",
       subtitle = "Indicadores da PNADC-Mensal",
       caption  = foot_ibge
       )
})

### Rendimentos


# Gerar gáfico
shiny::renderPlot({
  rendimento %>% 
    dplyr::group_by(variable) %>% 
    dplyr::filter(date >= Sys.Date() %m-% lubridate::years(5)) %>% 
    dplyr::ungroup() %>% 
    ggplot2::ggplot(ggplot2::aes(x = date, y = value, colour = variable)) +
    ggplot2::geom_line(size = 2) +
    ggplot2::scale_y_continuous(labels = scales::label_number(accuracy = 1)) +
    ggplot2::scale_x_date(
      breaks = scales::date_breaks("15 months"), 
      labels = scales::date_format("%Y\n(%b)")
    ) +
    ggplot2::scale_colour_manual(NULL, values = unname(colors)) +
    ggplot2::theme(
      legend.position = "bottom",
      plot.title      = ggplot2::element_text(size = 16, face = "bold"),
      plot.subtitle   = ggplot2::element_text(size = 14, face = "italic"),
      axis.text       = ggplot2::element_text(size = 12), 
      axis.text.x     = ggplot2::element_text(hjust = 0.9),
      axis.title.y    = ggplot2::element_text(size = 12),
      legend.text     = ggplot2::element_text(size = 12), 
      plot.caption    = ggplot2::element_text(size = 12)
      ) +
    ggplot2::labs(
       x        = NULL,
       y        = "R$",
       title    = "Rendimento médio real e nominal",
       subtitle = "Indicadores da PNADC-Mensal",
       caption  = foot_ibge
       )
})

### Massa de rendimentos

# Gerar gáfico
shiny::renderPlot({
  massa %>% 
    dplyr::group_by(variable) %>% 
    dplyr::filter(date >= Sys.Date() %m-% lubridate::years(5)) %>% 
    dplyr::ungroup() %>% 
    ggplot2::ggplot(ggplot2::aes(x = date, y = value, colour = variable)) +
    ggplot2::geom_line(size = 2) +
    ggplot2::scale_y_continuous(labels = scales::label_number(accuracy = 1)) +
    ggplot2::scale_x_date(
      breaks = scales::date_breaks("15 months"), 
      labels = scales::date_format("%Y\n(%b)")
    ) +
    ggplot2::scale_colour_manual(NULL, values = unname(colors)) +
    ggplot2::theme(
      legend.position = "bottom",
      plot.title      = ggplot2::element_text(size = 16, face = "bold"),
      plot.subtitle   = ggplot2::element_text(size = 14, face = "italic"),
      axis.text       = ggplot2::element_text(size = 12), 
      axis.text.x     = ggplot2::element_text(hjust = 0.9),
      axis.title.y    = ggplot2::element_text(size = 12),
      legend.text     = ggplot2::element_text(size = 12), 
      plot.caption    = ggplot2::element_text(size = 12)
      ) +
    ggplot2::labs(
       x        = NULL,
       y        = "R$ bilhões",
       title    = "Massa de rendimento real e nominal",
       subtitle = "Indicadores da PNADC-Mensal",
       caption  = foot_ibge
       )
})

Novo CAGED {data-icon="fa-users"}
=====================================

Row
-------------------------------------

### Saldo do Novo CAGED {.no-title}


# Gerar gáfico
shiny::renderPlot({
  # Gerar gáfico
  caged %>% 
    dplyr::filter(date >= Sys.Date() %m-% lubridate::years(5)) %>% 
    ggplot2::ggplot(ggplot2::aes(x = date, y = value)) +
    ggplot2::geom_bar(
      fill = ifelse(caged$value > 0, colors["blue"], colors["red"]),
      stat = "identity"
      ) +
    ggplot2::geom_text(
      ggplot2::aes(y = value + sign(value), label = round(value, 0)),
      position = ggplot2::position_dodge(width = 0.9),
      vjust    = ifelse(caged$value > 0, -0.5, 1.3),
      size     = 6,
      colour   = ifelse(caged$value > 0, colors["blue"], colors["red"]),
      fontface = "bold"
      ) +
    ggplot2::scale_y_continuous(
      expand = ggplot2::expansion(mult = 0.1),
      breaks = scales::breaks_extended(n = 6),
      labels = scales::label_number(accuracy = 1)
      ) +
    ggplot2::scale_x_date(
      breaks = scales::date_breaks("2 months"), 
      labels = scales::date_format("%Y\n(%b)")
      ) +
    ggplot2::theme(
      plot.title    = ggplot2::element_text(size = 16, face = "bold"),
      plot.subtitle = ggplot2::element_text(size = 14, face = "italic"),
      axis.text     = ggplot2::element_text(size = 12), 
      axis.text.x   = ggplot2::element_text(hjust = 0.9), 
      plot.caption  = ggplot2::element_text(size = 12)
      ) +
    ggplot2::labs(
       x        = NULL,
       y        = NULL,
       title    = "Saldo do Novo CAGED",
       subtitle = "Diferença entre o total de admissões e demissões de empregados, em milhares",
       caption  = "Fonte: analisemacro.com.br com dados do Ministério da Economia."
       )
})

Ao final, o resultado será um Dashboard semelhante ao da imagem.

É possível acessar o Dashboard de Mercado de Trabalho da Análise Macro por meio do seguinte link.

Quer saber mais?

Veja a nossa trilha de Macroeconomia Aplicada.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Análise do Censo Demográfico com o R

Como podemos analisar dados do Censo Demográfico para produzir pesquisas e implementar políticas públicas? Mostramos nesta postagem o resultado de uma breve análise dos dados preliminares do Censo Demográfico de 2022 usando o R.

Deploy de modelos com Python + Shinylive + GitHub gastando ZERO reais

Colocar modelos em produção pode ser um grande desafio. Lidar com custos monetários, infraestrutura operacional e complexidades de códigos e ferramentas pode acabar matando potenciais projetos. Uma solução que elimina todos estes obstáculos é a recém lançada Shinylive. Neste artigo mostramos um exemplo com um modelo de previsão para o preço do petróleo Brent.

Como automatizar tarefas repetitivas usando Python? Um exemplo para largar o Excel

Manter relatórios diários com dados e análises atualizados é um desafio, pois envolve várias etapas: coleta de dados, tratamento de informações, produção de análises e atualização de relatório. Para superar este desafio algumas ferramentas como Python + Quarto + GitHub podem ser usadas para automatizar tudo que for automatizável. Neste artigo mostramos um exemplo com dados do mercado financeiro.

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.