Como os testes A/B moldam estratégias vencedoras de marketing
Aprofundando-se nos fundamentos estatísticos dos experimentos associados ao teste A/B
Sumário
→ Antes de mais nada… o que é um teste de hipótese?
→ O que é o teste A/B?
→ Versão de controle e versão variante
→ Hipótese nula (H0) e hipótese alternativa (HA)
→ Distribuição normal ou t-student: qual utilizar?
→ O que é o Z-score e como calculá-lo?
→ O que é a estatística-t e como calculá-la?
→ Exemplo 1 — Teste A/B em campanha de marketing por e-mail
→ Exemplo 2 — Teste A/B em comércio eletrônico online
→ Conclusões
→ Referências
Antes de mais nada… o que é um teste de hipótese?
Um teste de hipótese é uma metodologia estatística usada para fazer inferências sobre uma população com base em uma amostra dos dados. Ele envolve a formulação de duas hipóteses: a hipótese nula (H0) e a hipótese alternativa (HA ou H1).
- A hipótese nula (H0) geralmente representa uma afirmação de ausência de efeito, enquanto a hipótese alternativa (HA) representa o efeito que você deseja testar.
- O objetivo de um teste de hipótese é determinar se há evidências suficientes para rejeitar a hipótese nula em favor da hipótese alternativa com base nos dados coletados da amostra.
Se você ainda não leu o meu artigo completo sobre teste de hipótese, recomendo a sua leitura antes de continuar para o próximo tópico! Garanto que não vai se arrepender! Link logo abaixo.
Teste de Hipótese: uma ferramenta poderosa para tomadas de decisão baseadas em evidências
O que é o teste A/B?
Um teste A/B é uma aplicação prática de um teste de hipótese em um contexto específico, geralmente usado em marketing, design de produtos ou otimização de sites, entre outros.
O teste A/B é uma técnica que envolve a comparação direta de duas variantes de um mesmo conteúdo para avaliar qual delas performa melhor conforme métricas pré-estabelecidas. Trata-se de uma ferramenta estratégica utilizada para medir o impacto das alterações feitas em uma experiência digital, podendo ser uma página web, um aplicativo, um e-mail de marketing, entre outros. Desta forma, há o objetivo de melhorar resultados específicos, como taxa de conversão, engajamento do usuário ou qualquer outra métrica importante para o negócio.
Resumindo: Se deseja descobrir se um fundo azul é mais atraente para os visitantes de seu site em comparação com o fundo vermelho, ou se mudar a fonte da sua newsletter para Arial aumentaria as inscrições em comparação com Calibri… então o teste A/B é a solução! Prossiga com a leitura!
Versão de controle e versão variante
Inicialmente, são criadas duas versões do mesmo recurso: a versão “A” (controle) e a versão “B” (variante), que contém a modificação em análise.
Versão de controle (A): Esta é a versão original ou atual de um produto, página web ou anúncio. Serve como linha de base contra a qual a variante será comparada. Por exemplo, se você estiver testando um novo design de botão em seu site, a versão “controle” seria o design atual do botão.
Versão variante (B): Esta é a nova versão que você deseja testar contra a versão de controle. Usando o exemplo anterior do botão, a “variante” seria o novo design que você acredita que pode ter um desempenho melhor em termos de cliques, conversões ou qualquer outra métrica que você esteja monitorando.
Hipótese nula (H0) e hipótese alternativa (HA)
As hipóteses nula e alternativa fornecem uma maneira sistemática de testar se as diferenças entre as versões de controle e variante são estatisticamente significativas ou se podem ser atribuídas ao acaso.
Hipótese nula (H0): Representa a ideia de que não há diferença entre os grupos que estão sendo testados. Em outras palavras, qualquer diferença observada é devido ao acaso e não a uma mudança real. A hipótese nula geralmente afirma que não há diferença nas métricas de desempenho (como taxa de conversão) entre a versão de controle e a variante.
Hipótese alternativa (HA): É o oposto da hipótese nula. Representa a ideia de que há uma diferença real entre os grupos. A hipótese alternativa afirma que a variante tem um desempenho significativamente diferente (pode ser melhor ou pior) em comparação com o controle.
Assim, o teste A/B é um teste de hipótese que assumirá uma distribuição bicaudal (ou bilateral):
Sendo pA uma medida do grupo A e pB uma medidia do grupo B. Graficamente, o teste A/B pode ser representado da seguinte forma:
Com o nível de significância estabelecido em α, as regiões de rejeição possuem área α/2, delimitadas pelo valor crítico em tracejado. Qualquer valor que esteja na região é considerado como estatísticamente significativo, podendo assim ser rejeitada a hipótese nula.
Distribuição normal ou t-student: qual utilizar?
Distribuição normal:
De acordo com o artigo de teste de hipótese, o teste Z é mais adequado quando se tem um tamanho de amostra grande (n > 30 é uma regra prática comum) ou também quando a variância da população é conhecida.
Além disso, o teste Z é frequentemente usado para comparar proporções (taxas de conversão, por exemplo) dos grupos A e B. Assim, é possível determinar a Proporção de sucesso combinada:
- Proporção de sucesso combinada: Quando a distribuição é normal, pode ser calculada uma estimativa agregada da taxa de sucesso (cliques, conversões, etc) das versões A e B. É calculada da seguinte forma:
Sob a hipótese nula em um teste A/B, supomos que não há diferença nas taxas de conversão entre os grupos. Portanto, é adequado utilizar uma taxa de sucesso combinada ao realizar cálculos sob essa hipótese.
Exemplo de aplicação:
Uma empresa envia dois tipos de e-mails promocionais (A e B) para seus clientes. Eles querem saber se a proporção de cliques (CTR) no email A é significativamente diferente do email B.
Distribuição t-student:
Para o teste t-student, o artigo de teste de hipótese indica que o uso desta distribuição é mais pertinente quando o tamanho da amostra é pequeno (n≤30) ou quando a variância da população é desconhecida.
Em contextos de teste A/B, o teste t é frequentemente usado para comparar as médias entre dois grupos, tornando-o uma ferramenta valiosa para avaliar diferenças significativas em métricas como taxas de conversão, tempo médio gasto em uma página, entre outras.
Exemplo de aplicação:
Uma empresa agrícola quer saber se um novo tipo de semente de milho produz, em média, mais grãos do que a semente tradicional. Eles plantam ambos os tipos em pequenos campos e comparam a produção média.
Importante:
Considerando um teste A/B com uma amostra grande e com a intenção de comparar médias, se o desvio padrão da população for desconhecido (o que é comum na prática), mesmo assim a distribuição t-student (teste t) é geralmente a escolha recomendada. Se, por algum motivo, o desvio padrão da população for conhecido, então a distribuição normal (teste Z) pode ser usada.
No entanto, em grande parte dos cenários práticos de teste A/B, o desvio padrão da população é desconhecido. Assim, o teste t é a escolha aceitável, mesmo para amostras grandes.
O que é o Z-score e como calculá-lo?
O Z-score é um conceito da estatística que indica quantos desvios padrão um valor específico está da média em um conjunto de dados.
É como se este valor apontasse o quão fora do comum é um dado em relação ao conjunto de dados.
- Se o Z-score é 0, isso indica que o valor da observação é igual à média;
- Se o Z-score é positivo, a observação está acima da média; e
- Se o Z-score é negativo, a observação está abaixo da média.
A fórmula básica para calcular o Z-score é:
Quando o teste A/B requer a comparação da diferença entre duas proporções de amostras diferentes, o Z-score pode ser calculado de uma outra maneira, conforme ilustrado a seguir:
Mas o que significa este Z-score no teste A/B?…
Caso este Z-score seja maior que um valor de Z chamado de Zcrítico, então o Z-score estará na região de rejeição, assim deve-se rejeitar a hipótese nula.
Mas como este Zcrítico é calculado?…
O Zcrítico é calculado através da função quantil ou “Percent-Point Function” (PPF). A PPF é o inverso da função de distribuição cumulativa (CDF, do inglês Cumulative Distribuition Function). Enquanto a CDF fornece a probabilidade de que a variável aleatória assuma um valor menor ou igual a um determinado valor, a PPF fornece o valor da variável para uma probabilidade acumulada dada.
Ou seja, fornecendo a probabilidade à função PPF, ela retornará o valor de “corte” (ou Zcrítico) correspondente naquela distribuição.
Sendo assim, para o caso de um teste bicaudal, com um nível de significância α (alpha) de 0.05 (5%):
- 2.5% (alpha/2) dos valores estariam na cauda inferior
- 2.5% (alpha/2) dos valores estariam na cauda superior. Assim, a probabilidade acumulada até o valor crítico superior é 1-alpha/2, ou seja, 97.5%.
Para definir os valores de corte, podemos utilizar a função “norm.ppf” em python, do módulo “scipy.stats”.
from scipy.stats import norm
# Definindo a significância alpha
alpha = 0.05
# Calculando o valor crítico para a cauda inferior
Zcritico_inf = norm.ppf(alpha/2)
# Calculando o valor crítico para a cauda superior
Zcritico_sup = norm.ppf(1 - alpha/2)
print(f"O Zcritico para a cauda inferior é: {Zcritico_inf:.2f}")
print(f"O Zcritico para a cauda superior é: {Zcritico_sup:.2f}")
Assim, são obtidos os seguintes resultados:
Desta forma, neste exemplo conclui-se que:
- 2,5% dos dados da distribuição estão abaixo de -1,96.
- 2,5% dos dados da distribuição estão acima de 1,96.
Desta forma, com Zscore e Zcriticos definidos, a H0 será rejeitada se:
- Z-score for maior que o Zcrítico superior, ou
- Zscore for menor que o Zcrítico inferior
Resumindo: Se o módulo de Zscore for maior que o Zcritico superior, a hipótese nula pode ser rejeitada.
O que é a estatística-t e como calculá-la?
A estatística-t é uma métrica que auxilia a entender se a diferença entre dois grupos é realmente significativa, considerando a variabilidade dos dados. É utilizada quando o tamanho da amostra é pequeno ou quando a variância da população é desconhecida.
Para um teste A/B em que se deseja comparar as médias de dois grupos independentes, a estatística-t é calculada da seguinte forma:
Em Python, o módulo scipy.stats disponibiliza a função ttest_ind, que calcula a estatística-t e também o p-valor:
# Importando a biblioteca numpy
import numpy as np
# Importando a função ttest_ind
from scipy.stats import ttest_ind
# Criando duas amostras de grupos como exemplos
grupo_A = np.array([23, 21, 34, 45, 26, 27, 38, 39, 40])
grupo_B = np.array([35, 37, 29, 41, 32, 33, 36, 30, 31])
# Calculando a estatística t e o p-valor
t_stat, p_val = ttest_ind(grupo_A, grupo_B)
print(f"Estatística t: {t_stat:.4f}")
print(f"P-valor: {p_val:.4f}")
Neste caso, são obtidos como resultados:
Neste caso, as hipóteses poderiam ser formuladas da seguinte forma:
- H0: Não há uma diferença significativa entre os grupos A e B
- H1: Há uma diferença real entre os grupos A e B
Desta forma, caso fosse definido um nível de significância de α = 5% (0.05) não se poderia rejeitar a H0, pois p-valor > α.
Recapitulando do artigo de teste de hipótese:
- Se p-valor ≤ α: rejeita-se a H0. Há uma diferença estatisticamente significativa nas métricas entre as versões A e B.
- Se p-valor > α: não se pode rejeitar a H0. Não se pode afirmar que há uma diferença significativa entre A e B.
Exemplo 1 — Teste A/B em campanha de marketing por e-mail
Imagine que você é um cientista de dados em uma empresa de e-commerce e decide realizar um teste A/B para entender qual versão de um e-mail promocional traz mais cliques para o site. Há duas versões do e-mail:
- Versão A: Atual, com um design clássico.
- Versão B: Nova, com um design mais moderno e uma chamada para ação (CTA) diferenciada.
Ambas as versões foram enviadas para 1000 clientes selecionados aleatoriamente, e você monitorou se o cliente clicou no link dentro do e-mail (1 = clicou, 0 = não clicou).
Objetivo: Verificar se há uma diferença estatisticamente significativa nas taxas de cliques entre os dois e-mails.
1) Dados:
- Versão A: 120 cliques em 1000 e-mails enviados.
- Versão B: 150 cliques em 1000 e-mails enviados.
2) Definição do tipo de distribuição:
Como estamos lidando com amostras que são relativamente grandes (1000 e-mails enviados), pode-se adotar a distribuição normal para este exemplo. Além disso, o teste Z é frequentemente usado para comparar proporções entre dois grupos. Neste caso, estamos comparando a proporção de cliques da Versão A com a proporção de cliques da Versão B.
3) Definição das hipóteses:
- Hipótese Nula (H0): pA=pB (Não há diferença nas taxas de cliques)
- Hipótese Alternativa (HA): pA ≠ pB (Há diferença nas taxas de cliques)
4) Cálculo do Z-Score:
De acordo os dados informados, pode-se calcular as proporções das amostras A e B, além da proporção de sucesso combinada. Assim, é possível obter o valor de Z-score seguindo o código Python abaixo:
# Importando a biblioteca de operações matemáticas
import math
# Tamanho das amostras
n_A = n_B = 1000
# Proporção das amostras A e B
p_A = 120 / 1000
p_B = 150 / 1000
# Proporção de sucesso combinada
p = (p_A * n_A + p_B * n_B) / (n_A + n_B)
# Cálculo do Z_score
Z_score = (p_B - p_A) / math.sqrt(p * (1-p) * (1/n_A + 1/n_B))
print(f"Z-Score: {Z_score:.4f}")
O Z-score obtido foi de:
5) Cálculo do Zcritico:
Assumindo um nível de significância de α = 5%, foi possível utilizar a função norm.ppf para obter o Zcritico:
# Importando a função para o cálculo do Zcritico
from scipy.stats import norm
# Nível de confiança de 95%
alpha = 0.05
# Calculando o Zcritico
Z_critico = norm.ppf(1 - alpha/2)
print(f"Z-Critico: {Z_critico:.4f}")
print("Rejeitar H0" if abs(Z_score) > Z_critico else "Não rejeitar H0")
Obtendo o seguinte resultado:
Assim, como |Z-score| > Zcritico, então rejeita-se a H0. Isto indica que as versões A e B são significativamente diferentes.
Com base no resultado do teste, conclui-se que a nova versão do e-mail (Versão B) traz uma mudança significativa nas taxas de cliques em comparação com a versão atual (Versão A). Isso ajuda a tomar uma decisão fundamentada sobre qual versão implementar em uma campanha de marketing por e-mail em larga escala.
Exemplo 2 — Teste A/B em comércio eletrônico online
Imagine que você é cientista de dados de uma empresa de comércio eletrônico que quer testar a eficácia de duas versões diferentes de uma página de produto. A intenção é verificar qual delas resulta em um tempo médio de permanência mais alto dos usuários.
- Versão A (controle): Contém muitos detalhes técnicos, especificações e gráficos.
- Versão B (variante): Contém mais imagens, vídeos e é mais orientada para o estilo de vida.
Você coleta aleatoriamente duas amostras de 25 visitantes cada. Uma para a Versão A e uma outra para a Versão B.
Objetivo: Verificar qual página leva os clientes a passar mais tempo (média de minutos na página).
1) Dados:
Tempos médios de permanência dos usuários:
# Tempos médios de permanência (em minutos) dos usuários na página
versao_A = [2.5, 3.0, 2.8, 2.9, 3.1, 2.7, 2.6, 3.0, 2.8, 3.2, 2.9, 2.8, 3.0, 3.1, 2.7, 2.8, 3.2, 3.0, 2.9, 2.7, 2.8, 3.1, 2.9, 2.8, 3.0]
versao_B = [3.2, 3.1, 3.5, 3.0, 3.4, 3.2, 3.3, 3.1, 3.0, 3.2, 3.3, 3.4, 3.2, 3.1, 3.0, 3.5, 3.3, 3.2, 3.3, 3.1, 3.2, 3.4, 3.0, 3.3, 3.2]
2) Definição do tipo de distribuição:
Como estamos lidando com amostras que são relativamente pequenas (25 visitantes) e a variância da população é desconhecida, pode-se adotar a distribuição t-student para este exemplo. Além disso, o teste t é frequentemente usado para comparar médias entre dois grupos. Neste caso, estamos comparando a média de permanência na página entre dois grupos diferentes.
3) Definição das hipóteses:
- Hipótese Nula (H0): média A = média B
Não há diferença significativa no tempo médio de permanência entre a Versão A e a Versão B.
- Hipótese Alternativa (HA): média A ≠ média B
Há uma diferença significativa no tempo médio de permanência entre a Versão A e a Versão B.
4) Calculando a estatística-t e o p-valor:
De acordo os dados de tempo de permanência informados, pode-se calcular tanto a estatística-t e o p-valor através da função ttest_ind, em Python:
# Importando a função que realiza o teste-t para duas amostras independentes
from scipy.stats import ttest_ind
# Nível de confiança de 95%
alpha = 0.05
# Calculando a estatística-t e o p-valor
t_stat, p_val = ttest_ind(versao_A, versao_B)
print(f"Estatística-t: {t_stat:.10f}")
print(f"p-valor: {p_val:.10f}")
print("Rejeitar H0" if p_val <= alpha else "Não rejeitar H0")
Os resultados obtidos foram:
Pelo fato do p-valor ser menor que o nível de significância, então rejeitamos a H0. Ou seja, há uma diferença significativa no tempo de permanência dos usuários na Versão B da página de comércio online.
Conclusão
Na atual “Era da informação”, das redes sociais, das campanhas de marketing, a concorrência é extrema e a atenção do consumidor/cliente mutas vezes é “volátil”. Nisso, o teste A/B surge como uma espécie de bússola, permitindo com que as marcas naveguem com mais confiança, performando cada vez melhor em suas estratégias.
Este artigo teve o propósito de apresentar os conceitos estatísticos por traz de um teste A/B, além de disponibilizar alguns exemplos em Python para por o aprendizado em prática.
Ainda não me segue no Medium? Aproveite e me siga para ficar sabendo toda vez que sair um artigo novo do forninho!!
Nos próximos posts estarei explorando mais aplicações do teste de hipótese na ciência de dados. Fique ligado!!
LinkedIn: https://www.linkedin.com/in/edson-junior/
GitHub: https://github.com/ejunior029
Referências
- O que é teste A/B — Oracle
- Comunidade DS — Canal do Youtube
- Livro: Estatística Básica — Por Wilton Bussab e Pedro Morettin