Estatística

Efeito de Arrasto entre Testes A/B: o resíduo do anterior

O efeito de arrasto entre testes A/B contamina o próximo experimento nos mesmos baldes. Medimos 93% de falso positivo num A/A e a correção que zera isso.

Ilustração plana de uma trilha de pegadas atravessando uma superfície clara de areia, nítidas e fundas à esquerda e cada vez mais apagadas até quase desaparecerem à direita

Quando o segundo teste reaproveita os mesmos baldes do primeiro, o resíduo do primeiro entra na leitura do segundo como se fosse efeito. Na simulação deste artigo, um teste A/A rodado logo depois de um experimento que deixou o grupo de tratamento 0,60 ponto percentual abaixo acusou resultado significante em 93,30 por cento das réplicas, contra os 5 por cento nominais. Com re-sorteio dos usuários a cada experimento, a mesma medição voltou para 4,47 por cento. O problema não está na estatística nem no volume de tráfego: está em quem foi sorteado para onde, e quando. Este guia mostra por que o sistema de baldes cria o problema, mede quanto tempo o resíduo sobrevive, prova que a verificação de SRM não pega isso, e descreve a correção. Faz parte do nosso guia completo de teste A/B e complementa teste A/A para validar o setup e efeito novidade.

O sistema de baldes e o preço da conveniência

Plataformas grandes não sorteiam o usuário direto para o experimento. Elas sorteiam o usuário uma vez para um balde, e depois alocam baldes aos experimentos. Kohavi, Deng, Frasca, Longbotham, Walker e Xu descrevem o desenho e a vantagem dele: é flexível e permite o reuso fácil de usuários em experimentos subsequentes. O mesmo grupo descreve, no artigo sobre a plataforma do Bing em escala, o mecanismo de isolamento que roda em cima disso: uma linha numérica, equivalente às camadas do Google, garante que um usuário fique em um único experimento por linha, com a atribuição feita por um hash pseudoaleatório de um identificador anônimo.

A conveniência é real. O custo também. Se o sorteio não se repete a cada experimento, quem estava no tratamento ontem tende a estar no tratamento de novo hoje, e carrega junto tudo que o teste anterior fez com ele: o hábito que criou, a frustração que causou, o cadastro que completou, o carrinho que abandonou.

Por que reusar o balde faz o resíduo do teste anterior virar efeito do teste novoDiagrama em duas faixas horizontais. Na faixa de cima, chamada teste 1, uma fileira de baldes numerados está pintada em duas cores alternadas: baldes claros no controle e baldes escuros no tratamento, e os escuros levam uma marca indicando que aquele grupo foi afetado. Na faixa de baixo, chamada teste 2, aparecem dois cenários. À esquerda, reusando o mesmo hash, os mesmos baldes escuros caem de novo no mesmo braço e a marca vem junto, concentrada em um lado. À direita, com re-sorteio, os baldes marcados aparecem espalhados nos dois braços, e as marcas ficam distribuídas de forma equilibrada entre controle e tratamento.Teste 1: metade dos baldes vai para o tratamento e sai marcadaescuro = passou pelo tratamento e ficou marcadoTeste 2, mesmo hashcontrolevariaçãotodas as marcas de um lado sóo resíduo vira “efeito”Teste 2, hash novocontrolevariaçãomarcas divididas entre os dois braçoso resíduo vira ruído comumO resíduo não some com o re-sorteio. Ele deixa de se concentrar em um dos braços, que é o que importa.
A correção não faz o efeito do teste anterior desaparecer. Ela distribui esse efeito igualmente entre controle e variação, que é onde ele para de virar viés.

O resultado clássico está no artigo de Kohavi, Deng, Frasca, Longbotham, Walker e Xu: um experimento rodou e as métricas não relacionadas à mudança se moveram em direções inesperadas, com significância estatística alta. Ao rodar de novo numa amostra maior, muitos desses efeitos simplesmente sumiram. A explicação era o arrasto.

Quanto tempo o resíduo sobrevive

Os autores relatam duas medições. Na primeira, o experimento foi rodado em três estágios: 7 dias de A/A nos baldes, 47 dias de A/B ligado, e depois mais de três semanas monitorando os mesmos baldes com o experimento já desligado. O efeito de arrasto no critério principal, sessões por usuário, era visível e parece morrer por volta da terceira semana depois do fim do experimento. Na segunda, um bug expôs os usuários do tratamento a uma experiência muito ruim: mesmo depois de três meses, os baldes ainda não tinham voltado aos níveis anteriores ao experimento.

Simulamos essa dinâmica para poder medir o efeito sobre a decisão. O desenho: 1.000 baldes de 60 usuários cada, 60.000 usuários por leitura, taxa base de 5 por cento, um teste 1 que deixou o grupo de tratamento 0,60 ponto percentual abaixo, e um resíduo que decai com meia-vida de 14 dias. Depois disso, um teste 2 é rodado como A/A puro, ou seja, sem nenhum efeito real, e medimos quantas vezes ele acusa significância. São 3.000 réplicas por linha, com erro-padrão de Monte Carlo de 0,40 ponto percentual em torno de 5 por cento.

descanso entre os testes resíduo naquele dia reusando o balde: falso positivo lift medido médio com re-sorteio: falso positivo
0 dia -0,6000 pp 93,30% -0,6032 pp 4,47%
7 dias -0,4243 pp 67,93% -0,4196 pp 4,87%
14 dias -0,3000 pp 39,87% -0,2982 pp 4,90%
21 dias -0,2121 pp 23,10% -0,2155 pp 5,13%
28 dias -0,1500 pp 13,90% -0,1496 pp 6,00%
42 dias -0,0750 pp 7,03% -0,0743 pp 4,97%
60 dias -0,0308 pp 5,07% -0,0292 pp 4,47%
90 dias -0,0070 pp 4,77% -0,0055 pp 5,43%

Duas leituras saem daí.

A primeira: descanso funciona, mas é caro demais. Três semanas de espera ainda deixavam o falso positivo em 23,10 por cento, quase cinco vezes o nominal. Só com 60 dias de balde parado a leitura voltou ao lugar. Poucos times têm capacidade de tráfego para dar dois meses de férias a metade da base entre um teste e outro.

A segunda: re-sortear resolve independentemente do descanso. A coluna da direita fica entre 4,47 e 6,00 por cento em todas as linhas, inclusive com descanso zero. É a diferença entre esperar o problema passar e desmontar o problema.

Falso positivo de um teste A/A conforme o tempo de descanso entre experimentosGráfico de linhas com o tempo de descanso em dias no eixo horizontal, de zero a noventa, e a taxa de falso positivo de um teste A/A no eixo vertical, de zero a cem por cento. A linha escura, que representa o reuso dos mesmos baldes, começa em 93,3 por cento com descanso zero, cai para 67,9 por cento em sete dias, 39,9 em catorze, 23,1 em vinte e um, 13,9 em vinte e oito, 7,0 em quarenta e dois e só encosta nos 5 por cento nominais aos sessenta dias. A linha clara, que representa o re-sorteio dos usuários a cada experimento, fica praticamente colada na linha dos 5 por cento em todos os pontos. Uma linha tracejada horizontal marca o nível nominal de 5 por cento.Falso positivo de um A/A depois de um experimento que machucou o tratamentonominal 5%93,3%67,9%39,9%23,1%13,9%7,0%014286090dias de descanso entre os dois testesreusando o mesmo hash de baldere-sorteando a cada experimento
A linha clara é uma reta em 5 por cento. Nenhum tempo de espera compra o que uma semente de hash nova entrega de graça.

Um exemplo trabalhado, com a calculadora

Este é um único teste A/A rodado imediatamente depois do experimento anterior, sem nenhum descanso, sobre os mesmos baldes:

Colando esses números na calculadora de significância, o veredito é:

Um valor-p de 0,001404 num teste onde as duas variações são idênticas. Nada foi mudado. Nenhum código foi implantado. A conclusão que sai desse painel, se ninguém souber o que aconteceu antes, é que a variação derrubou a conversão em 11 por cento.

Rode você mesmo os números na calculadora abaixo:

Calculadora de significância estatística
Controle (A)
Variação (B)
Controle (A) · Taxa-
Variação (B) · Taxa-
Melhora relativa-
valor-p-
IC 95% da diferença-

Teste z bilateral de duas proporções. "Sem significância" quase sempre quer dizer que falta amostra, não que as versões são iguais.

O SRM não pega isso

A verificação de proporção de amostra é a defesa padrão contra sorteio quebrado, e é uma boa defesa: ver SRM e divisão desigual de tráfego. Ela simplesmente não é a defesa para este problema.

Rodando o teste de qui-quadrado sobre a divisão do exemplo acima:

verificação resultado
visitantes em A 30.000
visitantes em B 30.000
divisão esperada 50/50
estatística de qui-quadrado 0,0000
valor-p do SRM 1,0000
desvio detectado não

O sorteio está perfeito. A contagem está perfeita. O problema não é quantos usuários caíram em cada braço, é quais. Nenhum verificador de proporção enxerga isso, porque a informação que denuncia o arrasto não está nas contagens do teste atual, está no histórico de quem esteve onde no teste anterior.

Esse é o mesmo tipo de armadilha de Bom demais para ser verdade e a lei de Twyman: um resultado forte demais em métricas que nem deveriam ter se mexido é sinal de problema de medição, não de descoberta.

O que acontece com um teste que tem efeito de verdade

O caso do A/A é didático, mas o dano real aparece quando existe um efeito genuíno para medir e o arrasto o distorce. Rodamos o mesmo desenho com um efeito real de +4 por cento relativo, ou seja, +0,20 ponto percentual, 3.000 réplicas por linha:

descanso reusando: taxa de resultado significante lift medido médio re-sorteando: taxa significante lift medido médio
0 dia 63,33% -0,4051 pp 19,07% +0,1931 pp
7 dias 25,53% -0,2274 pp 21,33% +0,2027 pp
14 dias 8,57% -0,0977 pp 19,00% +0,1950 pp
21 dias 4,53% -0,0167 pp 20,53% +0,1981 pp
28 dias 6,10% +0,0516 pp 20,83% +0,2015 pp
60 dias 16,27% +0,1698 pp 19,23% +0,1946 pp

Leia a coluna do lift medido com atenção. O efeito real é de +0,20 ponto percentual. Com descanso zero e baldes reusados, o teste mede -0,4051, ou seja, sinal trocado. E os 63,33 por cento de resultados significantes não são vitórias: são condenações. Em quase dois terços das réplicas, uma variação que de fato melhora a conversão é declarada perdedora com significância estatística.

Repare também na linha de 21 dias, onde a taxa de significância cai para 4,53 por cento. Não é uma boa notícia: é o ponto em que o resíduo negativo cancela quase exatamente o efeito positivo real, e o teste conclui empate sobre uma melhoria que existe. O arrasto não empurra o resultado sempre para um lado, ele empurra para o lado do teste anterior.

A coluna do re-sorteio, em contraste, mede entre +0,1931 e +0,2027 ponto percentual em todos os intervalos, com o efeito real de +0,2000 no meio da faixa.

A correção: re-aleatorização localizada

A causa raiz, na formulação dos autores do Bing, é direta: o sistema de baldes não re-sorteia a cada experimento. Ele depende de uma reatribuição infrequente dos baldes, e entre uma reatribuição e outra a alocação fica constante por um período relativamente longo.

Trocar a função de hash resolve, mas tem um custo operacional pesado: o sistema de baldes acopla todos os experimentos de uma mesma linha, então trocar a função exige parar todos os experimentos daquela linha, o que machuca capacidade e agilidade.

A alternativa que eles descrevem é um sistema de baldes em dois níveis:

  1. O nível de cima define quais unidades entram no experimento.
  2. A atribuição de tratamento acontece no nível de baixo, com uma semente de hash diferente para cada experimento.

Isso garante um sorteio por experimento, de modo que a atribuição de tratamento fica independente de qualquer evento histórico, incluindo o arrasto de experimentos anteriores.

O custo declarado por eles é um só, e é importante: não dá para usar um controle compartilhado. Cada experimento precisa do próprio controle, para que qualquer resíduo de um experimento anterior fique misturado entre controle e tratamento em vez de concentrado num lado.

Em troca vem um benefício que compensa bem. Com re-aleatorização localizada, dá para rodar um teste A/A retrospectivo sem gastar tempo de calendário: você troca a função de hash e reavalia os últimos dias antes do experimento como se fossem um A/A. Pela propriedade de independência da re-aleatorização localizada, comparar retrospectivamente os usuários que teriam sido atribuídos a controle e tratamento em qualquer período anterior ao experimento é um A/A legítimo. Se esse A/A mostra efeito nas métricas principais, com valor-p abaixo de 0,2 por exemplo, por conta de uma divisão azarada, troca-se a chave de hash e tenta de novo, antes de gastar um dia de tráfego.

Sistema de baldes em dois níveis com semente de hash por experimentoDiagrama de fluxo em três colunas. Na coluna da esquerda, uma caixa chamada nível 1 recebe todos os usuários e seleciona quais entram no experimento, usando um hash estável que não muda entre experimentos. Uma seta leva à coluna do meio, uma caixa chamada nível 2, onde a atribuição de controle ou tratamento acontece usando uma semente de hash específica daquele experimento. Duas setas saem dela para a coluna da direita, uma para controle e outra para tratamento, e uma anotação diz que como a semente muda a cada experimento, o resíduo do experimento anterior cai igualmente nos dois braços. Abaixo, uma nota registra o custo: cada experimento precisa do seu próprio controle.A semente de hash muda por experimento, só no segundo nívelnível 1: elegibilidadehash estável, define quementra no experimentonível 2: atribuiçãosemente de hash PRÓPRIAde cada experimentocontrole deste experimentotratamentoComo a semente muda, o resíduo do experimento anterior cai igualmente nos dois braços deste.Custo declarado pelos autoresCada experimento precisa do próprio controle. Não dá para compartilhar um controle entre vários.Benefício que compensaTeste A/A retrospectivo sem gastar calendário: reavalie os dias anteriores com a nova semente.
O nível 1 responde “quem participa”, o nível 2 responde “em qual braço”. Só o segundo precisa mudar de semente a cada experimento.

O que fazer se você não controla a plataforma

Nem todo time pode reescrever o sistema de atribuição da ferramenta que usa. O que sobra, em ordem de preferência:

  1. Verifique se a sua ferramenta já re-sorteia por experimento. Muita ferramenta moderna faz o hash com uma combinação de identificador do usuário e identificador do experimento, o que é exatamente a re-aleatorização localizada. Se for o caso, o problema não existe para você e vale confirmar isso por escrito, não por suposição.
  2. Rode um A/A retrospectivo antes de cada teste. Pegue os dias anteriores, aplique a divisão que o teste novo vai usar e verifique se as métricas principais empatam. É o teste que teria pego o caso de 93,30 por cento na primeira tentativa.
  3. Trate valor-p abaixo de 0,2 no A/A como sinal amarelo, não como aprovação. O critério é dos próprios autores do Bing e é deliberadamente frouxo, porque o custo de um falso alarme aqui é trocar uma chave de hash, e o custo de deixar passar é um trimestre de decisão errada.
  4. Registre no relatório qual experimento rodou antes naqueles baldes. Sem esse registro, ninguém consegue nem levantar a hipótese de arrasto quando o resultado sair estranho.
  5. Desconfie de métricas que se moveram sem motivo. Se a mudança foi no rodapé e a métrica de busca se mexeu com significância alta, a hipótese principal não é uma descoberta.
  6. Descanso é o último recurso, e você precisa dimensioná-lo. Na nossa simulação, 21 dias ainda deixavam 23,10 por cento de falso positivo. Se for esperar, espere de verdade e meça com um A/A antes de voltar a testar.

Faça isso automático na Donnu

Arrasto é um problema de arquitetura de sorteio, não de análise. Na Donnu a atribuição de cada experimento sai de um hash que combina o identificador do usuário com o identificador daquele experimento, então dois testes seguidos nunca herdam a mesma divisão: quem foi tratado ontem se espalha entre controle e variação hoje. O painel também guarda quais experimentos rodaram antes sobre a mesma população, para que a hipótese de arrasto seja a primeira coisa que alguém consegue checar quando uma métrica não relacionada se mexe. Se a sua ferramenta atual sorteia o usuário uma vez e reaproveita a divisão, esse é o item que precisa mudar antes de qualquer refinamento estatístico valer alguma coisa.

Perguntas frequentes

As respostas curtas estão na seção de perguntas frequentes desta página, geradas a partir do mesmo material medido aqui.

Referências

Leia também

Read in English

Perguntas frequentes

O que é efeito de arrasto entre testes A/B?
É quando os mesmos usuários que foram afetados pelo primeiro experimento são reaproveitados no experimento seguinte, e o resíduo do primeiro contamina a leitura do segundo. O termo vem do sistema de baldes usado por plataformas grandes: os usuários são sorteados uma vez em baldes, e os baldes é que vão sendo alocados de experimento para experimento. Como o sorteio não se repete a cada teste, quem esteve no tratamento ontem tende a estar no tratamento de novo hoje, carregando junto tudo que o teste anterior fez com ele.
Quanto tempo o efeito de arrasto dura?
Mais do que a intuição sugere. Kohavi e coautores registram dois casos no Bing: num deles, um experimento de 47 dias deixou um resíduo mensurável nos mesmos baldes por cerca de três semanas depois de desligado; no outro, um bug que expôs os usuários a uma experiência muito ruim deixou os baldes sem voltar aos níveis anteriores mesmo depois de três meses. Na simulação deste artigo, com meia-vida de 14 dias, a taxa de falso positivo de um teste A/A só voltou ao patamar nominal de 5 por cento depois de 60 dias de descanso.
O teste A/A pega o efeito de arrasto?
Pega, e é a principal defesa disponível quando você não pode re-sortear. Na nossa simulação, um teste A/A rodado imediatamente depois de um experimento que deixou o tratamento 0,60 ponto percentual abaixo acusou resultado significante em 93,30 por cento das réplicas, contra os 5 por cento esperados. Um único A/A desses devolveu 4,8800 por cento contra 4,3333 por cento, com valor-p de 0,001404 e intervalo de confiança de menos 0,8821 a menos 0,2112 ponto percentual: um resultado forte e completamente falso.
A verificação de SRM não detecta esse problema?
Não, e essa é a parte perigosa. O SRM procura desvio na PROPORÇÃO de usuários entre os braços, e no efeito de arrasto a divisão está perfeita. No nosso exemplo trabalhado, os dois braços receberam exatamente 30.000 usuários e o teste de qui-quadrado devolveu estatística 0,0000 e valor-p 1,0000. O sorteio está certo, a contagem está certa, e mesmo assim a leitura está errada. Nenhum verificador de proporção vai levantar a mão aqui.
Qual é a correção definitiva do efeito de arrasto?
Re-sortear os usuários a cada experimento, o que Kohavi e coautores chamam de re-aleatorização localizada. A implementação descrita por eles é um sistema de baldes em dois níveis, em que o primeiro nível define quem entra no experimento e o segundo faz a atribuição de tratamento com uma semente de hash diferente por experimento. Na nossa simulação, com re-sorteio a taxa de falso positivo ficou entre 4,47 e 6,00 por cento em todos os intervalos de descanso testados, incluindo descanso zero.
Qual é o custo de re-sortear a cada experimento?
Você perde o controle compartilhado. Kohavi e coautores registram essa desvantagem de forma explícita: com re-aleatorização por experimento, cada experimento precisa do seu próprio controle, para que qualquer resíduo do experimento anterior fique misturado igualmente entre controle e tratamento. Em compensação, aparece um ganho que compensa bem: dá para rodar um teste A/A retrospectivo sem gastar tempo de calendário, reavaliando os últimos dias antes do experimento como se fossem um A/A. Se esse A/A acusar efeito nas métricas principais, com valor-p abaixo de 0,2 por exemplo, troca-se a chave de hash e tenta de novo.