Estatística

Multi-Armed Bandits x Teste A/B: o Guia Completo

Bandit x teste A/B: quando usar multi-armed bandits em vez do A/B clássico, com Thompson Sampling e um exemplo numérico comparando os dois.

Ilustração de um caça-níquel de três braços ao lado de duas colunas divididas representando um teste A/B, com uma curva de alocação de tráfego ao fundo

Todo mundo que roda testes o bastante esbarra na mesma frustração: enquanto o seu teste A/B ainda está rodando, metade do tráfego continua vendo a variação que, aos poucos, vai ficando claro que é a pior. Isso é o preço combinado de testar com rigor, você paga com “custo de oportunidade” para comprar uma resposta confiável. Só que existe uma família inteira de algoritmos desenhada exatamente para reduzir esse preço: os multi-armed bandits.

Bandit não é um substituto do teste A/B, é uma ferramenta com um objetivo diferente. Este guia explica o que é um bandit, como ele decide para onde mandar cada visitante, quando ele vale mais que um A/B clássico (e quando não vale), e mostra, com números de verdade calculados pelo mesmo motor estatístico que roda as calculadoras deste blog, quanto custa cada abordagem no mesmo cenário. No fim, uma tabela neutra compara o que VWO, Optimizely, Kameleoon e outras ferramentas do mercado realmente publicam sobre o tema, com fonte para cada claim.

O que é um multi-armed bandit

O nome vem de uma imagem antiga de cassino: um “bandido de um braço só” (one-armed bandit) é a máquina caça-níquel clássica, com uma alavanca. Um multi-armed bandit é o problema de decisão de alguém em frente a várias dessas máquinas ao mesmo tempo, cada uma com uma taxa de pagamento desconhecida e possivelmente diferente das outras. A cada jogada, você escolhe uma máquina, puxa a alavanca e observa o resultado. O objetivo é simples de enunciar e difícil de resolver bem: maximizar o total ganho ao longo de todas as jogadas, sabendo que quanto mais você joga numa máquina, mais aprende sobre ela, mas também abre mão de jogar nas outras.

Troque “máquina” por “variação da sua página” e “jogada” por “visitante”, e você tem o problema exato que um bandit resolve num teste online. Cada variação (A, B, C…) é um braço. Cada visitante que chega é uma jogada. A “taxa de pagamento” de cada braço é a taxa de conversão real daquela variação, que você não conhece de antemão e só vai estimando com mais precisão conforme o tráfego chega.

A diferença de postura em relação a um teste A/B é sutil, mas muda tudo o que vem depois: um teste A/B trata a fase de coleta de dados e a fase de decisão como duas etapas separadas (primeiro você junta evidência com uma divisão fixa, depois decide). Um bandit trata a coleta e a decisão como a mesma coisa, acontecendo em tempo real, jogada a jogada.

Exploração e explotação num multi-armed banditUm bandit decide a cada visitante entre explorar (mandar tráfego para braços incertos, para aprender mais) e explotar (concentrar tráfego no braço que parece melhor até agora). A proporção entre os dois muda conforme a confiança na estimativa de cada braço cresce.PróximovisitanteBraço Ataxa incertapouco tráfego até agoraBraço Btaxa incertapouco tráfego até agoraBraço Cparece o melhormais tráfego até agoraexplorar (linhas tracejadas)explotar (linha cheia)
Explorar manda uma fatia do tráfego para braços ainda incertos, para aprender mais sobre eles. Explotar concentra tráfego no braço que parece melhor agora. Todo bandit é, no fundo, uma regra para equilibrar os dois ao longo do tempo.

Bandit x teste A/B: a diferença central

Um teste A/B clássico é um experimento de horizonte fixo: você decide, antes de começar, a alocação de tráfego (normalmente 50/50) e o tamanho de amostra necessário, roda até chegar lá, e só então declara um vencedor. A alocação não muda um milímetro entre o primeiro visitante e o último, mesmo que no meio do caminho já esteja claro que uma variação está perdendo feio.

Um bandit realoca o tráfego continuamente. Ele começa perto de uma divisão igualitária (porque, no início, não sabe qual braço é melhor) e vai empurrando mais visitantes para o braço que parece vencer, ao mesmo tempo em que reduz, sem zerar, o tráfego para os braços que parecem perder. A cada nova conversão observada, a estimativa de cada braço é atualizada e a alocação se ajusta de novo.

Isso cria uma troca (trade-off) bem definida, e é o coração deste guia inteiro:

Em outras palavras: A/B otimiza para aprender com rigor; bandit otimiza para ganhar durante o aprendizado. Nenhuma das duas é “melhor” de forma absoluta, elas resolvem problemas diferentes, e escolher a errada para o seu caso custa caro dos dois lados: rodar A/B quando o custo da variação perdedora é alto desperdiça conversão à toa; rodar bandit quando você precisa defender uma decisão formalmente te deixa sem o número que sustenta a defesa.

Como funciona na prática: exploração x explotação

O nome técnico para a troca que todo bandit resolve é exploration/exploitation trade-off (exploração x explotação). Explorar é gastar tráfego em braços sobre os quais você ainda tem pouca certeza, na esperança de descobrir que um deles é, na verdade, o melhor. Explotar é concentrar tráfego no braço que, com a informação disponível até agora, parece o melhor.

Um algoritmo que só explora nunca converge, ele fica jogando às cegas para sempre e desperdiça conversão testando braços ruins indefinidamente. Um algoritmo que só explota (sempre escolhe o braço que parece melhor com base nos primeiros dados) corre o risco de travar cedo demais numa escolha errada, porque os primeiros dados de qualquer braço são ruidosos: um braço genuinamente melhor pode parecer pior nas primeiras dezenas de visitantes, só por acaso, e um algoritmo puramente guloso nunca lhe daria uma segunda chance depois disso. Os três algoritmos clássicos resolvem esse equilíbrio de formas diferentes.

Epsilon-greedy: o mais simples de explicar

O epsilon-greedy reserva uma fatia fixa e pequena de tráfego, chamada epsilon (ε, por exemplo 10%), para exploração pura e aleatória entre todos os braços, e manda o resto (1-ε) sempre para o braço que parece melhor no momento. É fácil de implementar e de explicar, mas tem um defeito estrutural: ele explora do mesmo jeito o tempo todo, gastando os mesmos 10% em braços claramente ruins depois de milhares de visitantes quanto gastava no primeiro dia, quando a incerteza era genuína. Variações do método (como o epsilon decrescente, que reduz ε aos poucos) tentam corrigir isso à mão, mas continuam sendo um ajuste manual, não uma resposta automática à incerteza real de cada braço.

UCB (Upper Confidence Bound): otimismo diante da incerteza

O UCB troca a exploração aleatória por uma regra mais elegante: para cada braço, ele calcula a taxa de conversão estimada mais um bônus de otimismo, proporcional à incerteza sobre aquele braço (quanto menos dados, maior o bônus), e escolhe sempre o braço com o maior valor combinado. Um braço pouco testado ganha um “benefício da dúvida” automático que o torna atrativo mesmo com uma taxa estimada mediana, o que empurra exploração exatamente para onde falta informação, sem precisar de um parâmetro fixo como o ε. Conforme mais dados chegam, o bônus de cada braço encolhe e a escolha converge naturalmente para o de fato melhor.

Thompson Sampling: o padrão de produção bayesiano

O Thompson Sampling é o algoritmo que mais aparece em produção quando a base é bayesiana, exatamente o terreno onde a Donnu já opera. A ideia, explicada sem fórmula: para cada braço, você mantém uma distribuição de probabilidade (o “quão provável é cada taxa de conversão possível daquele braço”, dado o que já foi observado, tipicamente uma distribuição Beta quando a métrica é uma taxa de conversão). A cada novo visitante, o algoritmo sorteia um valor aleatório da distribuição de cada braço e manda o visitante para o braço que sorteou o maior valor. Depois, atualiza a distribuição daquele braço com o resultado observado (converteu ou não), deixando a curva mais estreita e mais precisa.

posterior do braço = Beta(α + conversões, β + visitantes − conversões)

O truque é que essa amostragem aleatória já embute o equilíbrio certo entre explorar e explotar, sem precisar de nenhum parâmetro manual como o ε do epsilon-greedy. Um braço com poucos dados tem uma distribuição larga (muita incerteza), então às vezes o sorteio tira um valor bem alto dele mesmo que a média pareça mediana, e ele acaba recebendo tráfego de exploração de forma orgânica. Um braço com muitos dados e uma taxa claramente ruim tem uma distribuição estreita e baixa, então quase nunca sorteia um valor alto o bastante para ser escolhido, o que reduz o tráfego que vai para ele sem zerá-lo de vez.

Thompson Sampling: sortear das distribuições de cada braçoCada braço tem uma distribuição de crença sobre sua taxa de conversão real. A cada visitante, o algoritmo sorteia um valor de cada distribuição e escolhe o braço com o maior valor sorteado; braços com mais dados têm distribuições mais estreitas.taxa de conversão possívelBraço Apouco dado, largaBraço Balgum dado, médiaBraço Cmuito dado, estreitamaior sorteio, escolhido
Quanto mais estreita a distribuição, mais o braço já provou a que veio. O braço com o maior valor sorteado nesta rodada recebe o próximo visitante; na rodada seguinte, o sorteio pode favorecer outro braço.

Essa é também a razão de o Thompson Sampling se encaixar tão bem num produto que já é bayesiano por padrão: a distribuição de crença sobre cada braço é exatamente o mesmo tipo de objeto que um motor bayesiano de teste A/B já calcula para responder “qual a probabilidade de B ser melhor que A”. Bandit e teste A/B bayesiano compartilham a mesma matemática de fundo; a diferença está no que você faz com ela: decidir tráfego em tempo real, ou reportar uma probabilidade no fim.

Quando usar bandit em vez de A/B (e quando não usar)

A pergunta certa não é “qual é melhor”, é “o que essa decisão específica precisa”. Bandit tende a valer mais quando:

A/B clássico continua sendo a escolha certa quando:

Árvore de decisão: A/B clássico ou bandit?Se o custo de mostrar a variação perdedora é alto e você não precisa de significância formal, use bandit. Se precisa defender a decisão com rigor estatístico ou analisar por segmento depois, use teste A/B, mesmo quando o custo de oportunidade é alto.Mostrar a variação perdedoracusta caro agora?nãosimUse teste A/B clássicoPrecisa de significância formalou análise por segmento depois?simnãoUse A/B, depois automatizecom bandit o que já ganhouUse banditThompson Sampling
Mesmo quando o custo de oportunidade é alto, a necessidade de defender a decisão com rigor formal empurra de volta para o A/B. Muitas equipes maduras usam os dois em sequência: A/B para validar, bandit para otimizar o que já foi validado.

O trade-off que ninguém esconde

Vale repetir com todas as letras, porque é a parte que o marketing de “otimização automática” tende a suavizar: um bandit não produz um vencedor declarado com 95% de confiança da mesma forma que um teste A/B. A documentação da própria Optimizely é direta sobre isso, multi-armed bandit optimizations não geram significância estatística; o algoritmo otimiza o total de conversões realocando tráfego para a variação que está performando melhor no momento, sem analisar formalmente por que uma variação supera a outra, e sem usar um controle ou linha de base no sentido do A/B clássico.

Isso não é um defeito de implementação que algum fornecedor vai corrigir num próximo release, é a natureza do problema que o bandit resolve. Bandit é uma ferramenta de otimização (maximizar o resultado acumulado durante o período de teste); A/B é uma ferramenta de inferência causal (estimar, com uma margem de erro conhecida, se uma mudança específica causa uma melhora específica). São perguntas diferentes, e um bom bandit responde bem à primeira sem responder à segunda.

Na prática, isso importa no momento em que você precisa defender a decisão. “A variação B converteu 30% mais e recebeu a maior parte do tráfego ao longo do teste” é uma frase legítima para um bandit, mas não carrega o mesmo peso de “B converteu 30% mais, com valor-p de 0,003 e intervalo de confiança de 95% entre +0,5 e +2,5 pontos percentuais”, a frase que um teste A/B devidamente dimensionado permite dizer. Se a sua cultura de decisão exige o segundo tipo de frase (para um conselho, um investidor, ou só para o próprio time de produto dormir tranquilo), o bandit sozinho não entrega isso, mesmo que ele tenha, de fato, entregue mais conversão durante o processo.

Um exemplo numérico trabalhado

Para sair da teoria, vamos usar o mesmo motor estatístico que roda as calculadoras deste blog e comparar, com números concretos, o que um teste A/B fixo custa em oportunidade perdida frente a um bandit adaptativo, no mesmo cenário.

O cenário: uma página com 10.000 visitantes por semana, taxa de conversão atual de 5%, e uma variação B que, na realidade (embora você não saiba disso de antemão), converte 6,5%, o mesmo lift de 30% relativo usado como exemplo no guia de significância estatística deste blog. Você quer detectar um efeito mínimo de 10% relativo, com 95% de confiança e 80% de poder, o padrão de mercado.

Rode esses números na calculadora abaixo (ela já está com esse cenário preenchido) e confira o tamanho de amostra e a duração:

Calculadora de tamanho de amostra
-Visitantes por variação
-Total (2 variações)
-Duração estimada

Cálculo por aproximação normal de duas proporções, 2 variações (50/50). Mexa nos campos e veja o impacto ao vivo.

O motor de amostra deste blog (o mesmo de src/lib/stats.ts, sem alterações na matemática congelada) devolve 31.234 visitantes por variação, 62.468 no total, rodando por 44 dias com esse tráfego semanal.

O custo do A/B fixo 50/50

Durante os 44 dias inteiros, metade do tráfego (31.234 visitantes) continua vendo a variação A, mesmo que, bem antes do fim, os dados já estejam apontando para B. Fazendo a conta de conversões esperadas nesse desenho:

Agora, o teto teórico: se todo o tráfego, desde o primeiro visitante, tivesse ido para B (a variação de fato melhor, num cenário hipotético onde você já soubesse disso com certeza absoluta), o resultado seria:

A diferença, ≈ 468 conversões, é o “custo de oportunidade” que o desenho 50/50 fixo paga por sua própria disciplina: ele mantém metade do tráfego na variação inferior do início ao fim, porque a alocação foi decidida antes de qualquer dado chegar e não muda até o teste acabar. É exatamente esse custo que um bandit tenta reduzir.

Uma alocação adaptativa no mesmo cenário

Para ilustrar a lógica (não para simular com exatidão nenhum motor comercial específico, já que a curva real depende do algoritmo, do prior escolhido e da variância observada), vamos dividir os mesmos 44 dias e os mesmos 62.468 visitantes em três fases, com a alocação para B subindo conforme a evidência se acumula:

Fase Dias Visitantes (aprox.) Alocação para B Alocação para A
1: ainda incerto 1 a 11 ~15.617 50% 50%
2: evidência começa a aparecer 12 a 26 ~21.296 65% 35%
3: evidência forte, mas nunca 100% 27 a 44 ~25.555 80% 20%

Somando as duas variações ao longo das três fases: A recebe cerca de 20.374 visitantes e B cerca de 42.095. As conversões esperadas ficam assim:

Comparando os três números lado a lado, com o mesmo tráfego total:

Conversões esperadas: A/B fixo, bandit ilustrativo e teto teóricoCom os mesmos 62.468 visitantes, o A/B fixo 50/50 gera cerca de 3.592 conversões esperadas, um bandit adaptativo ilustrativo cerca de 3.755, e o teto teórico de alocar tudo para a variação vencedora desde o início seria 4.060.conversões esperadas em 62.468 visitantes3.592A/B fixo50/50 o tempo todo3.755Banditilustrativo, adaptativo4.060Teto teóricotudo para B desde o dia 1
O bandit ilustrativo recupera cerca de 35% da diferença entre o A/B fixo e o teto teórico (163 das 468 conversões possíveis), sem nunca chegar ao teto, porque continua explorando A em alguma medida até o fim.

O ponto central deste exemplo não é o número exato (que muda com o algoritmo, o prior e a taxa real de conversão), é a forma do resultado: um bandit bem configurado fica sistematicamente entre o A/B fixo e o teto teórico, nunca alcançando o teto porque nenhum bandit sério para de explorar por completo (isso seria apostar tudo numa leitura que ainda pode estar errada), mas também nunca ficando tão atrás quanto uma divisão 50/50 mantida do início ao fim. E, como visto acima, ele entrega esse ganho sem produzir, ao final, um valor-p ou uma significância no sentido clássico.

Alocação de tráfego para a variação B ao longo do testeNo teste A/B fixo, a alocação para B permanece em 50% do primeiro ao último dia. No bandit ilustrativo, a alocação começa em 50% e sobe progressivamente até cerca de 80% conforme a evidência se acumula, ao longo dos 44 dias do teste.% do tráfego indo para Bdias de teste (0 a 44)50% · A/B fixo (constante)65%80%dia 0dia 11dia 26dia 44
A curva do bandit é ilustrativa (a inclinação real depende do algoritmo e da variância observada), mas a forma qualitativa é sempre essa: parte de perto de 50%, sobe conforme a confiança aumenta, e não chega a 100%, porque zerar a exploração significa apostar tudo numa leitura que ainda pode estar errada.

Tabela comparativa: A/B clássico x bandit x bandit contextual

Critério A/B clássico Bandit (simples) Bandit contextual
Alocação de tráfego Fixa (ex.: 50/50) do início ao fim Muda ao longo do tempo, conforme a evidência Muda por visitante, conforme o contexto dele
Produz significância estatística formal Sim, valor-p e intervalo de confiança Não, no sentido clássico (Optimizely é explícita sobre isso) Não, no sentido clássico
Melhor para Decisões que precisam ser defendidas e documentadas Otimização contínua, custo alto de mostrar a variação perdedora O “vencedor” muda por perfil (dispositivo, canal, comportamento)
Análise por segmento depois do teste Direta, a alocação foi estável Difícil, a alocação já mudou sozinha durante o teste É o próprio objetivo do método
Exige mais dado/infraestrutura Não, é o desenho mais simples Um pouco mais (atualização contínua) Bem mais (modelo por atributo de contexto, dados em tempo real)
Risco de decisão errada Baixo, se dimensionado e rodado corretamente Baixo custo de oportunidade, mas sem prova formal de causa O mesmo do bandit simples, mais a complexidade de manter vários modelos

Nenhuma linha dessa tabela é “sempre a melhor”. Ela existe para você escolher com base no que a sua decisão específica exige, e não pelo que soa mais moderno.

Ferramentas que oferecem bandits (visão neutra)

Boa parte do mercado de teste A/B já oferece algum sabor de bandit, geralmente como um recurso ao lado do A/B clássico, não como substituto dele. Vale olhar o que cada fornecedor publica sobre a própria abordagem, com a devida ressalva de que specs de produto mudam e o melhor lugar para confirmar detalhes é sempre a documentação oficial mais recente.

Ferramenta Abordagem divulgada O que fica de fora sem confirmação direta
VWO Bayesiano (SmartStats), prior não informativo, teste sequencial Redução de tempo “pela metade” é número divulgado pela própria empresa
Optimizely MAB simples e contextual (via Opal), documentação explícita de que não gera significância Detalhes do algoritmo exato de bandit usado internamente
Kameleoon CUPED (redução de variância, não bandit em si) Se a empresa oferece bandit nativo além de CUPED, confira a documentação atual
Spotify Engineering Bandits contextuais em produção (personalização), avaliados por A/B formal à parte Detalhes de implementação são internos, o artigo público é de alto nível

A Donnu A/B se posiciona nesse mapa como uma ferramenta bayesiana nativa: o mesmo motor que já calcula “qual a probabilidade de B ser melhor que A” para um teste clássico é a base matemática de que um bandit como o Thompson Sampling precisa. Hoje o produto foca em teste A/B com leitura bayesiana honesta; bandit é a extensão natural desse motor, não um recurso genérico colado por cima.

Faça Isso Automático na Donnu

Você acabou de ver os dois lados reais dessa escolha: um teste A/B clássico entrega um veredito que aguenta ser defendido, com valor-p, intervalo de confiança e uma alocação estável fácil de analisar depois por segmento, ao custo de manter tráfego na variação perdedora até o fim. Um bandit reduz esse custo de oportunidade realocando tráfego em tempo real, ao custo de não entregar, ao final, uma significância estatística formal. Nenhuma ferramenta te livra de escolher: você ainda precisa decidir se a sua situação pede rigor de inferência causal ou otimização contínua, e a resposta muda de teste para teste.

A Donnu já roda hoje sobre um motor bayesiano nativo, exatamente a base matemática que sustenta os dois mundos: o mesmo cálculo de “qual a probabilidade de B ser melhor que A” que declara um vencedor honesto num A/B também é o que alimenta um bandit como o Thompson Sampling quando a decisão pede otimização contínua em vez de um veredito único. Você não precisa escolher a ferramenta certa às cegas, a Donnu já parte da estatística que os dois cenários exigem.

Leia também o que é teste A/B e como funciona, significância estatística explicada com a fórmula por trás, o problema do peeking e por que parar cedo estraga um teste, e a peça-irmã deste guia, bandit contextual explicado, para quando o “vencedor” muda de acordo com quem está olhando.

Comece um teste grátis de 14 dias e rode o seu próximo experimento sobre uma base estatística que já é bayesiana por padrão.

Referências

Perguntas frequentes

O que é um multi-armed bandit, em palavras simples?
É um algoritmo que decide, visita a visita, para qual variação mandar o próximo visitante, com base no que já aprendeu até ali. Em vez de fixar a divisão de tráfego no início e só analisar no fim (como um teste A/B clássico), o bandit reduz aos poucos o tráfego para as variações que parecem fracas e aumenta o das que parecem fortes, enquanto o teste ainda está rodando.
Bandit substitui totalmente o teste A/B?
Não. Bandit é ótimo para otimização contínua, quando o custo de mostrar a variação perdedora é alto e você não precisa de um veredito formal. Teste A/B continua sendo a ferramenta certa quando você precisa de uma resposta que aguenta ser defendida com rigor estatístico, documentada e analisada por segmento depois. Muitas equipes usam os dois: A/B para decidir o que fica, bandit para rodar a otimização contínua do que já foi validado.
Um bandit pode me dizer que uma variação "venceu com 95% de confiança"?
Não da mesma forma que um teste A/B. Bandits otimizam a métrica ao longo do tempo, realocando tráfego; eles não rodam o desenho de hipótese nula e valor-p que sustenta uma afirmação de significância clássica. A Optimizely é explícita sobre isso em sua documentação: otimizações de multi-armed bandit não geram significância estatística. O que você tem, ao final, é a melhora de desempenho sobre uma divisão igualitária, não um veredito com nível de confiança.
Quando um bandit contextual faz mais sentido que um bandit simples?
Quando o "vencedor" muda de acordo com quem está olhando: dispositivo, localização, canal de origem ou histórico de comportamento. Um bandit simples busca uma única variação campeã para todo mundo; um bandit contextual usa esses atributos para escolher a melhor variação para cada perfil de visitante, o que custa mais dados e mais complexidade de operação.
A Donnu oferece bandits?
A Donnu roda hoje sobre um motor bayesiano nativo, o que é a base estatística que também sustenta bandits como o Thompson Sampling. O produto atual foca em teste A/B com leitura bayesiana honesta; bandit é a extensão natural desse mesmo motor para quem precisa de otimização contínua, e é para onde o roteiro do produto aponta.