Sou desenvolvedor de software que trabalha em sistemas de teste A / B. Não tenho um histórico sólido de estatísticas, mas venho adquirindo conhecimento nos últimos meses.
Um cenário de teste típico envolve a comparação de dois URLs em um site. Um visitante visita LANDING_URL
e é encaminhado aleatoriamente para um URL_CONTROL
ou outro URL_EXPERIMENTAL
. Um visitante constitui uma amostra e uma condição de vitória é alcançada quando o visitante executa alguma ação desejável nesse site. Isso constitui uma conversão e a taxa de taxas de conversão é a taxa de conversão (normalmente expressa em porcentagem). Uma taxa de conversão típica para um determinado URL é algo entre 0,01% e 0,08%. Executamos testes para determinar como novos URLs se comparam com URLs antigos. Se URL_EXPERIMENTAL
for mostrado um desempenho superior URL_CONTROL
, substituímos URL_CONTROL
por URL_EXPERIMENTAL
.
Nós desenvolvemos um sistema usando técnicas simples de teste de hipóteses. Usei as respostas para outra pergunta CrossValidated aqui para desenvolver este sistema.
Um teste é configurado da seguinte maneira:
- A estimativa
CRE_CONTROL
da taxa de conversãoURL_CONTROL
é calculada usando dados históricos. - A taxa
CRE_EXPERIMENTAL
de conversão desejada desejada deURL_EXPERIMENTAL
está definida. - Um nível de significância de 0,95 é normalmente usado.
- Uma potência de 0,8 é normalmente usada.
Juntos, todos esses valores são usados para calcular o tamanho de amostra desejado. Estou usando a função R power.prop.test
para obter esse tamanho de amostra.
Um teste será executado até que todas as amostras sejam coletadas. Neste ponto, os intervalos de confiança para CR_CONTROL
e CR_EXPERIMENTAL
são calculados. Se eles não se sobrepõem, um vencedor pode ser declarado com nível de significância de 0,95 e poder de 0,8.
Os usuários de nossos testes têm duas preocupações principais:
1. Se, em algum momento do teste, forem coletadas amostras suficientes para mostrar um vencedor claro, o teste não poderá ser interrompido?
2. Se nenhum vencedor for declarado no final do teste, podemos executá-lo por mais tempo para ver se podemos coletar amostras suficientes para encontrar um vencedor?
Deve-se notar que existem muitas ferramentas comerciais que permitem que seus usuários façam exatamente o que nossos próprios usuários desejam. Eu li que existem muitas falácias com o exposto acima, mas também me deparei com a idéia de uma regra de parada e gostaria de explorar a possibilidade de usar essa regra em nossos próprios sistemas.
Aqui estão duas abordagens que gostaríamos de considerar:
1. Usando power.prop.test
, compare as taxas de conversão medidas atuais com o número atual de amostras e verifique se foram coletadas amostras suficientes para declarar um vencedor.
Exemplo: Um teste foi configurado para verificar se o seguinte comportamento existe em nosso sistema:
CRE_CONTROL
: 0,1CRE_EXPERIMENTAL
: 0,1 * 1,3- Com esses parâmetros, o tamanho da amostra
N
é 1774.
No entanto, à medida que o teste avança e atinge 325 amostras, CRM_CONTROL
(taxa de conversão medida para controle) é 0,08 e CRM_EXPERIMENTAL
é 0,15. power.prop.test
é executado nessas taxas de conversão e N
é 325. Exatamente o número de amostras necessárias para declarar CRM_EXPERIMENTAL
o vencedor! Neste ponto, esperamos que o teste seja encerrado. Da mesma forma, se o teste atingir 1774 amostras, mas nenhum vencedor for encontrado, mas atingir 2122 amostras, o suficiente para mostrar que CRM_CONTROL
0,1 e CRM_EXPERIMENTAL
0,128 é um resultado em que um vencedor pode ser declarado.
Em uma pergunta relacionada, os usuários informaram que esse teste é menos credível devido ao incentivo a paradas precoces com menos amostras e também à vulnerabilidade ao viés de estimativa e a um número aumentado de erros de Tipo I e Tipo II. Existe alguma maneira de fazer essa regra de parada funcionar? Essa é a nossa abordagem preferida, pois significa menos tempo de programação para nós. Talvez essa regra de parada funcione oferecendo algum tipo de pontuação ou pontuação numérica que mede a credibilidade do teste, caso seja interrompido mais cedo?
2. Usando análise sequencial ou SPRT .
Esses métodos de teste são projetados exatamente para a situação em que nos encontramos: como nossos usuários podem iniciar um teste e finalizá-lo de forma que não percam tempo demais nos testes? Executar um teste por muito tempo ou ter que iniciar um teste novamente com parâmetros diferentes.
Dos dois métodos acima, sou a favor do SPRT porque a matemática é um pouco mais fácil de entender e porque parece que pode ser mais fácil programar. No entanto, não entendo como usar a função de probabilidade neste contexto. Se alguém pudesse construir um exemplo de como calcular a razão de verossimilhança, a soma cumulativa da razão de verossimilhança e continuar com um exemplo que ilustra uma situação em que alguém continuaria monitorando, quando aceitaria a hipótese nula e a hipótese alternativa, isso nos ajudaria a determinar se o SPRT é o caminho certo a seguir.