Multicolinearidade

Visão geral

Multicolinearidade (multicollinearity) ocorre quando dois ou mais atributos (features) de entrada (preditores) em um conjunto de dados estão altamente correlacionados — isto é, carregam informações sobrepostas. Na presença de multicolinearidade, muitos modelos ainda conseguem fazer previsões precisas, mas os coeficientes de modelos lineares tornam-se instáveis, frequentemente mudando de forma dramática com pequenas perturbações nos dados. Isso torna os coeficientes mais difíceis de interpretar e também pode distorcer técnicas comuns de importância de atributos.

A multicolinearidade é uma armadilha frequente na engenharia de atributos (feature engineering) porque muitas vezes surge de escolhas razoáveis de pré-processamento: adicionar variáveis derivadas, aplicar codificação one-hot a categorias ou manter múltiplas medições do mesmo conceito subjacente.

O que é (e o que não é) multicolinearidade

Intuição: sinais redundantes

Se dois atributos se movem juntos, o modelo tem dificuldade em decidir quanto peso atribuir a cada um. Por exemplo:

  • square_feet e number_of_rooms normalmente são correlacionados em dados de imóveis.
  • weight_kg e BMI são correlacionados porque o BMI é calculado a partir de peso e altura.
  • income e education_level podem ser correlacionados em conjuntos de dados socioeconômicos.

Nesses casos, o modelo pode “dividir o crédito” entre atributos correlacionados de muitas maneiras quase equivalentes.

Multicolinearidade perfeita vs. alta

  • Multicolinearidade perfeita: um atributo é uma combinação linear exata de outros (por exemplo, x3 = 2*x1 + 5*x2). Então, a matriz de projeto (design matrix) fica com posto deficiente (rank-deficient), e a regressão linear padrão não consegue estimar coeficientes de forma única.
  • Multicolinearidade alta (imperfeita): os atributos são fortemente mas não perfeitamente correlacionados. Os coeficientes são tecnicamente identificáveis, porém muito sensíveis ao ruído.

A visão de álgebra linear (por que os coeficientes “explodem”)

Para regressão linear por mínimos quadrados ordinários (ordinary least squares, OLS):

[ \hat{\beta} = (X^T X)^{-1} X^T y ]

Quando atributos são altamente correlacionados, (X^T X) torna-se mal condicionado (ill-conditioned) (próximo de singular). Sua inversa ((X^T X)^{-1}) pode conter valores muito grandes, o que leva a:

  • Magnitudes grandes dos coeficientes
  • Alta variância / intervalos de confiança amplos
  • Inversões de sinal (um atributo que “deveria” ser positivo torna-se negativo)
  • Instabilidade entre diferentes amostras de treino

É importante notar que a multicolinearidade afeta principalmente a variância, não o viés (bias): o comportamento médio do modelo ainda pode ser razoável, mas ele se torna pouco confiável de uma amostra para outra.

Por que isso importa na prática de AM

1) A interpretação de coeficientes torna-se pouco confiável

Em modelos lineares/log-lineares (regressão linear, regressão logística, modelos lineares generalizados (generalized linear models, GLMs)), coeficientes muitas vezes são interpretados como “tamanhos de efeito”. Com multicolinearidade:

  • Os valores individuais dos coeficientes não são confiáveis.
  • Você pode ver resultados contraintuitivos (por exemplo, mais investimento em anúncios parece reduzir vendas) porque o modelo está compensando preditores correlacionados.

Isso é especialmente problemático em cenários em que o modelo é usado para tomada de decisão, políticas públicas ou explicação — e não apenas previsão.

2) Testes de hipótese e valores-p tornam-se enganosos

A inferência estatística clássica assume estimativas de coeficientes estáveis. A multicolinearidade infla erros-padrão, fazendo com que:

  • preditores pareçam “não significativos” mesmo se forem genuinamente informativos
  • conclusões sobre quais variáveis “importam” fiquem instáveis

3) Ela pode confundir métodos de importância de atributos

Mesmo que o desempenho preditivo continue bom, a multicolinearidade pode distorcer ferramentas de interpretabilidade e atribuição:

  • Importância por permutação (permutation importance): se x1 e x2 são redundantes, permutar x1 pode não prejudicar muito o desempenho do modelo porque x2 ainda carrega informação similar. O resultado pode sugerir de forma enganosa que x1 não é importante. Por outro lado, permutar um atributo às vezes pode causar um efeito exagerado dependendo dos padrões de dependência do modelo. Veja também: Importância de Atributos por Permutação.
  • Explicações aditivas de Shapley (Shapley Additive Explanations, SHAP) / métodos de atribuição (attribution methods): atributos correlacionados podem causar ambiguidade na “atribuição de crédito” — a importância pode ser dividida entre atributos de maneiras que dependem de detalhes de modelagem e da distribuição de referência. Veja: SHAP.
  • Dependência parcial (partial dependence): quando atributos são correlacionados, variar um atributo mantendo os outros “constantes” pode avaliar o modelo em combinações irreais. Veja: Gráficos de Dependência Parcial.

Causas comuns de multicolinearidade na engenharia de atributos

Atributos derivados e duplicados

A multicolinearidade muitas vezes é “autoinfligida” ao adicionar atributos que codificam informação similar:

  • versões bruta + normalizada (por exemplo, salary e salary_zscore)
  • totais mais componentes (por exemplo, total_spend mais spend_food, spend_rent, …)
  • razões e seus componentes (por exemplo, clicks, impressions e CTR=clicks/impressions)

Codificação one-hot e a armadilha das variáveis dummy

Com um termo de intercepto, codificar one-hot todas as categorias cria multicolinearidade perfeita porque as variáveis dummy somam 1. A correção padrão é remover uma categoria (“nível de referência”). Veja: Codificação One-Hot.

Tendências no tempo e sazonalidade

Em séries temporais ou dados em painel, múltiplos atributos podem compartilhar uma tendência comum de alta (por exemplo, “ano” e “clientes acumulados”), produzindo altas correlações a menos que se remova a tendência (detrending) ou se modele adequadamente.

Como detectar multicolinearidade

Nenhum diagnóstico é perfeito. Na prática, você costuma combinar vários.

1) Matriz de correlação (primeira passada rápida)

Correlações par a par são fáceis de calcular e visualizar.

  • Prós: rápido, intuitivo
  • Contras: a multicolinearidade pode envolver mais de duas variáveis mesmo se correlações par a par forem moderadas

Exemplo (Python):

import pandas as pd

# df is your feature dataframe
corr = df.corr(numeric_only=True)
high_pairs = (
    corr.abs()
        .where(lambda m: m < 0.999)  # ignore self-correlation
        .stack()
        .sort_values(ascending=False)
)

print(high_pairs.head(20))

Uma heurística comum (grosseira): correlação absoluta (|r| > 0.8) ou (|r| > 0.9) sugere problemas potenciais — mas o contexto importa.

2) Fator de Inflação da Variância (Variance Inflation Factor, VIF)

O VIF mede o quanto a variância de um coeficiente é inflada devido à multicolinearidade.

Para o atributo (x_j), faça uma regressão dele em função de todos os outros atributos e calcule (R_j^2). Então:

[ \text{VIF}_j = \frac{1}{1 - R_j^2} ]

  • Se (R_j^2) é alto, (x_j) é bem explicado por outros atributos → VIF alto.
  • Regras práticas (não universais):
    • VIF ≈ 1: sem problema
    • VIF > 5: multicolinearidade moderada
    • VIF > 10: multicolinearidade forte

Exemplo (Python com statsmodels):

import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor

X = df[["square_feet", "num_rooms", "num_bathrooms", "age"]].dropna()

# statsmodels expects a matrix; include an intercept if you're mirroring linear regression practice
X_mat = X.assign(intercept=1.0).to_numpy()

vifs = []
for i, name in enumerate(list(X.columns) + ["intercept"]):
    vifs.append((name, variance_inflation_factor(X_mat, i)))

vif_df = pd.DataFrame(vifs, columns=["feature", "VIF"]).sort_values("VIF", ascending=False)
print(vif_df)

Notas:

  • O VIF é mais interpretável para relações lineares entre preditores numéricos.
  • Se você tiver relações não lineares fortes, o VIF pode não capturar bem a redundância.

3) Número de condição / autovalores (condicionamento de matriz)

Um diagnóstico mais global é o número de condição (condition number) da matriz de atributos (frequentemente após padronização). Um número de condição alto indica dependências quase lineares.

  • Prós: captura dependências envolvendo vários atributos
  • Contras: menos “acionável” do que o VIF (não diz imediatamente qual atributo remover)

4) Detecção prática via checagens de instabilidade

Uma abordagem muito prática em AM: medir como os coeficientes variam sob reamostragem (resampling).

  • Ajuste o modelo em amostras bootstrap (bootstrap samples) ou em diferentes divisões de treino/validação (train/validation splits).
  • Se os coeficientes mudam violentamente enquanto o desempenho permanece similar, a multicolinearidade provavelmente está contribuindo.

Exemplo prático: preditores correlacionados desestabilizam coeficientes

Suponha que tentamos prever preços de casas com dois atributos correlacionados: square_feet e num_rooms. Ambos se relacionam ao “tamanho da casa”.

Se você ajustar uma regressão linear simples, pode ver:

  • coeficiente grande em square_feet e pequeno em num_rooms em uma divisão
  • o oposto em outra divisão
  • às vezes um coeficiente fica negativo

Ainda assim, a acurácia preditiva geral pode quase não mudar, porque o modelo consegue compensar entre eles.

Código ilustrativo (simulado):

import numpy as np
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.model_selection import train_test_split

rng = np.random.default_rng(0)
n = 1000

square_feet = rng.normal(2000, 500, size=n)
# make rooms highly correlated with square_feet
num_rooms = square_feet / 400 + rng.normal(0, 0.3, size=n)

# true relationship depends mostly on square_feet (size)
price = 50_000 + 200 * square_feet + rng.normal(0, 50_000, size=n)

X = np.column_stack([square_feet, num_rooms])
y = price

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

ols = LinearRegression().fit(X_train, y_train)
ridge = Ridge(alpha=10.0).fit(X_train, y_train)

print("OLS coefficients:", ols.coef_)
print("Ridge coefficients:", ridge.coef_)

Resultado típico:

  • Coeficientes de MQO são sensíveis à divisão e ao ruído.
  • Coeficientes de Ridge são mais estáveis porque a regularização (regularization) reduz a variância.

Por que a multicolinearidade afeta a importância por permutação (em detalhe)

A importância por permutação estima o quanto um modelo depende de um atributo medindo a queda de desempenho quando esse atributo é embaralhado aleatoriamente.

Com atributos correlacionados:

  • Se x1 e x2 são redundantes, embaralhar x1 mantém x2 intacto, então o modelo ainda consegue recuperar grande parte do sinal.
  • A importância medida de x1 fica artificialmente baixa.
  • O mesmo pode acontecer com x2, levando você a concluir que nenhum importa — quando, na realidade, o grupo importa.

Isso não é apenas um problema de modelos lineares: ensembles de árvores (tree ensembles) e redes neurais (neural networks) também podem distribuir a dependência entre entradas correlacionadas.

Alternativas práticas incluem:

  • Importância por permutação agrupada (grouped permutation importance): permutar atributos correlacionados juntos.
  • Permutação condicional (conditional permutation): permutar um atributo de uma forma que preserve sua relação com atributos correlacionados (mais complexo e com mais suposições).

Mitigações e boas práticas

A mitigação correta depende de sua prioridade: interpretabilidade, inferência, acurácia preditiva, ou simplicidade de implantação (deployment).

1) Seleção de atributos (manter um representante)

Se dois atributos codificam o mesmo conceito, escolha um com base em:

  • relevância do domínio e interpretabilidade
  • padrões de dados faltantes e qualidade dos dados
  • estabilidade e facilidade de medição
  • risco de vazamento de informação (leakage) (veja: Vazamento)

Isso é uma parte central de Seleção de Atributos.

Exemplos de decisões:

  • Manter square_feet, remover num_rooms (ou vice-versa).
  • Manter componentes brutos, remover razões (ou calcular razões e remover componentes), mas evitar redundância.

2) Combinar atributos em uma única variável significativa

Em vez de manter entradas correlacionadas separadamente, você pode construir um único atributo mais interpretável:

  • Substituir height_cm e weight_kg por BMI (se o BMI fizer sentido para o objetivo do seu domínio).
  • Substituir múltiplas categorias de gasto por total_spend (se apenas o total importar).
  • Criar um escore de índice (por exemplo, índice socioeconômico) por combinação ponderada.

Cuidado: combinar pode esconder detalhes acionáveis. Isso ajuda a interpretabilidade no nível do conceito, mas pode reduzir a explicabilidade no nível do fator.

3) Regularização (estabilizar coeficientes)

A regularização é uma das correções mais comuns em AM.

  • Ridge (L2): contrai coeficientes correlacionados em direção uns aos outros e reduz variância; frequentemente é a escolha padrão para multicolinearidade quando você ainda quer usar todos os atributos.
  • Lasso (L1): pode zerar alguns coeficientes, efetivamente selecionando um atributo entre grupos correlacionados (mas o selecionado pode ser instável entre amostras).
  • Rede elástica (Elastic Net): combina L1 e L2; frequentemente útil quando você espera grupos correlacionados.

Veja: Regularização.

Nota prática: se seu objetivo principal é interpretação, coeficientes estabilizados por ridge podem ser mais fáceis de usar do que MQO, mas ainda são influenciados pela estrutura de correlação e pela escolha da intensidade da regularização (regularization strength).

4) Redução de dimensionalidade (PCA)

A Análise de Componentes Principais (Principal Component Analysis, PCA) substitui atributos correlacionados por um número menor de componentes não correlacionados.

  • Prós: remove multicolinearidade por construção, pode melhorar estabilidade numérica e às vezes a generalização
  • Contras: componentes são menos interpretáveis do que atributos originais

Essa é uma escolha comum quando a previsão importa mais do que a interpretação direta dos atributos. Veja: Análise de Componentes Principais (PCA).

5) Coletar dados melhores (reduzir correlação na origem)

Quando possível, mude o processo de coleta de dados para reduzir redundância:

  • medir amostras mais diversas em que preditores correlacionados variem de forma independente
  • adicionar experimentos ou intervenções (comum em contextos causais)
  • melhorar a precisão de medição (ruído também pode piorar a instabilidade dos coeficientes)

6) Usar abordagens de modelagem menos sensíveis à multicolinearidade (com ressalvas)

Modelos baseados em árvores (tree-based models) (florestas aleatórias, boosting por gradiente) em geral são menos afetados em desempenho preditivo, mas:

  • atributos correlacionados ainda podem levar a divisões instáveis
  • medidas de importância podem ser enganosas (tanto as baseadas em ganho (gain-based) quanto as baseadas em permutação têm particularidades sob correlação)

Em outras palavras, trocar a classe do modelo pode ajudar na estabilidade de previsão, mas não resolve automaticamente problemas de interpretabilidade.

Fluxo de trabalho prático em um pipeline de AM

Em muitos projetos, lidar com multicolinearidade vira um passo repetível do fluxo de trabalho:

  1. Checagens exploratórias

    • mapa de calor de correlação
    • procurar redundância em atributos gerados (razões + componentes, totais + partes)
  2. Quantificar

    • calcular VIF para modelos lineares/estilo GLM
    • inspecionar estabilidade de coeficientes via reamostragem
  3. Decidir a mitigação com base no objetivo

    • interpretabilidade/inferência: seleção de atributos + modelagem cuidadosa
    • previsão: ridge / rede elástica, ou PCA, ou classe de modelo robusta
  4. Implementar em um pipeline reprodutível

    • garantir que as mesmas transformações sejam aplicadas a treino e teste
    • evitar vazamento ao ajustar PCA/seleção (ajustar apenas no treino)

Veja: Pipelines (Pré-processamento + Modelagem em AM).

Principais conclusões

  • Multicolinearidade significa que preditores contêm informação redundante; ela prejudica principalmente estabilidade e interpretabilidade dos coeficientes, não necessariamente a acurácia preditiva.
  • Detecte com matrizes de correlação, VIF e checagens de condicionamento/estabilidade.
  • Ela pode distorcer métodos de interpretabilidade, especialmente importância por permutação, ao permitir que atributos correlacionados “cobram” uns aos outros.
  • Mitigações comuns incluem:
    • seleção de atributos (remover atributos redundantes),
    • regularização (ridge/rede elástica),
    • combinar atributos em uma única variável significativa,
    • PCA quando a interpretabilidade dos atributos originais não é necessária.

Se você compartilhar o tipo de modelo que está usando (MQO/logística/árvores com boosting), o método de interpretabilidade de seu interesse (coeficientes vs. permutação vs. SHAP) e um exemplo do seu conjunto de atributos, a melhor estratégia de mitigação pode ser definida de forma muito mais concreta.