Phase 01 - Lesson 15

Estatística para Aprendizado de Máquina

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

Estatística é como você sabe se o seu modelo realmente funciona ou apenas teve sorte.

Tipo: Construir Linguagem: Python Pré-requisitos: Fase 1, Lições 06 (Probabilidade e Distribuições), 07 (Teorema de Bayes) Tempo: ~120 minutos

Objetivos de Aprendizagem

  • Calcular estatísticas descritivas, correlação de Pearson/Spearman e matrizes de covariância do zero
  • Realizar testes de hipótese (teste t, qui-quadrado) e interpretar p-valores e intervalos de confiança corretamente
  • Usar reamostragem por bootstrap para construir intervalos de confiança para qualquer métrica sem suposições distribucionais
  • Distinguir significância estatística de significância prática usando medidas de tamanho de efeito

O Problema

Você treinou dois modelos. O Modelo A pontua 0.87 no seu conjunto de teste. O Modelo B pontua 0.89. Você implanta o Modelo B. Três semanas depois, as métricas de produção estão piores do que antes. O que aconteceu?

O Modelo B na verdade não superou o Modelo A. A diferença de 0.02 era ruído. Seu conjunto de teste era pequeno demais, ou a variância alta demais, ou ambos. Você embarcou aleatoriedade vestida de melhoria.

Isso acontece o tempo todo. Reviravoltas no leaderboard do Kaggle. Papers que não reproduzem. Testes A/B que declaram vencedores com base em algumas centenas de amostras. A causa raiz é sempre a mesma: alguém pulou a estatística.

A estatística te dá as ferramentas para distinguir sinal de ruído. Ela te diz quando uma diferença é real, quão confiante você deveria estar e quantos dados você precisa antes de poder confiar em um resultado. Todo pipeline de ML, toda comparação de modelos, todo experimento precisa de estatística. Sem ela, você está adivinhando.

O Conceito

Estatísticas Descritivas: Resumindo Seus Dados

Antes de modelar qualquer coisa, você precisa saber com o que seus dados se parecem. Estatísticas descritivas comprimem um conjunto de dados em alguns números que capturam sua forma.

Medidas de tendência central respondem "onde fica o meio?"

Mean:   sum of all values / count
        mu = (1/n) * sum(x_i)

Median: middle value when sorted
        Robust to outliers. If you have [1, 2, 3, 4, 1000], the mean is 202
        but the median is 3.

Mode:   most frequent value
        Useful for categorical data. For continuous data, rarely informative.

A média é o ponto de equilíbrio. A mediana é o marco da metade. Quando elas divergem, sua distribuição é assimétrica. Distribuições de renda tem média >> mediana (assimetria a direita por bilionários). Distribuições de loss durante o treinamento frequentemente tem média << mediana (assimetria a esquerda por amostras fáceis).

Medidas de dispersão respondem "quão espalhados estão os dados?"

Variance:   average squared deviation from the mean
            sigma^2 = (1/n) * sum((x_i - mu)^2)

Standard deviation:  square root of variance
                     sigma = sqrt(sigma^2)
                     Same units as the data, so more interpretable.

Range:      max - min
            Sensitive to outliers. Almost never useful alone.

IQR:        Q3 - Q1 (interquartile range)
            The range of the middle 50% of the data.
            Robust to outliers. Used for box plots and outlier detection.

Percentis dividem os dados ordenados em 100 partes iguais. O 25o percentil (Q1) significa que 25% dos valores ficam abaixo desse ponto. O 50o percentil é a mediana. O 75o percentil é Q3.

For latency monitoring:
  P50 = median latency        (typical user experience)
  P95 = 95th percentile       (bad but not worst case)
  P99 = 99th percentile       (tail latency, often 10x the median)

Em ML, você se importa com percentis para latencia de inferência, distribuições de confiança de predição e para entender distribuições de erro. Um modelo com baixo erro médio mas péssimo erro de P99 pode ser inútil para aplicações críticas de segurança.

Estatísticas de amostra vs população. Ao calcular a variância a partir de uma amostra, divida por (n-1) em vez de n. Essa é a correção de Bessel. Ela compensa o fato de que a média da sua amostra não é a média verdadeira da população. Com n no denominador, você subestima sistematicamente a variância verdadeira. Com (n-1), a estimativa fica não enviesada.

Population variance: sigma^2 = (1/N) * sum((x_i - mu)^2)
Sample variance:     s^2     = (1/(n-1)) * sum((x_i - x_bar)^2)

Na prática: se n é grande (milhares de amostras), a diferença é negligenciável. Se n é pequeno (dezenas de amostras), ela importa.

Correlação: Como as Variáveis se Movem Juntas

A correlação mede a força e a direção de uma relação linear entre duas variáveis.

O coeficiente de correlação de Pearson mede a associação linear:

r = sum((x_i - x_bar)(y_i - y_bar)) / (n * s_x * s_y)

r = +1:  perfect positive linear relationship
r = -1:  perfect negative linear relationship
r =  0:  no linear relationship (but there might be a nonlinear one!)

Range: [-1, 1]

Pearson assume que a relação é linear e que ambas as variáveis são aproximadamente normalmente distribuídas. Ele é sensível a outliers. Um único ponto extremo pode arrastar r de 0.1 para 0.9.

A correlação de postos de Spearman mede a associação monotônica:

1. Replace each value with its rank (1, 2, 3, ...)
2. Compute Pearson correlation on the ranks

Spearman catches any monotonic relationship, not just linear.
If y = x^3, Pearson gives r < 1 but Spearman gives rho = 1.

Quando usar cada uma:

Pearson:    Both variables are continuous and roughly normal.
            You care about the linear relationship specifically.
            No extreme outliers.

Spearman:   Ordinal data (rankings, ratings).
            Data is not normally distributed.
            You suspect a monotonic but not linear relationship.
            Outliers are present.

A regra de ouro: correlação não implica causalidade. Vendas de sorvete e mortes por afogamento são correlacionadas porque ambas aumentam no verão. A acurácia do seu modelo e o número de parâmetros são correlacionados, mas adicionar parâmetros não melhora automaticamente a acurácia (veja: overfitting).

Matriz de Covariância

A covariância entre duas variáveis mede o quanto elas variam juntas:

Cov(X, Y) = (1/n) * sum((x_i - x_bar)(y_i - y_bar))

Cov(X, Y) > 0:  X and Y tend to increase together
Cov(X, Y) < 0:  when X increases, Y tends to decrease
Cov(X, Y) = 0:  no linear co-movement

Para d features, a matriz de covariância C é uma matriz d x d onde C[i][j] = Cov(feature_i, feature_j). As entradas diagonais C[i][i] são as variâncias de cada feature.

C = | Var(x1)      Cov(x1,x2)  Cov(x1,x3) |
    | Cov(x2,x1)  Var(x2)      Cov(x2,x3) |
    | Cov(x3,x1)  Cov(x3,x2)  Var(x3)     |

Properties:
  - Symmetric: C[i][j] = C[j][i]
  - Positive semi-definite: all eigenvalues >= 0
  - Diagonal = variances
  - Off-diagonal = covariances

Conexão com PCA. O PCA faz a autodecomposição da matriz de covariância. Os autovetores são os componentes principais (direções de variância máxima). Os autovalores te dizem quanta variância cada componente captura. É exatamente isso que a Lição 10 cobriu, mas agora você vê por que a matriz de covariância é a coisa certa a decompor: ela codifica todas as relações lineares aos pares nos seus dados.

Conexão com correlação. A matriz de correlação é a matriz de covariância de variáveis padronizadas (cada uma dividida por seu desvio padrão). A correlação normaliza a covariância para que todos os valores caiam em [-1, 1].

Teste de Hipótese

O teste de hipótese é um arcabouço para tomar decisões sob incerteza. Você começa com uma afirmação, coleta dados e determina se os dados são consistentes com a afirmação.

A configuração:

Null hypothesis (H0):        the default assumption, usually "no effect"
Alternative hypothesis (H1): what you are trying to show

Example:
  H0: Model A and Model B have the same accuracy
  H1: Model B has higher accuracy than Model A

O p-valor é a probabilidade de ver dados tão extremos quanto os que você observou, assumindo que H0 é verdadeira. Ele NÃO é a probabilidade de que H0 seja verdadeira. Esse é o mal-entendido isolado mais comum em estatística.

p-value = P(data this extreme | H0 is true)

If p-value < alpha (typically 0.05):
    Reject H0. The result is "statistically significant."
If p-value >= alpha:
    Fail to reject H0. You do not have enough evidence.
    This does NOT mean H0 is true.

Intervalos de confiança dão uma faixa de valores plausíveis para um parâmetro:

95% confidence interval for the mean:
    x_bar +/- z * (s / sqrt(n))

where z = 1.96 for 95% confidence

Interpretation: if you repeated this experiment many times, 95% of the
computed intervals would contain the true mean. It does NOT mean there
is a 95% probability the true mean is in this specific interval.

A largura do intervalo de confiança te diz sobre a precisão. Intervalos largos significam alta incerteza. Intervalos estreitos significam que sua estimativa é precisa (mas não necessariamente acurada, se seus dados forem enviesados).

O Teste t

O teste t compara médias. Existem vários sabores.

Teste t de uma amostra: a média da população é diferente de um valor hipotético?

t = (x_bar - mu_0) / (s / sqrt(n))

degrees of freedom = n - 1

Teste t de duas amostras (independente): as médias de dois grupos são diferentes?

t = (x_bar_1 - x_bar_2) / sqrt(s1^2/n1 + s2^2/n2)

This is Welch's t-test, which does not assume equal variances.
Always use Welch's unless you have a specific reason for equal variances.

Teste t pareado: quando as medições vêm em pares (mesmo modelo avaliado nos mesmos splits de dados):

Compute d_i = x_i - y_i for each pair
Then run a one-sample t-test on the d_i values against mu_0 = 0

Em ML, o teste t pareado é comum: você roda ambos os modelos nos mesmos 10 folds de validação cruzada e compara suas pontuações par a par.

Teste Qui-Quadrado

O teste qui-quadrado verifica se as frequências observadas batem com as frequências esperadas. Útil para dados categóricos.

chi^2 = sum((observed - expected)^2 / expected)

Example: does a language model's output distribution match the
training distribution across categories?

Category    Observed   Expected
Positive       120        100
Negative        80        100
chi^2 = (120-100)^2/100 + (80-100)^2/100 = 4 + 4 = 8

With 1 degree of freedom, chi^2 = 8 gives p < 0.005.
The difference is significant.

Teste A/B para Modelos de ML

O teste A/B em ML não é o mesmo que o teste A/B na web. A comparação de modelos tem desafios específicos:

1. Same test set:    Both models must be evaluated on identical data.
                     Different test sets make comparison meaningless.

2. Multiple metrics: Accuracy alone is not enough. You need precision,
                     recall, F1, latency, and fairness metrics.

3. Variance:         Use cross-validation or bootstrap to estimate
                     the variance of each metric, not just point estimates.

4. Data leakage:     If the test set was used during model selection,
                     your comparison is biased. Hold out a final test set.

O procedimento:

1. Define your metric and significance level (alpha = 0.05)
2. Run both models on the same k-fold cross-validation splits
3. Collect paired scores: [(a1, b1), (a2, b2), ..., (ak, bk)]
4. Compute differences: d_i = b_i - a_i
5. Run a paired t-test on the differences
6. Check: is the mean difference significantly different from 0?
7. Compute a confidence interval for the mean difference
8. Compute effect size (Cohen's d) to judge practical significance

Significância Estatística vs Significância Prática

Um resultado pode ser estatisticamente significativo mas praticamente sem sentido. Com dados suficientes, até uma diferença trivial se torna estatisticamente significativa.

Example:
  Model A accuracy: 0.9234
  Model B accuracy: 0.9237
  n = 1,000,000 test samples
  p-value = 0.001

Statistically significant? Yes.
Practically significant? A 0.03% improvement is not worth the
engineering cost of deploying a new model.

O tamanho de efeito quantifica o quão grande é a diferença, independente do tamanho da amostra:

Cohen's d = (mean_1 - mean_2) / pooled_std

d = 0.2:  small effect
d = 0.5:  medium effect
d = 0.8:  large effect

Sempre reporte tanto o p-valor quanto o tamanho de efeito. O p-valor te diz se a diferença é real. O tamanho de efeito te diz se ela importa.

Problema das Comparações Múltiplas

Quando você testa muitas hipóteses, algumas serao "significativas" por acaso. Se você testa 20 coisas em alpha = 0.05, espera 1 falso positivo mesmo quando nada é real.

P(at least one false positive) = 1 - (1 - alpha)^m

m = 20 tests, alpha = 0.05:
P(false positive) = 1 - 0.95^20 = 0.64

You have a 64% chance of at least one false positive.

Correção de Bonferroni: divida alpha pelo número de testes.

Adjusted alpha = alpha / m = 0.05 / 20 = 0.0025

Only reject H0 if p-value < 0.0025.
Conservative but simple. Works when tests are independent.

Em ML, isso importa quando você compara um modelo em múltiplas métricas, testa muitas configurações de hiperparâmetros ou avalia em múltiplos conjuntos de dados.

Métodos de Bootstrap

O bootstrap estima a distribuição amostral de uma estatística reamostrando seus dados com reposição. Nenhuma suposição sobre a distribuição subjacente é necessária.

O algoritmo:

1. You have n data points
2. Draw n samples WITH replacement (some points appear multiple times,
   some not at all)
3. Compute your statistic on this bootstrap sample
4. Repeat B times (typically B = 1000 to 10000)
5. The distribution of bootstrap statistics approximates the
   sampling distribution

Intervalo de confiança por bootstrap (método do percentil):

Sort the B bootstrap statistics
95% CI = [2.5th percentile, 97.5th percentile]

Por que o bootstrap importa para ML:

- Test set accuracy is a point estimate. Bootstrap gives you
  confidence intervals.
- You cannot assume metric distributions are normal (especially
  for AUC, F1, precision at k).
- Bootstrap works for ANY statistic: median, ratio of two means,
  difference in AUC between two models.
- No closed-form formula needed.

Bootstrap para comparação de modelos:

1. You have predictions from Model A and Model B on the same test set
2. For each bootstrap iteration:
   a. Resample test indices with replacement
   b. Compute metric_A and metric_B on the resampled set
   c. Store diff = metric_B - metric_A
3. 95% CI for the difference:
   [2.5th percentile of diffs, 97.5th percentile of diffs]
4. If the CI does not contain 0, the difference is significant

Isso é mais robusto que o teste t pareado porque não faz suposições distribucionais.

Testes Paramétricos vs Não Paramétricos

Testes paramétricos assumem uma distribuição específica (geralmente normal):

t-test:         assumes normally distributed data (or large n by CLT)
ANOVA:          assumes normality and equal variances
Pearson r:      assumes bivariate normality

Testes não paramétricos não fazem suposições distribucionais:

Mann-Whitney U:     compares two groups (replaces independent t-test)
Wilcoxon signed-rank: compares paired data (replaces paired t-test)
Spearman rho:       correlation on ranks (replaces Pearson)
Kruskal-Wallis:     compares multiple groups (replaces ANOVA)

Quando usar não paramétrico:

- Small sample size (n < 30) and data is clearly non-normal
- Ordinal data (ratings, rankings)
- Heavy outliers you cannot remove
- Skewed distributions

Quando usar paramétrico:

- Large sample size (CLT makes the test statistic approximately normal)
- Data is roughly symmetric without extreme outliers
- More statistical power (better at detecting real differences)

Em experimentos de ML, você tipicamente tem n pequeno (5 ou 10 folds de validação cruzada), então testes não paramétricos como o de Wilcoxon de postos sinalizados são frequentemente mais apropriados que os testes t.

Teorema Central do Limite: Implicações Práticas

O TCL diz que a distribuição das médias amostrais se aproxima de uma distribuição normal à medida que n cresce, independentemente da distribuição da população subjacente.

If X_1, X_2, ..., X_n are iid with mean mu and variance sigma^2:

    X_bar ~ Normal(mu, sigma^2 / n)    as n -> infinity

Works for n >= 30 in most cases.
For highly skewed distributions, you might need n >= 100.

Por que isso importa para ML:

1. Justifies confidence intervals and t-tests on aggregated metrics
2. Explains why averaging over cross-validation folds gives stable
   estimates even when individual folds vary wildly
3. Mini-batch gradient descent works because the average gradient
   over a batch approximates the true gradient (CLT in action)
4. Ensemble methods: averaging predictions from many models gives
   more stable output than any single model

O que o TCL NÃO faz:

- Does NOT make your data normal. It makes the MEAN of samples normal.
- Does NOT work for heavy-tailed distributions with infinite variance
  (Cauchy distribution).
- Does NOT apply to dependent data (time series without correction).

Erros Estatísticos Comuns em Papers de ML

  1. Testar no conjunto de treinamento. Garante overfitting. Sempre separe dados que o modelo nunca vê durante o treinamento.

  2. Sem intervalos de confiança. Reportar um único número de acurácia sem incerteza torna os resultados não reprodutiveis e não verificáveis.

  3. Ignorar comparações múltiplas. Testar 50 configurações e reportar a melhor sem correção infla as taxas de falso positivo.

  4. Confundir significância estatística e prática. Um p-valor de 0.001 em uma melhoria de acurácia de 0.01% não é significativo.

  5. Usar acurácia em dados desbalanceados. 99% de acurácia em um conjunto de dados com 99% de classe negativa significa que o modelo não aprendeu nada. Use precisão, recall, F1 ou AUC.

  6. Escolher métricas a dedo (cherry-picking). Reportar apenas a métrica em que seu modelo vence. Avaliação honesta reporta todas as métricas relevantes.

  7. Vazar informação entre os splits de treino/teste. Normalizar antes de dividir, ou usar dados do futuro para prever o passado.

  8. Conjuntos de teste pequenos sem estimativas de variância. Avaliar em 100 amostras e afirmar 2% de melhoria é ruído, não sinal.

  9. Assumir independência quando os dados não são independentes. Imagens médicas do mesmo paciente, múltiplas sentenças do mesmo documento. Observações dentro de um grupo são correlacionadas.

  10. P-hacking. Tentar testes, subconjuntos ou critérios de exclusao diferentes até obter p < 0.05. O resultado é um artefato da busca.

Construindo

Você vai implementar:

  1. Estatísticas descritivas do zero (média, mediana, moda, desvio padrão, percentis, IQR)
  2. Funções de correlação (Pearson e Spearman, com a matriz de covariância)
  3. Testes de hipótese (teste t de uma amostra, teste t de duas amostras, teste qui-quadrado)
  4. Intervalos de confiança por bootstrap (para qualquer estatística, sem suposições necessárias)
  5. Simulador de teste A/B (gerar dados, testar, verificar erros do Tipo I e Tipo II)
  6. Demo de significância estatística vs prática (mostrando que um n grande torna tudo "significativo")

Tudo do zero, usando apenas math e random. Sem numpy, sem scipy.

Termos-Chave

Termo Definição
Média Soma dos valores dividida pela contagem. Sensível a outliers.
Mediana Valor do meio dos dados ordenados. Robusta a outliers.
Desvio padrão Raiz quadrada da variância. Mede a dispersão nas unidades originais.
Percentil Valor abaixo do qual cai uma dada porcentagem dos dados.
IQR Intervalo interquartil. Q3 menos Q1. A dispersão dos 50% centrais.
Correlação de Pearson Mede a associação linear entre duas variáveis. Faixa [-1, 1].
Correlação de Spearman Mede a associação monotônica usando postos.
Matriz de covariância Matriz de covariâncias aos pares entre todas as features.
Hipótese nula Suposição padrão de nenhum efeito ou nenhuma diferença.
p-valor Probabilidade de dados tão extremos quanto estes dada a hipótese nula verdadeira.
Intervalo de confiança Faixa de valores plausíveis para um parâmetro em um dado nível de confiança.
Teste t Testa se as médias diferem significativamente. Usa a distribuição t.
Teste qui-quadrado Testa se as frequências observadas diferem das frequências esperadas.
Tamanho de efeito Magnitude de uma diferença, independente do tamanho da amostra. O d de Cohen é comum.
Correção de Bonferroni Divide o limiar de significância pelo número de testes para controlar falsos positivos.
Bootstrap Reamostragem com reposição para estimar distribuições amostrais.
Erro do Tipo I Falso positivo. Rejeitar H0 quando ela é verdadeira.
Erro do Tipo II Falso negativo. Falhar em rejeitar H0 quando ela é falsa.
Poder estatístico Probabilidade de rejeitar corretamente uma H0 falsa. Poder = 1 menos a taxa de erro do Tipo II.
Teorema central do limite As médias amostrais convergem para uma distribuição normal à medida que o tamanho da amostra cresce.
Teste paramétrico Assume uma distribuição específica para os dados (geralmente normal).
Teste não paramétrico Não faz suposições distribucionais. Funciona com postos ou sinais.
0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).