Neste projeto, estamos analisando uma base de dados de uma empresa de telecomunicações que oferece serviços de internet, streaming de TV e filmes. Identificamos um problema significativo: constatou-se que 26% dos clientes estão cancelando os serviços. O objetivo é investigar as causas desses cancelamentos e desenvolver estratégias efetivas para evitar que continuem ocorrendo.
# Importando as bibliotecas para análise
import pandas as pd
import plotly.express as px
# Importando a base de dados
df = pd.read_csv("Telco-Customer-Churn.csv")
# Traduzindo o nome das colunas para uma melhor compreensão
df.columns = ["ID", "Gênero", "Aposentado", "Casado", "Dependentes", "MesesComoCliente", "ServicoTelefone", "MultiplasLinhas", "ServicoInternet", "SegurancaOnline", "BackupOnline", "ProtecaoEquipamento", "SuporteTecnicoPremium", "StreamingTV", "StreamingFilmes", "TipoContrato", "FaturaDigital", "FormaPagamento", "ValorMensal", "TotalGasto", "Cancelou"]
ID | Gênero | Aposentado | Casado | ... | ValorMensal | TotalGasto | Cancelou | |
---|---|---|---|---|---|---|---|---|
0 | 7590-VHVEG | Female | 0 | Yes | ... | 29.85 | 29.85 | No |
1 | 5575-GNVDE | Male | 0 | No | ... | 56.95 | 1889.5 | No |
2 | 3668-QPYBK | Male | 0 | No | ... | 53.85 | 108.15 | Yes |
3 | 7795-CFOCW | Male | 0 | No | ... | 42.30 | 1840.75 | No |
4 | 9237-HQITU | Female | 0 | No | ... | 70.70 | 151.65 | Yes |
RangeIndex: 7043 entries, 0 to 7042 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 7043 non-null object 1 Gênero 7043 non-null object 2 Aposentado 7043 non-null int64 3 Casado 7043 non-null object 4 Dependentes 7043 non-null object 5 MesesComoCliente 7043 non-null int64 6 ServicoTelefone 7043 non-null object 7 MultiplasLinhas 7043 non-null object 8 ServicoInternet 7043 non-null object 9 SegurancaOnline 7043 non-null object 10 BackupOnline 7043 non-null object 11 ProtecaoEquipamento 7043 non-null object 12 SuporteTecnicoPremium 7043 non-null object 13 StreamingTV 7043 non-null object 14 StreamingFilmes 7043 non-null object 15 TipoContrato 7043 non-null object 16 FaturaDigital 7043 non-null object 17 FormaPagamento 7043 non-null object 18 ValorMensal 7043 non-null float64 19 TotalGasto 7043 non-null object 20 Cancelou 7043 non-null object dtypes: float64(1), int64(2), object(18) memory usage: 1.1+ MB
# Convertendo a coluna TotalGasto de object para float
df['TotalGasto'] = pd.to_numeric(df.TotalGasto, errors='coerce')
df.info()
RangeIndex: 7043 entries, 0 to 7042 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 7043 non-null object 1 Gênero 7043 non-null object 2 Aposentado 7043 non-null int64 3 Casado 7043 non-null object 4 Dependentes 7043 non-null object 5 MesesComoCliente 7043 non-null int64 6 ServicoTelefone 7043 non-null object 7 MultiplasLinhas 7043 non-null object 8 ServicoInternet 7043 non-null object 9 SegurancaOnline 7043 non-null object 10 BackupOnline 7043 non-null object 11 ProtecaoEquipamento 7043 non-null object 12 SuporteTecnicoPremium 7043 non-null object 13 StreamingTV 7043 non-null object 14 StreamingFilmes 7043 non-null object 15 TipoContrato 7043 non-null object 16 FaturaDigital 7043 non-null object 17 FormaPagamento 7043 non-null object 18 ValorMensal 7043 non-null float64 19 TotalGasto 7032 non-null float64 20 Cancelou 7043 non-null object dtypes: float64(2), int64(2), object(17) memory usage: 1.1+ MB
Após realizar a conversão da coluna "Total Gasto" para o tipo float, foi identificado que alguns valores estão
ausentes nessa coluna.
É importante lidar com esses valores faltantes para garantir a integridade dos dados. Neste caso iremos apenas
excluir as linhas com dados faltantes.
# Removendo as linhas vazias
df = df.dropna(how='any', axis=0)
# Quantidade de valores vazios
df.isnull().sum().sort_values(ascending=False)
ID 0 ProtecaoEquipamento 0 TotalGasto 0 ValorMensal 0 FormaPagamento 0 FaturaDigital 0 TipoContrato 0 StreamingFilmes 0 StreamingTV 0 SuporteTecnicoPremium 0 BackupOnline 0 Gênero 0 SegurancaOnline 0 ServicoInternet 0 MultiplasLinhas 0 ServicoTelefone 0 MesesComoCliente 0 Dependentes 0 Casado 0 Aposentado 0 Cancelou 0 dtype: int64
Agora que não há mais nenhum dado ausente, podemos verificar o tamanho atual da nossa base de dados.
A base de dados conta com 7032 linhas, e 21 colunas.
Vamos analisar a quantidade de clientes que estão cancelando os serviços para confirmar se realmente corresponde a 26%. Essa verificação é importante para garantir a precisão dos dados e fornecer uma compreensão precisa da taxa de cancelamento.
# Usando value_counts para calcular a quantidade de clientes cancela
print(f"\tNúmero de clientes:\nNão cancelaram: {df.Cancelou.value_counts()[0]}\nCancelaram: {df.Cancelou.value_counts()[1]}\n")
print(f"\tPorcentagem dos cancelamentos:\nNão cancelaram: {df.Cancelou.value_counts(normalize=True)[0]:.3f}\nCancelaram: {df.Cancelou.value_counts(normalize=True)[1]:.3f}")
Número de clientes: Não cancelaram: 5163 Cancelaram: 1869 Porcentagem dos cancelamentos: Não cancelaram: 0.734 Cancelaram: 0.266
# histograma dos cancelamentos
cancelamentos = px.histogram(df, x="Cancelou", color='Cancelou', text_auto=True, title="Clientes que cancelaram")
cancelamentos.show()
Agora, iremos analisar como cada coluna da tabela influencia no cancelamento do serviço pelos
clientes.
Para essa análise, utilizaremos gráficos de histogramas, que são indicados para visualizar frequências. Os
histogramas mostram a distribuição das ocorrências, permitindo uma análise mais precisa das frequências com
que determinados eventos ocorrem.
Ao observar algumas tendências nos cancelamentos, identifiquei que há uma taxa de cancelamento mais alta entre
pessoas Não casadas e também entre aquelas que Não possuem dependentes em
suas famílias.
Podemos inferir que clientes com famílias maiores tendem a ter uma menor taxa de cancelamento.
Com base nessa observação, uma possível solução seria oferecer planos família, que atendam às necessidades e
preferências desse segmento de clientes, incentivando a fidelidade e reduzindo as taxas de cancelamento.
# Histograma de Casados x Cancelou
fig = px.histogram(df, x='Casado', color='Cancelou', text_auto=True, title='Casado x Cancelou', width=800)
fig.show()
# Histograma de Dependentes x Cancelou
fig = px.histogram(df, x='Dependentes', color='Cancelou', text_auto=True, title='Dependentes x Cancelou', width=800)
fig.show()
Ao analisar os dados, é evidente que clientes que gastaram menos têm uma maior probabilidade de cancelar. Além
disso, observa-se que a duração dos MesesComoCliente também influencia no cancelamento.
É surpreendente notar que, no primeiro mês, há mais clientes que cancelam os serviços do que aqueles que
continuam. Uma possível explicação para esse comportamento seria a existência de uma promoção atraente no
primeiro mês ou uma experiência insatisfatória nesse período inicial.
Uma solução viável seria criar um bônus ou promoção para os primeiros 12 meses. Essa abordagem tem como
objetivo reduzir o cancelamento imediato, aumentar a fidelização dos clientes e estabelecer um relacionamento
mais duradouro com eles.
# Histograma meses como cliente x cancelou
fig = px.histogram(df, x='MesesComoCliente', color='Cancelou', text_auto=True, title='MesesComoCliente x Cancelou', width=800)
fig.show()
# Histograma total gasto x cancelou
fig = px.histogram(df, x='TotalGasto', color='Cancelou', text_auto=True, title='TotalGasto x Cancelou', width=800)
fig.show()
Ao analisar os dados, verificamos que os clientes que Não possuem serviços extras, como streaming,
segurança e backups online, e suporte técnico premium, apresentam uma maior probabilidade de
cancelamento.
Uma possível solução para lidar com esse problema seria incluir alguns desses serviços extras nos pacotes
tradicionais oferecidos pela empresa. Além disso, oferecer um bônus ou desconto para incentivar os clientes a
adquirirem esses serviços adicionais também pode ser uma estratégia eficaz. Os serviços extras têm se mostrado
como fatores importantes na fidelização dos clientes, portanto, incorporá-los aos pacotes tradicionais pode
reduzir significativamente a probabilidade de cancelamento e aumentar a satisfação e fidelidade dos clientes.
lista_servicos = ['SegurancaOnline', 'BackupOnline', 'ProtecaoEquipamento', 'SuporteTecnicoPremium', 'StreamingTV', 'StreamingFilmes']
for servico in lista_servicos:
fig = px.histogram(df, x=servico, color='Cancelou', text_auto=True, title=f'{servico} x Cancelou', width=800)
fig.show()
Também foi identificado um alto número de cancelamentos relacionados ao serviço de fibra na base de dados. Dos
1869 cancelamentos registrados, 1297 deles correspondiam a clientes que utilizavam o serviço de fibra.
Essa observação indica que há um possível problema relacionado ao serviço de fibra prestado pela empresa, o
qual está levando os clientes a cancelarem seus contratos.
Uma solução necessária é investigar e corrigir o problema identificado no serviço de fibra. A empresa deve
priorizar a resolução dessa questão, uma vez que a fibra é uma das principais causas de cancelamentos em sua
base de clientes. Ao solucionar os problemas e aprimorar a qualidade do serviço de fibra é esperado haver uma
redução significativa na taxa de cancelamentos.
fig = px.histogram(df, x='ServicoInternet', color='Cancelou', text_auto=True, title='ServicoInternet x Cancelou', width=800)
fig.show()
Ao analisar os dados novamente, identificamos uma grande discrepância em relação aos cancelamentos. Dos 1869
cancelamentos registrados na base de dados, 1655 deles estão relacionados a contratos mensais, o que
representa 87% dos clientes, sendo o maior índice de cancelamento.
Por outro lado, os clientes com contratos anuais ou de dois anos apresentam uma taxa de cancelamento muito
baixa.
Com base nessa observação, a melhor estratégia seria oferecer descontos significativos, bônus ou benefícios
adicionais para incentivar um maior número de pessoas a optarem por contratos anuais em vez de contratos
mensais. Isso pode ser uma forma efetiva de aumentar a fidelidade dos clientes e reduzir a taxa de
cancelamentos. Oferecer incentivos atrativos para contratos de longo prazo pode ser uma solução viável para
resolver o problema dos cancelamentos e garantir uma maior estabilidade nos negócios da empresa.
fig = px.histogram(df, x='TipoContrato', color='Cancelou', text_auto=True, title='TipoContrato x Cancelou', width=800)
fig.show()
Ao analisar as formas de pagamento, observamos que os boletos apresentam uma taxa de cancelamento mais alta em comparação com débito automático e cartões de crédito. Como forma de incentivar outras opções de pagamento, podemos oferecer um pequeno desconto para clientes que optarem pelo débito automático ou cartões de crédito.
fig = px.histogram(df, x='FormaPagamento', color='Cancelou', text_auto=True, title='FormaPagamento x Cancelou', width=800)
fig.show()
A análise dos histogramas nos permitiu observar várias tendências significativas que influenciaram o
cancelamento dos serviços pelos clientes. Essa abordagem focalizada nos proporcionou insights valiosos sobre
os principais fatores de cancelamento e possíveis soluções para mitigar esses problemas.
Quando a análise de dados é aproveitada de forma eficiente, a empresa pode identificar oportunidades de
melhorias, identificar problemas em potencial e tomar medidas proativas para enfrentar os desafios do mercado.
A análise de dados também proporciona uma vantagem competitiva, permitindo que as empresas ajustem suas
estratégias de negócios com base em evidências concretas e tomem decisões embasadas em seus próprios dados.