Este relatório analisa um conjunto de dados relacionados a contratos de clientes, com o objetivo de identificar características associadas à renovação de contratos (churn). As variáveis incluem informações sobre renovações, escolaridade, idade no final do contrato, e dados demográficos, como estado de origem e gênero.
##
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
# Carregar os dados
database <- read.csv("C:/Users/Niciu/Downloads/dados.csv")
# Substituir valores de 120 por NA em idade_final_contrato
database$idade_final_contrato <- ifelse(database$idade_final_contrato == 120, NA, database$idade_final_contrato)
# Visualizar as primeiras linhas dos dados
head(database)## qt_renovacoes escolaridade_info idade_final_contrato filial estado_civil
## 1 5 0 NA 1 0
## 2 1 0 NA 1 0
## 3 0 0 34 0 0
## 4 4 0 NA 1 0
## 5 5 0 NA 1 0
## 6 1 0 NA 0 0
## mes_final ano pe ba outros_estados m f pj churn
## 1 10 2009 1 0 0 1 0 0 1
## 2 10 2014 0 0 1 1 0 0 1
## 3 10 2013 0 0 1 1 0 0 0
## 4 10 2010 0 0 1 0 0 1 0
## 5 10 2008 1 0 0 1 0 0 1
## 6 10 2013 0 0 1 0 0 1 1
## qt_renovacoes escolaridade_info idade_final_contrato filial
## Min. : 0.000 Min. :0.0000 Min. :18.00 Min. :0.0000
## 1st Qu.: 0.000 1st Qu.:0.0000 1st Qu.:33.00 1st Qu.:0.0000
## Median : 1.000 Median :0.0000 Median :40.00 Median :0.0000
## Mean : 1.576 Mean :0.4002 Mean :39.16 Mean :0.4494
## 3rd Qu.: 2.000 3rd Qu.:1.0000 3rd Qu.:46.00 3rd Qu.:1.0000
## Max. :16.000 Max. :1.0000 Max. :68.00 Max. :1.0000
## NA's :56704
## estado_civil mes_final ano pe
## Min. :0.0000 Min. : 1.000 Min. : 0 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.: 4.000 1st Qu.:2011 1st Qu.:0.0000
## Median :0.0000 Median : 7.000 Median :2015 Median :1.0000
## Mean :0.3163 Mean : 6.553 Mean :1965 Mean :0.5215
## 3rd Qu.:1.0000 3rd Qu.: 9.000 3rd Qu.:2020 3rd Qu.:1.0000
## Max. :1.0000 Max. :12.000 Max. :2211 Max. :1.0000
##
## ba outros_estados m f
## Min. :0.0000 Min. :0.000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.000 Median :1.0000 Median :0.0000
## Mean :0.1805 Mean :0.298 Mean :0.5261 Mean :0.2551
## 3rd Qu.:0.0000 3rd Qu.:1.000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.000 Max. :1.0000 Max. :1.0000
##
## pj churn
## Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000
## Mean :0.2188 Mean :0.4793
## 3rd Qu.:0.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.0000
##
## 'data.frame': 110619 obs. of 14 variables:
## $ qt_renovacoes : int 5 1 0 4 5 1 1 4 0 4 ...
## $ escolaridade_info : int 0 0 0 0 0 0 0 0 0 0 ...
## $ idade_final_contrato: num NA NA 34 NA NA NA 22 NA NA NA ...
## $ filial : int 1 1 0 1 1 0 0 1 0 1 ...
## $ estado_civil : int 0 0 0 0 0 0 1 0 0 0 ...
## $ mes_final : int 10 10 10 10 10 10 10 10 10 10 ...
## $ ano : int 2009 2014 2013 2010 2008 2013 2013 2011 2013 2002 ...
## $ pe : int 1 0 0 0 1 0 0 0 1 0 ...
## $ ba : int 0 0 0 0 0 0 0 0 0 1 ...
## $ outros_estados : int 0 1 1 1 0 1 1 1 0 0 ...
## $ m : int 1 1 1 0 1 0 1 0 0 1 ...
## $ f : int 0 0 0 0 0 0 0 0 0 0 ...
## $ pj : int 0 0 0 1 0 1 0 1 1 0 ...
## $ churn : int 1 1 0 0 1 1 1 0 0 1 ...
# Calcular a correlação entre variáveis numéricas
correlation_matrix <- cor(database %>% select_if(is.numeric))
correlation_matrix## qt_renovacoes escolaridade_info idade_final_contrato
## qt_renovacoes 1.000000000 -0.15748387 NA
## escolaridade_info -0.157483868 1.00000000 NA
## idade_final_contrato NA NA 1
## filial 0.268528064 -0.73805819 NA
## estado_civil -0.183295317 0.62295844 NA
## mes_final -0.005702877 -0.01017967 NA
## ano -0.130695670 -0.00351010 NA
## pe 0.086879413 -0.16446159 NA
## ba -0.043171064 -0.03973259 NA
## outros_estados -0.058587248 0.21303892 NA
## m 0.023258672 0.15486101 NA
## f -0.075138280 0.20132763 NA
## pj 0.051129492 -0.39929221 NA
## churn 0.498515747 -0.11322144 NA
## filial estado_civil mes_final ano
## qt_renovacoes 0.268528064 -0.183295317 -0.005702877 -0.130695670
## escolaridade_info -0.738058193 0.622958436 -0.010179671 -0.003510100
## idade_final_contrato NA NA NA NA
## filial 1.000000000 -0.614573103 0.004847809 -0.013833297
## estado_civil -0.614573103 1.000000000 -0.009827551 0.002646737
## mes_final 0.004847809 -0.009827551 1.000000000 0.051694586
## ano -0.013833297 0.002646737 0.051694586 1.000000000
## pe 0.236314875 -0.166365539 0.012584641 -0.006444673
## ba -0.034448300 -0.010814337 -0.008534166 0.002577528
## outros_estados -0.229137613 0.190800447 -0.006568529 0.004871450
## m -0.030611611 0.070383325 0.015080110 0.012780290
## f -0.217156832 0.167832288 -0.010372371 0.001479858
## pj 0.265922360 -0.261951893 -0.007276834 -0.016995287
## churn 0.215132191 -0.141069200 0.008708403 -0.122615579
## pe ba outros_estados m
## qt_renovacoes 0.0868794127 -0.043171064 -0.058587248 0.0232586722
## escolaridade_info -0.1644615933 -0.039732589 0.213038923 0.1548610087
## idade_final_contrato NA NA NA NA
## filial 0.2363148752 -0.034448300 -0.229137613 -0.0306116113
## estado_civil -0.1663655390 -0.010814337 0.190800447 0.0703833248
## mes_final 0.0125846408 -0.008534166 -0.006568529 0.0150801105
## ano -0.0064446734 0.002577528 0.004871450 0.0127802896
## pe 1.0000000000 -0.489989611 -0.680169045 0.0002889747
## ba -0.4899896113 1.000000000 -0.305749263 0.0014864575
## outros_estados -0.6801690449 -0.305749263 1.000000000 -0.0015656162
## m 0.0002889747 0.001486458 -0.001565616 1.0000000000
## f -0.0557018871 -0.021714649 0.079098590 -0.6165673870
## pj 0.0583784133 0.021098883 -0.081504113 -0.5576657920
## churn 0.0531645594 -0.045294806 -0.019977580 0.0336559104
## f pj churn
## qt_renovacoes -0.075138280 0.051129492 0.498515747
## escolaridade_info 0.201327627 -0.399292214 -0.113221440
## idade_final_contrato NA NA NA
## filial -0.217156832 0.265922360 0.215132191
## estado_civil 0.167832288 -0.261951893 -0.141069200
## mes_final -0.010372371 -0.007276834 0.008708403
## ano 0.001479858 -0.016995287 -0.122615579
## pe -0.055701887 0.058378413 0.053164559
## ba -0.021714649 0.021098883 -0.045294806
## outros_estados 0.079098590 -0.081504113 -0.019977580
## m -0.616567387 -0.557665792 0.033655910
## f 1.000000000 -0.309673865 -0.056180229
## pj -0.309673865 1.000000000 0.018584725
## churn -0.056180229 0.018584725 1.000000000
## corrplot 0.94 loaded
Essa imagem é uma matriz de correlação visualizada como um gráfico de correlação, onde cada célula representa o coeficiente de correlação entre dois pares de variáveis no conjunto de dados. Aqui está uma interpretação do que cada parte da imagem demonstra:
churn:
churn no eixo vertical ou
horizontal indicam como outras variáveis estão correlacionadas com o
churn.churn tem uma correlação alta (azul escuro ou
vermelho escuro) com outra variável, isso sugere uma forte relação
positiva ou negativa.qt_renovacoes e churn: Há
uma correlação negativa entre qt_renovacoes e
churn, sugerindo que clientes que renovaram o contrato
várias vezes no passado têm menor probabilidade de churn. Isso faz
sentido, pois clientes fiéis geralmente continuam renovando.filial e churn: A relação
entre filial e churn é positiva, o que sugere
que a maneira como o contrato foi vendido (pela empresa diretamente ou
por distribuidores) pode ter uma influência no churn.idade_final_contrato e
churn: A correlação entre idade final do contrato
e churn também parece fraca, o que indica que a idade do
cliente no final do contrato pode não ser um fator determinante na
decisão de renovar.estado_civil e churn: A
variável estado_civil tem uma correlação ligeiramente
negativa com churn, sugerindo que clientes casados ou com
outro estado civil diferente de solteiro têm uma ligeira tendência a
renovar mais do que os solteiros.pj e churn: Há uma
correlação negativa entre ser Pessoa Jurídica (pj) e o
churn, o que pode indicar que clientes empresariais (Pessoa
Jurídica) têm maior propensão a renovar o contrato em comparação com
clientes individuais (Pessoa Física).m, f e
churn: As correlações entre gênero (m
para masculino, f para feminino) e churn são
fracas, sugerindo que o gênero não é um fator significativo na decisão
de churn.churn podem ser cruciais para intervenções, enquanto
variáveis sem correlação significativa podem ser menos relevantes.Esse gráfico é essencial para entender as relações entre variáveis no seu dataset e ajuda a guiar a análise subsequente, como quais variáveis incluir em modelos de regressão ou outros métodos analíticos.
qt_renovacoes e churnNesta seção, vamos explorar como o número de renovações anteriores está relacionado ao churn. Se houver uma correlação negativa significativa, isso pode indicar que clientes que renovaram menos vezes têm maior probabilidade de churn.
# Gráfico de dispersão para qt_renovacoes e churn
ggplot(database, aes(x = qt_renovacoes, y = churn)) +
geom_point() +
geom_smooth(method = "lm", col = "red") +
labs(title = "Relação entre Número de Renovações e Churn", x = "Número de Renovações", y = "Churn (0 = Não, 1 = Sim)")## `geom_smooth()` using formula = 'y ~ x'
Este gráfico de dispersão mostra a relação entre o número de
renovações anteriores (qt_renovacoes) e o
churn, onde churn = 1 indica que o cliente
renovou o contrato. A linha vermelha representa a linha de tendência
obtida por um modelo de regressão linear.
escolaridade_info e churnVamos explorar se clientes com maior escolaridade apresentam taxas de churn diferentes.
# Gráfico de barras para escolaridade_info e churn
ggplot(database, aes(x = factor(escolaridade_info), fill = factor(churn))) +
geom_bar(position = "dodge", color = "black") +
labs(title = "Comparação de Churn por Escolaridade", x = "Escolaridade Superior (0 = Não, 1 = Sim)", y = "Quantidade", fill = "Churn (0 = Não, 1 = Sim)")Este gráfico de barras compara a quantidade de churn entre clientes
com diferentes níveis de escolaridade. A variável
escolaridade_info indica se o cliente possui escolaridade
superior ao ensino médio (0 = Não, 1 = Sim). A cor dos blocos indica se
o cliente fez churn (1 = Sim) ou não (0 = Não).
pe, ba,
outros_estados com churnAqui examinamos se a localização geográfica do cliente (Pernambuco, Bahia, Outros Estados) influencia as taxas de churn.
# Gráfico de barras para localizações e churn
database %>%
pivot_longer(cols = c(pe, ba, outros_estados), names_to = "localizacao", values_to = "presente") %>%
filter(presente == 1) %>%
ggplot(aes(x = localizacao, fill = factor(churn))) +
geom_bar(position = "dodge", color = "black") +
labs(title = "Comparação de Churn por Localização Geográfica", x = "Localização", y = "Quantidade", fill = "Churn (0 = Não, 1 = Sim)")Este gráfico de barras compara a quantidade de churn entre clientes
de diferentes localizações geográficas. As localizações são
categorizadas como pe (Pernambuco), ba
(Bahia), e outros_estados (outras regiões). A cor dos
blocos indica se o cliente fez churn (1 = Sim) ou não (0 = Não).
A distribuição da idade final dos clientes pode indicar faixas etárias mais propensas à renovação de contratos.
# Criar faixas etárias finais
database <- database %>%
filter(!is.na(idade_final_contrato)) %>%
mutate(faixa_etaria = cut(idade_final_contrato,
breaks = c(18, 30, 40, 50, 60, 70, 80, 90, 100),
labels = c("18-30", "31-40", "41-50", "51-60", "61-70", "71-80", "81-90", "91-100"),
include.lowest = TRUE))
# Calcular a quantidade de churn em cada faixa etária
churn_by_age <- database %>%
group_by(faixa_etaria) %>%
summarize(churn_count = sum(churn))
# Visualizar o resultado
churn_by_age## # A tibble: 5 × 2
## faixa_etaria churn_count
## <fct> <int>
## 1 18-30 2882
## 2 31-40 6937
## 3 41-50 8766
## 4 51-60 2583
## 5 61-70 1
# Gráfico da quantidade de churn por faixa etária final
ggplot(churn_by_age, aes(x = faixa_etaria, y = churn_count, fill = faixa_etaria)) +
geom_bar(stat = "identity", color = "black") +
labs(title = "Quantidade de Churn por Faixa Etária Final", x = "Faixa Etária Final", y = "Quantidade de Churn") +
theme_minimal() +
scale_fill_brewer(palette = "Blues") +
geom_text(aes(label = churn_count), vjust = -0.5)# Criar faixas etárias finais
database <- database %>%
filter(!is.na(idade_final_contrato)) %>%
mutate(faixa_etaria = cut(idade_final_contrato,
breaks = c(18, 30, 40, 50, 60, 70, 80, 90, 100),
labels = c("18-30", "31-40", "41-50", "51-60", "61-70", "71-80", "81-90", "91-100"),
include.lowest = TRUE))
# Calcular a taxa de renovação (churn = 1) em cada faixa etária
renovacao_by_age <- database %>%
group_by(faixa_etaria) %>%
summarize(total = n(),
renovacao_count = sum(churn == 1),
renovacao_rate = (renovacao_count / total) * 100)
# Visualizar o resultado
renovacao_by_age## # A tibble: 5 × 4
## faixa_etaria total renovacao_count renovacao_rate
## <fct> <int> <int> <dbl>
## 1 18-30 9254 2882 31.1
## 2 31-40 18981 6937 36.5
## 3 41-50 21067 8766 41.6
## 4 51-60 4612 2583 56.0
## 5 61-70 1 1 100
# Gráfico de taxa de renovação por faixa etária final
ggplot(renovacao_by_age, aes(x = faixa_etaria, y = renovacao_rate, fill = faixa_etaria)) +
geom_bar(stat = "identity", color = "black") +
labs(title = "Taxa de Renovação por Faixa Etária Final", x = "Faixa Etária Final", y = "Percentual de Renovação") +
theme_minimal() +
scale_fill_brewer(palette = "Blues") +
geom_text(aes(label = round(renovacao_rate, 1)), vjust = -0.5)Este gráfico de barras ilustra a quantidade de churn (renovação de
contrato, onde churn = 1) em diferentes faixas etárias
finais dos clientes.
Analisamos a distribuição do estado civil dos clientes para verificar se há algum grupo mais propenso ao churn.
# Calcular a quantidade de churn por estado civil
churn_by_estado_civil <- database %>%
group_by(estado_civil, churn) %>%
summarize(count = n()) %>%
ungroup()## `summarise()` has grouped output by 'estado_civil'. You can override using the
## `.groups` argument.
# Gráfico de barras para comparar churn por estado civil
ggplot(churn_by_estado_civil, aes(x = factor(estado_civil), y = count, fill = factor(churn))) +
geom_bar(stat = "identity", position = "dodge", color = "black") +
labs(title = "Comparação de Churn por Estado Civil", x = "Estado Civil (0 = Solteiro, 1 = Casado)", y = "Quantidade", fill = "Churn (0 = Não, 1 = Sim)") +
theme_minimal() +
scale_fill_manual(values = c("0" = "lightblue", "1" = "red")) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5)Este gráfico de barras compara a quantidade de churn (renovação de
contrato, onde churn = 1) entre clientes solteiros
(estado_civil = 0) e clientes casados ou em outros estados
civis (estado_civil = 1).
estado_civil = 1) têm uma maior propensão a não renovar
seus contratos (maior quantidade de churn = 0) em comparação com os
clientes solteiros. No entanto, entre aqueles que renovam
(churn = 1), a proporção de casados que renovam é maior do
que a dos solteiros.Aqui verificamos se há diferenças significativas no churn entre homens e mulheres.
# Filtrar homens e calcular churn
homens_churn <- database %>% filter(m == 1)
total_homens_churn <- sum(homens_churn$churn)
# Gráfico de churn para homens
ggplot(homens_churn, aes(x = factor(churn))) +
geom_bar(fill = "lightblue", color = "black") +
labs(title = "Churn entre Homens", x = "Churn (1 = Sim, 0 = Não)", y = "Frequência") +
scale_x_discrete(labels = c("0" = "Não", "1" = "Sim"))# Filtrar mulheres e calcular churn
mulheres_churn <- database %>% filter(f == 1)
total_mulheres_churn <- sum(mulheres_churn$churn)
# Gráfico de churn para mulheres
ggplot(mulheres_churn, aes(x = factor(churn))) +
geom_bar(fill = "lightpink", color = "black") +
labs(title = "Churn entre Mulheres", x = "Churn (1 = Sim, 0 = Não)", y = "Frequência") +
scale_x_discrete(labels = c("0" = "Não", "1" = "Sim"))# Contagem total de homens e mulheres no dataset
total_homens <- nrow(homens_churn)
total_mulheres <- nrow(mulheres_churn)
# Calcular porcentagens de churn
percentual_churn_homens <- (total_homens_churn / total_homens) * 100
percentual_churn_mulheres <- (total_mulheres_churn / total_mulheres) * 100
# Criar dataframe para visualização
churn_comparison <- data.frame(
Genero = c("Homens", "Mulheres"),
Percentual_Churn = c(percentual_churn_homens, percentual_churn_mulheres)
)
# Gráfico comparativo de churn entre homens e mulheres
ggplot(churn_comparison, aes(x = Genero, y = Percentual_Churn, fill = Genero)) +
geom_bar(stat = "identity", color = "black") +
labs(title = "Comparação do Churn entre Homens e Mulheres", x = "Gênero", y = "Percentual de Churn") +
scale_fill_manual(values = c("Homens" = "lightblue", "Mulheres" = "lightpink"))Este gráfico de barras compara o percentual de churn (renovação de
contrato, onde churn = 1) entre homens e mulheres.
Analisamos qual mês final de contrato é o mais propenso a churn.
# Calcular a frequência de churn por mês
churn_by_month <- database %>%
filter(churn == 1) %>%
count(mes_final) %>%
arrange(desc(n))
# Identificar o mês com maior churn
mes_mais_churn <- churn_by_month$mes_final[1]
# Gráfico de churn por mês com destaque no mês com maior churn
ggplot(churn_by_month, aes(x = factor(mes_final), y = n, fill = mes_final == mes_mais_churn)) +
geom_bar(stat = "identity", color = "black") +
scale_fill_manual(values = c("FALSE" = "lightblue", "TRUE" = "red")) +
labs(title = "Churn por Mês Final do Contrato", x = "Mês Final", y = "Frequência de Churn", fill = "Maior Churn") +
theme(legend.position = "none") +
geom_text(aes(label = n), vjust = -0.5)Este gráfico de barras ilustra a frequência de churn (renovação de
contrato, onde churn = 1) ao longo dos diferentes meses em
que os contratos terminam.
Nesta análise, exploramos a distribuição das variáveis, analisamos a correlação entre elas, e investigamos os fatores que podem influenciar o churn.