No mundo de hoje, é difícil imaginar o desenvolvimento de produtos sem testes A / B. Para iniciar com êxito um produto ou nova funcionalidade, é necessário projetar corretamente A / B, calcular e interpretar seus resultados. Às vezes, precisamos testar para mais de dois grupos. Neste artigo, consideraremos exatamente esse caso - vários testes:
- Falaremos sobre quando e por que realizar vários testes;
- considere os principais métodos de cálculo dos resultados dos testes e os princípios matemáticos nos quais os métodos se baseiam;
- damos exemplos da implementação de software dos métodos; Você pode usar esses exemplos em seus projetos.
Então, vamos começar.

Várias experiências: quando e por quê
Obviamente, qualquer complicação técnica do experimento deve ser justificada por necessidade prática. Isso também se aplica a vários testes. Se o público for dividido em mais de dois subgrupos, a probabilidade de obter um erro do primeiro tipo durante o experimento aumenta exponencialmente:
onde
- o número de subgrupos,
- um determinado nível de significância estatística.
Portanto, ao adicionar apenas um subgrupo adicional ao teste de par usual (
) em um determinado nível padrão
temos a probabilidade de um erro do primeiro tipo
que excede significativamente nossa meta
.
Por que várias experiências se reduzem a precisão dos resultados da pesquisa? Pode haver vários motivos:
- É necessário testar várias alterações e seu efeito cumulativo nas métricas do produto. Um exemplo está mostrando ao usuário na página de serviço dois novos elementos que estão localizados diferentemente um em relação ao outro.
- As alterações só podem ser testadas em um período, pois são interdependentes e sensíveis à sazonalidade semanal. Um exemplo é desativar os canais de publicidade para calcular o efeito da canibalização entre canais.
- O cliente deseja receber uma resposta o mais rápido possível e mais barata, qual das opções deve ser escolhida, economizando ao mesmo tempo o desenvolvimento e a implementação do experimento.
Se nos deparamos com um desses problemas e precisamos calcular a significância estatística para o teste - precisamos considerar a necessidade de correções para vários testes. Sobre o que é e como fazê-lo corretamente, será discutido abaixo.
Várias experiências: recursos de cálculo
Conceitos básicos
Considere o caso geral quando estamos lidando com
hipóteses
,
sobre a igualdade pareada de mediana ou média
subgrupos. Nesse caso, o resultado verdadeiro e o errado são possíveis.
para cada um
hipóteses. Apresente os resultados como um experimento com matriz de confusão:
Assim, rejeitado incorretamente
de
rejeitou hipóteses básicas.
Com base nesses parâmetros, apresentamos dois conceitos importantes de erros, que são controlados durante vários testes:
e
.
Probabilidade de erro do grupo
(Taxa de erro inteligente da família) é a probabilidade de obter pelo menos um erro do primeiro tipo e é determinado pela fórmula:
(Taxa de descoberta falsa) é a expectativa matemática da razão de erros do primeiro tipo para o número total de desvios da hipótese principal:
Considere os métodos de controle desses erros usando o exemplo de um caso de produto padrão.
Descrição do caso
Como um exemplo simples, considere um experimento no qual três grupos de usuários isolados e separados foram mostrados com três opções de página com uma oferta para clicar no botão de chamada de um anúncio. Como métrica básica para simplicidade de cálculo, tomamos o número total de chamadas em cada grupo.
Vejamos como a métrica em estudo mudou:
Fig. 1. O gráfico da dinâmica de pressionar o botão de chamada
Vamos usar o método padrão
para normalizar a distribuição da métrica alvo nas amostras e observar os histogramas e gráficos de intervalo dos valores médios nas amostras:
Fig. 2. O histograma da distribuição dos valores médios nos grupos
Fig. 3. A faixa de valores médios em grupos
A julgar pelos gráficos, o grupo C vence pelo número de cliques no botão de chamada. No entanto, é necessário verificar a significância estatística dos resultados. Para fazer isso, trazemos a métrica estimada para a forma da distribuição normal e usamos o critério t de Student usual para comparação pareada de grupos no experimento e, em seguida, usando métodos de controle
e
para contabilizar correções para várias comparações.
Controle FWER
Existem muitos métodos para controlar esse erro, mas dois são os mais comuns:
1) procedimento de uma etapa com ajuste simultâneo
para todas as hipóteses testadas usando o método de Bonferroni;
2) ajuste sequencial e iterativo
c tomada de decisão em cada etapa, de acordo com o resultado do método Hill.
1. Alteração Bonferroni
Este procedimento de uma etapa reduz a probabilidade de um resultado falso positivo da experiência. A essência do método é aceitar uma hipótese alternativa se:
onde
- o número de hipóteses testadas.
O método pode ser implementado simplesmente usando a biblioteca padrão
:
from bootstrapped import bootstrap as bs from bootstrapped import compare_functions as bs_cmp from bootstrapped import stats_functions as bs_st bs_ab_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_B), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_bc_estims = bs.bootstrap_ab(np.array(group_B), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_ac_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4)
Tendo obtido os resultados de uma avaliação estatística, podemos concluir se os grupos diferem ou não.
O principal ponto negativo da abordagem: quanto mais subgrupos, menor o poder do critério, o que aumenta a probabilidade de aceitação da hipótese incorreta. Por exemplo, para dez testes e
precisa obter
dizer que a diferença é significativa. Para nivelar essas deficiências, você pode escolher o método Hill.
2. Método Hill
Este é um procedimento de alteração sequencial descendente.
. Na primeira etapa do algoritmo do método, real
ordenado ascendente:
então o original
-level:
após o qual a condição é verificada
e conclui se a hipótese principal é verdadeira
.
Ponto de interrupção do algoritmo - momento i em que a primeira hipótese principal é aceita
e todas as subseqüentes
.
Você pode implementar esse método usando o procedimento
da biblioteca
com parâmetro
:
from bootstrapped import bootstrap as bs from bootstrapped import stats_functions as bs_st from scipy.stats import ttest_ind from statsmodels.sandbox.stats.multicomp import multipletests bs_a = bs.bootstrap(np.array(group_A), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_b = bs.bootstrap(np.array(group_B), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_c = bs.bootstrap(np.array(group_C), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) stat_ab, p_ab = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_b)) stat_bc, p_bc = stats.ttest_ind(pd.DataFrame(bs_b), pd.DataFrame(bs_c)) stat_ac, p_ac = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_c)) print(sorted([p_ab, p_bc, p_ac])) print("FWER: " + str(multipletests(sorted([p_ab, p_bc, p_ac]), alpha=0.05, method='holm', is_sorted = True)))
Controle FDR
Controlar
significa que a condição está satisfeita
. Ao mesmo tempo
, ou seja, a probabilidade de obter um erro de primeira ordem no controle
declinando.
Método Benjamini-Hochberg
Este procedimento de baixo para cima envolve uma mudança seqüencial.
ascendente pré-classificado:
Então fonte
-level é ajustado pela fórmula:
então, como no método Holm, a condição é verificada
e conclui se a hipótese principal é verdadeira
e todos subsequentes
.
O método Benjamini-Hochberg, bem como o método Holm, podem ser implementados usando o procedimento
:
print("FDR: " + str(multipletests([p_ab, p_bc, p_ac], alpha=0.05, method='fdr_bh', is_sorted = False)))
Conclusão
No artigo, falamos sobre os principais métodos para avaliar os resultados de vários testes e fornecemos exemplos de código de programa que implementa esses métodos. Esperamos que você tenha passado algum tempo com benefícios e interesses e possa colocar em prática os procedimentos descritos. E se você tiver alguma dúvida, teremos o maior prazer em responder.
Obrigado pela atenção!