Testes de hipóteses com pedidos Olist

Notebook de estudo da Aula 11

Objetivos

Este notebook transforma a pergunta operacional da Aula 11 em um teste completo. Você irá formular hipóteses, construir a distribuição nula, comparar três formas de calcular o valor-p e estudar erros tipo I, poder e importância prática. Ao final, organizará essas ideias em um teste A/B didático no contexto da Olist.

Como estudar este capítulo

Um teste de hipóteses é um procedimento para medir compatibilidade entre dados e uma afirmação de referência. Ele começa antes do cálculo: definimos a população, o parâmetro, a hipótese nula, a alternativa e uma estatística que represente o afastamento relevante.

Depois construímos o comportamento da estatística se a hipótese nula fosse verdadeira. O valor observado é comparado com essa distribuição de referência. O valor-p corresponde à proporção de resultados nulos tão ou mais extremos que o observado, na direção definida pela alternativa.

O capítulo apresenta cálculo exato, aproximação Normal e simulação para a mesma pergunta. Compare os métodos e observe que todos dependem do mesmo modelo nulo. Ao final, separe claramente evidência estatística, tamanho do efeito e importância prática: rejeitar \(H_0\) não informa, por si só, se a diferença é grande ou útil.

A seção final transforma o problema operacional em um experimento A/B. Como a base Olist não registra uma intervenção randomizada, os grupos e resultados do A/B são explicitamente simulados; a base real fornece apenas o contexto e uma ordem de grandeza plausível para a taxa de atraso.

1. A base e a pergunta

Usaremos o Brazilian E-Commerce Public Dataset by Olist, disponível no Kaggle. Cada linha da tabela de pedidos representa um pedido. As colunas centrais são as datas de compra, entrega efetiva e entrega prevista. A pergunta é:

A taxa de pedidos atrasados excede o limite operacional de 8%?

2. Download e preparação

import kagglehub
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from scipy.stats import binom, norm

path = kagglehub.dataset_download("olistbr/brazilian-ecommerce")
orders_path = next(Path(path).rglob("olist_orders_dataset.csv"))
orders = pd.read_csv(orders_path)

date_cols = ["order_purchase_timestamp", "order_delivered_customer_date",
             "order_estimated_delivery_date"]
orders[date_cols] = orders[date_cols].apply(pd.to_datetime)
orders = orders.dropna(subset=date_cols).copy()
orders["delay_days"] = (
    orders["order_delivered_customer_date"]
    - orders["order_estimated_delivery_date"]
).dt.total_seconds() / 86400
orders["late"] = (orders["delay_days"] > 0).astype(int)
Warning: Looks like you're using an outdated `kagglehub` version (installed: 0.3.13), please consider upgrading to the latest version (1.0.2).

3. Descrição rápida

orders[["delay_days", "late"]].describe()
delay_days late
count 96476.000000 96476.000000
mean -11.179120 0.081129
std 10.186113 0.273035
min -146.016123 0.000000
25% -16.244384 0.000000
50% -11.948941 0.000000
75% -6.390000 0.000000
max 188.975081 1.000000
sns.histplot(orders["delay_days"], bins=80)
plt.axvline(0, color="darkorange", linewidth=2)
plt.xlim(-40, 30)
plt.xlabel("Dias após a data prevista")
plt.show()

NotaInterpretação

Interprete o resultado sob H0: o valor-p mede quão extremo seria o observado no modelo nulo. Ele não é a probabilidade de H0 e deve ser lido junto com efeito, incerteza e regra de decisão.

Interprete a unidade: late=1 indica pedido entregue depois da previsão, e não pedido cancelado ou ainda em trânsito. Observe também que a base contém apenas pedidos com as três datas disponíveis.

4. População didática e amostra

Trataremos os pedidos válidos como uma população didática e retiraremos uma amostra de 1.200 pedidos. Isso permite repetir o experimento em simulações.

rng = np.random.default_rng(20260824)
sample_rng = np.random.default_rng(13)
late = orders["late"].to_numpy()
sample = sample_rng.choice(late, size=1200, replace=False)
n = len(sample)
k = int(sample.sum())
p_hat = sample.mean()
print(f"n={n}; atrasados={k}; taxa={p_hat:.2%}")
n=1200; atrasados=115; taxa=9.58%
NotaInterpretação

A taxa amostral é a evidência observada que será comparada aos 8% de \(H_0\). Uma nova amostra produziria outro valor; o teste precisa quantificar se a diferença atual é grande em relação à variabilidade esperada.

5. Hipóteses e estatística

\[ H_0:p=0{,}08 \qquad\text{contra}\qquad H_1:p>0{,}08 \]

A estatística será \(\widehat p\), a proporção de atrasos. Sob \(H_0\), o número de atrasos em \(n\) pedidos segue uma Binomial com parâmetros \(n\) e \(p_0=0{,}08\).

6. Distribuição nula por simulação

p0 = 0.08
null_counts = rng.binomial(n=n, p=p0, size=100_000)
null_proportions = null_counts / n

sns.histplot(null_proportions, bins=35)
plt.axvline(p_hat, color="darkorange", linewidth=3, label="observado")
plt.xlabel("Taxa de atraso sob H0")
plt.legend()
plt.show()

NotaInterpretação

A distribuição nula mostra as taxas que surgiriam apenas por flutuação amostral se \(p=8\%\). A posição da linha observada nessa distribuição determina quão incompatíveis são os dados com \(H_0\).

7. Três p-valores

p_sim = (1 + np.sum(null_proportions >= p_hat)) / (len(null_proportions) + 1)
p_exact = binom.sf(k - 1, n=n, p=p0)
se0 = np.sqrt(p0 * (1-p0) / n)
z_cc = (k - 0.5 - n*p0) / np.sqrt(n*p0*(1-p0))
p_normal = norm.sf(z_cc)

pd.Series({"simulação": p_sim, "Binomial exata": p_exact,
           "Normal com correção de continuidade": p_normal})
simulação                              0.026440
Binomial exata                         0.026835
Normal com correção de continuidade    0.024504
dtype: float64

Para a amostra usada nos slides, \(n=1200\), \(k=115\) e \(\widehat p=0{,}0958\). Os resultados esperados são aproximadamente 0,0265 por simulação, 0,0268 pela Binomial exata e 0,0245 pela aproximação Normal com correção de continuidade.

Distribuição Binomial sobreposta por uma curva Normal. A cauda discreta a partir de K igual a 7 é comparada com a área Normal iniciada em 6,5.

NotaPor que usamos 114,5?

A Binomial concentra probabilidade nos valores inteiros. Quando a aproximamos por uma Normal contínua, representamos a massa associada ao inteiro \(k\) pela área da curva entre os pontos médios \(k-0{,}5\) e \(k+0{,}5\). Para incluir toda a massa de \(k\), uma probabilidade acumulada até \(k\) precisa terminar na borda direita, \(k+0{,}5\). Uma cauda que começa em \(k\) precisa começar na borda esquerda, \(k-0{,}5\):

\[ P(K\le k)\approx P(Y\le k+0{,}5), \qquad P(K\ge k)\approx P(Y\ge k-0{,}5). \]

Assim, somamos 0,5 ao aproximar uma probabilidade acumulada até \(k\) e subtraímos 0,5 ao aproximar uma cauda que começa em \(k\). Neste exemplo, \(K\ge115\) inclui os inteiros 115, 116 e assim por diante. A cauda Normal equivalente começa em 114,5, logo \(P(K\ge115)\approx P(Y\ge114{,}5)\).

A pequena diferença restante decorre do erro de Monte Carlo na simulação e do fato de a Normal ainda ser uma aproximação.

Explique por que os resultados são próximos e em quais amostras a aproximação Normal poderia falhar.

NotaInterpretação

O cálculo exato usa a distribuição binomial; a simulação a reproduz com erro de Monte Carlo; e a Normal é uma aproximação. A concordância é esperada quando \(np_0\) e \(n(1-p_0)\) não são pequenos, mas pode falhar com amostras pequenas ou probabilidades próximas de zero ou um.

8. Regra de decisão

alpha = 0.05
decision = "rejeitar H0" if p_exact < alpha else "não rejeitar H0"
print(decision)
rejeitar H0

“Não rejeitar” não significa aceitar que a taxa seja exatamente 8%. Significa que a amostra não forneceu evidência suficiente contra esse modelo no nível escolhido.

9. Erro tipo I

O erro tipo I ocorre quando rejeitamos \(H_0\) apesar de ela ser verdadeira. Para um teste calibrado com nível exato \(\alpha\),

\[ P_{H_0}(\text{rejeitar }H_0)=\alpha, \]

em que \(P_{H_0}\) indica que a probabilidade é calculada sob a hipótese nula. Portanto, se repetíssemos o estudo muitas vezes em situações nas quais \(H_0\) fosse verdadeira, a fração de rejeições tenderia a \(\alpha\).

Há uma precisão importante: a definição geral de um teste de nível \(\alpha\) exige

\[ P_{H_0}(\text{rejeitar }H_0)\leq\alpha. \]

A igualdade ocorre quando o teste usa exatamente todo o nível disponível. Em testes com estatísticas discretas, como certos testes binomiais exatos, nem sempre existe uma região de rejeição cuja probabilidade sob \(H_0\) seja exatamente \(\alpha\). Nesse caso, o teste costuma ser conservador e sua probabilidade real de erro tipo I fica abaixo de \(\alpha\).

def rejection_rate(true_p, n=1200, reps=10000, alpha=.05):
    counts = rng.binomial(n, true_p, size=reps)
    p_values = binom.sf(counts - 1, n=n, p=.08)
    return np.mean(p_values < alpha)

print("Erro tipo I sob p=8%:", rejection_rate(.08))
Erro tipo I sob p=8%: 0.0411
NotaInterpretação

Sob \(H_0\), qualquer rejeição é um erro tipo I. A taxa simulada próxima de 5% confirma que \(\alpha\) limita a frequência de falsos positivos no longo prazo, e não a probabilidade de esta decisão específica estar errada.

10. Poder

effects = np.array([.08, .085, .09, .10, .11, .12])
power = [rejection_rate(p) for p in effects]
plt.plot(100*effects, power, marker="o")
plt.axhline(.80, color="darkorange", linestyle="--")
plt.xlabel("Taxa verdadeira de atraso (%)")
plt.ylabel("Poder")
plt.show()

NotaInterpretação

O poder é baixo para alternativas muito próximas de 8% e cresce com o tamanho do efeito. A linha de 80% é uma referência de planejamento, não uma garantia de detectar toda diferença relevante.

Visualizando poder sob \(H_0\) e \(H_1\)

Fixemos um teste unilateral com \(H_0:p=0{,}08\), uma alternativa específica \(p_1=0{,}10\) e \(\alpha=0{,}05\). O limiar crítico aproximado para cada tamanho amostral é

\[c_n=p_0+z_{1-\alpha}\sqrt{\frac{p_0(1-p_0)}{n}},\]

em que \(c_n\) é a menor proporção que leva à rejeição, \(p_0\) é a taxa nula, \(z_{1-\alpha}\) é o quantil da Normal padrão e \(n\) é o tamanho da amostra. Sob a alternativa, o poder aproximado é

\[\pi(p_1;n)=P_{p_1}(\widehat p\geq c_n).\]

\(P_{p_1}\) indica que a probabilidade é calculada quando a taxa verdadeira é \(p_1\); geometricamente, ela corresponde à área da distribuição alternativa à direita do limiar.

p0, p1, alpha = .08, .10, .05
z_critical = norm.ppf(1 - alpha)
fig, axes = plt.subplots(1, 2, figsize=(13.2, 5.3), sharex=True)
common_x = np.linspace(.02, .16, 800)

for ax, n_current in zip(axes, [300, 1200]):
    se0_current = np.sqrt(p0 * (1-p0) / n_current)
    se1_current = np.sqrt(p1 * (1-p1) / n_current)
    critical = p0 + z_critical * se0_current
    x = common_x
    y0 = norm.pdf(x, p0, se0_current)
    y1 = norm.pdf(x, p1, se1_current)
    power_current = norm.sf(critical, p1, se1_current)
    ax.plot(100*x, y0, label=r"Sob $H_0$: $p=8\%$")
    ax.plot(100*x, y1, label=r"Sob $H_1$: $p=10\%$")
    mask = x >= critical
    ax.fill_between(100*x[mask], 0, y1[mask], alpha=.5, hatch="///",
                    label=f"Poder = {power_current:.0%}")
    ax.axvline(100*critical, linestyle="--", label="limiar crítico")
    ax.set_title(f"n = {n_current}")
    ax.set_xlim(2, 16)
    ax.legend()
plt.show()

Distribuições da proporção amostral sob H0 e H1 para duas amostras, com a área de poder hachurada.

NotaInterpretação

Com 300 pedidos, as distribuições sob 8% e 10% se sobrepõem bastante e apenas 37% da distribuição alternativa ultrapassa o limiar. Com 1.200 pedidos, ambas ficam mais estreitas, a sobreposição diminui e o poder sobe para aproximadamente 79%. O efeito verdadeiro não mudou; aumentou apenas a capacidade de distingui-lo da flutuação amostral.

11. Significância e relevância

Calcule também a diferença \(\widehat p-0{,}08\) e traduza-a para atrasos extras por mil pedidos. Uma decisão operacional deve considerar o tamanho do efeito, custos e um intervalo de confiança, não apenas o valor-p.

12. Testes A/B como experimentos aleatorizados

Um teste A/B compara duas versões de uma experiência. A versão A costuma ser o controle; a versão B introduz uma mudança. A atribuição aleatória procura tornar os grupos comparáveis antes da intervenção, de modo que uma diferença posterior possa ser atribuída à mudança, dentro das limitações do desenho.

Um bom teste A/B precisa definir antes da coleta:

  • a unidade que será randomizada;
  • as versões de controle e tratamento;
  • a métrica primária;
  • o menor efeito relevante;
  • o tamanho da amostra ou a regra de parada;
  • a direção e o nível do teste;
  • exclusões e métricas de proteção.

Exemplo: um alerta preventivo na operação da Olist

Suponha que a operação queira testar um alerta capaz de identificar cedo pedidos com risco de atraso e priorizar seu encaminhamento. Entre pedidos elegíveis, a atribuição seria aleatória:

  • A — controle: processo logístico atualmente usado;
  • B — tratamento: processo com o novo alerta preventivo.

A base Olist original é observacional e não contém essa intervenção. Para aprender o fluxo de um A/B sem trocar o contexto da aula, usaremos um experimento didático simulado, com taxas calibradas pela base real:

ab_olist = pd.DataFrame({
    "grupo": ["A — processo atual", "B — alerta preventivo"],
    "pedidos": [5000, 5000],
    "atrasados": [415, 345],
})
ab_olist["taxa_atraso"] = ab_olist["atrasados"] / ab_olist["pedidos"]
ab_olist
grupo pedidos atrasados taxa_atraso
0 A — processo atual 5000 415 0.083
1 B — alerta preventivo 5000 345 0.069
NotaInterpretação

A randomização é uma característica do experimento proposto, não da base Olist histórica. Essa distinção impede apresentar como causal uma comparação que não foi realmente observada no conjunto de dados original.

Da pergunta operacional às hipóteses

A métrica primária é a proporção de pedidos entregues depois da data prevista. A pergunta é: o alerta reduz a taxa de atraso? Definimos

\[ \Delta=p_B-p_A, \]

em que \(p_A\) e \(p_B\) são as probabilidades populacionais de atraso nos dois processos. Como a direção foi definida antes dos dados, o teste unilateral é

\[ H_0:\Delta=0 \qquad\text{contra}\qquad H_A:\Delta<0. \]

Estimativa e teste para duas proporções

n_a, n_b = ab_olist["pedidos"].to_numpy()
x_a, x_b = ab_olist["atrasados"].to_numpy()
p_a, p_b = ab_olist["taxa_atraso"].to_numpy()

p_combinada = (x_a + x_b) / (n_a + n_b)
erro_nulo = np.sqrt(
    p_combinada * (1 - p_combinada) * (1 / n_a + 1 / n_b)
)
efeito = p_b - p_a
z_ab = efeito / erro_nulo
p_ab = norm.cdf(z_ab)

pd.Series({
    "taxa no processo atual": p_a,
    "taxa com alerta": p_b,
    "diferença B - A": efeito,
    "estatística z": z_ab,
    "valor-p unilateral": p_ab,
})
taxa no processo atual    0.083000
taxa com alerta           0.069000
diferença B - A          -0.014000
estatística z            -2.641528
valor-p unilateral        0.004127
dtype: float64

O erro padrão usa a proporção combinada porque, sob \(H_0\), as duas amostras são tratadas como observações de uma mesma taxa:

\[ \widehat p_{pool}=\frac{x_A+x_B}{n_A+n_B}, \qquad EP_0=\sqrt{\widehat p_{pool}(1-\widehat p_{pool}) \left(\frac1{n_A}+\frac1{n_B}\right)}. \]

Aqui, \(x_g\) é o número de pedidos atrasados e \(n_g\) é o número de pedidos no grupo \(g\). A estatística é \(Z=(\widehat p_B-\widehat p_A)/EP_0\).

Substituindo os números do experimento:

\[ \widehat p_{pool}=\frac{415+345}{5000+5000}=0{,}076, \]

\[ EP_0=\sqrt{0{,}076(1-0{,}076) \left(\frac1{5000}+\frac1{5000}\right)}\approx0{,}00530, \]

\[ z_{obs}=\frac{0{,}069-0{,}083}{0{,}00530}\approx-2{,}64. \]

Como a hipótese alternativa é \(H_A:\Delta<0\), resultados mais extremos estão na cauda esquerda da Normal padrão. Assim,

\[ \text{valor-p}=P(Z\leq z_{obs}\mid H_0) =\Phi(-2{,}64)\approx0{,}0041, \]

em que \(\Phi\) é a função de distribuição acumulada da Normal padrão. Em outras palavras: se o alerta não tivesse efeito, observar uma redução igual ou maior que 1,4 ponto percentual ocorreria em aproximadamente 0,41% de experimentos como este.

Taxas simuladas de atraso de 8,3 por cento no processo atual e 6,9 por cento com um alerta preventivo.

NotaInterpretação

A taxa simulada caiu de 8,3% para 6,9%: redução absoluta de 1,4 ponto percentual, com \(z\approx-2{,}64\) e valor-p unilateral próximo de 0,0041. Isso fornece evidência contra \(H_0\) no nível de 5%, mas não decide sozinho se a magnitude compensa o custo do alerta. Em uma escala de 10 mil pedidos, o efeito corresponde a aproximadamente 140 atrasos evitados.

O fluxo completo do A/B

  1. formular a mudança e o mecanismo causal esperado;
  2. escolher unidade de randomização e população-alvo;
  3. definir métrica primária e menor efeito relevante;
  4. planejar tamanho amostral e regra de parada;
  5. randomizar e auditar a alocação;
  6. estimar o efeito com sua incerteza;
  7. testar a hipótese previamente definida;
  8. avaliar significância estatística, relevância prática e efeitos adversos.

A lógica será ampliada nas aulas seguintes: bootstrap para quantificar incerteza, permutação para construir \(H_0\) a partir da randomização e simulação para estudar poder e múltiplas métricas.

13. Exercícios

  1. Repita o teste com amostras de 300, 1.200 e 5.000 pedidos.
  2. Transforme o teste em bilateral e explique a mudança no valor-p.
  3. Compare o erro tipo I para \(\alpha=0{,}01\), 0,05 e 0,10.
  4. Encontre o menor \(n\) que atinge 80% de poder quando \(p=0{,}10\).
  5. Discuta se os pedidos podem ser tratados como independentes quando um mesmo cliente realiza várias compras.
  6. Refaça o A/B do alerta com uma alternativa bilateral e compare o valor-p com o teste unilateral planejado.
  7. Proponha uma métrica de proteção para verificar se a priorização reduz atrasos sem prejudicar pedidos que não receberam o alerta.

Fonte e limitações

Base olistbr/brazilian-ecommerce, Kaggle. Os dados são históricos e anonimizados; o limite de 8% é uma referência didática, não uma meta declarada pela empresa. O notebook não deve ser interpretado como auditoria operacional da Olist.

O exemplo A/B do alerta é uma simulação pedagógica construída no contexto da Olist. Ele não deve ser descrito como um experimento realizado pela empresa nem como uma variável presente na base original.

Guia teórico consolidado

A lógica de um teste

Um teste começa antes dos cálculos: defina o parâmetro de interesse, a hipótese nula \(H_0\), a alternativa \(H_A\), a estatística e a direção. A distribuição nula descreve valores que a estatística poderia assumir se \(H_0\) fosse verdadeira. O valor-p é a probabilidade, calculada sob \(H_0\), de obter resultado tão ou mais extremo que o observado.

O valor-p não é \(P(H_0\mid\text{dados})\), não mede o tamanho do efeito e não é a probabilidade de o resultado ter ocorrido por acaso.

Formalmente, seja \(T=T(X_1,\ldots,X_n)\) uma estatística cuja direção de extremidade foi definida antes da análise. Em um teste unilateral à direita,

\[p(X)=P_{H_0}\{T(X^{rep})\geq T(X^{obs})\},\]

em que \(X^{obs}\) são os dados observados, \(X^{rep}\) representa uma nova amostra gerada pelo modelo nulo e \(P_{H_0}\) indica que a probabilidade é calculada assumindo \(H_0\). No teste bilateral, a região extrema deve incluir desvios relevantes nas duas direções, frequentemente por meio de \(|T|\) quando a distribuição nula é centrada em zero.

Uma região crítica \(\mathcal R_\alpha\) é escolhida para satisfazer \(P_{H_0}(T\in\mathcal R_\alpha)\leq\alpha\). A regra é rejeitar \(H_0\) quando \(T_{obs}\in\mathcal R_\alpha\), de modo que \(\alpha\) limita a probabilidade de rejeição quando a nula é verdadeira.

Decisão e erros

O nível \(\alpha\) controla a probabilidade de erro tipo I sob as condições do teste. Erro tipo II é não rejeitar \(H_0\) quando uma alternativa relevante é verdadeira. Poder é \(1-\beta\): a chance de detectar essa alternativa específica.

Para um valor alternativo \(\theta_1\), \(\beta(\theta_1)=P_{\theta_1}(T\notin\mathcal R_\alpha)\) e \(\pi(\theta_1)=1-\beta(\theta_1)\) é a função poder. Portanto, poder não é um único atributo do teste: ele varia com o efeito verdadeiro \(\theta_1\).

Reduzir \(\alpha\) diminui falsos positivos, mas pode reduzir poder. Poder cresce com tamanho do efeito, tamanho amostral, menor variabilidade e, mantendo o restante, um limiar menos rigoroso.

Significância e importância

“Rejeitar \(H_0\)” não significa provar \(H_A\); “não rejeitar” não prova equivalência. Com amostras grandes, efeitos irrelevantes podem ser significativos. Sempre reporte estimativa, intervalo e consequência substantiva, além do valor-p.

Testes unilaterais só são defensáveis quando a direção foi escolhida antes de observar os dados e efeitos na direção oposta não levariam à mesma ação. Fazer muitos testes aumenta a chance de falsos positivos e exige definir uma família e uma estratégia de correção.

Testes A/B conectam desenho e inferência

Em um teste A/B, a inferência não começa no valor-p. Ela começa na atribuição aleatória das unidades a duas versões. A hipótese nula representa ausência de efeito da mudança sobre a métrica previamente escolhida. O parâmetro de interesse deve ser escrito com direção explícita, como \(\Delta=p_B-p_A\), porque seu sinal determina qual versão é favorecida.

Randomização sustenta a interpretação causal apenas quando a unidade de análise é compatível com a unidade randomizada, não há interferência relevante entre unidades, perdas ou falhas de instrumentação não destroem a comparação e a regra de parada não é alterada depois de observar os resultados. O relatório deve combinar estimativa do efeito, intervalo de confiança, valor-p, relevância prática e métricas de proteção.

Como reduzir falsos positivos quando há muitos testes

Se realizamos vários testes, cresce a probabilidade de encontrar ao menos um resultado significativo apenas por flutuação amostral. Com 20 testes independentes, todos sob hipóteses nulas verdadeiras e cada um com \(\alpha=0{,}05\), essa probabilidade é

\[ P(\text{ao menos um falso positivo}) =1-(1-0{,}05)^{20}\approx 0{,}64. \]

Três estratégias ajudam em momentos diferentes da pesquisa:

  • Pré-registro: antes de observar os resultados, registrar as hipóteses, os desfechos, os critérios de exclusão e o plano de análise. Isso distingue análises confirmatórias das explorações feitas depois de olhar os dados e reduz a liberdade para selecionar apenas resultados favoráveis. Pré-registro não altera matematicamente um valor-p.
  • Correções para múltiplos testes: ajustar os limiares de rejeição ou os valores-p levando em conta a família de testes realizada. Bonferroni e Holm, por exemplo, controlam a probabilidade de ao menos um falso positivo na família. A Aula 15 detalha diferentes critérios e procedimentos.
  • Validação externa: verificar a conclusão em uma amostra, período, instituição ou população independente daquela usada para descobrir o resultado. Um achado que se repete oferece evidência de generalização; um achado que não se repete pode depender de acaso ou de características particulares da amostra original.
NotaInterpretação

Essas medidas não são sinônimas. A correção atua na regra estatística da família de testes; o pré-registro melhora a transparência do processo; e a validação externa procura evidência independente. Em um estudo bem planejado, as três podem ser usadas em conjunto.

Questões de revisão da Aula 11

  1. O que um valor-p de 0,02 afirma — e o que ele não afirma?
  2. Por que aumentar \(n\) eleva o poder quando \(p_0\), \(p_1\) e \(\alpha\) permanecem fixos?
  3. Quais elementos precisam ser definidos antes de iniciar um teste A/B?
Respostas comentadas
  1. Sob \(H_0\), resultados tão ou mais extremos ocorreriam com probabilidade 2%. Isso não significa que \(P(H_0\mid\text{dados})=0{,}02\) nem mede relevância prática.
  2. O erro padrão diminui, as distribuições sob \(H_0\) e \(H_1\) ficam mais estreitas e sua sobreposição diminui.
  3. No mínimo: unidade de randomização, versões A e B, população-alvo, métrica primária, efeito relevante, tamanho amostral ou regra de parada, hipótese, nível do teste e critérios de exclusão.