Estatística

Variáveis Aleatórias: O Alicerce de Todo Modelo

01 Jun 202512 min read

Se você treina modelos de machine learning, monitora APIs em produção ou analisa resultados de testes A/B, está trabalhando com variáveis aleatórias — mesmo que nunca tenha parado para formalizar isso. Este artigo constrói o conceito do zero, com rigor estatístico mas sem arrogância, e termina com uma aplicação real de monitoramento de SLA.

Ao final, você vai entender: o que é uma variável aleatória, como descrevê-la formalmente, e por que isso é o alicerce de qualquer modelo probabilístico que você vai usar na carreira.

🔗 Conexão: Este é o primeiro artigo da trilha de Estatística para ML. Os conceitos aqui são pré-requisito para tudo que vem depois — distribuições, inferência, testes de hipótese.


O que é uma variável aleatória?

Imagine que você monitora o tempo de resposta de uma API. Cada requisição é um "experimento" — você não sabe de antemão se vai demorar 50ms ou 3 segundos. O valor que você mede é imprevisível individualmente, mas segue um padrão coletivo. Esse "medidor de resultados imprevisíveis" é exatamente uma variável aleatória.

Formalmente, uma variável aleatória XX é uma função que mapeia resultados de um experimento aleatório para números reais:

X:ΩRX: \Omega \rightarrow \mathbb{R}

Onde Ω\Omega é o espaço amostral — o conjunto de todos os resultados possíveis do experimento.

💡 Insight: Todo dado que você coleta em produção (latência, taxa de conversão, valor de compra, churn) é uma realização de uma variável aleatória. Quando você faz df['latencia'].mean(), está estimando E[X]E[X] a partir de amostras.

Exemplos concretos

  • XX = tempo de resposta da API → X=42X = 42 ms, X=180X = 180 ms, X=3200X = 3200 ms
  • YY = número de cliques por sessão → Y=0Y = 0, Y=3Y = 3, Y=12Y = 12
  • ZZ = valor de uma compra → Z=0Z = 0 (não comprou) ou Z=89.90Z = 89.90

Tipos de variáveis aleatórias

Nem todas as variáveis aleatórias são iguais. A distinção fundamental determina quais distribuições e quais modelos você pode usar:

TipoValores possíveisExemplo em produçãoDistribuição típica
DiscretaFinitos ou enumeráveisCliques por sessão, erros por minutoPoisson, Binomial
ContínuaQualquer valor num intervaloLatência, tempo até churn, receitaNormal, Exponencial, Log-Normal
MistaCombinação (ponto + intervalo)Valor de compra (0 ou contínuo)Zero-inflated, Hurdle

⚠️ Atenção: Tratar uma variável discreta como contínua (ou vice-versa) é um dos erros mais comuns em modelagem. Se seus dados têm muitos zeros exatos, provavelmente precisa de um modelo misto — não de uma Normal.


Distribuição de probabilidade

A distribuição descreve como a probabilidade se espalha pelos valores de XX. É o "retrato completo" da variável aleatória — saber a distribuição é saber tudo sobre o comportamento de XX.

Para variáveis contínuas, usamos a função densidade de probabilidade (PDF):

f(x)=1σ2πexp(12(xμσ)2)f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2\right)

Esta é a distribuição Normal (Gaussiana) — a mais famosa, com média μ\mu e desvio padrão σ\sigma.

Propriedades que você precisa saber

PropriedadeFórmulaSignificado
Área total = 1+f(x)dx=1\int_{-\infty}^{+\infty} f(x)\, dx = 1A probabilidade total é 100%
Probabilidade num intervaloP(aXb)=abf(x)dxP(a \leq X \leq b) = \int_a^b f(x)\, dxÁrea sob a curva entre aa e bb
Valor esperadoE[X]=μE[X] = \mu"Centro de gravidade" da distribuição
VariânciaVar(X)=σ2\text{Var}(X) = \sigma^2O quão espalhados os valores estão

🛠️ Na prática: Você raramente calcula integrais manualmente. Use scipy.stats.norm.cdf(x, mu, sigma) para probabilidades e norm.ppf(q, mu, sigma) para quantis.

Valor esperado e variância

Estes dois números resumem qualquer distribuição. Com eles, você já sabe "para onde aponta" e "quão incerto é".

O valor esperado E[X]E[X] é a média ponderada pela probabilidade:

E[X]=+xf(x)dxE[X] = \int_{-\infty}^{+\infty} x \cdot f(x)\, dx

A variância Var(X)\text{Var}(X) mede o quanto os valores se afastam da média:

Var(X)=E[(Xμ)2]=E[X2](E[X])2\text{Var}(X) = E\left[(X - \mu)^2\right] = E[X^2] - (E[X])^2

Por que isso importa em ML?

Conceito MLConexão com variância
Bias do estimadorBias(θ^)=E[θ^]θ\text{Bias}(\hat{\theta}) = E[\hat{\theta}] - \theta
OverfittingModelo com alta variância nas previsões
Trade-off bias-variânciaMSE=Bias2+Var\text{MSE} = \text{Bias}^2 + \text{Var}
RegularizaçãoReduz variância ao custo de aumentar bias

💡 Insight: Quando alguém diz "o modelo está overfitting", está dizendo que a variância das previsões é alta — para inputs parecidos, o modelo dá respostas muito diferentes dependendo do treino.


Quantis: a linguagem de produção

Em produção, ninguém fala em média — fala-se em quantis (percentis). A razão é simples: a média é sensível a outliers. Um timeout de 30 segundos em 10.000 requisições distorce a média, mas não afeta o P50 nem o P95.

QuantilO que representaUso típico
P50 (mediana)Metade é menor, metade é maior"Experiência típica" do usuário
P9595% das requisições são mais rápidasAlerta de degradação
P9999% são mais rápidas — o 1% piorSLA contratual

⚠️ Atenção: Se seu SLA diz "latência média < 200ms", está mal definido. Um sistema com média 150ms pode ter P99 de 5 segundos. Defina SLA em percentis.

Visualizando a distribuição

P99 = 500msMediana = 90ms0100200300500Latência (ms)DensidadePDF Log-NormalViolação SLA

O gráfico mostra a distribuição Log-Normal das latências da FlashLog. A área vermelha à direita de P99 representa os ~2% de requisições que violam o SLA. Note como a mediana (89ms) está distante do P99 (621ms) — é a cauda longa em ação.

Caso prático: Monitorando SLA na FlashLog

A FlashLog é uma startup de logging que processa 50.000 requisições/minuto. O SLA contratual garante latência P99 < 500ms. O time de engenharia precisa de um monitor que detecte degradação antes que o SLA estoure.

Modelando o problema

O tempo de resposta XX segue uma distribuição Log-Normal (típico para latências — sempre positiva, cauda longa à direita):

ln(X)N(μ=4.5,  σ=0.8)\ln(X) \sim N(\mu = 4.5,\; \sigma = 0.8)

Implementação do monitor

import numpy as np
from scipy import stats

# Parâmetros estimados de dados históricos
mu_ln, sigma_ln = 4.5, 0.8

# Simular 10.000 requisições
np.random.seed(42)
latencias = np.random.lognormal(mean=mu_ln, sigma=sigma_ln, size=10_000)

# Quantis operacionais
p50 = np.percentile(latencias, 50)
p95 = np.percentile(latencias, 95)
p99 = np.percentile(latencias, 99)

print(f'P50 (mediana):  {p50:.1f} ms')
print(f'P95:            {p95:.1f} ms')
print(f'P99:            {p99:.1f} ms')
print(f'SLA (P99<500):  {"VIOLADO" if p99 > 500 else "OK"}')

# Probabilidade de violar o SLA por requisição
prob_viola = 1 - stats.lognorm.cdf(500, s=sigma_ln, scale=np.exp(mu_ln))
print(f'P(X > 500ms):   {prob_viola:.4f} ({prob_viola*100:.2f}%)')
P50 (mediana):  89.4 ms
P95:            328.7 ms
P99:            621.3 ms
SLA (P99<500):  VIOLADO
P(X > 500ms):   0.0198 (1.98%)

📊 Resultado: Com σ=0.8\sigma = 0.8, quase 2% das requisições violam o SLA. A mediana é ótima (89ms), mas a cauda longa é o problema. O time precisa reduzir a variância dos outliers, não otimizar o caso médio.

Decisão tomada

OpçãoAçãoImpacto no P99
AOtimizar queries lentas (top 5%)Reduz σ\sigma de 0.8 → 0.6
BRenegociar SLA para P99 < 700msAceita a cauda atual
CCircuit breaker em 400msCorta a cauda, mas gera erros

O time escolheu opção A — atacar a causa (queries lentas), não o sintoma.

🛠️ Na prática: Monitore com np.percentile(latencias_janela, 99) a cada minuto. Alerte se P99 > 400ms (margem de segurança antes do SLA de 500ms).


Quando usar / Quando NÃO usar

CenárioAbordagem corretaErro comum
Modelar incerteza em previsõesTratar output como variável aleatóriaReportar só o ponto médio sem intervalo
Monitorar performanceUsar quantis (P95, P99)Usar média (masca outliers)
Dados com muitos zerosModelo misto (zero-inflated)Forçar Normal em dados assimétricos
Feature engineeringCalcular estatísticas da distribuiçãoUsar só a média como feature
Comparar modelosAnalisar distribuição dos errosComparar só RMSE médio

Resumo

ConceitoO que éPor que importa
Variável aleatória XXFunção: resultados → númerosBase de toda modelagem probabilística
Distribuição f(x)f(x)Como a probabilidade se espalhaEscolher o modelo certo
Valor esperado E[X]E[X]Centro de gravidadeBias, previsão pontual
Variância Var(X)\text{Var}(X)DispersãoOverfitting, incerteza
Quantis (P50, P95, P99)Pontos de corteSLAs, alertas, decisões

Próximo passo

No próximo artigo, vamos abrir a caixa das distribuições de probabilidade — Bernoulli, Binomial, Poisson, Normal, Exponencial e Log-Normal. Para cada uma: quando usar, fórmula, gráfico comparativo e um guia prático para escolher a distribuição certa para cada problema que você encontra em produção.

"O melhor modelo é aquele que você entende profundamente o suficiente para saber quando ele vai falhar." — Victor Zoré

© 2026 Victor Zoré. All rights reserved.