Incremento, significância e proteções em SQL
Calculando o incremento de conversão e as verificações de dados que sinalizam um experimento com problemas.
Incremento, significância e proteções em SQL é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
Das métricas a uma decisão
A conversão por variante é apenas o começo. A pergunta da entrevista é: o tratamento realmente venceu? Isso significa calcular o incremento, avaliar se a diferença é real ou apenas ruído e verificar as métricas de segurança que identificam um experimento defeituoso.
Você não executará um pacote estatístico completo em SQL, mas poderá calcular as entradas e um indicador aproximado de significância que os entrevistadores esperam ver.
A CTE de resumo por variante
Tudo o que vem depois se baseia em um único resumo organizado: por variante, a quantidade de usuários n, a quantidade de conversores c e a taxa de conversão p. Calcule isso uma vez em uma CTE e reutilize.
WITH summary AS (
SELECT
variant,
COUNT(DISTINCT user_id) AS n,
COUNT(DISTINCT converted_user) AS c
FROM experiment_flat
GROUP BY variant
)
SELECT
variant, n, c,
1.0 * c / n AS p
FROM summary;Incremento absoluto versus relativo
Há duas definições de incremento, e os entrevistadores esperam, por padrão, a relativa:
- Incremento absoluto = p_tratamento - p_controle (pontos percentuais).
- Incremento relativo = (p_tratamento - p_controle) / p_controle (uma melhoria percentual).
Dizer "um aumento de 2 pontos" ou "um incremento relativo de 20%" pode descrever o mesmo resultado. Seja explícito.
Calculando o incremento com uma autoagregação
Para comparar duas variantes em uma única linha, coloque controle e tratamento lado a lado usando agregação condicional e depois faça a aritmética.
Isso evita uma autojunção frágil e mantém a fórmula do incremento legível.
WITH s AS (
SELECT variant,
COUNT(DISTINCT user_id) AS n,
COUNT(DISTINCT converted_user) AS c
FROM experiment_flat GROUP BY variant
),
rates AS (
SELECT
MAX(CASE WHEN variant='control' THEN 1.0*c/n END) AS p_ctrl,
MAX(CASE WHEN variant='treatment' THEN 1.0*c/n END) AS p_trt
FROM s
)
SELECT
p_ctrl, p_trt,
p_trt - p_ctrl AS abs_lift,
ROUND(100.0 * (p_trt - p_ctrl) / p_ctrl, 2) AS rel_lift_pct
FROM rates;Por que uma diferença pode ser ruído
Uma taxa maior no tratamento pode ser resultado da sorte da amostragem aleatória. A significância pergunta: qual é a probabilidade de uma diferença desse tamanho ocorrer se as variantes fossem realmente idênticas?
O ingrediente principal é o erro padrão de cada taxa, que diminui à medida que o tamanho da amostra aumenta. Amostras grandes tornam incrementos pequenos confiáveis; amostras pequenas tornam suspeitos até incrementos grandes.
Erro padrão de uma proporção
Para uma taxa de conversão p em n usuários, o erro padrão é sqrt(p * (1 - p) / n). Calcule-o diretamente em SQL para cada variante.
Isso quantifica a oscilação de cada taxa antes de compará-las.
WITH s AS (
SELECT variant,
COUNT(DISTINCT user_id) AS n,
COUNT(DISTINCT converted_user) AS c
FROM experiment_flat GROUP BY variant
)
SELECT
variant, n,
1.0 * c / n AS p,
SQRT( (1.0*c/n) * (1 - 1.0*c/n) / n ) AS std_err
FROM s;Um escore z para duas proporções
Um indicador aproximado de significância é o escore z para duas proporções: a diferença entre as taxas dividida pelo erro padrão dessa diferença. Um valor absoluto acima de aproximadamente 1.96 corresponde ao limite comum de 95%.
Deixe claro que isso é uma aproximação, não um substituto para um teste apropriado, mas que responde em SQL à pergunta "isso é plausivelmente real?".
WITH r AS (
SELECT
MAX(CASE WHEN variant='control' THEN 1.0*c/n END) AS p1,
MAX(CASE WHEN variant='control' THEN n END) AS n1,
MAX(CASE WHEN variant='treatment' THEN 1.0*c/n END) AS p2,
MAX(CASE WHEN variant='treatment' THEN n END) AS n2
FROM (
SELECT variant, COUNT(DISTINCT user_id) n,
COUNT(DISTINCT converted_user) c
FROM experiment_flat GROUP BY variant
) s
)
SELECT
p2 - p1 AS abs_lift,
(p2 - p1) / SQRT( p1*(1-p1)/n1 + p2*(1-p2)/n2 ) AS z_score
FROM r;Interpretando o escore z
Transforme o número em uma conclusão para que o entrevistador ouça bom senso de negócio, não apenas matemática:
|z| >= 1.96: a diferença é significativa com aproximadamente 95% de confiança.|z| < 1.96: não há evidências suficientes; o incremento pode ser apenas ruído.
Use um CASE para emitir um rótulo legível e sempre associe a significância ao tamanho prático do incremento.
SELECT
z_score,
CASE WHEN ABS(z_score) >= 1.96
THEN 'significant at 95%'
ELSE 'not significant' END AS verdict
FROM (
SELECT 2.3 AS z_score
) t;Incompatibilidade da proporção da amostra (SRM)
A primeira métrica de segurança investigada pelos entrevistadores é: os usuários foram realmente divididos conforme o planejado? Um experimento 50/50 que resulta em 53/47 com milhões de usuários é um sinal de alerta: a randomização ou o registro está com problema.
Compare as quantidades observadas com a divisão esperada. Um desvio grande invalida todo o teste antes mesmo de você analisar a métrica.
WITH cnt AS (
SELECT variant, COUNT(DISTINCT user_id) AS n
FROM experiment_flat GROUP BY variant
),
tot AS (SELECT SUM(n) AS total FROM cnt)
SELECT
c.variant, c.n,
ROUND(100.0 * c.n / t.total, 2) AS observed_pct,
50.0 AS expected_pct
FROM cnt c CROSS JOIN tot t;Métricas de segurança
Uma métrica de segurança é uma métrica que não pode piorar, mesmo que a métrica principal melhore. Exemplos clássicos: latência da página, taxa de reembolso, taxa de descadastro e taxa de erros.
Apresente-as por variante junto com a métrica vencedora. Um tratamento que aumenta a conversão, mas dobra os reembolsos, não é uma vitória. Calcular as métricas de segurança sem ser solicitado demonstra bom julgamento de produto.
SELECT
variant,
AVG(load_ms) AS avg_latency_ms,
ROUND(100.0 * SUM(refunded) / COUNT(*), 2) AS refund_rate_pct,
ROUND(100.0 * SUM(errored) / COUNT(*), 2) AS error_rate_pct
FROM experiment_flat
GROUP BY variant;O relatório completo
Um relatório completo do experimento, do tipo que os entrevistadores valorizam, combina quatro elementos em um único resultado: taxas por variante, incremento relativo, conclusão de significância e verificação de SRM. Encadeie CTEs e apresente tudo como uma única tabela pronta para embasar uma decisão.
Conclua afirmando: significativo, tamanho do incremento aceitável, métricas de segurança saudáveis, divisão equilibrada; portanto, publique ou aguarde.
WITH s AS (
SELECT variant, COUNT(DISTINCT user_id) n,
COUNT(DISTINCT converted_user) c
FROM experiment_flat GROUP BY variant
),
r AS (
SELECT
MAX(CASE WHEN variant='control' THEN 1.0*c/n END) p1,
MAX(CASE WHEN variant='control' THEN n END) n1,
MAX(CASE WHEN variant='treatment' THEN 1.0*c/n END) p2,
MAX(CASE WHEN variant='treatment' THEN n END) n2
FROM s
)
SELECT
ROUND(100.0*(p2-p1)/p1, 2) AS rel_lift_pct,
CASE WHEN ABS((p2-p1)/SQRT(p1*(1-p1)/n1 + p2*(1-p2)/n2)) >= 1.96
THEN 'significant' ELSE 'not significant' END AS verdict,
CASE WHEN ABS(1.0*n2/(n1+n2) - 0.5) > 0.02
THEN 'SRM warning' ELSE 'split ok' END AS srm_check
FROM r;Verificação rápida
O tratamento mostra um incremento relativo de 25% na conversão, mas cada variante tem apenas 40 usuários. Qual é a conclusão correta?
Recapitulação: Incremento, significância e métricas de segurança
Agora você consegue transformar métricas brutas das variantes em uma decisão:
- Diferencie o incremento absoluto (em pontos) do incremento relativo (em percentual).
- Calcule o erro padrão de cada taxa e um escore z para duas proporções como indicador aproximado de significância (|z| >= 1.96 ~ 95%).
- Faça a verificação de SRM para confirmar que a divisão corresponde ao planejado.
- Apresente métricas de segurança para que uma vitória não esconda uma regressão.
- Apresente um único relatório pronto para embasar uma decisão e sempre associe a significância ao tamanho prático do incremento.
Isso conclui a análise de funis e testes A/B em SQL.
Perguntas Frequentes
A aula “Incremento, significância e proteções em SQL” é grátis?
Sim — o texto completo de “Incremento, significância e proteções em SQL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Incremento, significância e proteções em SQL”?
Calculando o incremento de conversão e as verificações de dados que sinalizam um experimento com problemas. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Incremento, significância e proteções em SQL”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Coding Interview Prep?
Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Criando um funil de várias etapas
- Eventos ordenados e janelas de tempo
- Atribuição e métricas de teste A/B
- Incremento, significância e proteções em SQL