rollfuse
← Voltar aos tutoriais

Lendo Resultados de Experimentos e Decidindo Quando Concluir

Um experimento em execução acumula dois tipos de dado: exposições (quem viu qual variação) e observações (quem converteu na métrica que você está acompanhando). Dois endpoints transformam esses dados brutos em decisão: sample-ratio-mismatch, que diz se os dados de exposição em si merecem confiança, e outcome-analysis, que diz se alguma variação realmente venceu a outra. Você checa o primeiro antes de acreditar no segundo.

Verifique primeiro se há sample ratio mismatch

const res = await fetch(
  `https://api.rollfuse.com/v1/experiments/${experimentId}/sample-ratio-mismatch`,
  { headers: { Authorization: `Bearer ${token}` } },
);

const srm = await res.json();

Um experimento com alocação 50/50 deveria terminar com contagens de exposição praticamente iguais em cada variação. O sample-ratio-mismatch roda um teste qui-quadrado comparando as contagens reais de exposição contra a alocação configurada, e sinaliza um mismatch quando o desvio é estatisticamente improvável de ser acaso.

Um mismatch quase nunca significa "a variação de tratamento é pouco popular". Significa que algo está errado em como os subjects foram distribuídos ou contados, por exemplo:

  • Um bug no cliente que faz o evento de exposição de uma variação ser perdido com mais frequência que o da outra (um caminho de renderização lento, um crash antes de a exposição disparar).
  • Um cache ou CDN servindo uma Configuration desatualizada para parte do seu tráfego, de forma que alguns subjects nunca chegam a ver as regras de bucketing do experimento.
  • Tráfego de bots ou retries batendo mais em um caminho de código do que no outro, inflando a contagem de exposições de uma variação.

Se o sample-ratio-mismatch reportar um mismatch, não trate a análise de resultado como verdade absoluta. As duas variações não foram testadas em populações comparáveis, então qualquer lift que o outcome-analysis reportar pode ser explicado inteiramente pelo bug que está causando o mismatch, não pela mudança de produto em si. Corrija a causa raiz e, se uma parte relevante do tráfego do experimento foi afetada, reinicie-o em vez de tentar corrigir o viés estatisticamente.

Lendo a análise de resultado

Uma vez que as contagens de exposição estejam confiáveis, o outcome-analysis traz a comparação entre variações na métrica que você vem registrando com observations.

const res = await fetch(
  `https://api.rollfuse.com/v1/experiments/${experimentId}/outcome-analysis`,
  { headers: { Authorization: `Bearer ${token}` } },
);

const outcome = await res.json();

for (const variation of outcome.variations) {
  console.log(
    variation.key,
    "conversao:", variation.conversion_rate,
    "lift vs control:", variation.relative_lift,
    "p-value:", variation.p_value,
  );
}

Três números importam para a decisão:

  • Taxa de conversão por variação: observações divididas por exposições daquela variação. É o sinal bruto, antes de qualquer ajuste estatístico.
  • Lift relativo: o quanto uma variação de tratamento está melhor (ou pior) que o control em termos percentuais. Um lift positivo com p-value baixo é o que você quer ver quando a expectativa era de que o tratamento vencesse.
  • p-value / significância: a probabilidade de um lift desse tamanho aparecer por acaso caso as duas variações fossem, na prática, idênticas. A rollfuse marca uma variação como estatisticamente significativa quando o p-value cruza abaixo do limiar de significância configurado no experimento (0,05 por padrão). Uma amostra pequena pode produzir um lift que parece grande mas com p-value alto; esse lift é ruído, não é resultado, e não deve ser usado como base de decisão ainda.

Não interrompa um experimento assim que uma variação ficar na frente na taxa de conversão bruta. No início de um experimento, pequenas diferenças na contagem de exposições produzem oscilações grandes e instáveis na taxa de conversão, que tendem a se estabilizar perto do efeito real conforme mais dados chegam. O p-value é o que diz se você já coletou evidência suficiente para confiar na direção que está vendo, não só no tamanho dela.

Concluindo ou abortando com base no que você encontrou

// a variação de tratamento é significativamente melhor: encerre o experimento e mantenha o resultado
await fetch(
  `https://api.rollfuse.com/v1/experiments/${experimentId}/conclude`,
  { method: "POST", headers: { Authorization: `Bearer ${token}` } },
);
// sample-ratio-mismatch sinalizou um problema, ou o tratamento está claramente pior: pare mais cedo
await fetch(
  `https://api.rollfuse.com/v1/experiments/${experimentId}/abort`,
  { method: "POST", headers: { Authorization: `Bearer ${token}` } },
);

Use conclude quando o experimento já rodou tempo suficiente para atingir significância na métrica principal (ou claramente falhou em movê-la depois de acumular exposições suficientes para ter poder estatístico de detectar um efeito real), e os dados de exposição passaram pela checagem de sample-ratio-mismatch. Concluir trava o resultado e é o desfecho correto tanto para quando o tratamento venceu quanto para quando perdeu ou empatou.

Use abort quando algo invalida o experimento antes mesmo de você poder confiar no resultado: um sample ratio mismatch confirmado que não dá para corrigir rápido, uma variação de tratamento causando uma regressão grave o bastante para você não estar disposto a esperar a significância estatística provar isso, ou um rollout que precisa ser revertido por motivo operacional alheio ao experimento. Abortar encerra o experimento sem declarar um vencedor, que é o estado honesto para uma execução cujos dados você não confia.