Meu objetivo com este documento é ilustrar como elaborar um gráfico denominado waterfall. Embora não seja muito conhecido ou utilizado é possível encontrar bastante referência na internet. O leitor interessado poderá consultar, por exemplo, as seguintes páginas ou documentos:
https://learnr.wordpress.com/2010/05/10/ggplot2-waterfall-charts/
https://analyticstraining.com/waterfall-charts-using-ggplot2-in-r/
https://www.r-bloggers.com/waterfall-charts-in-style-of-the-economist-with-r/
https://vita.had.co.nz/papers/ggplot2-wires.pdf
Para ilustrar a elaboração deste gráfico vou utilizar um conjunto de dados referente às aplicações de recursos dos RPPS em fundos de investimentos. O conjunto de dados consta do arquivo baseAPR_DtGer_04-10-2018.rds. O arquivo contém dados de alguns RPPS fluminenses para os anos de 2017 e 2018.
Quem consultou qualquer das referências indicadas viu que este gráfico é indicado para representar movimentações financeiras (ingressos, saídas e saldo) em contas bancárias ou, no nosso caso, os movimentos de aplicações e resgates nos fundos de investimentos. Deve-se notar que os acréscimos oriundos de rendimentos não são evidenciados no gráfico. Apenas os valoes das aplicações e dos resgates.
O R possui dois pacotes para a elaboração deste gráfico: o pacote waterfall e o pacote waterfalls. Neste documento irei utilizar o pacote waterfalls que utiliza o pacote ggplot2 para a elaboração do gráfico.
Os comandos a seguir fazem a importação dos dados e sua preparação para a elaboração do gráfico.
setwd("I:/Melhores Praticas TCE e Atricon/ATRICON/3. Parte Pratica - Laboratorio/2-importar dados dair/waterfall-app")
apr <- readRDS("baseAPR_DtGer_04-10-2018.rds")
head(apr)## ente ano mes
## 1 Pinheiral 2017 1
## 2 Pinheiral 2017 1
## 3 Pinheiral 2017 1
## 4 Pinheiral 2017 1
## 5 Pinheiral 2017 1
## 6 Pinheiral 2017 1
## fundos
## 1 14.386.926/0001-71 - CAIXA BRASIL IDKA 2 A TITULOS PUBLICOS FI RENDA FIXA LP
## 2 18.598.288/0001-03 - CAIXA BRASIL2024I TITULOS PUBLICOS FI RENDA FIXA
## 3 11.060.913/0001-10 - CAIXA BRASIL IMA B 5 TITULOS PUBLICOS FI RENDA FIXA LP
## 4 10.740.658/0001-93 - CAIXA BRASIL IMA B TITULOS PUBLICOS FI RENDA FIXA LP
## 5 10.740.670/0001-06 - CAIXA BRASIL IRFM 1 TITULOS PUBLICOS FI RENDA FIXA
## 6 07.861.554/0001-22 - BB IMA B FI RENDA FIXA PREVIDENCIARIO
## numeroAPR tipoOperacao dataOperacao quantidade valorOperacao
## 1 A1701001 COMPRA 2017-01-31 2996314.7 4921518.8
## 2 A1701002 COMPRA 2017-01-31 300000.0 406980.6
## 3 A1701003 COMPRA 2017-01-31 1793117.8 3907225.2
## 4 A1701004 COMPRA 2017-01-31 4552179.2 10371507.5
## 5 A1701005 COMPRA 2017-01-31 1220056.1 2467451.1
## 6 A1701006 COMPRA 2017-01-31 737252.3 2638003.5
## nomeBanco agenciaBanco contaBanco quantidadeAntes
## 1 Caixa Econômica Federal 2171 170 0
## 2 Caixa Econômica Federal 2171 170 0
## 3 Caixa Econômica Federal 2171 170 0
## 4 Caixa Econômica Federal 2171 170 0
## 5 Caixa Econômica Federal 2171 170 0
## 6 Banco do Brasil S.A. 3259 7960X 0
## quantidadeApos descricaoOperacao
## 1 2996314.7 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS\t
## 2 300000.0 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS\t
## 3 1793117.8 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS
## 4 4552179.2 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS\t
## 5 1220056.1 FUNDO DE RENDA FIXA ATRELADO A 100%TITULOS PUBLICOS
## 6 737252.3 FUNDO DE RENDA FIXA ATRELADO A 80% TITULOS PUBLICOS
## caracteristicasAtivos valorAtivoCota nome
## 1 FI 100% TITULOS PUBLICOS 1.642524 FI 100% títulos TN
## 2 FI 100% TITULOS TN 1.356602 FI 100% títulos TN
## 3 FI 100% TITULOS TN 2.179012 FI 100% títulos TN
## 4 FI 100% TITULOS TN 2.278361 FI 100% títulos TN
## 5 FI 100% TITULOS TN 2.022408 FI 100% títulos TN
## 6 FI 80% TITULOS TN 3.578156 FI Renda Fixa/Referenciados RF
## textoFundamentoLegal valorLimite dtInicioVigencia
## 1 Art. 7º, I, "b" 100.00 2010-11-25
## 2 Art. 7º, I, "b" 100.00 2010-11-25
## 3 Art. 7º, I, "b" 100.00 2010-11-25
## 4 Art. 7º, I, "b" 100.00 2010-11-25
## 5 Art. 7º, I, "b" 100.00 2010-11-25
## 6 Art. 7º, III, "a" 80.00 2010-11-25
Com os comandos acima fiz a importação dos dados e mostrei os registros iniciais para que o leitor tenha uma ideia do conteúdo da base de dados.
É necessário realizar algum trabalho de preparação dos dados. Irei criar uma nova coluna na base de dados contendo apenas o CNPJ do fundo de investimento e criarei também uma outra coluna contendo uma indicação do ano e mês da operação registrada na APR. Os comandos a seguir executam estes procedimentos:
# Criação da coluna com o CNPJ dos Fundos de Investimentos
apr$cnpj_fundos <- substr(as.character(apr$fundos), 1, 18)
# Criação de uma coluna com indicação de ano e mês
apr$ano_mes <- substr(apr$numeroAPR, 1, 5)
head(apr)## ente ano mes
## 1 Pinheiral 2017 1
## 2 Pinheiral 2017 1
## 3 Pinheiral 2017 1
## 4 Pinheiral 2017 1
## 5 Pinheiral 2017 1
## 6 Pinheiral 2017 1
## fundos
## 1 14.386.926/0001-71 - CAIXA BRASIL IDKA 2 A TITULOS PUBLICOS FI RENDA FIXA LP
## 2 18.598.288/0001-03 - CAIXA BRASIL2024I TITULOS PUBLICOS FI RENDA FIXA
## 3 11.060.913/0001-10 - CAIXA BRASIL IMA B 5 TITULOS PUBLICOS FI RENDA FIXA LP
## 4 10.740.658/0001-93 - CAIXA BRASIL IMA B TITULOS PUBLICOS FI RENDA FIXA LP
## 5 10.740.670/0001-06 - CAIXA BRASIL IRFM 1 TITULOS PUBLICOS FI RENDA FIXA
## 6 07.861.554/0001-22 - BB IMA B FI RENDA FIXA PREVIDENCIARIO
## numeroAPR tipoOperacao dataOperacao quantidade valorOperacao
## 1 A1701001 COMPRA 2017-01-31 2996314.7 4921518.8
## 2 A1701002 COMPRA 2017-01-31 300000.0 406980.6
## 3 A1701003 COMPRA 2017-01-31 1793117.8 3907225.2
## 4 A1701004 COMPRA 2017-01-31 4552179.2 10371507.5
## 5 A1701005 COMPRA 2017-01-31 1220056.1 2467451.1
## 6 A1701006 COMPRA 2017-01-31 737252.3 2638003.5
## nomeBanco agenciaBanco contaBanco quantidadeAntes
## 1 Caixa Econômica Federal 2171 170 0
## 2 Caixa Econômica Federal 2171 170 0
## 3 Caixa Econômica Federal 2171 170 0
## 4 Caixa Econômica Federal 2171 170 0
## 5 Caixa Econômica Federal 2171 170 0
## 6 Banco do Brasil S.A. 3259 7960X 0
## quantidadeApos descricaoOperacao
## 1 2996314.7 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS\t
## 2 300000.0 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS\t
## 3 1793117.8 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS
## 4 4552179.2 FUNDO DE RENDA FIXA ATRELADO A 100% TITULOS PUBLICOS\t
## 5 1220056.1 FUNDO DE RENDA FIXA ATRELADO A 100%TITULOS PUBLICOS
## 6 737252.3 FUNDO DE RENDA FIXA ATRELADO A 80% TITULOS PUBLICOS
## caracteristicasAtivos valorAtivoCota nome
## 1 FI 100% TITULOS PUBLICOS 1.642524 FI 100% títulos TN
## 2 FI 100% TITULOS TN 1.356602 FI 100% títulos TN
## 3 FI 100% TITULOS TN 2.179012 FI 100% títulos TN
## 4 FI 100% TITULOS TN 2.278361 FI 100% títulos TN
## 5 FI 100% TITULOS TN 2.022408 FI 100% títulos TN
## 6 FI 80% TITULOS TN 3.578156 FI Renda Fixa/Referenciados RF
## textoFundamentoLegal valorLimite dtInicioVigencia cnpj_fundos
## 1 Art. 7º, I, "b" 100.00 2010-11-25 14.386.926/0001-71
## 2 Art. 7º, I, "b" 100.00 2010-11-25 18.598.288/0001-03
## 3 Art. 7º, I, "b" 100.00 2010-11-25 11.060.913/0001-10
## 4 Art. 7º, I, "b" 100.00 2010-11-25 10.740.658/0001-93
## 5 Art. 7º, I, "b" 100.00 2010-11-25 10.740.670/0001-06
## 6 Art. 7º, III, "a" 80.00 2010-11-25 07.861.554/0001-22
## ano_mes
## 1 A1701
## 2 A1701
## 3 A1701
## 4 A1701
## 5 A1701
## 6 A1701
Agora já é possível preparar os dados para serem plotados. Nos comandos a seguir, irei selecionar um município e farei as agregações necessárias de forma que o gráfico evidencie para o RPPS do município selecionado as aplicações e resgates do conjunto dos fundos de investimentos que compõem a carteira do RPPS.
O mesmo gráfico poderia ser feito para cada fundo individualmente, mas nesse documento optei por mostrar a movimentação agregada.
suppressPackageStartupMessages(library(dplyr))
# Escolha do município
munic <- "Petrópolis"
# Criação da base de dados
wfdata <- apr %>%
filter(ente == munic) %>%
select("numeroAPR", "valorOperacao", "dataOperacao", "tipoOperacao") %>%
mutate(valorOperacao = ifelse(tipoOperacao == "RESGATE", valorOperacao * -1, valorOperacao)) %>%
arrange(as.Date(dataOperacao)) %>%
mutate(mes_ano = format(dataOperacao, "%Y-%m")) %>%
group_by(mes_ano, tipoOperacao) %>%
summarise(vlrOp = sum(valorOperacao)) %>%
ungroup()Em resumo, o que o comando acima faz é criar um novo conjunto de dados denominado wddata com a movimentação de aplicações e resgate para o conjunto dos Fundos de Investimentos para o RPPS de Petrópolis.
O resultado pode ser visto a seguir:
wfdata## # A tibble: 27 x 3
## mes_ano tipoOperacao vlrOp
## <chr> <fct> <dbl>
## 1 2017-01 COMPRA 256472
## 2 2017-02 NOVA 400527
## 3 2017-02 RESGATE - 90570
## 4 2017-03 COMPRA 31188
## 5 2017-03 NOVA 55662
## 6 2017-03 RESGATE - 31248
## 7 2017-04 NOVA 157173
## 8 2017-05 NOVA 2195088
## 9 2017-06 NOVA 202867
## 10 2017-07 RESGATE -2477172
## # ... with 17 more rows
Para produzir os dados para outros RPPS é só informar o nome do município desejado e a base de dados correspondente será preparada.
Feita a preparação dos dados já posso plotar o gráfico. Veja como nos comandos a seguir:
options(scipen = 20)
library(waterfalls)
waterfall(values = wfdata$vlrOp,
labels = wfdata$tipoOperacao)O gráfico acima pode ser melhorado alterando-se alguns parâmetros. Veja o exemplo a seguir:
library(ggplot2)
waterfall(values = wfdata$vlrOp,
labels = paste(substr(wfdata$mes_ano, 3, 7),
substr(wfdata$tipoOperacao, 1, 1), sep = ""),
rect_text_labels = rep("", length(wfdata$vlrOp)),
print_plot = TRUE)Alguns ajustes adicionais podem ainda serem feitos no gráfico. A opção print_plot = TRUE salva o objeto que representa o gráfico na área de trabalho com o nome default mywaterfall. O usuário pode alterar este nome modificando o argumento ggplot_object_name = "mywaterfall" e escolhendo um novo nome.
Os comandos a seguir incluem um título no gráfico e rotaciona os labels do eixo dos “x”.
mywaterfall +
ggtitle(munic) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))Os nomes no eixo dos “x”" indicam o ano e mês da operação (17-01 indica janeiro de 2017) e a letra indica se a operação é uma COMPRA (C), ou é uma NOVA aplicação (N) ou se é um RESGATE (R).
As aplicações estão em azul (Compra e Novo) e os resgates em vermelho (Resgate).