Pular para o conteúdo principal

Fator de inflação de variância (VIF): Como lidar com a multicolinearidade na análise de regressão

Saiba como detectar multicolinearidade em modelos de regressão usando o fator de inflação de variância (VIF), uma ferramenta de diagnóstico importante. Este tutorial explica como o VIF é calculado, como interpretar seus valores e as técnicas para lidar com o VIF alto para melhorar a confiabilidade da modelagem de regressão.
Actualizado 18 de nov. de 2024  · 9 min de leitura

Na análise de regressão, a multicolinearidade ocorre quando as variáveis independentes estão correlacionadas entre si. Isso dificulta a determinação da influência exclusiva de cada preditor sobre a variável dependente. Como resultado, você tem erros padrão inflados, o que, por sua vez, afeta a significância dos coeficientes.

O fator de inflação de variância (VIF) é uma ótima ferramenta para detectar multicolinearidade, oferecendo percepções além das simples correlações entre pares. Este tutorial explica como o VIF funciona, como calculá-lo e interpretá-lo e o que fazer se você encontrar valores altos de VIF. Essas etapas ajudarão você, como profissional de dados e cientista de dados, a melhorar a estabilidade do seu modelo.

Embora o VIF seja uma importante ferramenta de diagnóstico e valha a pena aprendê-lo, ele representa apenas uma pequena parte do conjunto de habilidades mais amplo que você desenvolverá em nosso curso de carreira de Cientista de Aprendizado de Máquina em Python.

Torne-se um cientista de ML

Aperfeiçoe suas habilidades em Python para se tornar um cientista de aprendizado de máquina.
Comece a aprender de graça

O que é o fator de inflação de variância (VIF)?

Desenvolvido pelo estatístico Cuthbert Daniel, o VIF é uma ferramenta de diagnóstico amplamente usada na análise de regressão para detectar multicolinearidade, que é conhecida por afetar a estabilidade e a interpretabilidade dos coeficientes de regressão. Mais tecnicamente, o VIF funciona quantificando o quanto a variação de um coeficiente de regressão é inflada devido às correlações entre os preditores.

Tudo isso é importante porque essas correlações dificultam o isolamento do efeito exclusivo de cada preditor sobre a variável-alvo, o que leva a estimativas de modelos menos confiáveis. Devo dizer também que, para realmente contar a história certa, o VIF é sempre calculado para cada preditor em um modelo.

A fórmula do fator de inflação de variância

O VIF para um preditor X é calculado como:

Fórmula do fator de inflação da variância (VIF)

Onde:

  • R2 é o coeficiente de determinação obtido quando X​ é regredido em todos os outros preditores.

Cálculo passo a passo

Encontrar o VIF é um processo de três etapas. A primeira etapa é ajustar um modelo de regressão linear separado para cada preditor em relação a todos os outros preditores. A segunda etapa é obter o valorR2 para cada modelo. A etapa final é calcular o VIF usando a fórmula acima.

Interpretação dos valores VIF

Veja como você pode interpretar os valores de VIF para entender o nível de multicolinearidade:

  • VIF = 1: Isso indica que não há multicolinearidade. O preditor não está correlacionado com outros preditores, portanto, não aumenta o erro padrão nem afeta a estabilidade do modelo.
  • VIF entre 1 e 5: Isso sugere multicolinearidade moderada. Há alguma correlação com outros preditores, mas geralmente não é grave. No entanto, vale a pena ficar de olho nesses preditores para ver se a multicolinearidade se torna um problema, especialmente se outros valores de VIF forem altos.
  • VIF > 5: Há alta multicolinearidade. O erro padrão do preditor pode estar visivelmente inflado, o que pode tornar seu coeficiente menos confiável. Considere tomar medidas para reduzir a multicolinearidade, como remover ou combinar preditores correlacionados.
  • VIF > 10: Isso indica uma multicolinearidade grave. O erro padrão do preditor está muito inflado, e a estimativa do coeficiente provavelmente é instável. Geralmente, são necessárias ações corretivas, como a remoção do preditor ou o uso de técnicas de regularização.

Por exemplo, se o VIF de um preditor for 10, isso indica que a variação do coeficiente desse preditor é 10 vezes maior do que seria se não houvesse multicolinearidade. 

Como o VIF explica a multicolinearidade na regressão

A multicolinearidade faz com que os erros padrão aumentem, o que dificulta a avaliação da importância dos preditores individuais. Isso ocorre porque as variáveis colineares carregam informações semelhantes, o que dificulta a separação de seus efeitos individuais específicos sobre a variável de resultado. 

Embora a multicolinearidade não prejudique necessariamente a capacidade de previsão do modelo, ela reduz a confiabilidade e a clareza dos coeficientes. Isso é especialmente problemático quando queremos entender o impacto individual de cada preditor.

O fator de inflação de variância (VIF) serve como uma métrica de diagnóstico precisa para identificar a multicolinearidade. Diferentemente das observações gerais sobre correlação, o VIF isola o efeito combinado de todos os preditores em cada variável, destacando as interações que podem não ser evidentes nas correlações entre pares.

Fator de inflação de variância em Python e R

Para tornar isso prático, vamos analisar um exemplo em Python e R usando um conjunto de dados exclusivo. Calcularemos o VIF usando pacotes automatizados e também usando a fórmula VIF para criar intuição. Para que você tenha uma boa prática, criei deliberadamente um conjunto de dados em que descobriremos um alto valor de VIF para uma de nossas variáveis, mesmo que não haja uma correlação muito alta entre as duas variáveis - portanto, acho que é um exemplo convincente. Vamos começar com uma visão geral do conjunto de dados que usaremos.

Visão geral do conjunto de dados:

Esse conjunto de dados fictício representa os resultados de uma pesquisa realizada em 1.000 lojas de um gigante do varejo. Os clientes de cada loja foram solicitados a classificar vários aspectos de sua experiência de compra em uma escala de -5 a +5, em que -5 indica uma experiência muito negativa e +5 indica uma experiência muito positiva. A média das classificações dos clientes em cada loja foi obtida com base em quatro parâmetros principais:

  • Ambience: Percepção do cliente sobre o ambiente da loja, como limpeza, layout, iluminação e atmosfera geral. 

  • Customer_service: Avaliação do serviço prestado pela equipe da loja, incluindo a ajuda, a simpatia e a capacidade de resposta às necessidades do cliente.

  • Offers: Classificação das ofertas promocionais, descontos e promoções da loja disponíveis para os clientes.

  • Product_range: Avaliação da variedade e da qualidade dos produtos disponíveis na loja.

A variável-alvo, Performance, mede o desempenho geral de cada loja. No entanto, isso não é relevante do ponto de vista do VIF. Você pode fazer o download do conjunto de dados aqui

Fator de inflação de variância em Python

Começaremos calculando os valores VIF usando os pacotes python. A primeira etapa é carregar o conjunto de dados e as bibliotecas necessárias. 

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools.tools import add_constant

datacamp_retail_data = pd.read_csv(' vif_data.csv')
datacamp_retail_data.head()

O código acima carregará os dados e exibirá os cinco primeiros registros. 

Como próxima etapa, podemos executar uma matriz de correlação para verificar a correlação entre pares.

O código abaixo seleciona quatro colunas e as armazena em um novo DataFrame chamado correl_data . Em seguida, você calcula a matriz de correlação de pares usando a função .corr(). O resultado é armazenado no objeto corr_matrix, que é uma tabela que mostra os coeficientes de correlação entre cada par das colunas selecionadas. 

A matriz é então visualizada usando a função heatmap() do Seaborn, exibindo cada coeficiente de correlação como uma célula codificada por cores, em que o azul representa correlações negativas e o vermelho representa correlações positivas, com base no mapa de cores coolwarm

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']]

# Compute the pairwise correlation matrix
corr_matrix = correl_data.corr()

# Visualize the correlation matrix
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Pairwise Correlation Matrix')
plt.show()

Saída:

Correlação entre as variáveis. Imagem do autor

  Correlação entre as variáveis. Imagem do autor

O gráfico fornece um resumo visual das relações entre as variáveis em correl_data. Os valores de correlação variam de -1 a 1, sendo que os valores mais próximos de 1 indicam uma forte correlação positiva, os valores mais próximos de -1 indicam uma forte correlação negativa e os valores em torno de 0 sugerem que não há correlação. É evidente que não há correlação forte entre as variáveis, sendo que nenhum dos valores de correlação é maior do que 0,6. 

A próxima etapa é calcular os valores VIF para as variáveis preditoras. O código abaixo calcula os valores de cada variável preditora no conjunto de dados para verificar se há multicolinearidade. 

Primeiro, ele define X removendo a coluna de destino Performance e adicionando um intercepto. Em seguida, ele cria um DataFrame, datacamp_vif_data, para armazenar os nomes dos preditores e seus valores VIF. Usando um loop, ele calcula o VIF para cada preditor com afunção variance_inflation_factor() , em que VIFs mais altos indicam a presença de multicolinearidade .

# Define the predictor variables
X = datacamp_retail_data.drop(columns=['Performance'])

# Add a constant to the model (intercept)
X = add_constant(X)

# Calculate VIF for each feature
datacamp_vif_data = pd.DataFrame()
datacamp_vif_data['Feature'] = X.columns
datacamp_vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(datacamp_vif_data)

Saída:

Saída mostrando os valores VIF. Imagem do autor

Saída mostrando os valores VIF. Imagem do autor

Esse resultado mostra o valor VIF para cada variável preditora, indicando os níveis de multicolinearidade no conjunto de dados. A linha const representa o termo de interceptação, com um VIF próximo a 1, o que significa que não há multicolinearidade. Entre as variáveis preditoras, Product_range tem o VIF mais alto (5,94), o que sugere que ele precisa de medidas corretivas. Todos os outros preditores têm valores de VIF abaixo de 3, indicando baixa multicolinearidade. 

Abordagem manual para o cálculo do VIF

A outra abordagem é calcular os valores separadamente, regredindo cada variável independente em relação às outras variáveis preditoras.  

Portanto, o funcionamento é que, para cada recurso em retail_data, ele define esse recurso como a variável dependente (y) e os recursos restantes como variáveis independentes (X). Um modelo de regressão linear é então ajustado para prever y usando X, e o valor R-quadrado do modelo é usado para calcular o VIF usando a fórmula que discutimos na seção inicial.

Posteriormente, cada recurso e seus valores VIF correspondentes são armazenados em um dicionário (vif_manual), que é então convertido em um DataFrame (vif_manual_df) para exibição. 

datacamp_retail_data = retail_data.drop(columns=['Performance'])

# Manual VIF Calculation
vif_manual = {}

for feature in retail_data.columns:
    # Define the target variable (current feature) and predictors (all other features)
    y = datacamp_retail_data[feature]
    X = datacamp_retail_data.drop(columns=[feature])

    # Fit the linear regression model
    model = LinearRegression().fit(X, y)

    # Calculate R-squared
    r_squared = model.score(X, y)

    # Calculate VIF
    vif = 1 / (1 - r_squared)
    vif_manual[feature] = vif

# Convert the dictionary to a DataFrame for better display
vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF'])
print(vif_manual_df)

 Saída:

Saída mostrando os valores VIF. Imagem do autor

Saída mostrando os valores VIF. Imagem do autor

O resultado mostra cada recurso junto com seu valor VIF, ajudando a identificar possíveis problemas de multicolinearidade. Você pode ver que o resultado é obviamente o mesmo que obtivemos acima, assim como sua interpretação, que é a de que a variável Product_range está apresentando multicolinearidade.

Fator de inflação de variância em R

Nesta seção, repetiremos o exercício do fator de inflação da variância acima na seção Python, especialmente para os desenvolvedores que trabalham com a linguagem de programação R. Começamos carregando o conjunto de dados e as bibliotecas necessárias.

library(tidyverse)
library(car)
library(corrplot)

data <- read.csv('vif_data.csv')
str(data)

Saída:

A próxima etapa é calcular a matriz de correlação entre pares e visualizá-la com o mapa de calor. As funções cor() e corrplot nos ajudam a realizar essa tarefa.

# Remove the target column
predictors_data <- data[, !(names(data) %in% "Performance")]

# Calculate the correlation matrix
correlation_matrix <- cor(predictors_data)

# Plot the correlation heatmap
# Load necessary libraries
library(ggplot2)
library(reshape2)
melted_corr_matrix <- melt(correlation_matrix)

# Plot the heatmap with ggplot2
ggplot(data = melted_corr_matrix, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1, 1), space = "Lab", 
                       name="Correlation") +
  theme_minimal() + # Minimal theme for a clean look
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  labs(x = "", y = "") + # Remove axis labels
  geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) +
  theme(axis.text=element_text(size=15))

Saída:

Correlação entre as variáveis. Imagem do autor

Correlação entre as variáveis. Imagem do autor

Fica evidente no mapa de calor da correlação que não há uma forte correlação entre as variáveis, sendo que nenhum dos valores de correlação é superior a 0,6. Agora, calcularemos os valores VIF e veremos se há algo alarmante. A linha de código a seguir faz essa tarefa. 

# Fit a regression model
model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data)

# Calculate VIF
vif(model)

Saída:

A partir do resultado, podemos ver que, entre as variáveis preditoras, somente a variável Product_range tem o valor VIF maior que 5, o que sugere alta multicolinearidade que precisa de medidas corretivas. 

Abordagem manual para o cálculo do VIF

A outra abordagem para o cálculo do VIF seria calcular os valores do VIF para cada variável separadamente, regredindo cada variável independente em relação às outras variáveis preditoras.  

Isso é feito no código abaixo, que usa a função sapply()em cada preditor, em que cada preditor é definido como a variável dependente em um modelo de regressão linear com os outros preditores como variáveis independentes. 

O valor R-quadrado de cada modelo é então usado para calcular os valores VIF com sua fórmula. Por fim, o resultado, vif_values, exibe o VIF para cada preditor, ajudando a identificar problemas de multicolinearidade.

# VIF calculation for each predictor manually
predictors <- c("Ambience", "Customer_service", "Offers", "Product_range")

vif_values <- sapply(predictors, function(pred) {
    formula <- as.formula(paste(pred, "~ ."))
    model <- lm(formula, data = data[, predictors])
    1 / (1 - summary(model)$r.squared)
})

print(vif_values)

Saída:

Obtemos o mesmo resultado e fica evidente que a variável Product_range com um valor VIF alto, acima de 5, precisa de intervenção. 

VIF vs. Matriz de correlação e outros métodos

Recapitulando, aqui estão os métodos populares para detectar multicolinearidade:

  • Valores altos de VIF: Um valor alto de VIF é um indicador claro de multicolinearidade. Quando esses valores excedem determinados limites, eles indicam que um preditor está fortemente relacionado a outros preditores, o que pode afetar a estabilidade, a confiabilidade e o desempenho do modelo.
  • Matrizes de correlação: Ao examinar uma matriz de correlação, você pode ver as correlações entre pares de preditores. As altas correlações entre pares sugerem multicolinearidade entre esses preditores específicos. No entanto, esse método detecta apenas relações lineares diretas entre duas variáveis e pode não detectar a multicolinearidade que envolve interações mais complexas entre diversas variáveis.
  • Alterações de coeficiente: Se os coeficientes dos preditores mudarem significativamente quando você adicionar ou remover outras variáveis do modelo, isso pode ser um sinal de multicolinearidade. Essas flutuações indicam que determinados preditores podem estar compartilhando informações comuns, dificultando a identificação do impacto exclusivo de cada variável sobre o resultado.

Entre todos esses métodos, o VIF é particularmente útil porque pode detectar multicolinearidade mesmo quando as correlações entre pares são baixas, como vimos em nosso próprio exemplo. Isso torna o VIF uma ferramenta mais abrangente.

Ideias adicionais sobre como lidar com valores altos de VIF

Se os valores de VIF indicarem alta multicolinearidade e você não quiser necessariamente apenas remover a variável, há outras estratégias mais avançadas para atenuar a multicolinearidade:

  1. Seleção de recursos: Remova um dos preditores altamente correlacionados e recalcule o VIF para ver se isso ajuda a simplificar o modelo e melhorar a estabilidade.
  2. Análise de componentes principais (PCA): Use o PCA para combinar seus preditores em um conjunto menor de componentes não correlacionados. Isso transforma as variáveis originais em variáveis novas, independentes e não correlacionadas que capturam a maior parte da variação dos dados, ajudando a lidar com a multicolinearidade sem perder informações valiosas.
  3. Técnicas de regularização: Aplique a regressão ridge ou lasso, que adiciona termos de penalidade ao modelo. Essas técnicas ajudam a reduzir a multicolinearidade, diminuindo a influência de variáveis correlacionadas, tornando o modelo mais estável e confiável.

Conclusão

Saber como usar o VIF é fundamental para identificar e corrigir a multicolinearidade, o que melhora a precisão e a clareza dos modelos de regressão. A verificação regular dos valores de VIF e a aplicação de medidas corretivas quando necessário ajudam os profissionais de dados e analistas a criar modelos nos quais podem confiar. Essa abordagem garante que o efeito de cada preditor seja claro, facilitando a obtenção de conclusões confiáveis do modelo e a tomada de decisões melhores com base nos resultados. Acesse nossa trilha de carreira de Cientista de Aprendizado de Máquina em Python para você realmente entender como criar modelos e usá-los. Além disso, a conclusão do programa fica muito bem em um currículo.

Torne-se um cientista de ML

Aperfeiçoe suas habilidades em Python para se tornar um cientista de aprendizado de máquina.

Além disso, para aprender mais, considere explorar os seguintes recursos do blog e das seções de tutoriais do DataCamp:


Vikash Singh's photo
Author
Vikash Singh
LinkedIn

Profissional experiente em funções de ciência de dados, inteligência artificial, análise e estratégia, com mais de 18 anos de experiência nas áreas de -: Ciência de dados, ML e IA ~ Ciência de dados, machine learning supervisionado e não supervisionado, aprendizagem profunda, modelagem preditiva, processamento de linguagem natural (NLP), modelagem e análise estatística, otimização, estratégia de negócios e análise ~ desenvolvimento e avaliação de modelos de negócios, análise descritiva e diagnóstica, EDA, visualização, análise de causa raiz, análise de sensibilidade e cenário.

Perguntas frequentes sobre o VIF

Para que é usado o fator de inflação de variância (VIF)?

O VIF é uma técnica usada para detectar multicolinearidade em modelos de regressão, quantificando o quanto a variação de um preditor é inflada devido a correlações com outros preditores.

O que é multicolinearidade na análise de regressão?

A multicolinearidade ocorre quando duas ou mais variáveis preditoras em um modelo de regressão são altamente correlacionadas, o que pode dificultar a identificação do impacto individual de cada preditor sobre a variável-alvo.

Como o VIF é diferente da correlação de pares?

A correlação par a par mede a força e a direção da relação linear entre duas ou mais variáveis, enquanto o VIF avalia como um preditor está correlacionado com todas as outras variáveis independentes, o que o torna uma medida de multicolinearidade mais abrangente.

Quais são os métodos comuns para reduzir os altos valores de VIF?

Os métodos comuns incluem a remoção ou a combinação de variáveis colineares, o uso de técnicas de redução de dimensionalidade, como PCA, ou a aplicação de métodos de regularização, como regressão Ridge ou Lasso.

Com que frequência devo verificar o VIF em meus modelos?

É uma boa prática verificar o VIF sempre que você adicionar novas variáveis a um modelo de regressão, especialmente em análises exploratórias ou quando a interpretabilidade do modelo for uma prioridade.

Temas

Aprenda com a DataCamp

Certificação disponível

curso

Regressão intermediária com statsmodels em Python

4 hr
10.8K
Aprenda a realizar regressão linear e logística com múltiplas variáveis explicativas.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

tutorial

Tutorial de regressão Lasso e Ridge em Python

Saiba mais sobre as técnicas de regressão lasso e ridge. Compare e analise os métodos em detalhes.
DataCamp Team's photo

DataCamp Team

10 min

tutorial

Regressão linear múltipla no R: Tutorial com exemplos

Uma visão geral completa para entender as regressões lineares múltiplas no R por meio de exemplos.
Zoumana Keita 's photo

Zoumana Keita

12 min

tutorial

Tutorial de regressão linear no R

Neste tutorial, você aprenderá os fundamentos de um modelo estatístico muito popular: a regressão linear.

Eladio Montero Porras

15 min

tutorial

Tutorial de regressão logística no R

Descubra tudo sobre a regressão logística: como ela difere da regressão linear, como ajustar e avaliar esses modelos no R com a função glm() e muito mais!
Vidhi Chugh's photo

Vidhi Chugh

14 min

tutorial

Principais técnicas para lidar com valores ausentes que todo cientista de dados deve conhecer

Explore várias técnicas para lidar eficientemente com valores ausentes e suas implementações em Python.
Zoumana Keita 's photo

Zoumana Keita

15 min

tutorial

Entendendo o desvio de dados e o desvio de modelo: Detecção de deriva em Python

Navegue pelos perigos do desvio de modelo e explore nosso guia prático para o monitoramento do desvio de dados.
Moez Ali's photo

Moez Ali

9 min

Ver maisVer mais