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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
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.

1
2
3
4
5
6
7
8
9
# Carregar pacotes
library(rmarkdown)
library(flexdashboard)
library(shiny)
library(dplyr)
library(ggplot2)
library(lubridate)
library(scales)
library(rsconnect)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
### 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."

 

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

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

1
2
3
4
# 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)

1
2
3
4
5
6
7
8
9
10
# 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)

1
2
3
4
5
6
7
8
9
10
# 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)

1
2
3
4
5
6
7
8
9
10
11
12
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}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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

Como a IA pode auxiliar na otimização de Portfólio de Investimentos?

A construção de portfólio ótimo refere-se ao processo de alocar eficientemente capital entre um conjunto predefinido de ativos ou títulos. O campo da construção de portfólio tem sido extensivamente estudado por acadêmicos e profissionais desde a década de 1950, quando Markowitz introduziu sua inovadora abordagem de média-variância para a construção de portfólio. Diante disso, podemos melhorar o processo de alocação de peso de um investimento em um portfólio através do Aprendizado não supervisionado com a aplicação do Hierarchical Risk Parity (HRP). Neste exercício, realizamos uma introdução ao método e mostramos os resultados de um exemplo criado através do Python.

Como usar IA + Python para o Mercado Financeiro?

Neste post, mostramos como a Inteligência Artificial, aliada à linguagem Python, está revolucionando o mercado financeiro. Exploramos as principais áreas onde essa tecnologia pode ser aplicada — como gestão de carteiras, análise de demonstrações contábeis, estratégias quantitativas, trading e análise macroeconômica — com foco em aplicações práticas e exemplos voltados para o contexto brasileiro.

Como otimizar um portfólio de investimentos no Python?

Este post apresenta, de forma prática e didática, como aplicar o modelo de otimização de carteiras de Markowitz utilizando Python. A partir de dados reais de ações brasileiras, mostramos como calcular retornos, medir riscos e encontrar a combinação ótima de ativos com base nas preferências de risco do investidor. Utilizamos a biblioteca Riskfolio-Lib para estruturar a análise e gerar gráficos como o conjunto de oportunidades e a fronteira eficiente.

Boletim AM

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

Boletim AM

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

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.