0.1 Introdução

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.


0.2 Importação e preparo dos dados

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.


0.3 Elaboração do gráfico

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).