Análise_Reclamações

Introdução

Essa análise busca fazer um breve apanhado das principais reclamações contra bancos e outras instituições financeiras ao seu órgão regulador, o Banco Central. O nosso objetivo será avaliar os principais tipos de reclamações que afligem os maiores bancos do país. Será observada também a evolução dos dados a cada trimestre.

Tratando dos dados

Pra análise das reclamações usaremos os dados do Ranking de Reclamações do Banco central disponibilizados no seguinte site: https://www.bcb.gov.br/estabilidadefinanceira/rankingreclamacoes.

Usaremos as seguintes bibliotecas:

library(plyr)
library(zoo)
library(knitr)
library(gganimate)
library(gifski)
library(av)
library(scales)
library(tidyverse)
library(viridis)
library(patchwork)
library(wordcloud2)
library(RColorBrewer)
library(SnowballC)
library(wordcloud)
library(tm)
library(NLP)
library(ggwordcloud)

Primeiramente, já com os arquivos baixados no nosso diretório principal, faremos a concatenação no modelo de dados em painel, ou seja, empilhando as informações por data.

hist_reclam <- data.frame()
for (n in 1:20) {
  hist_reclam <- rbind(hist_reclam,
                       read_delim(paste("dados_raclam/Bancos+e+financeiras+-+Irregularidades+por+instituicao+financeira (", n, ")", ".csv", sep = ""), 
                                  delim = ";", escape_double = FALSE, locale = locale(encoding = "LATIN1"), 
                                  trim_ws = TRUE))
}

Vale ressaltar que temos dois tipos de dados. O hist_reclam contém todos os diferentes tipos de reclamações que o banco central regula, já o hist_reclam_2 é mais generalista e contém a quantidade total de reclamações por período analisado.

hist_reclam_2 <- data.frame()
for (n in 6:25) {
  hist_reclam_2 <- rbind.fill(hist_reclam_2,
                              read_delim(paste("dados_reclam_2/Bancos+e+financeiras+-+Reclamacoes+e+quantidades+de+clientes+por+instituicao+financeira (", n, ")", ".csv", sep = ""), 
                                         delim = ";", escape_double = FALSE, locale = locale(encoding = "LATIN1"), 
                                         trim_ws = TRUE))
}

Renomeando o nome das colunas com colnames, caracterizando empresas para “mais que 4 milhões de habitantes” ou “menos de 4 milhões de habitantes” e retirando o símbolo de número da coluna Trimestre

colnames(hist_reclam_2) <- c("Ano", "Trimestre",
                             "Categoria", "Tipo",
                             "CNPJ.IF", "Instituição.financeira",
                             "Índice", "Quantidade.de.reclamações.reguladas.procedentes",
                             "Quantidade.de.reclamações.reguladas...outras",
                             "Quantidade.de.reclamações.não.reguladas",
                             "Quantidade.total.de.reclamações",
                             "Quantidade.total.de.clientes...CCS.e.SCR",
                             "Quantidade.de.clientes...CCS", "Quantidade.de.clientes...SCR",
                             "Quantidade.de.clientes...FGC", "X")

colnames(hist_reclam) <- c("Ano", "Trimestre",
                           "Categoria", "Tipo",
                           "CNPJ.IF", "Instituição.financeira",
                           "Irregularidade", "Quantidade.de.reclamações.reguladas.procedentes",
                           "Quantidade.de.reclamações.reguladas...outras",
                           "Quantidade.de.reclamações.não.reguladas",
                           "Quantidade.total.de.reclamações", "X")

Adicionando a variável categoria_2, se empresa maior que 4 milhões:

hist_reclam_2$Categoria_2 <- hist_reclam_2$Quantidade.total.de.clientes...CCS.e.SCR>4000000
hist_reclam_2$Categoria_2[is.na(hist_reclam_2$Categoria_2)] <- FALSE
hist_reclam_2$Categoria_2 <- replace(hist_reclam_2$Categoria_2, hist_reclam_2$Categoria_2 == "FALSE", "Menos de 4 milhões de clientes")
hist_reclam_2$Categoria_2 <- replace(hist_reclam_2$Categoria_2, hist_reclam_2$Categoria_2 == "TRUE", "Mais de 4 milhões de clientes")

Tirando o símbolo de número do 1 e 2 data frame:

hist_reclam_2$Trimestre = gsub("\\º","",hist_reclam_2$Trimestre)

hist_reclam$Trimestre = gsub("\\º","",hist_reclam$Trimestre)

Inserindo colunas de apoio para modificar o formato da date para “Ano-Trimestre”:

hist_reclam_2$tri <- ifelse(hist_reclam_2$Trimestre == 2, 4, 
                            ifelse(hist_reclam_2$Trimestre == 3, 7,
                                   ifelse(hist_reclam_2$Trimestre == 4, 10, 1)))
hist_reclam_2$date <- as.Date(paste0(hist_reclam_2$tri, '-', 1, '-', hist_reclam_2$Ano), format = "%m-%d-%Y")

hist_reclam <- hist_reclam %>% 
  mutate(tri = ifelse(Trimestre == 2, 4, 
                      ifelse(Trimestre == 3, 7,
                             ifelse(Trimestre == 4, 10, 1)))) %>% 
  mutate(date = as.Date(paste0(tri, '-', 1, '-', Ano), format = "%m-%d-%Y" ))

Inserindo coluna com data no formato “Ano-Trimestre”:

hist_reclam_2$date_2 <- as.yearqtr(hist_reclam_2$date, format = "%m-%d-%Y")

hist_reclam$date_2 <- as.yearqtr(hist_reclam$date, format = "%m-%d-%Y")

Removendo as colunas indesejadas:

hist_reclam <- hist_reclam[,-c(12)]

hist_reclam_2 <- hist_reclam_2[,-c(16,17)]

Agora com os dados do hist_reclam já tratados, podemos usar a função summary() para obter as informações gerais do data-frame.

summary(hist_reclam)
##       Ano        Trimestre          Categoria             Tipo          
##  Min.   :2017   Length:43810       Length:43810       Length:43810      
##  1st Qu.:2018   Class :character   Class :character   Class :character  
##  Median :2019   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2019                                                           
##  3rd Qu.:2020                                                           
##  Max.   :2021                                                           
##    CNPJ.IF          Instituição.financeira Irregularidade    
##  Length:43810       Length:43810           Length:43810      
##  Class :character   Class :character       Class :character  
##  Mode  :character   Mode  :character       Mode  :character  
##                                                              
##                                                              
##                                                              
##  Quantidade.de.reclamações.reguladas.procedentes
##  Min.   :   0.000                               
##  1st Qu.:   0.000                               
##  Median :   0.000                               
##  Mean   :   6.928                               
##  3rd Qu.:   2.000                               
##  Max.   :6044.000                               
##  Quantidade.de.reclamações.reguladas...outras
##  Min.   :   0.00                             
##  1st Qu.:   0.00                             
##  Median :   1.00                             
##  Mean   :  11.37                             
##  3rd Qu.:   4.00                             
##  Max.   :3443.00                             
##  Quantidade.de.reclamações.não.reguladas Quantidade.total.de.reclamações
##  Min.   :   0.00                         Min.   :   1.00                
##  1st Qu.:   0.00                         1st Qu.:   1.00                
##  Median :   0.00                         Median :   4.00                
##  Mean   :  11.26                         Mean   :  29.55                
##  3rd Qu.:   1.00                         3rd Qu.:  16.00                
##  Max.   :4450.00                         Max.   :6089.00                
##       tri              date                date_2    
##  Min.   : 1.000   Min.   :2017-01-01   Min.   :2017  
##  1st Qu.: 4.000   1st Qu.:2018-04-01   1st Qu.:2018  
##  Median : 7.000   Median :2019-07-01   Median :2020  
##  Mean   : 5.623   Mean   :2019-07-15   Mean   :2020  
##  3rd Qu.:10.000   3rd Qu.:2020-10-01   3rd Qu.:2021  
##  Max.   :10.000   Max.   :2021-10-01   Max.   :2022

Faremos o mesmo para hist_reclam_2.

summary(hist_reclam_2)
##       Ano        Trimestre          Categoria             Tipo          
##  Min.   :2017   Length:2092        Length:2092        Length:2092       
##  1st Qu.:2018   Class :character   Class :character   Class :character  
##  Median :2019   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2019                                                           
##  3rd Qu.:2020                                                           
##  Max.   :2021                                                           
##                                                                         
##    CNPJ.IF          Instituição.financeira    Índice         
##  Length:2092        Length:2092            Length:2092       
##  Class :character   Class :character       Class :character  
##  Mode  :character   Mode  :character       Mode  :character  
##                                                              
##                                                              
##                                                              
##                                                              
##  Quantidade.de.reclamações.reguladas.procedentes
##  Min.   :   0.0                                 
##  1st Qu.:   0.0                                 
##  Median :   3.0                                 
##  Mean   : 145.1                                 
##  3rd Qu.:  27.0                                 
##  Max.   :7802.0                                 
##                                                 
##  Quantidade.de.reclamações.reguladas...outras
##  Min.   :   0.00                             
##  1st Qu.:   1.00                             
##  Median :   5.00                             
##  Mean   : 238.05                             
##  3rd Qu.:  56.25                             
##  Max.   :8562.00                             
##                                              
##  Quantidade.de.reclamações.não.reguladas Quantidade.total.de.reclamações
##  Min.   :    0.0                         Min.   :    1.0                
##  1st Qu.:    1.0                         1st Qu.:    3.0                
##  Median :    6.0                         Median :   15.0                
##  Mean   :  235.7                         Mean   :  618.9                
##  3rd Qu.:   44.0                         3rd Qu.:  136.0                
##  Max.   :14828.0                         Max.   :30074.0                
##                                                                         
##  Quantidade.total.de.clientes...CCS.e.SCR Quantidade.de.clientes...CCS
##  Min.   :        0                        Min.   :        0           
##  1st Qu.:    20258                        1st Qu.:      706           
##  Median :   234574                        Median :     5464           
##  Mean   :  4943685                        Mean   :  4346564           
##  3rd Qu.:  1329489                        3rd Qu.:   434127           
##  Max.   :145914729                        Max.   :144407266           
##  NA's   :8                                NA's   :206                 
##  Quantidade.de.clientes...SCR Quantidade.de.clientes...FGC Categoria_2       
##  Min.   :       0             Min.   :       0             Length:2092       
##  1st Qu.:   12343             1st Qu.:     405             Class :character  
##  Median :  160306             Median :    2350             Mode  :character  
##  Mean   : 2315030             Mean   : 3756897                               
##  3rd Qu.:  880271             3rd Qu.:  108814                               
##  Max.   :54505797             Max.   :79022308                               
##  NA's   :80                   NA's   :1412                                   
##       tri             date                date_2    
##  Min.   : 1.00   Min.   :2017-01-01   Min.   :2017  
##  1st Qu.: 4.00   1st Qu.:2018-04-01   1st Qu.:2018  
##  Median : 7.00   Median :2019-07-01   Median :2020  
##  Mean   : 5.56   Mean   :2019-06-18   Mean   :2019  
##  3rd Qu.:10.00   3rd Qu.:2020-10-01   3rd Qu.:2021  
##  Max.   :10.00   Max.   :2021-10-01   Max.   :2022  
## 

Quantidade de clientes e número de reclamações

Existe relação entre o tamanho das instituições financeiras e a quantidade de reclamações? Obviamente uma instituição grande terá maior quantidade de reclamações, mas em termos proporcionais será correto afirmar tal coisa?

Buscando responder essa pergunta desenvolveremos um gráfico com o logaritmo das quantidades totais de clientes, no eixo Y, e das quantidades totais de reclamações, no eixo X. Será feita uma animação para auxiliar na visualização da evolução dos dados no tempo através do pacote gganimate.

grafico_1 <- ggplot(hist_reclam_2,
                    aes(size= I(4), 
                        shape  = Tipo, 
                        color = Categoria_2, 
                        x = log(Quantidade.total.de.clientes...CCS.e.SCR), 
                        y = log(Quantidade.de.reclamações.reguladas.procedentes)))+
  geom_point(alpha = 0.6)+
  theme_classic()+
  theme(text = element_text(size = 17))+
  theme(legend.text = element_text(size = 13))+
  guides(colour = guide_legend(override.aes = list(size=5)))+
  guides(shape = guide_legend(override.aes = list(size=5)))+
  scale_y_continuous(breaks = seq(-2, 20, 2))+
  #theme(legend.position = "bottom", legend.text = element_text(size = 10))+
  labs(
    x = "Log(Quantidade de clientes)",
    y = "Log(Quantidade de reclamações)",
    shape = "Categoria",
    color = "Tamanho Instituição",
    title = "Reclamação contra bancos e outras instituições financeiras ao Bacen",
    #subtitle = "Reclamações vs Quantidade de clientes (2021)",
    caption = "Fonte: BCB\nElaboração própria")

grafico_1 <- grafico_1 + transition_time(Ano)+
  labs(subtitle = "Reclamações vs Quantidade de clientes ({as.integer(frame_time)})")

animate(grafico_1, fps = 6, height = 500, width = 900, end_pause = 50)

Como pode ser visto no gráfico, a maioria dos bancos com mais de 4 milhões de clientes concentram o maior número de reclamações. Dessa forma, focaremos nossa análise nos 5 maiores bancos com histórico de reclamação na base de dados do Banco central.

Faremos mais um breve tratamento dos dados para selecionar as 5 maiores instituições por trimestre, usando a base hist_reclam_2.

hist_reclam_2 %>% 
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(Trimestre, `Instituição.financeira`, `Quantidade.total.de.clientes...CCS.e.SCR`)) %>% 
  group_by(Trimestre) %>% 
  top_n(5, `Quantidade.total.de.clientes...CCS.e.SCR`) -> data_plot_hist_2_total_clientes

colnames(data_plot_hist_2_total_clientes) <-  c('date', 'instituicao', 'quantidadeclientes')

head(data_plot_hist_2_total_clientes, n = 5)
## # A tibble: 5 × 3
## # Groups:   date [1]
##   date      instituicao                            quantidadeclientes
##   <yearqtr> <chr>                                               <dbl>
## 1 2017 Q1   BB (conglomerado)                                59432237
## 2 2017 Q1   BRADESCO (conglomerado)                          92106865
## 3 2017 Q1   CAIXA ECONÔMICA FEDERAL (conglomerado)           84016461
## 4 2017 Q1   ITAU (conglomerado)                              68531765
## 5 2017 Q1   SANTANDER (conglomerado)                         37527740

Executando o gráfico a partir dos dados acima:

data_plot_hist_2_total_clientes %>% 
  ggplot(aes(x = date, y = quantidadeclientes, color = instituicao)) +
  geom_line(size = 1) +
  geom_point(size = 5, alpha = .5) +
  labs(x = 'Periodo', y = 'Quantidade Total de Clientes',
       title = 'Quantidade total de Clientes',
       subtitle = 'Referente as 5 maiores instituicoes financeiras (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  scale_color_viridis_d() +
  scale_x_yearqtr(format = "%YT%q",
                  breaks = seq(from = min(data_plot_hist_2_total_clientes$date), 
                               to = max(data_plot_hist_2_total_clientes$date), by = 0.25)) +
  guides(color = guide_legend(ncol = 1))+
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(size = 15),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

O gráfico acima nos mostra os 5 maiores bancos por trimestre, desde 2017 até 2021. Pode-se perceber que todos os bancos, com exceção da Caixa Econômica Federal, mantêm um crescimento semelhante na base de clientes.

O crescimento rápido e abrupto da carteira de clientes da caixa é explicado pelo Auxílo Brasil que se foi aprovado no segundo trimestre de 2020. Tal auxílio já atendeu mais de 39 milhões de famílias que foram financeiramente impactadas pelos efeitos da COVID-19. Como o seu pagamento está sendo feito através de uma conta na Caixa Econômica Federal, resultou nesse aumento massivo na base de clientes da instituição que podemos visualizar no gráfico acima.

Veremos agora a evolução do total de reclamações para essas 5 maiores instituições financeiras: Bradesco, Itaú, Caixa, Banco do Brasil e Santander.

Preparando os dados para o gráfico de reclamações:

top5Bancos <- c('BRADESCO (conglomerado)', 'BB (conglomerado)',
                'CAIXA ECONÔMICA FEDERAL (conglomerado)',
                'ITAU (conglomerado)', 'SANTANDER (conglomerado)')

filter(hist_reclam_2,
       Instituição.financeira %in% top5Bancos) %>% 
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(Trimestre, `Instituição.financeira`, `Quantidade.total.de.reclamações`, `Quantidade.total.de.reclamações`,`Quantidade.total.de.clientes...CCS.e.SCR`)) %>% 
  group_by(Trimestre) %>% 
  top_n(5, `Quantidade.total.de.reclamações`) -> data_plot_hist_2_reclamacoes

colnames(data_plot_hist_2_reclamacoes) <-  c('date', 'instituicao', 'reclamacoes', 'quanidadeclientes')

Executando o gráfico a partir dos dados acima:

data_plot_hist_2_reclamacoes %>% 
  ggplot(aes(x = date, y = reclamacoes, color = instituicao)) +
  geom_line(size = 1) +
  geom_point(size = 5, alpha = .5) +
  labs(x = 'Periodo', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total de Reclamações',
       subtitle = 'Referente às 5 maiores instituições financeiras (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  scale_color_viridis_d() +
  scale_x_yearqtr(format = "%YT%q",
                  breaks = seq(from = min(data_plot_hist_2_total_clientes$date), 
                               to = max(data_plot_hist_2_total_clientes$date), by = 0.25)) +
  guides(color = guide_legend(ncol = 1))+
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(size = 15),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

O gráfico acima corrobora com o fenômeno do Auxílio Brasil. Como houve grande aumento do número de clientes e a inclusão de um serviço novo é possível observar aumento exponencial dos números absolutos de reclamação da caixa econômica.

Os outros bancos vêm apresentando um movimento de queda com o passar dos anos em termos absolutos e mantém a tendência de forma conjunta. Os dados aqui trabalhados não permitem aferir se o número de clientes desses bancos está crescendo acima das fintechs, como Nubak, Banco Inter, PicPay, C6bank entre outros. Logo, podemos estar deixando passar uma perda de crescimento da carteira de modo geral e, consequentemente, redução do número de reclamações.

Obviamente, para uma análise com relação a qualidade da experiência do cliente junto a instituição financeira é preciso levar em consideração o tamanho da instituição. Logo, para melhor visualização dos dados e comparação das instituições financeiras em questão, montaremos um novo gráfico dividindo o eixo Y (número de reclamações), pela quantidade de clientes.

Faremos então mais um breve tratamento dos dados:

filter(hist_reclam_2,
       Instituição.financeira %in% top5Bancos) %>%
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01))),
         indice = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(`Trimestre`, `Instituição.financeira`, `Quantidade.total.de.reclamações`,`Quantidade.total.de.clientes...CCS.e.SCR`, `indice`)) %>%
  group_by(Trimestre) %>% 
  top_n(5, Quantidade.total.de.clientes...CCS.e.SCR) -> data_plot_hist_2_indice

colnames(data_plot_hist_2_indice) <-  c('date', 'instituicao', 'reclamacoes', 'quantidadeclientes', 'indice')

Agora podemos executar o gráfico que representa o índice de reclamações das 5 maiores instituições.

data_plot_hist_2_indice %>% 
  ggplot(aes(x = date, y = indice, color = instituicao)) +
  geom_line(size = 1) +
  geom_point( size = 5, alpha = .5) +
  labs(x = 'Periodo', y = 'Reclamações por clientes',
       title = 'Reclamações por número de clientes',
       subtitle = 'Referente às 8 maiores instituições financeiras (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = percent) +
  scale_color_viridis_d() +
  scale_x_yearqtr(format = "%YT%q",
                  breaks = seq(from = min(data_plot_hist_2_total_clientes$date), 
                               to = max(data_plot_hist_2_total_clientes$date), by = 0.25)) +
  guides(color = guide_legend(ncol = 1))+
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(size = 15),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

Nitidamente é possível tirar algumas breves conclusões. Primeiramente, se desconsiderarmos o evento COVID-19, as instituições estão reduzindo o seu índice de reclamações. Tal redução pode estar relacionada com a tendência de redução de agência e automação dos processos bancários, evitando assim erros humanos, filas em agências bancárias, entre outras situações que poderiam gerar reclamação.

Sobre a Caixa Econômica, é nítido que a fuga dá média foi um fenômeno atípico, e logo após do início dos pagamentos dos auxílios o seu índice de reclamações se regularizou.

Já o Santander vem mantendo elevado índice de reclamações desde 2017 e lidera tal quesito em comparação aos pares analisados. A pandemia também afetou muito a qualidade dos serviços prestados pelo banco de modo geral. Não é possível nem aferir nenhuma outra causa a alta abrupta na pandemia, uma vez que os outros bancos não chegaram nem perto da alta que o Santander apresentou em 2020.

Para finalizar, faremos o box plot dos índices de reclamação dos bancos em questão e também de todos os bancos consolidados.

# Boxplot do numero de reclamações por cliente ----
## Bradesco
filter(hist_reclam_2,
       Instituição.financeira == 'BRADESCO (conglomerado)') %>%
  ggplot(aes(x = Ano,
             y = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR,
             group = Ano))+
             #fill = Tipo))+
  geom_boxplot() +
  labs(x = '', y = '',
       title = 'Bradesco')+
       #subtitle = '')+
  scale_y_continuous(labels = percent)+
  theme_bw()+
  theme(axis.text.x = element_text(hjust = 1, angle = 50)) -> box_1

# Banco do Brasil
filter(hist_reclam_2,
       Instituição.financeira == 'BB (conglomerado)') %>%
  ggplot(aes(x = Ano,
             y = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR,
             group = Ano))+
  #fill = Tipo))+
  geom_boxplot() +
  labs(x = '', y = '',
       title = 'Banco do Brasil')+
       #subtitle = '')+
  scale_y_continuous(labels = percent)+
  theme_bw()+
  theme(axis.text.x = element_text(hjust = 1, angle = 50)) -> box_2

## Caixa economica federal
filter(hist_reclam_2,
                         Instituição.financeira == 'CAIXA ECONÔMICA FEDERAL (conglomerado)') %>%
  ggplot(aes(x = Ano,
             y = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR,
             group = Ano))+
  #fill = Tipo))+
  geom_boxplot() +
  labs(x = '', y = '',
       title = 'Caixa Econômica Federal')+
  #subtitle = '')+
  scale_y_continuous(labels = percent)+
  theme_bw()+
  theme(axis.text.x = element_text(hjust = 1, angle = 50)) -> box_3

## ITAU
filter(hist_reclam_2,
                Instituição.financeira == 'ITAU (conglomerado)') %>%
  ggplot(aes(x = Ano,
             y = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR,
             group = Ano))+
  geom_boxplot() +
  labs(x = '', y = '',
       title = 'Itau')+
  scale_y_continuous(labels = percent)+
  theme_bw()+
  theme(axis.text.x = element_text(hjust = 1, angle = 50)) -> box_4

## Santander
filter(hist_reclam_2,
       Instituição.financeira == 'SANTANDER (conglomerado)') %>%
  ggplot(aes(x = Ano,
             y = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR,
             group = Ano))+
  geom_boxplot() +
  labs(x = '', y = '',
       title = 'Santander')+
  scale_y_continuous(labels = percent)+
  theme_bw()+
  theme(axis.text.x = element_text(hjust = 1, angle = 50)) -> box_5

## Geral
filter(hist_reclam_2,
       Instituição.financeira %in% top5Bancos) %>%
  ggplot(aes(x = Ano,
             y = Quantidade.total.de.reclamações/Quantidade.total.de.clientes...CCS.e.SCR,
             group = Ano))+
  geom_boxplot() +
  labs(x = '', y = '',
       title = 'Top 5 bancos')+
  scale_y_continuous(labels = percent)+
  theme_bw()+
  theme(axis.text.x = element_text(hjust = 1, angle = 50)) -> box_6

## Juntando todos os box plot
((box_1 + box_2) /
    (box_3 + box_4) /
    (box_5 + box_6))+
  plot_annotation(
  title = "Box Plot - Referente às 5 maiores instituições financeiras",
  subtitle = "Evolução anual do número de reclamações por cliente médio",
  caption = "Fonte: BCB\nElaboração própria") & theme_minimal() +
  theme(legend.title = element_blank(),
        plot.title = element_text(size = 25),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16))

Como podemos perceber no gráfico acima, individualmente os bancos não apresentam muitos outliers. A distribuição dos dados não vinha sendo tão abrangente até o ano de 2020, onde todos os bancos sentiram o efeito do aumento do índice de reclamações de modo geral.

É nítida a tendência de queda no índice de reclamações de modo geral. Tal inclinação pode ser melhor observada quando somamos os dados de os bancos no Boxplot Top 5 Bancos.

Tipos de reclamações

Agora olharemos para a base de dados hist_reclam_2, com o objetivo de ver quais são os maiores tipo de reclamação entre os bancos em questão, já que nessa relação teremos a disposição mais de 200 tipos de reclamações diferentes reguladas pelo Banco Central.

Primeiramente vamos filtrar os Top 5 maiores bancos:

## filtrando os maiores bancos
Top5_reclam <- hist_reclam %>%
  filter(Instituição.financeira %in% top5Bancos)

Agora, para ter uma ideia mais global da evolução dos maiores tipos de reclamação, somaremos todos os tipos de reclamação por ano e trimestre.

Primeiramente informamos quais as datas queremos somar:

datas <- c("2017 Q1", "2017 Q2","2017 Q3","2017 Q4",
           "2018 Q1", "2018 Q2","2018 Q3","2018 Q4",
           "2019 Q1", "2019 Q2","2019 Q3","2019 Q4",
           "2020 Q1", "2020 Q2","2020 Q3","2020 Q4",
           "2021 Q1", "2021 Q2","2021 Q3","2021 Q4")

Logo em seguida devemos somar os dados condicionado a data e tipo de reclamação.

## somando todos os tipos de reclamações por trimestre
plot_top_reclam <- data.frame()
plot_top_reclam1 <- data.frame()

for (i in datas) {
  plot_top_reclam1 <- filter(Top5_reclam, date_2 == i)
  plot_top_reclam1 <- aggregate(Quantidade.total.de.reclamações ~ Irregularidade, plot_top_reclam1, sum)
  plot_top_reclam1 %>%
    mutate(date = i) -> plot_top_reclam1
  plot_top_reclam <- rbind(plot_top_reclam, plot_top_reclam1)
}

Acertando nome das colunas e agrupando os dados por trimestre.

colnames(plot_top_reclam) <-  c('Irregularidade', 'quantreclam', 'date')

plot_top_reclam %>%
  group_by(date) %>% 
  top_n(1, quantreclam) -> data_plot_top_reclam

Por fim, executando o gráfico de barras que retornará os maiores tipos de reclamação por trimestre, considerando todos os 5 maiores instituições.

data_plot_top_reclam %>% 
  ggplot()+
  geom_bar(aes(x = date, y = quantreclam,
               fill = Irregularidade),
           stat="identity",
           width=.8,
           position = "dodge" )+
  labs(x = 'Período', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total do Maior Tipo de Reclamação no Período',
       subtitle = 'Referente às 5 maiores instituições financeiras (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  guides(fill = guide_legend(nrow = 7))+
  scale_fill_viridis_d()+
  theme_minimal()+
  theme(legend.position = "bottom",
        legend.margin = margin(),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.2),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

O gráfico acima evidencia que o tipo de reclamação mais recorrente era a insatisfação do serviço prestado pelas agencias, mas em 2018 isso muda. Tal evidência corrobora para a mudança no perfil das reclamações, uma vez que os bancos estão em processo de redução do número de agência e digitalização dos processos bancários.

Do quarto trimestre de 2018 até o quarto trimestre de 2019 o principal tipo de reclamação passa a ser falha de comunicação ou de venda de produtos ou serviços.

Em 2020 ocorreu outra mudança bem interessante, o tipo de reclamação de maior relevância do período passa a ser renegociações de dívidas. Como já mencionado em 2020 a população estava vivendo o ápice do lockdown, muitas pessoas foram demitidas ou foram obrigadas a fechar seu estabelecimento e, consequentemente, perderam capacidade de pagamento. O resultado desse cenário foi aumento da demanda por renegociações de dívidas, que por sua vez elevaram o nível de reclamações desse nicho.

Já em 2021 vemos que as principais reclamações estão ligadas ao serviço de crédito fornecido. Esse também pode ser mais uma consequência da COVID-19, já muitas pessoas passaram a ser tomadoras de crédito por conta da crise pós pandemia.

Também pode existir alguma ligação com o aumento da concorrência pelo mercado de cartão de crédito. Normalmente, quando há muita concorrência para determinado produto, as instituições elevam suas metas para obter maior market share. Tal movimento das instituições do setor pode reduzir a qualidade das informações passadas ao consumidor no ato da venda, abrindo uma brecha para futuras reclamações.

Agora veremos a evolução das principais reclamações por trimestre de cada uma das 5 instituições analisadas.

Tratamento final dos dados referentes ao Bradesco:

## BRADESCO
filter(hist_reclam,Instituição.financeira == 'BRADESCO (conglomerado)') %>%
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(`Trimestre`, `Instituição.financeira`, `Irregularidade`,`Quantidade.total.de.reclamações`)) %>%
  group_by(Trimestre) %>% 
  top_n(1, Quantidade.total.de.reclamações) -> Top_reclam_bra

colnames(Top_reclam_bra) <-  c('date', 'instituicao', 'Irregularidade', 'quantreclam')

Executando o gráfico das maiores reclamações referentes ao Bradesco:

Top_reclam_bra %>% 
  ggplot()+
  geom_bar(aes(x = date, y = quantreclam,
               fill = Irregularidade),
           stat="identity",
           width=.2,
           position = "dodge" )+
  labs(x = 'Período', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total do Maior Tipo de Reclamação no Período',
       subtitle = 'Referente ao Banco Bradesco (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  guides(fill = guide_legend(nrow = 9))+
  scale_fill_viridis_d()+
  theme_minimal()+
  theme(legend.position = "bottom",
        legend.margin = margin(),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.2),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

Os tipos de reclamação do Bradesco variam bastante com o tempo. Entre 2017 e 2019 a maioria das reclamações estão relacionadas com a oferta de serviço ou informação de forma inadequada. Passando esse período e avançando para 2019 o teor das principais reclamações passam a estar mais relacionadas as operações de crédito no geral, seja credito consignado, cartão de credito, entre outros.

Seguindo a tendência vista quando analisado os dados consolidados dos top 5 instituições financeiras, em 2020 houve um crescimento abrupto das reclamações relacionadas a renegociação de dívida.

A próxima instituição será o Banco do Brasil, faremos então um tratamento final dos dados:

## BANCO DO BRASIL
filter(hist_reclam,Instituição.financeira == 'BB (conglomerado)') %>%
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(`Trimestre`, `Instituição.financeira`, `Irregularidade`,`Quantidade.total.de.reclamações`)) %>%
  group_by(Trimestre) %>% 
  top_n(1, Quantidade.total.de.reclamações) -> Top_reclam_BB

colnames(Top_reclam_BB) <-  c('date', 'instituicao', 'Irregularidade', 'quantreclam')

Executando o gráfico das maiores reclamações referentes ao Bando do Brasil:

Top_reclam_BB %>% 
  ggplot()+
  geom_bar(aes(x = date, y = quantreclam,
               fill = Irregularidade),
           stat="identity",
           width=.2,
           position = "dodge" )+
  labs(x = 'Período', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total do Maior Tipo de Reclamação no Período',
       subtitle = 'Referente ao Banco do Brasil (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  guides(fill = guide_legend(nrow = 4))+
  scale_fill_viridis_d()+
  theme_minimal()+
  theme(legend.position = "bottom",
        legend.margin = margin(),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.2),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

A variabilidade dos tipos de reclamações no Banco do Brasil é pequena. A reclamação mais frequente, durante todo o período analisado, é o atendimento nas agências.

Os efeitos da COVID-19 são bem claros vão de encontro com outros apontamentos feitos no tópico anterior. Há aumento das reclamações com operações de renegociação de dívidas em 2020 e, em 2021, das operações com cartão de crédito

A próxima instituição será a da Caixa Econômica Federal. Faremos então um breve tratamento dos dados:

## CAIXA ECONOMICA
filter(hist_reclam,Instituição.financeira == 'CAIXA ECONÔMICA FEDERAL (conglomerado)') %>%
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(`Trimestre`, `Instituição.financeira`, `Irregularidade`,`Quantidade.total.de.reclamações`)) %>%
  group_by(Trimestre) %>% 
  top_n(1, Quantidade.total.de.reclamações) -> Top_reclam_caixa

colnames(Top_reclam_caixa) <-  c('date', 'instituicao', 'Irregularidade', 'quantreclam')

Executando o gráfico das maiores reclamações referentes a Caixa Econômica Federal:

Top_reclam_caixa %>% 
  ggplot()+
  geom_bar(aes(x = date, y = quantreclam,
               fill = Irregularidade),
           stat="identity",
           width=.2,
           position = "dodge" )+
  labs(x = 'Período', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total do Maior Tipo de Reclamação no Período',
       subtitle = 'Referente à Caixa Econômica Federal (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  guides(fill = guide_legend(nrow = 5))+
  scale_fill_viridis_d()+
  theme_minimal()+
  theme(legend.position = "bottom",
        legend.margin = margin(),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.2),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

No caso da Caixa econômica percebemos uma semelhança grande com o Banco do Brasil, já que a reclamação de maior frequência é o atendimento nas agências.

Também é possível perceber características distintas, mas que também estão relacionadas a pandemia. O aumento das reclamações ao Internet Banking é um exemplo, que pode ser explicado pela mudança forçada do perfil dos clientes, que a partir de 2020 são obrigados a fazer muitos mais operações usando as plataformas digitais. Existe também uma dificuldade das instituições se adequarem a nova realidade, abrindo brecha para mais reclamações.

As reclamações relacionadas ao Auxílio Brasil ainda não possuem rótulo específico no Banco central, por conta disso são lançados como “assuntos diversos”.

A próxima instituição será a da Banco Itaú. Faremos então um breve tratamento dos dados:

## ITAU
filter(hist_reclam,Instituição.financeira == 'ITAU (conglomerado)') %>%
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(`Trimestre`, `Instituição.financeira`, `Irregularidade`,`Quantidade.total.de.reclamações`)) %>%
  group_by(Trimestre) %>% 
  top_n(1, Quantidade.total.de.reclamações) -> Top_reclam_itau

colnames(Top_reclam_itau) <-  c('date', 'instituicao', 'Irregularidade', 'quantreclam')

Executando o gráfico das maiores reclamações referentes ao Itaú:

Top_reclam_itau %>% 
  ggplot()+
  geom_bar(aes(x = date, y = quantreclam,
               fill = Irregularidade),
           stat="identity",
           width=.2,
           position = "dodge" )+
  labs(x = 'Período', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total do Maior Tipo de Reclamação no Período',
       subtitle = 'Referente ao Banco Itau (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  guides(fill = guide_legend(nrow = 4))+
  scale_fill_viridis_d()+
  theme_minimal()+
  theme(legend.position = "bottom",
        legend.margin = margin(),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.2),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

O Itaú tem muita variabilidade nos tipos de reclamação. A maior parte das reclamações estão relacionadas com falha na oferta ou na informação de produtos e serviços. A outra classe de reclamações com grande número de aparições são os relacionados com operações de crédito, cartão de crédito e até crédito consignado.

Durante a pandemia também houve aumento das reclamações, mas as relacionadas aos cartões de crédito foram as maiores e não as relacionadas com renegociação de dívidas.

Tratamento final dos dados referentes ao Santander:

#'SANTANDER 
filter(hist_reclam,Instituição.financeira == 'SANTANDER (conglomerado)') %>%
  mutate(Trimestre = as.yearqtr(as.Date(paste0(Ano,'-', ifelse(Trimestre == 2, 4,
                                                               ifelse(Trimestre == 3, 7,
                                                                      ifelse(Trimestre == 4, 10, 1))),
                                               '-', 01)))) %>% 
  group_by(Trimestre) %>% 
  dplyr::select(c(`Trimestre`, `Instituição.financeira`, `Irregularidade`,`Quantidade.total.de.reclamações`)) %>%
  group_by(Trimestre) %>% 
  top_n(1, Quantidade.total.de.reclamações) -> Top_reclam_sant

colnames(Top_reclam_sant) <-  c('date', 'instituicao', 'Irregularidade', 'quantreclam')

Executando o gráfico das maiores reclamações referentes ao Santander:

Top_reclam_sant %>% 
  ggplot()+
  geom_bar(aes(x = date, y = quantreclam,
               fill = Irregularidade),
           stat="identity",
           width=.2,
           position = "dodge" )+
  labs(x = 'Período', y = 'Quantidade Total de Reclamações',
       title = 'Quantidade Total do Maior Tipo de Reclamação no Período',
       subtitle = 'Referente ao Santander (por Trimestre)',
       caption = "Fonte: BCB\nElaboração própria") +
  scale_y_continuous(labels = comma) +
  guides(fill = guide_legend(nrow = 10))+
  scale_fill_viridis_d()+
  theme_minimal()+
  theme(legend.position = "bottom",
        legend.margin = margin(),
        legend.title = element_blank(),
        legend.text = element_text(size = 15),
        plot.title = element_text(size = 30),
        plot.subtitle = element_text(size = 20),
        text = element_text(size = 16),
        axis.text.x = element_text(angle = 45, hjust = 1))

O Banco Santander tem grande variabilidade de tipos de reclamação preponderantes, mas os principais nichos são oferta inadequada de produtos ou informações e em operações de crédito no geral.

Assim como as outras instituições, houve grande aumento das renegociações de dívidas em 2020 por conta da COVD-19.

Núvem de Palavras

Nesse último tópico faremos uma análise da nuvem de palavras resultante dos diversos tipos de reclamações que mais apareceram entre 2017 e 2021. Esse método facilita a visualização das palavras vinculadas as reclamações, considerando que ordem de importância tem relação com a frequência que ela aparece.

Primeiramente, faremos a filtragem das instituições de interesse, os 5 maiores bancos, das reclamações e suas respectivas frequências. Depois, criamos a variável data_nuvem, que contém os tipos de irregularidade e a soma do número de vezes que se repetiram.

Por fim, criaremos a variável top5_corpus que vai representar todos os tipos de reclamações multiplicadas pela quantidade de vezes que apareceram entre 2017 e 2021.

Criando Corpus de palavras a partir das instituições desejadas:

Limpando os dados, removendo pontuações, palavras inúteis através da função stopwords, letras maiúsculas, etc:

Criando data frame com as palavras e suas respectivas frequências de repetição:

Por fim, executamos a função wordcloud para gerar a nossa nuvem de palavras referente a todos os tipos de reclamações entre 2017 e 2021 das 5 maiores instituições financeiras do país.

set.seed(100)
wordcloud(words = dataframe_nuvem$word, freq = dataframe_nuvem$freq,
          min.freq = 3, max.words = 200, random.order = FALSE,
          rot.per=0.30, colors = brewer.pal(10, "BrBG"))

Conclusão

Através da análise das reclamações dos principais bancos do país é possível perceber movimentos além dos relacionados a qualidade do atendimento em si. É possível observar claramente os efeitos da COVID-19 na relação entre os clientes e as instituições financeiras.

Também é possível identificar uma mudança nas características do segmento bancário como um todo. No início do período analisado, o maior tipo de reclamação estava relacionado com o atendimento nas agências. Aos poucos isso foi mudando para outros tipos de reclamações, mais relacionadas com os serviços e produtos do banco em si, como crédito, renegociações, etc. Esse movimento pode estar ligado com a tendência de fechamento de agências, expansão dos canais digitais e automação do segmento como um todo.