Minimizando Cancelamentos

Análise de Dados e Estratégias Preventivas em uma Empresa de Telecom.

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"]
        

Visualizando as 5 primeiras linhas

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

Explicando as colunas da base de dados

  • ID: Número de identificação do cliente;
  • Gênero: Masculino ou Feminino;
  • Aposentado: 0 para não, 1 para sim;
  • Casado: Sim ou Não;
  • Dependentes: Indica se o cliente possui pessoas dependentes morando com ele, como filhos, por exemplo;
  • Serviço de Telefone: Indica se o cliente adquiriu o serviço de linha telefônica;
  • Múltiplas Linhas: Indica se o cliente possui várias linhas telefônicas;
  • Serviço de Internet: Indica se o cliente adquiriu o serviço de internet e especifica o tipo de serviço;
  • Segurança Online: Indica se o cliente adquiriu um serviço extra de segurança online;
  • Backup Online: Indica se o cliente adquiriu um serviço extra de backup;
  • Proteção de Equipamento: Indica se o cliente adquiriu um serviço extra de proteção para o equipamento de internet;
  • Suporte Técnico Premium: Indica se o cliente adquiriu um serviço extra de suporte técnico com tempo de espera reduzido;
  • Streaming TV: Indica se o cliente adquiriu o serviço de streaming de TV;
  • Streaming Filmes: Indica se o cliente adquiriu o serviço de streaming de filmes;
  • Tipo de Contrato: Indica o tipo de contrato realizado, podendo ser mensal, anual ou de dois anos;
  • Fatura Digital: Indica se o cliente optou por receber a fatura digitalmente;
  • Forma de Pagamento: Indica o método de pagamento escolhido:
    • Bank transfer: Débito automático;
    • Credit Card: Cartão de crédito;
    • Mailed Check & Electronic check: Boleto;
    • Valor Mensal: Valor gasto mensalmente;
  • Total Gasto: Total já gasto desde o início dos serviços;
  • Cancelou: Informa se o cliente cancelou os serviços, podendo ser sim ou não.
Na base de dados utilizada, temos um total de 7.043 linhas, e não foram identificados valores ausentes.

No entanto, observamos que a coluna "Total Gasto", que deveria ser do tipo float(número com casas decimais) por representar um valor numérico, está atualmente definida como object(caracteres).

Portanto, é necessário realizar uma alteração no tipo de dados dessa coluna para corrigir essa inconsistência.

    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.

Análise inicial

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()
      

Análise Completa

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.

Plano família

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()
      

Primeiros meses

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()
      

Serviços extras

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()
      

Fibra

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()
      

Tipos de contrato

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()
      

Formas de Pagamento

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()
      

Conclusão

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.