Estatística

Métricas de Contagem em Teste A/B: Poisson e dispersão

Métricas de contagem em teste A/B quase nunca seguem Poisson. Como medir a superdispersão, dimensionar a amostra certa e não subestimar o erro pela metade.

Ilustração plana de várias fichas circulares verdes empilhadas em montes de alturas muito desiguais sobre uma superfície, com duas pilhas bem mais altas que as demais

Sessões por usuário, itens por pedido e páginas por sessão são métricas de contagem, e a variância delas quase sempre é maior que a média. Isso se chama superdispersão, e ela tem um preço direto em tamanho de amostra: com índice de dispersão 4, que é um valor comum em dados de produto, o teste que o modelo de Poisson dimensionaria com 2.011 usuários por variação precisa na verdade de 8.194. Se você ignorar isso e calcular o erro-padrão como o Poisson manda, ele sai pela metade do correto, e o mesmo dado que dá z de 3,42 na conta certa dá 6,85 na conta ingênua. Este guia mostra como medir a dispersão, como dimensionar direito e quando trocar a contagem por um proxy binário. Faz parte do nosso guia completo de teste A/B e é o par direto de tamanho de amostra para métricas contínuas, que cobre médias e receita.

Métricas de contagem não são proporção nem média comum

A maioria das ferramentas de teste A/B só sabe fazer uma conta: comparar duas proporções. Isso cobre taxa de conversão, taxa de clique, taxa de rejeição, qualquer coisa em que cada usuário contribua com um zero ou um um.

Contagem é outra coisa. Cada usuário contribui com um inteiro não negativo, e a distribuição desses inteiros tem uma cauda:

métrica de contagem unidade onde ela aparece
sessões por usuário usuário sorteado engajamento, retenção semanal
páginas por sessão sessão profundidade de navegação, busca interna
itens por pedido pedido e-commerce, cesta média
pesquisas por visita visita busca no site, catálogo
mensagens enviadas por conta conta produtos de comunicação
tickets abertos por cliente cliente métrica de guardrail de suporte

Todas elas compartilham o mesmo comportamento: um monte de usuários com zero, um ou dois eventos, e uma minoria com dezenas. É a mesma cauda longa que já discutimos em outliers e capping, só que aqui ela nasce da natureza da contagem, não de um valor monetário extremo.

Poisson assume que a variância é igual à média

O modelo padrão para contagem é o de Poisson. Ele tem um único parâmetro, que é ao mesmo tempo a média e a variância da distribuição. Essa é a suposição inteira, e ela quase nunca vale em dados de produto.

O motivo é simples e não é estatístico: os usuários não são iguais entre si. Um Poisson com média 3,2 descreveria uma população em que todo mundo tem a mesma propensão a gerar sessões e a variação é só sorte. A sua base real tem um grupo que entra uma vez por mês e outro que entra três vezes por dia. Essa heterogeneidade entre usuários entra na variância total e não entra na média.

Poisson contra binomial negativa com a mesma médiaGráfico de barras sobrepostas mostrando duas distribuições de contagem de sessões por usuário, ambas com média 3,2. As barras escuras representam o modelo de Poisson, concentradas entre uma e seis sessões, com pico em três e praticamente nada acima de nove. As barras claras representam a binomial negativa com variância 12,8, que tem muito mais massa em zero e uma cauda visível que se estende até quinze sessões ou mais. As duas distribuições têm a mesma média, mas a segunda é muito mais espalhada.Mesma média de 3,2 sessões por usuário, dispersão completamente diferentesessões na semana, por usuárioproporção de usuários036913 ou maisPoisson (variância 3,2)binomial negativa (variância 12,8)
As duas distribuições têm média 3,2. A binomial negativa acomoda a heterogeneidade entre usuários: mais gente em zero e uma cauda real de usuários muito ativos.

O modelo que acomoda isso é a binomial negativa, que tem dois parâmetros: a média e um parâmetro de dispersão, normalmente escrito como kappa. A relação entre eles é direta:

variância = média + kappa vezes o quadrado da média

Com kappa igual a zero, a binomial negativa vira exatamente o Poisson. Quanto maior o kappa, mais espalhada a distribuição em torno da mesma média.

Meça a dispersão antes de dimensionar qualquer coisa

Você não precisa de nenhuma ferramenta especial para saber se tem superdispersão. Pegue os dados de uma semana histórica, calcule a média e a variância da contagem por usuário, e divida uma pela outra. Esse é o índice de dispersão:

índice de dispersão = variância dividida pela média

Sob Poisson ele é 1. Em dados de produto ele costuma ficar entre 2 e 8. E ele se relaciona com o kappa de forma exata: o índice de dispersão é igual a 1 mais kappa vezes a média, o que permite ir de um para o outro sem simulação.

Com média de 3,2 sessões por usuário na semana e um alvo de detectar mais 5 por cento na taxa, a conta muda assim:

variância observada índice de dispersão kappa usuários por variação dias a 40.000 usuários por semana
3,2 1,0 (Poisson) 0,0000 2.011 1
6,4 2,0 0,3125 4.072 2
9,6 3,0 0,6250 6.133 3
12,8 4,0 0,9375 8.194 3
19,2 6,0 1,5625 12.315 5

Repare que a relação é praticamente linear no índice de dispersão. Ignorar a superdispersão não é um arredondamento, é um erro de fator inteiro. Quem dimensionou por Poisson um teste com índice de dispersão 4 está rodando com um quarto da amostra necessária, e vai ler o resultado como “não deu nada” quando o teste na verdade nunca teve poder.

A fórmula, e a prova de que ela está certa

A referência para dimensionar a razão entre duas taxas de contagem é Zhu e Lakkis, publicada em Statistics in Medicine em 2014. É a fórmula implementada em software de dimensionamento e a que a documentação do PASS descreve como método 3, a versão que estima a variância nula por máxima verossimilhança. Zhu e Lakkis registram que as simulações deles indicam que os métodos 2 e 3 são mais acurados que o método 1.

Aqui está ela, em JavaScript, exatamente como usamos para gerar as tabelas deste artigo:

// Zhu e Lakkis (2014), metodo 3 (maxima verossimilhanca sob a nula).
// lambda1 = taxa do controle | RR = razao de taxas alvo
// kappa   = parametro de dispersao | mut = tempo medio de exposicao
function nbSampleSize({ lambda1, RR, kappa, mut = 1, R = 1, alpha = 0.05, power = 0.8 }) {
  const lambda2 = lambda1 * RR;
  const VA = (1 / mut) * (1 / lambda1 + 1 / (R * lambda2)) + ((1 + R) * kappa) / R;
  const V0 = Math.pow(1 + R, 2) / (mut * R * (lambda1 + R * lambda2)) + ((1 + R) * kappa) / R;
  const za = zCritical(alpha, 2);   // 1,9600 no bicaudal a 5%
  const zb = normInv(power);        // 0,8416 para 80% de poder
  return Math.ceil(
    Math.pow(za * Math.sqrt(V0) + zb * Math.sqrt(VA), 2) / Math.pow(Math.log(RR), 2)
  );
}

Uma fórmula publicada sem verificação é só uma afirmação. Rodamos a nossa implementação contra o cenário de referência que Zhu e Lakkis publicam na Tabela I do artigo (taxa de controle 0,8 evento por unidade de tempo, razão de taxas de 0,85, tempo médio de exposição 0,75, alfa 0,05, poder 80 por cento, alocação balanceada) e comparamos linha a linha:

parâmetro de dispersão nossa implementação valor publicado diferença
0,4 1.311 1.311 0,000%
0,7 1.490 1.490 0,000%
1,0 1.668 1.668 0,000%
1,5 1.965 1.965 0,000%

Reprodução exata nas quatro linhas. É esse mesmo bloco de código que gerou a tabela do índice de dispersão da seção anterior e a comparação da próxima.

O quanto o Poisson mente, por tamanho de efeito

Com o parâmetro de dispersão fixado em 0,9375 (o que corresponde a variância 12,8 sobre média 3,2, ou índice de dispersão 4), a diferença entre dimensionar por Poisson e dimensionar direito é constante e grande:

efeito alvo na taxa binomial negativa dias Poisson (kappa zero) dias razão
mais 2 por cento 49.915 18 12.387 5 4,0 vezes
mais 3 por cento 22.376 8 5.532 2 4,0 vezes
mais 5 por cento 8.194 3 2.011 1 4,1 vezes
mais 8 por cento 3.282 2 797 1 4,1 vezes
mais 10 por cento 2.135 1 515 1 4,1 vezes

Dias calculados a 40.000 usuários por semana, com dois braços. A razão entre as duas colunas fica presa em torno de 4, que é exatamente o índice de dispersão: o fator de correção é o índice de dispersão, e ele não depende do tamanho do efeito que você quer detectar. Essa é a regra de bolso que vale levar: meça o índice de dispersão uma vez, multiplique a conta de Poisson por ele, e você terá uma aproximação boa antes mesmo de abrir a fórmula.

O erro mais caro é anterior à fórmula

Existe um erro pior do que dimensionar por Poisson, e ele acontece na leitura, não no desenho: contar o evento como se fosse a unidade de observação.

O cenário: 30.000 usuários sorteados, 96.000 sessões geradas. A tentação é analisar as 96.000 sessões como observações independentes, ou calcular o erro-padrão da média assumindo variância igual à média, como o Poisson manda. Os dois erros levam ao mesmo lugar.

conta erro-padrão da média por braço z da diferença entre os dois braços, para um efeito de mais 0,10 sessão por usuário
correta (variância 12,8 sobre 30.000 usuários) 0,020656 3,4233
ingênua (variância assumida igual à média, 3,2) 0,010328 6,8465

Para refazer a conta: o erro-padrão da diferença entre dois braços do mesmo tamanho é a raiz de 2 vezes o erro-padrão de um braço, então o z correto é 0,10 dividido por 0,020656 vezes a raiz de 2, o que dá 3,4233.

O erro-padrão sai exatamente pela metade, o intervalo de confiança sai 50 por cento mais estreito do que deveria e o z dobra. Nesse caso específico as duas contas concordam sobre o veredito (as duas passam de 1,96), mas a que produz z de 6,85 vai ser descrita como “resultado esmagador” numa reunião, e ela não é. Num efeito menor, a mesma distorção vira falso positivo direto.

A raiz do problema é a mesma que descrevemos em unidade de sorteio: a unidade de análise tem que ser a unidade de sorteio. Se você sorteou usuários, a observação é o usuário e a métrica dele é a contagem total, com toda a variância que ela carrega. Sessões do mesmo usuário são correlacionadas entre si, e tratá-las como independentes é inventar informação que não existe.

Contar usuários contra contar eventosDiagrama comparando duas leituras dos mesmos dados. À esquerda, a leitura correta: cinco círculos representam usuários sorteados, cada um com um número diferente de pontinhos ligados a ele representando suas sessões, e o resumo indica 30 mil usuários com erro-padrão de 0,0207. À direita, a leitura ingênua: os mesmos pontinhos aparecem soltos, sem ligação com nenhum usuário, e o resumo indica 96 mil eventos tratados como independentes com erro-padrão de 0,0103, metade do valor correto.O mesmo dado, duas unidades de análise, dois erros-padrãoleitura correta: a unidade é o usuário30.000 observaçõesvariância 12,8erro-padrão 0,0207z do efeito: 3,42leitura ingênua: a unidade é o evento96.000 observações supostaserro-padrão 0,0103, metade do certoz do efeito: 6,85
Sessões do mesmo usuário são correlacionadas. Tratá-las como observações independentes divide o erro-padrão por dois e dobra a estatística de teste.

Vale trocar a contagem por um proxy binário?

Uma saída pragmática é converter a contagem num indicador: em vez de “sessões por usuário”, medir “usuário com pelo menos 4 sessões na semana”. Isso devolve o problema para a calculadora binária, que toda ferramenta tem, e para a conta de duas proporções.

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.

Com a base do proxy em 35 por cento dos usuários, a calculadora acima devolve:

efeito relativo no proxy usuários por variação dias a 40.000 por semana
mais 2 por cento 73.214 26
mais 3 por cento 32.612 12
mais 5 por cento 11.791 5
mais 8 por cento 4.635 2

Compare com a coluna da binomial negativa: detectar mais 5 por cento na taxa de sessões pedia 8.194 usuários por variação, e detectar mais 5 por cento relativos no proxy pede 11.791. Ou seja, neste cenário o proxy saiu mais caro, não mais barato.

Isso não é uma regra geral, e é aí que está o cuidado. As duas linhas não medem a mesma coisa: uma pergunta se a contagem média subiu 5 por cento, a outra pergunta se a proporção de usuários acima de um limiar subiu 5 por cento. Não existe conversão automática entre as duas, e supor que um efeito de mais 5 por cento na média produz mais 5 por cento no proxy é uma hipótese sua, não um fato. Os critérios honestos para escolher o proxy são:

E a normalidade da média

Falta uma última checagem, que é independente do dimensionamento pelo efeito: a média da contagem precisa ser aproximadamente normal para o teste z valer. A régua é a regra de bolso de Kohavi, Deng, Longbotham e Xu, que pede pelo menos 355 vezes o quadrado do coeficiente de assimetria e é recomendada quando o módulo da assimetria passa de 1.

variância (média 3,2) assimetria mínimo pela regra do TCL mínimo pelo efeito de mais 5 por cento qual manda
3,2 0,56 111 2.011 o efeito
6,4 1,19 500 4.072 o efeito
12,8 1,96 1.359 8.194 o efeito
19,2 2,51 2.238 12.315 o efeito

Em contagens típicas, o dimensionamento pelo efeito manda com folga, e a regra do teorema central do limite nunca chega a ser o gargalo. É por isso que contagem é um caso mais confortável que receita: nas métricas do Bing que Kohavi e coautores publicam, sessões por usuário tem assimetria 3,6 e pede 4,70 mil observações, enquanto receita por usuário tem 17,9 e pede 114 mil. A cauda da contagem é longa, mas a cauda do dinheiro é muito pior.

Duas ressalvas honestas sobre a tabela acima. A primeira: as assimetrias vêm da fórmula fechada da binomial negativa com aquelas média e variância, não de dados seus. A segunda: se a sua contagem tiver um punhado de usuários com centenas de eventos, o que é comum quando bots entram na conta, a assimetria real vai passar muito da tabela. Antes de dimensionar, limpe o tráfego de bot e considere aplicar um teto.

Checklist

  1. Meça a variância antes de qualquer coisa. Uma semana de dados históricos, contagem por usuário, média e variância. Divida uma pela outra.
  2. Se o índice de dispersão passar de 1,5, esqueça o Poisson. Use a binomial negativa e o kappa correspondente.
  3. Como aproximação rápida, multiplique a conta de Poisson pelo índice de dispersão. O fator ficou preso em 4,0 a 4,1 em toda a faixa de efeito testada.
  4. A unidade de análise é a unidade de sorteio. Nunca calcule erro-padrão sobre a contagem de eventos.
  5. Limpe bot e considere teto antes de estimar a variância, senão você dimensiona para a cauda errada.
  6. Se for usar proxy binário, declare a hipótese de tradução. E não presuma que ele é mais barato: neste cenário não foi.
  7. Confira a regra dos 355 vezes a assimetria ao quadrado. Em contagem ela raramente manda, mas confirmar leva um minuto.

Faça isso automático na Donnu

Quase toda ferramenta de teste A/B de mercado só sabe comparar proporções. Quando o time quer testar “sessões por usuário” ou “itens por pedido”, a saída padrão é inventar um proxy binário e torcer, ou exportar tudo para uma planilha e fazer a conta na mão, sem dimensionamento prévio.

A Donnu guarda a contagem por usuário sorteado, então o índice de dispersão é algo que você lê antes de começar o teste, e não descobre depois. Isso muda a pergunta na hora de planejar: em vez de “quantos visitantes eu preciso”, que é a pergunta binária, você consegue responder “quanto essa métrica varia entre os meus usuários e o que isso custa em dias de teste”. Se o seu caso ainda é binário, comece pela calculadora de tamanho de amostra; se já é de contagem, meça a variância primeiro e use a fórmula publicada acima.

Referências

Leia também: Tamanho de amostra para métricas contínuas · Outliers e capping · Unidade de sorteio · Métricas de razão · Tráfego de bot · Calculadora de tamanho de amostra · Read in English

Perguntas frequentes

O que é uma métrica de contagem em teste A/B?
É toda métrica em que cada usuário contribui com um número inteiro de eventos em vez de um sim ou não: sessões por usuário, páginas por sessão, itens por pedido, pesquisas por visita, mensagens enviadas por conta. Ela não é uma proporção, então nem a calculadora de significância binária nem a fórmula de duas proporções se aplicam a ela sem tradução. A média é uma taxa de eventos por unidade, e o que governa o tamanho de amostra é a variância dessa contagem, não a taxa em si.
O que é superdispersão e por que ela importa?
Superdispersão é a variância da contagem ser maior que a média. O modelo de Poisson assume que as duas são iguais, e em dados de produto isso praticamente nunca acontece, porque usuários são heterogêneos: alguns visitam uma vez por mês e outros dez vezes por dia. A medida direta é o índice de dispersão, a variância dividida pela média. Se ele der 4, a variância é quatro vezes a que o Poisson assumiria, e a amostra necessária cresce na mesma proporção. No exemplo deste artigo, um índice de dispersão de 4 levou a amostra de 2.011 para 8.194 usuários por variação.
Como calcular o tamanho de amostra de uma métrica de contagem?
Use a fórmula de Zhu e Lakkis para a razão de duas taxas sob o modelo binomial negativo, que é o padrão da literatura clínica e está implementado em software de dimensionamento. Ela pede a taxa do controle, a razão de taxas que você quer detectar, o parâmetro de dispersão e o tempo médio de exposição. O parâmetro de dispersão sai da variância observada: ele é a variância menos a média, dividida pelo quadrado da média. A fórmula publicada neste artigo reproduz exatamente a tabela de referência publicada por Zhu e Lakkis, nas quatro linhas testadas.
Qual o erro mais caro em métrica de contagem?
Tratar cada evento como observação independente. Se 30.000 usuários geraram 96.000 sessões e você calcula o erro-padrão como se tivesse 96.000 observações independentes, ou como se a variância fosse igual à média, o erro-padrão sai pela metade do correto. No exemplo deste artigo, o mesmo efeito de mais 0,10 sessão por usuário produz z de 3,42 na conta certa e 6,85 na conta ingênua. O intervalo de confiança sai 50 por cento mais estreito do que deveria e o valor-p vira ficção.
Posso transformar a métrica de contagem numa métrica binária?
Pode, e às vezes vale. Trocar "sessões por usuário" por "usuário com pelo menos 4 sessões na semana" devolve o problema para a calculadora binária, que todo mundo já sabe usar. O custo é que o efeito medido deixa de ser o mesmo: você passa a medir se usuários cruzaram um limiar, não quanto a contagem mudou, e precisa de uma hipótese própria sobre como o efeito da contagem se traduz nesse limiar. No cenário deste artigo o proxy não saiu mais barato: detectar mais 5 por cento na contagem pedia 8.194 usuários por variação, e detectar mais 5 por cento relativos no proxy pedia 11.791.
A regra dos 355 vezes a assimetria ao quadrado se aplica a contagens?
Sim, e nas contagens ela costuma ser folgada. A regra de Kohavi e coautores pede pelo menos 355 vezes o quadrado do coeficiente de assimetria para a média ser aproximadamente normal, e é recomendada quando o módulo da assimetria passa de 1. Uma binomial negativa com média 3,2 e variância 12,8 tem assimetria 1,96, o que pede 1.359 observações por braço. Como o dimensionamento pelo efeito já pediu 8.194, é o dimensionamento que manda. Em receita por usuário a ordem se inverte: a assimetria pode passar de 15 e a regra do teorema central do limite passa a ser o gargalo.