Múltiplas Experiências: Teoria e Prática

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:

1(1 alpha)n,


onde n- o número de subgrupos,  alpha- um determinado nível de significância estatística.
Portanto, ao adicionar apenas um subgrupo adicional ao teste de par usual ( n=3) em um determinado nível padrão  alpha=0,05temos a probabilidade de um erro do primeiro tipo p=0,14que excede significativamente nossa meta  alpha=0,05.

Por que várias experiências se reduzem a precisão dos resultados da pesquisa? Pode haver vários motivos:

  1. É 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.
  2. 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.
  3. 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 nhipóteses H0i, i=1,...,nsobre a igualdade pareada de mediana ou média msubgrupos. Nesse caso, o resultado verdadeiro e o errado são possíveis. H0iVSH1ipara cada um i=1,...,nhipóteses. Apresente os resultados como um experimento com matriz de confusão:

H0inão rejeitadoH0irejeitadoTotal

H0iverdade

UVn0
H0ierradoTSn1
TotalkRRn


Assim, rejeitado incorretamente Vde Rrejeitou hipóteses básicas.

Com base nesses parâmetros, apresentamos dois conceitos importantes de erros, que são controlados durante vários testes: FWERe Fdr.

Probabilidade de erro do grupo FWER(Taxa de erro inteligente da família) é a probabilidade de obter pelo menos um erro do primeiro tipo e é determinado pela fórmula:

FWER=p(V>0).



Fdr(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:

FDR=E(V/R|R>0).



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 bootstrappara 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 FWERe Fdrpara 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 pvalorpara todas as hipóteses testadas usando o método de Bonferroni;

2) ajuste sequencial e iterativo pvalorc 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:

p alpha/n,


onde n- o número de hipóteses testadas.

O método pode ser implementado simplesmente usando a biblioteca padrão bootstrapped:

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 αi=0,05precisa obter pi5103dizer 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. pvalor. Na primeira etapa do algoritmo do método, real pvalorordenado ascendente:

p1···pn,


então o original  alpha-level:

 alphai= alpha/(ni+1),


após o qual a condição é verificada pi alphaie conclui se a hipótese principal é verdadeira H0i.

Ponto de interrupção do algoritmo - momento i em que a primeira hipótese principal é aceita H0ie todas as subseqüentes H0j,j>i.
Você pode implementar esse método usando o procedimento multipletestes()da biblioteca statsmodelscom parâmetro method="holm":

 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 Fdrsignifica que a condição está satisfeita FDR=E(V/R)< alpha. Ao mesmo tempo FDRFWER, ou seja, a probabilidade de obter um erro de primeira ordem no controle Fdrdeclinando.

Método Benjamini-Hochberg


Este procedimento de baixo para cima envolve uma mudança seqüencial. pvalorascendente pré-classificado:

p1···pn.


Então fonte α-level é ajustado pela fórmula:

 alphai=i· alpha/n,


então, como no método Holm, a condição é verificada pi alphaie conclui se a hipótese principal é verdadeira H0ie todos subsequentes H0j,j>i.

O método Benjamini-Hochberg, bem como o método Holm, podem ser implementados usando o procedimento multipletestes():

 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!

Source: https://habr.com/ru/post/pt476826/


All Articles