No mercado altamente competitivo de telecomunicações, a perda de clientes (conhecida como churn) é um dos maiores desafios financeiros para empresas distribuidoras de internet regional e nacional. Adquirir um novo cliente gera custos elevados de marketing, instalação e subsídios de equipamentos. Portanto, prever o cancelamento e reter o cliente atual é drasticamente mais barato e estratégico para a saúde financeira e operacional da empresa.
Nota de Impacto: Reter um cliente na base custa, em média, de 5 a 7 vezes menos do que o esforço comercial e operacional de trazer um novo assinante de fibra óptica.
Para endereçar este problema, utilizaremos uma base de dados pública
de clientes de telecomunicações (Telco Customer Churn). A metodologia
consistirá no pré-processamento e limpeza de dados no ecossistema
tidyverse do R, seguidos por uma Análise Exploratória de
Dados (EDA) quantitativa e qualitativa, buscando identificar variáveis
críticas que correlacionam com a evasão.
Nossa abordagem focará no cruzamento de dados demográficos, tipos de serviços contratados (como planos de fibra ótica) e contratos financeiros. Utilizaremos técnicas de engenharia de recursos (criação de novas variáveis de custos diários) e visualizações gráficas avançadas para identificar o perfil do cliente propenso ao cancelamento antes que este ocorra.
Os principais clientes desta análise são os Gestores de Marketing e a Equipe de Retenção e Sucesso do Cliente (Customer Success). Os insights gerados permitirão que a empresa crie campanhas de fidelização cirúrgicas, como ofertas de upgrade de contrato ou manutenção preventiva para clientes de alto risco, reduzindo a taxa de churn geral e aumentando o valor do tempo de vida do cliente (LTV).
A reprodutibilidade desta análise depende dos pacotes descritos a seguir. Eles cobrem todas as fases do ciclo de ciência de dados, fornecendo as funções necessárias para a manipulação de dados e para o desenvolvimento de visualizações e mapas interativos.
# Engenharia de Dados e Limpeza
library(tidyverse) # Manipulação de dados (dplyr, tidyr) e gráficos base (ggplot2)
library(janitor) # Padronização e limpeza dos nomes das colunas (clean_names)
library(skimr) # Resumo estatístico consolidado e visual das variáveis
# Interatividade e Formatação Avançada
library(DT) # Geração de tabelas HTML interativas e pagnadas
library(plotly) # Conversão de gráficos estáticos em visuais interativos
library(scales) # Formatação estética de valores nos eixos dos gráficos
Os dados utilizados nesta análise são públicos e foram disponibilizados originalmente pela IBM Accelerator no repositório de comunidade da plataforma. Você pode acessar a fonte original através do link: Telco Customer Churn: IBM Dataset. O registro e a coleta das ocorrências de assinaturas refletem o comportamento de clientes de uma empresa de telecomunicações na Califórnia durante o terceiro trimestre, servindo como uma excelente base de simulação mercadológica para operações de provedores de internet e fibra óptica.
O conjunto de dados original é composto por 7.043 observações (linhas) e 33 variáveis (colunas). Cada registro mapeia um cliente único a partir de chaves identificadoras, informações de localização residencial no estado da Califórnia, dados demográficos essenciais, tipos de contratos vigentes, formas de pagamento, serviços de telefonia e, de forma centralizada para nosso escopo, a presença de planos de internet acompanhados de serviços agregados de segurança digital e streaming de mídia.
# Importar dataset de churn relacionado a consumidores de telecomunicações
dados_brutos <- read_csv("Telco_customer_churn.csv")
#Verificar dimensões do dataset original
dim(dados_brutos)
## [1] 7043 33
glimpse(dados_brutos)
## Rows: 7,043
## Columns: 33
## $ CustomerID <chr> "3668-QPYBK", "9237-HQITU", "9305-CDSKC", "7892-PO…
## $ Count <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ Country <chr> "United States", "United States", "United States",…
## $ State <chr> "California", "California", "California", "Califor…
## $ City <chr> "Los Angeles", "Los Angeles", "Los Angeles", "Los …
## $ `Zip Code` <dbl> 90003, 90005, 90006, 90010, 90015, 90020, 90022, 9…
## $ `Lat Long` <chr> "33.964131, -118.272783", "34.059281, -118.30742",…
## $ Latitude <dbl> 33.96413, 34.05928, 34.04801, 34.06213, 34.03922, …
## $ Longitude <dbl> -118.2728, -118.3074, -118.2940, -118.3157, -118.2…
## $ Gender <chr> "Male", "Female", "Female", "Female", "Male", "Fem…
## $ `Senior Citizen` <chr> "No", "No", "No", "No", "No", "No", "Yes", "No", "…
## $ Partner <chr> "No", "No", "No", "Yes", "No", "Yes", "No", "No", …
## $ Dependents <chr> "No", "Yes", "Yes", "Yes", "Yes", "No", "No", "No"…
## $ `Tenure Months` <dbl> 2, 2, 8, 28, 49, 10, 1, 1, 47, 1, 17, 5, 34, 11, 2…
## $ `Phone Service` <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No", "Y…
## $ `Multiple Lines` <chr> "No", "No", "Yes", "Yes", "Yes", "No", "No phone s…
## $ `Internet Service` <chr> "DSL", "Fiber optic", "Fiber optic", "Fiber optic"…
## $ `Online Security` <chr> "Yes", "No", "No", "No", "No", "No", "No", "No int…
## $ `Online Backup` <chr> "Yes", "No", "No", "No", "Yes", "No", "No", "No in…
## $ `Device Protection` <chr> "No", "No", "Yes", "Yes", "Yes", "Yes", "Yes", "No…
## $ `Tech Support` <chr> "No", "No", "No", "Yes", "No", "Yes", "No", "No in…
## $ `Streaming TV` <chr> "No", "No", "Yes", "Yes", "Yes", "No", "No", "No i…
## $ `Streaming Movies` <chr> "No", "No", "Yes", "Yes", "Yes", "No", "Yes", "No …
## $ Contract <chr> "Month-to-month", "Month-to-month", "Month-to-mont…
## $ `Paperless Billing` <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "N…
## $ `Payment Method` <chr> "Mailed check", "Electronic check", "Electronic ch…
## $ `Monthly Charges` <dbl> 53.85, 70.70, 99.65, 104.80, 103.70, 55.20, 39.65,…
## $ `Total Charges` <dbl> 108.15, 151.65, 820.50, 3046.05, 5036.30, 528.35, …
## $ `Churn Label` <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "…
## $ `Churn Value` <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ `Churn Score` <dbl> 86, 67, 86, 84, 89, 78, 100, 92, 77, 97, 74, 66, 6…
## $ CLTV <dbl> 3239, 2701, 5372, 5003, 5340, 5925, 5433, 4832, 57…
## $ `Churn Reason` <chr> "Competitor made better offer", "Moved", "Moved", …
Antes de qualquer análise, o dataset original passou por um pipeline de limpeza estruturado em seis etapas.
As variáveis originais do conjunto de dados possuem letras maiúsculas
e espaços vazios (ex: Tenure Months, Monthly Charges),
o que costuma gerar falhas de digitação e problemas de sintaxe no
ambiente R. Utilizamos a função clean_names() para
converter todas as colunas para o padrão corporativo
snake_case.
# Padronização de nomes das colunas
dados_limpos <- dados_brutos %>%
clean_names()
filtramos a base para descartar registros de consumidores que não assinam o serviço de internet (internet_service != “No”).
# Mantendo apenas o ecossistema de clientes de internet
dados_limpos <- dados_limpos %>%
filter(internet_service != "No")
Identificou-se uma peculiaridade na variável de faturamento acumulado (total_charges). Clientes novos (com tempo de contrato zerado) registram essa informação como uma string com espaço vazio ” “, forçando o R a interpretar a coluna inteira como texto (character). Forçamos a conversão para numérico e removemos os valores nulos gerados (NA).
# Correção do campo de cobranças totais e remoção de registros nulos
dados_limpos <- dados_limpos %>%
mutate(total_charges = as.numeric(total_charges)) %>%
filter(!is.na(total_charges))
Para enriquecer a análise exploratória, criamos dois novos indicadores estratégicos de valor agregado (recursos que não existem no dado bruto):
seguranca_total: Identifica se o usuário adquire proteção ponta a ponta (Segurança Online e Backup Online).
combo_streaming: Mapeia se o cliente utiliza a conexão para entretenimento total (Streaming de TV e Filmes).
# Criação de variáveis de inteligência de mercado
dados_limpos <- dados_limpos %>%
mutate(
seguranca_total = ifelse(online_security == "Yes" & online_backup == "Yes", "Sim", "Não"),
combo_streaming = ifelse(streaming_tv == "Yes" & streaming_movies == "Yes", "Sim", "Não")
)
As colunas de texto contendo categorias qualitativas (ex: “Yes”/“No”) e os novos grupos criados precisam ser convertidos explicitamente para a estrutura de Fatores (factors). Isso garante que os algoritmos de visualização e resumos estatísticos processem as métricas corretamente.
# Normalização das variáveis qualitativas categóricas
dados_limpos <- dados_limpos %>%
mutate(across(c(gender, senior_citizen, partner, dependents, phone_service,
multiple_lines, internet_service, online_security, online_backup,
device_protection, tech_support, streaming_tv, streaming_movies,
contract, paperless_billing, payment_method, churn_label,
seguranca_total, combo_streaming), as.factor))
Por fim, efetuamos a redução de dimensionalidade do banco de dados. Descartamos identificadores operacionais redundantes e coordenadas geográficas que desviam do objetivo do negócio, mantendo apenas as 15 colunas cruciais.
# Redução do dataframe para as variáveis foco do negócio
dados_limpos <- dados_limpos %>%
select(gender, senior_citizen, tenure_months, internet_service, online_security,
online_backup, seguranca_total, streaming_tv, streaming_movies,
combo_streaming, contract, monthly_charges, total_charges, cltv, churn_label)
Para conferir o resultado da limpeza, são exibidas abaixo as dez primeiras observações com as colunas mais relevantes para a análise. A tabela é interativa: é possível buscar, ordenar e navegar pelas páginas.
Após a execução do pipeline de pré-processamento, a base de dados foi refinada de 33 para 15 variáveis de interesse estratégico, totalizando os registros apenas dos consumidores que possuem o serviço de internet ativo na empresa. Abaixo, apresenta-se o perfil estrutural e a distribuição dessas variáveis, divididas entre métricas quantitativas (numéricas) e qualitativas (categóricas) para atender às exigências de documentação do projeto.
O comportamento financeiro e o tempo de casa dos clientes ativos de internet apresentam as seguintes características centrais:
| Variável | Mínimo | Média | Mediana | Desvio Padrão | Máximo |
|---|---|---|---|---|---|
| cltv | 2003.00 | 4408.40 | 4543.50 | 1182.70 | 6500.00 |
| monthly_charges | 23.45 | 76.86 | 79.50 | 21.93 | 118.75 |
| tenure_months | 1.00 | 32.91 | 30.00 | 24.58 | 72.00 |
| total_charges | 23.45 | 2729.51 | 2139.15 | 2355.68 | 8684.80 |
Resumo das Variáveis Qualitativas (Categóricas)
As variáveis categóricas moldam os perfis comportamentais e os tipos de produtos consumidos. Abaixo está a distribuição de frequência dos principais fatores de interesse para o nosso cenário de internet:
| Variável | Categoria | n | Percentual |
|---|---|---|---|
| churn_label | No | 3756 | 68.1% |
| churn_label | Yes | 1756 | 31.9% |
| combo_streaming | Não | 3573 | 64.8% |
| combo_streaming | Sim | 1939 | 35.2% |
| contract | Month-to-month | 3351 | 60.8% |
| contract | One year | 1109 | 20.1% |
| contract | Two year | 1052 | 19.1% |
| internet_service | DSL | 2416 | 43.8% |
| internet_service | Fiber optic | 3096 | 56.2% |
| seguranca_total | Não | 4389 | 79.6% |
| seguranca_total | Sim | 1123 | 20.4% |