O Que É Estratificado - Entenda o que é estratificação Social para Octavio Ianni.
Entenda o que é estratificação Social para Octavio Ianni.

Amostragem estratificada na prática

A maioria das pessoas aprende estratificação em estatística e já acha que entende. Na realidade, a diferença entre a teoria e o que acontece quando você aplica isso em dados de verdade é enorme. O conceito básico é simples: dividir a população em subgrupos (estratos) e sortear dentro de cada um. Mas os detalhes que fazem o método funcionar — ou quebrar — são onde a coisa fica interessante.

O que é estratificado e por que importa

Quando se fala em o que é estratificado, o referimos basicamente a uma técnica de amostragem onde a população é separada em grupos homogêneos internamente e heterogêneos entre si. Cada grupo é chamado estrato. A amostra final respeita a proporção de cada estrato na população original. Isso garante que subgrupos pequenos mas importantes não sejam ignorados por sorteio puramente aleatório. Um exemplo do dia a dia: você precisa pesquisar satisfação de clientes num serviço que tem 60% de usuários básicos, 30% intermediários e 10% empresariais. Se fizer uma amostragem simples aleatória com 300 respostas, há uma chance real de o grupo empresarial quase não aparecer. Com estratificação proporcional, você garante que os 10% estejam representados.

O problema é que muitos engenheiros de dados e analistas tratam estratificação como algo que se aplica automaticamente e pronto. Não é. Tem gente que já vi rodar pipeline inteiro com estratificação por coluna de categoria e descobrir depois que a coluna tinha 40% de valores nulos, o que inviabilizava todo o processo se ninguém tivesse tratado isso antes.

Como implementar sem errar

Vou direto ao ponto. Suponha que você tenha um dataframe em Python com pandas e precisa stratificar por uma coluna categórica. O caminho mais comum é usar o método stratified_train_test_split do scikit-learn ou fazer manualmente com groupby e sample. Aqui vai um exemplo funcional: import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("dados.csv")
X = df.drop("target", axis=1)
y = df["target"]

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)

Isso é o básico. O que ninguém conta é que stratify só funciona bem quando cada classe tem amostras suficientes. Se uma classe tem menos de 5 registros, o método pode falhar silenciosamente ou gerar splits irreais. Eu já passei por isso num projeto de detecção de fraude onde a classe positiva tinha 23 amostras em 50 mil registros. Tentei stratify e o split não convergia. A solução foi combinar com oversampling controlado (SMOTE) apenas no treino, nunca no conjunto inteiro, senão vaza informação para o teste.

Pegadinhas que não aparecem na documentação

A primeira pegadinha é achar que estratificação resolve problemas de desbalanceamento. Ela não resolve. Ela apenas garante representação proporcional. Se você tem 99% de uma classe e 1% da outra, o split estratificado vai manter essa proporção. O modelo continua achando que prever tudo como majoritário é estratégia vencedora. Estratificação não é remedo de class weights ou técnicas de reamostragem. São coisas complementares, não substitutas. A segunda pegadinha, e aqui vou dar um exemplo bem específico que me custou duas semanas de retrabalho: estratificar por múltiplas colunas simultaneamente. Muita gente quer stratificar por gênero E faixa etária ao mesmo tempo. O scikit-learn não suporta stratify com múltiplas colunas nativamente. A tentação é criar uma coluna composta concatenando os valores. Isso funciona até você encontrar combinações raras que existem só uma vez. Aí o algoritmo não consegue formar os grupos necessários e dá erro ou faz um split completamente enviesado.

👉 Clique no botão abaixo para saber mais sobre o assunto!

A solução que eu uso hoje é mais chata mas funciona: criar os estratos com cross-tabulation, filtrar combinações com menos de N ocorrência, agrupar essas combinações raras numa categoria "outros", e só então aplicar o stratify nessa coluna limpa. Em código: df["estrato"] = df["genero"] + "_" + df["faixa_etaria"]
contagem = df["estrato"].value_counts()
comuns = contagem[contagem >= 10].index
df.loc[~df["estrato"].isin(comuns), "estrato"] = "raro"
agora sim, stratify=df["estrato"]

Isso corta o tempo de debugging de divisão de dados de horas para minutos. E evita aquele erro frustrante de training pipeline que falha só porque uma combinação de atributos apareceu uma vez no dataset.

Quando estratificação não é a resposta

Tem cenário em que estratificar é perda de tempo. Se sua população é essencialmente homogênea na variável que você pretende estratificar, você está apenas adicionando complexidade sem ganho. Já fiz análise em que estratificação por região geográfica não alterava em nada a variância da estimativa porque o indicador estudado não tinha variação regional significativa. Nesse caso, amostragem simples aleatória era mais eficiente em termos computacionais e tão precisa. Também funciona mal quando os estratos são muito pequenos e numerosos. Se você tem 200 estratos com média de 10 unidades cada, a amostragem estratificada proporcional vai exigir pelo menos 200 observações só para tocar todo mundo. Em projetos reais com orçamentos limitados, isso é proibitivo. Nesses casos, amostragem por conglomerados ou até PPS (probabilidade proporcional ao tamanho) costuma ser mais viável.

Alternativas que vale conhecer

Se estratificação tradicional está te dando dor de cabeça, considere estas opções: Amostragem sistemática estratificada: ordena os estratos e seleciona a cada k elementos. Mais simples de implementar, menos sensível a classes raras.

Bootstrap estratificado: para estimação de intervalo de confiança, reproduz o dataset mantendo a proporção dos estratos. Útil quando não dá para coletar dados novos e você precisa de estimates robustas. Estratificação pós-classificação (raking): primeiro amostra aleatoriamente, depois ajusta pesos para corrigir desproporções. Menos elegante teoricamente, mas muito mais flexível na prática porque lida com missing values e categorias dinâmicas sem quebrar.

O ponto é que saber o que é estratificado é o mínimo. O que diferencia quem implementa isso no mundo real de quem apenas passou pela matéria na faculdade é saber onde o método falha, quais são as armadilhas de implementação, e quando vale a pena abandonar a abordagem e partir para outra coisa. Os dados nunca são limpos, as categorias nunca são estáveis, e os erros mais caros são sempre os que parecem óbvios de prime