Teste de Hipótese com Python
Quando fazemos a análise exploratória de dados sempre buscamos padrões, correlações e diferenças entre grupos e subconjuntos dos dados. Isso acontece principalmente quando temos o objetivo de explicar as causas e consequências de determinado evento e propor respostas que possam amenizar, caso seja negativo, ou alavancar caso seja positivo o evento. Por exemplo, descobrir que em vendas passivas você tem mais conversão do que ativas, que um canal de distribuição é melhor que o outro ou um tipo de cliente tem um LTV ( life time value) maior ou um CAC (customer acquisition cost) menor do que outro.
Entretanto, os padrões e diferenças que são encontrados não necessariamente tem relevância estatística. As diferenças que você encontrou podem ser pelo acaso, serem enviesadas ou ter baixo grau de confiança. Isso é muito perigoso porque podemos fazer falsas suposições sobre nossos dados. Consequentemente, tirando conclusões e fazendo recomendações erradas.
Para verificar se nossas observações tem relevância estatística usamos os testes estatísticos ou testes de hipótese. Em geral, eles são métodos estatísticos para verificar as hipóteses que fazemos na EDA. Como cada problema tem sua peculiaridade, existem diversos testes que atendem as mais diversas necessidades. Nesse artigo trabalharemos com os: t-test e U-test.
O teste de hipótese vai seguir a seguinte estrutura:
1- Definir o p-value
2- Definir a hipótese nula (H0)
3- Definir a hipótese alternativa (HA)
4- Definir o teste
5- Executar e Verificar os resultados
6- Rejeitar ou não a hipótese nula
Caso não esteja familiarizado com esses termos ou com testes de hipótese vou deixar no final do artigo links para materiais que explicam mais profundamente com uma linguagem didática esse tema. Mas para entender os próximos passos você só precisa ter a intuition de que: após o teste gostaríamos que rejeitar a hipótese nula e podemos rejeita-la caso o p-value < 0.05, ok?
Na prática
O case que irei utilizar é de churn de uma empresa de telecom que analisei os dados em What is churn, and how to predict it?. Na análise exploratória faço algumas observações e reconheço alguns padrões de comportamento para clientes que continuam na empresa (ativos) e clientes que cancelam o serviço (clientes churn).
Agora, irei testar minhas hipótese se clientes com algumas características ficam mais tempo no serviço ou não. Para isso utilizarei a biblioteca SciPy. A partir dela vamos criar uma função que se adapta aos dados para atender as diversas distribuições e realizar o teste de hipótese.
#packages
import scipy.stats as stats
from scipy.stats import mannwhitneyu, ttest_ind
O t-test exige que as distribuições sejam normais e variância igual. Por isso vamos usar funções auxiliares para testar se os grupos tem essas características.
# Shapiro wilk - verificar se é normal
def e_normal(group):
wval, pval = stats.shapiro(group)
if len(group) > 5000:
if wval <0.05: return False
if pval < 0.05: return False
return True# equal variance test
def var_igual(group1,group2):
_,pval = stats.levene(group1,group2)
if pval<0.05: return False
return True
A função stats_test vai juntar as duas anteriores e performar o teste de acordo com as características dos dados:
Distribuição normal e variância igual- t-test
Distribuição normal e variância diferente- t-test with unequal variance
Distribuição “não normal” e variância diferente- U-Test
# teste de hipótese
def stats_test(group1, group2):
if e_normal(group1) and e_normal(group2):
if var_igual(group1,group2):
print("Realizando t-test...")
return stats.ttest_ind(group1,group2)
print("Relizando t-test com variancia diferente...")
return stats.ttest_ind(group1,group2, equal_var = False)
print("Realizando U-Test...")
return mannwhitneyu(group1,group2)
ps: para todos os teste o p-value = 0.05
Q1) O tipo do contrato influencia o Life-time do cliente?
Contratos com pequenas duração (mês a mês) os clientes tem mais possibilidades de cancelar o serviço. Em contratos mais longos essa possibilidade se reduz, por isso para muitas empresas é vantagem cobrar menos mensalmente por um contrato anual a fim de garantir que o LTV (life time value) seja maior que seu CAC (customer aquisition cost).
No nosso caso aparentemente os clientes com contratos mais longos (≥1 ano) ficam mais tempo. Para verificar essa observação, testaremos o “tenure” — variável que representa o tempo que o cliente fica ativo no nosso serviço em meses.
Toda a análise foi feita com dois grupos: os clientes ativos (df_nochurn) e clientes que cancelaram (df_churn).
Para os clientes churn
- Tenure médio de contratos curtos: 14.02 meses
- Tenure médio de contratos longos: 48.62 meses
Vamos verificar se essa diferença é estatisticamente relevante com o teste de hipótese
- H0 - não existe diferença entre o life-time de clientes com contratos curtos ou longos
- HA - existe diferença entre o life-time de clientes com contratos curtos e longos
p-value < 0.05 — H0 rejeitada
Para os clientes ativos
- Tenure médio de contratos curtos: 21.03 meses
- Tenure médio de contratos longos: 50.00 meses
Testando a mesma hipótese…
p-value < 0.05 — H0 rejeitada
Podemos afirmar então que os clientes que tem contratos longos realmente ficam mais tempo em nossos serviços. Nesse sentido, a empresa deve investir na aquisição de clientes com contratos mais longos e/ou transferir clientes com contratos curtos para longos.
Q2) Será que os clientes que tem algum companheiro ficam mais tempo?
Durante o estudo foi observada um diferença na proporção de clientes que tinham parceiros entre os dois grupos. Foi observado que clientes que tinham parceiros ficam mais tempo no serviço. Podem ter várias explicações para isso, uma delas é que mesmo que um não use ou goste do serviço, o outro pode gostar, assim a assinatura é mantida. Para confirmar que essa diferença tem relevância estatística podemos fazer um teste de hipótese.
Clientes que cancelaram
- Tenure médio de clientes com parceiros: 26.59 meses
- Tenure médio de clientes sem parceiross: 13.18 meses
Nossa hipótese nula é que não existe diferença no tempo que esse cliente fica no nosso serviço (tenure) entre esses dois grupos ( clientes que cancelaram com e sem parceiros).
Resultado do teste
O p-value<0.05, então rejeitamos a hipótese de que ter parceiros não faz diferença no período que esses cliente fica em nosso serviço.
Clientes Ativos
- Tenure médio de clientes com parceiros: 45.79 meses
- Tenure médio de clientes sem parceiross: 28.36 meses
Resultado do teste
p-value<0.05 — rejeitamos a hipótese nula
Acho que deu para compreender um pouco sobre o teste de hipótese. No notebook tem mais alguns testes, por exemplo será que o tipo de pagamento ou a conta ter dependentes influencia uma pessoa a ficar mais ou menos tempo ?
Espero que tenham gostado :)
Qualquer feedback podem me contatar via dm no medium ou LinkedIn ou email.
Materiais de estudo
Videos
- Hypothesis testing with Applications in Data Science
- Hypothesis Testing and The Null Hypothesis
- StatQuest: Linear Models Pt.2 — t-tests and ANOVA
Leituras