Estatística para Cientistas de Dados
Introdução
O desenvolvimento do projeto foi para avaliação da Pós-Graduação MBA em Data Science, disciplina Estatística para Cientistas de Dados. Utilizamos a linguagem de programação R.
Ranking de Reclamações do Banco Central
Banco de Dados
Para aplicar os conhecimentos, utilizamos os dados do Ranking de Reclamações coletados no Banco Central do Brasil do 3º semestre de 2022. Os dados divulgados nas listagens do ranking estão disponíveis para download no site https://www.bcb.gov.br/ranking/index.asp .
O Ranking de Reclamações contribui para a transparência das ações do Banco Central do Brasil, trazendo ao conhecimento da sociedade o perfil das reclamações que foram processadas, analisadas e encerradas pelo BCB.
O Ranking é formado a partir das reclamações do público registradas nos canais de atendimento do Banco Central (BC): internet, correspondência, presencialmente ou telefone (145). As demandas são analisadas de forma amostral pelo BC.
Participam do Ranking: bancos (comerciais, múltiplos, cooperativos, de investimentos), sociedades de crédito, financiamento e investimento (SCFI), instituições de pagamento e administradoras de consórcio.
As principais Reclamações registradas são irregularidades em operações e serviços de cartões de crédito e em serviços de crédito.
Seleção de variáveis
A função retorna 163 Instituições financeiras em 14 variáveis, sendo 5 variáveis caracteres e 9 variáveis numéricas, utilzaremos as variáveis abaixo:
Instituição financeira: bancos (comerciais, múltiplos, cooperativos, de investimentos), sociedades de crédito, financiamento e investimento (SCFI), instituições de pagamento e administradoras de consórcio.
Reclamações reguladas procedentes: casos em que houve sinal de descumprimento de lei ou norma pela instituição financeira no período indicado.
Total de reclamações: total de reclamações reguladas procedentes, reclamações reguladas outras e reclamações não reguladas.
Total de clientes : O número de clientes é formado pela base conjugada de dados das instituições no Cadastro de Clientes do Sistema Financeiro Nacional (CCS) e no Sistema de Informações de Crédito do Banco Central (SCR), em nº de CPFs e CNPJs distintos. Os clientes são contados uma única vez por instituição ou conglomerado financeiro.
Índice : (reclamações reguladas procedentes * 1.000.000) / número de clientes.
Razão de reclamação: Criaremos a variável utilizando o total de (reclamações procedentes / total de reclamações) * 100 .
As instituições são classificadas pela ordem decrescente do índice de reclamações, ou seja, da mais reclamada para a menos reclamada. É possível consultar a relação de instituições que tiveram menos de trinta reclamações procedentes apresentada em ordem alfabética do nome.
Ambiente RStudio
Pacotes utilizados
A função install.packages() é utilizada para instalar a biblioteca pela primeita vez no Rstudio, depois para carregar a biblioteca, a função library().
A biblioteca Tidyverse foi especialmente projetados para Data Science. Incluindo todos os pacotes necessários ao fluxo de trabalho da ciência de dados, desde a exploração de dados até a visualização de dados.
Ggplot2 é uma biblioteca de visualização de dados R baseada na Gramática dos Gráficos.
Readxl é utilizada para a importação de arquivo Excel (.xlx ou .xlsx).
Dplyr é uma biblioteca de manipulação de dados muito popular em R. Utilizaremos para limpeza e criação de variaveis.
A biblioteca summarytools fornece um conjunto coerente de funções centradas na exploração de dados e relatórios simples.
library(corrplot)
library(dlookr)
library(dplyr)
library(ggplot2)
library(readxl)
library(summarytools)
library(tidyverse)
library(knitr)Carregando o Banco de Dados
Utilizamos o github para download do arquivo baixado do Banco Central e a função read_excel() para criar o Banco de dados Bancos3 com os dados do arquivo Bancos3.xlsx.
download.file( url = "https://github.com/taianasantos/Pos/blob/main/Bancos+e+financeiras32022.xlsx?raw=true", quiet = TRUE, mode = "wb", destfile = "Bancos3.xlsx" )
Bancos3 <- readxl :: read_excel("Bancos3.xlsx")Funções para limpeza das variáveis
Utilizaremos uma função para retiradas dos espaços e uma função para limpeza dos caracteres especiais.
limpeza.nomes.pipe <- function(nomes)
{
nomes.limpos <- nomes %>% stringr::str_replace_all("/", "") %>%
stringr::str_replace_all("\\s", "_") %>% stringr::str_replace_all("__", "_")
return(nomes.limpos)
}
names(Bancos3) <- limpeza.nomes.pipe(names(Bancos3))
Limpeza.acentos <- function(x) iconv(x, to = "ASCII//TRANSLIT")
names(Bancos3) <- Limpeza.acentos(names(Bancos3))Seleção das variáveis de interesse para análise
Utilizamos a função select() ,biblioteca dplyr, para selecionar as variáveis para análise.
Bancos <- dplyr::select(Bancos3, 6,7,8,11,12)Renomear as variáveis
Utilizamos a função rename() ,biblioteca dplyr, para renomar as variáveis para análise.
Bancos <- dplyr::rename(Bancos,c(
Procedentes = Quantidade_de_reclamacoes_reguladas_procedentes,
Total_Reclamacoes= Quantidade_total_de_reclamacoes,
Clientes =`Quantidade_total_de_clientes_-_CCS_e_SCR`,
Instituicao = Instituicao_financeira ))Limpeza de dados ausentes
Bancos <- Bancos[!(is.na(Bancos$Indice)), ]Calculo de Variável
Utilizamos a função mutate() ,biblioteca dplyr, para criação de nova variável para análise.
Bancos <- Bancos %>% dplyr::mutate(Razao = Bancos$Procedentes /
Bancos$Total_Reclamacoes * 100)Dados apos limpeza
knitr :: kable(head(Bancos), digits = 1 ,"pipe")| Instituicao | Indice | Procedentes | Total_Reclamacoes | Clientes | Razao |
|---|---|---|---|---|---|
| ACESSO SOLUÇÕES DE PAGAMENTO S.A. | 14.7 | 75 | 212 | 5098671 | 35.4 |
| AGIBANK (conglomerado) | 96.0 | 182 | 539 | 1895683 | 33.8 |
| BANCO CSF S.A. | 10.0 | 77 | 192 | 7707988 | 40.1 |
| BANCO DIGIMAIS S.A. | 424.8 | 132 | 196 | 310734 | 67.3 |
| BANCO DO ESTADO DE SERGIPE S.A. | 164.7 | 139 | 216 | 844129 | 64.4 |
| BANCO DO ESTADO DO PARÁ S.A. | 56.4 | 56 | 107 | 993127 | 52.3 |
Identificando os tipos de cada variável
Utilizamos a função diagnose() ,biblioteca dlookr, para identificar as variáveis para análise.
A função diagnose() do pacote dlookr que retorna por variável qual o tipo dela, contagem de valores faltantes, frequência de faltantes em relação à base toda.
Bancos %>% dlookr::diagnose()## # A tibble: 6 × 6
## variables types missing_count missing_percent unique_count uniqu…¹
## <chr> <chr> <int> <dbl> <int> <dbl>
## 1 Instituicao character 0 0 46 1
## 2 Indice numeric 0 0 46 1
## 3 Procedentes numeric 0 0 44 0.957
## 4 Total_Reclamacoes numeric 0 0 43 0.935
## 5 Clientes numeric 0 0 46 1
## 6 Razao numeric 0 0 46 1
## # … with abbreviated variable name ¹unique_rate
Análise descritiva da Base de dados
Para realizar essa análise, podemos utilizar a função descr do pacote summarytools e realizar a leitura desses dados. Analisar a centralidade dos dados, dipersão, assimetria e se há presença de outliers.
Bancos %>% summarytools::descr()## Non-numerical variable(s) ignored: Instituicao
## Descriptive Statistics
## Bancos
## N: 46
##
## Clientes Indice Procedentes Razao Total_Reclamacoes
## ----------------- -------------- -------- ------------- -------- -------------------
## Mean 18664350.43 68.47 430.91 36.96 1377.54
## Std.Dev 31714302.04 96.03 623.21 12.37 2142.28
## Min 118808.00 5.11 34.00 12.84 84.00
## Q1 1564046.00 15.77 75.00 28.32 196.00
## Median 5363170.50 32.67 135.50 34.86 387.00
## Q3 20473165.00 68.21 542.00 42.14 1540.00
## Max 148308904.00 424.80 2564.00 67.41 8722.00
## MAD 6821177.96 31.42 138.62 10.37 409.94
## IQR 17576861.75 50.16 459.50 13.43 1327.00
## CV 1.70 1.40 1.45 0.33 1.56
## Skewness 2.35 2.41 2.08 0.66 2.13
## SE.Skewness 0.35 0.35 0.35 0.35 0.35
## Kurtosis 5.26 5.04 3.76 0.08 3.78
## N.Valid 46.00 46.00 46.00 46.00 46.00
## Pct.Valid 100.00 100.00 100.00 100.00 100.00
view(descr(Bancos))As variaveis Clientes, Indice, Procedentes e Total_Reclamacoes apresentam presenças de outliers, influenciando muito o valor da média que apresenta valores maiores que a Mediana. Com o valor de desvio padrão mais alto indica maior dispersão nos dados, geralmente longe da média. Com Skewness > 1 temos um caso de alta assimetria.
A variável Razao será analisada posteriormente.
summarytools::descr(Bancos[ ,-1],
stats = c("mean", "sd", "med", "skewness"),
transpose = TRUE,
headings = FALSE)##
## Mean Std.Dev Median Skewness
## ----------------------- ------------- ------------- ------------ ----------
## Clientes 18664350.43 31714302.04 5363170.50 2.35
## Indice 68.47 96.03 32.67 2.41
## Procedentes 430.91 623.21 135.50 2.08
## Razao 36.96 12.37 34.86 0.66
## Total_Reclamacoes 1377.54 2142.28 387.00 2.13
Utilizamos a função boxplot() para representar graficamente a distribuição de do conjunto de dados e identificar outliers.
boxplot(Bancos$Procedentes,
main = "Quantidade de Reclamações Procedentes",
xlab = "Reclamações Procedentes",
col = "lightblue",
horizontal = TRUE,
notch = 0
)Análise descritiva da Variável Razão
Utilizamos algumas funções: mean para média, sd para desvio padrão e quantile para quantils ou a função descr() da biblioteca summarytools.
mean(Bancos$Razao)## [1] 36.95721
sd(Bancos$Razao)## [1] 12.3694
quantile(Bancos$Razao)## 0% 25% 50% 75% 100%
## 12.83784 28.59201 34.85971 42.02381 67.40741
summarytools::descr(Bancos$Razao,
stats = c("mean", "sd", "Q1","med", "Q3", "skewness"),
transpose = TRUE,
headings = FALSE)##
## Mean Std.Dev Q1 Median Q3 Skewness
## ----------- ------- --------- ------- -------- ------- ----------
## Razao 36.96 12.37 28.32 34.86 42.14 0.66
A Média da razão foi de 36.96, 1º quartil 28,32, a Mediana ou 2º quartil 34.86, 3º quartil 42,14 com outlier acima dos 55. Desvio padrão 12,37 com o valor de desvio padrão mais baixo indica menor dispersão nos dados.
Distribuição Assimétrica positiva (à direita): Média maior que a Mediana. Pelo critério de skewness com o valor de 0.66 para assimetria, nos faz interpretar essa distribução como levemente assimétrica, com cauda à direita.
A variável Razão foi criada utilizando a razão entre as reclamações procedentes ( impacto negativo para a Instituição Financeira) e a quantidade total de reclamações recebidas, analisando a média da variável percebemos que aproximadamente 37% das reclamações são procedentes. Enquanto 63% das reclamações são improcedentes.
Utilizamos a função boxplot() para representar graficamente a distribuição de do conjunto de dados e identificar outliers.
boxplot(Bancos$Razao,
xlab = "Razão",
col = "lightblue",
horizontal = TRUE,
notch = 0
)Histograma da variável Razão
Distribuição Assimétrica positiva (à direita): Mediana maior que a média. Pelo critério de skewness com o valor de 0.66 para assimetria, nos faz interpretar essa distribução como levemente assimétrica, com cauda à direita.
Bancos %>% dplyr::select(Razao) %>% ggplot(aes(x=Razao))+geom_histogram(aes(y = after_stat(density)) ,bins = 5, fill = 'lightblue') + xlab('Razao') + ylab('Densidade de Frequencia') + geom_vline(xintercept=c(median(Bancos$Razao), mean(Bancos$Razao))) + annotate("text", x=median(Bancos$Razao) + 0.3, y=0.05, label="Mediana", angle=90) + annotate("text", x=mean(Bancos$Razao) + 0.3, y=0.05, label="Media", angle=90) + theme_classic()Percebe-se pelo valor da mediana diferente do valor da média que há a distribuição não é simétrica, confirmado pela regra da assimetria lida em Skewness.
Número de Bins
A escolha do número de bins do histograma é uma escolha arbitrária e está diretamente ligada à amplitude que se deseja definir como base de cada barra contígua, para o caso onde se trabalha com amplitudes iguais para todos intervalos.
Existem equações modeladas para sugerir amplitudes dos bins de modo a facilitar a decisão do analista, das quais destacamos duas:
A regra de Freedman-Diaconis leva em consideração o intervalo interquartil dos dados, que impede que outliers tenham infuência na definição da amplitude do intervalo de bin.
A regra de Sturge leva em consideração a dispersão da distribuição para definir a amplitude. Em geral, a regra de Sturge é mais recomendada quando a distribuição dos dados se aproximará de uma distribuiçao normal.
fd <- function(x) {
n <-length(x)
return((2*IQR(x))/n^(1/3))
}
sr <- function(x) {
n <-length(x)
return((3.49*sd(x))/n^(1/3))
}
Bancos %>% dplyr::select(Razao) %>% ggplot(aes(x=Razao))+geom_histogram(aes(y = after_stat(density)) , binwidth=fd, fill = 'lightblue') + xlab('Razao') + ylab('Densidade de Frequencia') + labs(title = "Distribuicao dos dados Indice aproximada por Histograma", subtitle = "Binarizacao pela Regra de FD") + geom_vline(xintercept=c(median(Bancos$Razao), mean(Bancos$Razao))) + annotate("text", x=median(Bancos$Razao) + 0.3, y=0.05, label="Mediana", angle=90) + annotate("text", x=mean(Bancos$Razao) + 0.3, y=0.05, label="Media", angle=90) + geom_density(linetype = 2) + theme_classic()#FD MELHOR
Bancos %>% dplyr::select(Razao) %>% ggplot(aes(x=Razao))+geom_histogram(aes(y = after_stat(density)) , binwidth=sr, fill = 'lightblue') + xlab('Razao') + ylab('Densidade de Frequencia') + labs(title = "Distribuicao dos dados de Indice aproximada por Histograma", subtitle = "Binarizacao pela Regra de SR") + geom_vline(xintercept=c(median(Bancos$Razao), mean(Bancos$Razao))) + annotate("text", x=median(Bancos$Razao) + 0.3, y=0.05, label="Mediana", angle=90) + annotate("text", x=mean(Bancos$Razao) + 0.3, y=0.05, label="Media", angle=90) + geom_density(linetype = 2) + theme_classic()Após a aplicar a regra de Freedman-Diaconis, nosso histograma apresentou um bin a mais, o que pode ser justificado pela extração de um maior nível de detalhes da distribuição dos dados.
Coeficiente de Correlação
Na estatística o coeficiente de correlação de Pearson (r) mede a relação que existe entre duas variáveis dentro de uma mesma escala métrica.
A função do coeficiente de correlação é determinar qual é a intensidade da relação que existe entre conjuntos de dados ou informações conhecidas.
O valor do coeficiente de correlação pode variar entre -1 e 1. Para interpretar o coeficiente é preciso saber que 1 significa que a correlação entre as variáveis é perfeita positiva e -1 significa que é perfeita negativa. Se o coeficiente for igual a 0 significa que as variáveis não dependem uma da outra.
Correlograma
Utilizamos a função corrplot() para criar uma visualização grafica da matrix de correlação. Analisando o correlograma verificamos que o banco de dados , temos 3 correlações acima de 0,8. as variáveis são muito correlacionadas.
corrplot :: corrplot(cor(Bancos[, -1]), method='number', , tl.col = 'black', cl.ratio = 0.2, tl.srt = 45, col = COL2('RdYlBu', 10))As maiores coorelação são entre o total de quantidade de clientes, reclamações recebidas e reclamações procedentes.
Grafico Scatterplot
A função geom_point é utilizada para criação de scatterplots, utilizado para displayin o relacionamento entre duas variáveis continuas. Relação positiva entre a quantidade de reclamações procedentes e a quantidade de clientes.
Bancos[, -1] %>% dplyr::select(Procedentes, Clientes) %>% ggplot(aes(x=Procedentes, y =Clientes)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + theme_classic() +
labs(x = "Reclamações Procedentes",
y = "Total de Clientes",
title = "Relação entre Reclamações Procedentes e Total de Clientes")## `geom_smooth()` using formula = 'y ~ x'
Conclusões
–
O Ranking de reclamações é muito importante para dar transparencia e confiança dos serviços prestados pelas Instituições Financeiras. Percebemos que Instituições recebem muitas reclamações improcedentes, cerca de 64%, esse numero elevado pode ser fruto de insatisfação com o produto contratado, falta de conhecimento ou pouca transparência das normas bancárias.
Algumas sugestões propostas para uma redução das reclamações recebidas :
● Melhoria dos canais de ouvidoria para reduzir a quantidade de reclamações recebidas pelo Banco Central. ● Transparência nas informações prestadas aos clientes. ● Investimento em Treinamento e ampliação das equipes de atendimento. ● Aperfeiçoamento dos canais de atendimento. ● Linguagem simples para melhoria da compreensão dos clientes.
# Bibliografia
https://didatica.tech/regressao-linear-com-linguagem-r/
https://didatica.tech/o-que-sao-dados-missing/