Uma introdução ao teste A/B bayesiano | por Lauri…

Uma introdução ao teste A/B bayesiano | por Lauri...

Obtenha melhores insights dos seus dados

Rumo à Ciência de Dados

O teste A/B, também divulgado porquê teste de separação, permite que Sua visita nos ajuda a continuar oferecendo o melhor para você! empresas experimentem diferentes versões de uma página da web ou ativo de marketing para mandar qual delas tem melhor desempenho em termos de engajamento do usuário, taxas de cliques e, mais importante, taxas de conversão.

As taxas de conversão — a porcentagem de visitantes que concluem uma ação desejada, porquê fazer uma compra ou assinar um boletim informativo — geralmente são as principais métricas que determinam o sucesso de campanhas on-line. Ao testar cuidadosamente as variações de uma página da web, as empresas podem tomar decisões baseadas em dados que melhoram significativamente essas taxas. Seja ajustando a cor de um botão de call-to-action, alterando o título ou reorganizando o layout, o teste A/B fornece insights acionáveis ​​que podem transformar a eficiência da sua presença on-line.

Neste post, mostrarei porquê fazer testes A/B Bayesianos para observar taxas de conversão. Também veremos um exemplo mais complicado, onde veremos as diferenças nas mudanças de comportamento do cliente depois uma mediação. Sua visita nos ajuda a continuar oferecendo o melhor para você! veremos as diferenças ao confrontar esta abordagem a uma abordagem frequentista e quais são as possíveis vantagens ou desvantagens.

Digamos que queremos melhorar nosso site de e-commerce. Fazemos isso expondo dois grupos de clientes a duas versões do nosso site onde, por exemplo, alteramos um botão. Portanto, paramos esse experimento depois termos exposto um perceptível número de visitantes a ambas as versões. Depois disso, obtemos uma matriz binária com 1 indicando conversão e 0 se não houve conversão.

Dados observados depois o teste A/B

Podemos reunir os dados em uma tábua de contingência que nos mostra as frequências (relativas).

contingency = np.array([[obsA.sum(), (1-obsA).sum()], [obsB.sum(), (1-obsB).sum()]])
Tábua de Contingência

No nosso caso, mostramos cada variação para 100 clientes. Na primeira variação, 5 (ou 5%) converteram, e na segunda variação, 3 converteram.

Formato Frequentista

Faremos um teste estatístico para medir se esse resultado é significativo ou devido ao casualidade. Nesse caso, usaremos um teste Chi2 que compara as frequências observadas com as que seriam esperadas se não houvesse diferenças verdadeiras entre as duas versões (a hipótese nula). Para mais informações, pode-se consultar levante blog postagem que entra em mais detalhes.

Nesse caso, o valor de p não fica inferior do limite de significância (por exemplo, 5%) e, portanto, não podemos rejeitar a hipótese nula de que as duas variantes diferem em seu efeito na taxa de conversão.

Agora, há algumas armadilhas ao usar o teste Chi2 que podem tornar os insights obtidos com ele errôneos. Primeiro, ele é muito sensível ao tamanho da modelo. Com um tamanho de modelo grande, mesmo pequenas diferenças se tornarão significativas, enquanto com um tamanho de modelo pequeno, o teste pode falhar em detectar diferenças. Leste é mormente o caso se as frequências esperadas calculadas para qualquer um dos campos forem menores que cinco. Neste caso, é preciso usar qualquer outro teste. Ou por outra, o teste não fornece informações sobre a magnitude ou significância prática da diferença. Ao conduzir vários testes A/B simultaneamente, a verosimilhança de encontrar pelo menos um resultado significativo devido ao casualidade aumenta. O teste Chi2 não considera esse problema de comparações múltiplas, o que pode levar a falsos positivos se não for controlado adequadamente (por exemplo, por meio da correção de Bonferroni).

Outra embuste generalidade ocorre ao interpretar os resultados do teste Chi2 (ou qualquer teste estatístico para esse tópico). O valor p nos dá a verosimilhança de observar os dados, oferecido que a hipótese nula é verdadeira. Ele não faz uma enunciação sobre a distribuição das taxas de conversão ou sua diferença. E levante é um grande problema. Não podemos fazer declarações porquê “a verosimilhança de que a taxa de conversão da versão B seja 2% é X%” porque para isso precisaríamos da distribuição de verosimilhança da taxa de conversão (condicionada aos dados observados).

Essas armadilhas destacam a preço de entender as limitações do teste Chi2 e usá-lo apropriadamente dentro de suas restrições. Ao empregar esse teste, é crucial complementá-lo com outros métodos estatísticos e estudo contextual para prometer conclusões precisas e significativas.

Formato Bayesiana

Depois de estudar a maneira frequentista de mourejar com o teste A/B, vamos estudar a versão bayesiana. Cá, estamos modelando o processo de geração de dados (e, portanto, a taxa de conversão) diretamente. Ou seja, estamos especificando uma verosimilhança e um prior que podem levar ao resultado observado. Pense nisso porquê especificar uma “história” de porquê os dados podem ter sido criados.

Fórmula de Bayes

Neste caso, estou usando o pacote Python PyMC para modelagem, pois tem uma sintaxe clara e concisa. Dentro da enunciação ‘with’, especificamos distribuições que podemos combinar e que dão origem a um processo de geração de dados.

with pm.Model() as ConversionModel:
# priors
pA = pm.Uniform('pA', 0, 1)
pB = pm.Uniform('pB', 0, 1)

delta = pm.Deterministic('delta', pA - pB)

obsA = pm.Bernoulli('obsA', pA, observed=obsA)
obsB = pm.Bernoulli('obsB', pB, observed=obsB)

trace = pm.sample(2000)

Temos pA e pB que são as probabilidades de conversão nos grupos A e B, respectivamente. Com pm.Uniform, especificamos nossa crença prévia sobre esses parâmetros. É cá que poderíamos codificar o conhecimento prévio. No nosso caso, estamos sendo neutros e permitindo que qualquer taxa de conversão entre 0 e 1 seja também provável.

O PyMC portanto nos permite extrair amostras da distribuição ulterior, que é nossa crença atualizada sobre os parâmetros depois ver os dados. Agora obtemos uma distribuição de verosimilhança completa para as probabilidades de conversão.

Distribuições posteriores para taxas de conversão

A partir dessas distribuições, podemos ler diretamente quantidades de interesse, porquê intervalos confiáveis. Isso nos permite responder perguntas porquê “Qual é a verosimilhança de uma taxa de conversão entre X% e Y%?”.

A abordagem bayesiana permite muito mais flexibilidade, porquê veremos mais tarde. Interpretar os resultados também é mais direto e intuitivo do que no cenário frequentista.

Agora, veremos um exemplo mais complicado de teste A/B. Digamos que expomos os sujeitos a alguma mediação no início do período de reparo. Esta seria a segmento A/B em que um grupo recebe a mediação A e o outro a mediação B. Portanto, olhamos para a interação dos 2 grupos com nossa plataforma nos próximos 100 dias (talvez um tanto porquê o número de logins). O que podemos ver é o seguinte.

Agora queremos saber se esses dois grupos mostram uma diferença significativa em sua resposta à mediação. Uma vez que resolveríamos isso com um teste estatístico? Francamente, não sei. Alguém teria que inventar um teste estatístico para exatamente esse cenário. A selecção é voltar novamente para uma forma bayesiana, onde primeiro criaremos um processo de geração de dados. Assumiremos que cada quidam é independente e suas interações com a plataforma são normalmente distribuídas. Eles têm um ponto de troca onde mudam seu comportamento. Esse ponto de troca ocorre exclusivamente uma vez, mas pode suceder a qualquer momento. Antes do ponto de troca, assumimos uma intensidade média de interação de mu1 e depois disso uma intensidade de mu2. A sintaxe pode parecer um pouco complicada, mormente se você nunca usou PyMC antes. Nesse caso, eu recomendaria verificar o PyMC deles material de aprendizagem.

with pm.Model(coords={
'ind_id': ind_id,
}) as SwitchPointModel:

sigma = pm.HalfCauchy("sigma", beta=2, dims="ind_id")

# draw a switchpoint from a uniform distribution for each individual
switchpoint = pm.DiscreteUniform("switchpoint", lower=0, upper=100, dims="ind_id")

# priors for the two groups
mu1 = pm.HalfNormal("mu1", sigma=10, dims="ind_id")
mu2 = pm.HalfNormal("mu2", sigma=10, dims="ind_id")

diff = pm.Deterministic("diff", mu1 - mu2)

# create a deterministic variable for the
intercept = pm.math.switch(switchpoint < X.T, mu1, mu2)

obsA = pm.Normal("y", muar=intercept, sigma=sigma, observed=obs)

trace = pm.sample()

O padrão pode portanto nos mostrar a distribuição da localização do ponto de Sua visita nos ajuda a continuar oferecendo o melhor para você! muito porquê a distribuição das diferenças antes e depois do ponto de troca.

Podemos estudar mais detalhadamente essas diferenças com um gráfico de floresta.

Podemos ver claramente porquê as diferenças entre o Grupo A (id 0 a 9) e o Grupo B (10 a 19) são muito diferentes, onde o grupo B mostra uma resposta muito maior à mediação.

A Inferência Bayesiana oferece muita flexibilidade quando se trata de modelar situações nas quais não temos muitos dados e onde nos importamos com a incerteza da modelagem. Ou por outra, temos que tornar nossas suposições explícitas e pensar sobre elas. Em cenários mais simples, os testes estatísticos frequentistas são frequentemente mais simples de usar, mas é preciso estar cônscio das suposições que os acompanham.

Todo o código usado neste cláusula pode ser encontrado no meu GitHub. Salvo indicação em contrário, todas as imagens são criadas pelo responsável.

Tags:

Crédito: Manadeira Original

Adriano Pina

Adriano Pina

Análise de Sistemas | SEO e Google Ads | Fundador da Loja Script PHP Aqui & Marca Shoslh de tecnologia

Especialista em transformar ideias em soluções digitais e acelerar o crescimento online.

Deixe um comentário

Tem perguntas? Nos envia sua mensagem 24/7!

(17) 99100-0874

Endereço & Contato

Centro, Interior de São Paulo
E-mail: [email protected]

Links Úteis
BAIXAR APP | SCRIPT PHP AQUI
Certificados
0
    0
    Seu carrinho
    Seu carrinho está vazio

    Usamos cookies para garantir que oferecemos a melhor experiência em nosso site. 

       

    X

    Clique em um de nossos representantes abaixo para conversar no WhatsApp ou envie um email para: 📧 [email protected]

    Precisa de ajuda fale conosco?