Fator de Inflação da Variância (VIF): Abordando a Multicolinearidade na Análise de Regressão

Na análise de regressão, a multicolinearidade ocorre quando variáveis independentes estão correlacionadas entre si. Isso torna difícil determinar a influência única de cada preditor sobre a variável dependente. Como resultado, você terá erros padrão inflacionados, o que por sua vez afeta a significância dos coeficientes.

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

Agora, enquanto o VIF é uma ferramenta de diagnóstico importante e que vale a pena aprender, ele representa apenas uma pequena parte do conjunto de habilidades mais amplo que você desenvolverá em nossa trilha de carreira Cientista de Aprendizado de Máquina em Python, então matricule-se hoje.

O que é o Fator de Inflação da Variância (VIF)?

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

Tudo isso é importante porque essas correlações tornam difícil isolar o efeito único de cada preditor na variável alvo, levando a estimativas de modelo menos confiáveis. Devo também dizer 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 da variância

O VIF para um preditor X é calculado como:

Onde:

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

Calculo 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 valor de R2 para cada modelo. A etapa final é calcular o VIF usando a fórmula acima.

Interpretação dos Valores de VIF

Aqui está como interpretar os valores de VIF para entender o nível de multicolinearidade:

  • VIF = 1: Isso indica nenhuma multicolinearidade. O preditor não está correlacionado com outros preditores, então não infla o erro padrão ou afeta a estabilidade do modelo.
  • VIF entre 1 e 5: Isso sugere uma multicolinearidade moderada. Há alguma correlação com outros preditores, mas geralmente não é grave. No entanto, é bom ficar de olho nesses preditores para ver se a multicolinearidade se torna um problema, especialmente se outros valores de VIF forem altos.
  • VIF > 5: Alta multicolinearidade está presente. O erro padrão do preditor pode estar significativamente inflacionado, 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 séria multicolinearidade. O erro padrão do preditor é altamente inflacionado, e a estimativa do coeficiente é provavelmente instável. Ações corretivas, como remover o preditor ou usar técnicas de regularização, geralmente são necessárias.

Por exemplo, se o VIF de um preditor for 10, isso indica que a variância 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 torna mais difícil avaliar a significância de cada preditor individual. Isso acontece porque variáveis colineares carregam informações semelhantes, tornando difícil separar seus efeitos individuais específicos sobre a variável de resultado.

Embora a multicolinearidade não necessariamente prejudique a capacidade do modelo de prever, 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 da variância (VIF) serve como uma métrica diagnóstica precisa para identificar a multicolinearidade. Ao contrário de observações gerais sobre correlação, o VIF isola o efeito combinado de todos os preditores sobre cada variável, destacando interações que podem não ser evidentes a partir de correlações em pares.

Fator de Inflação da Variância em Python e R

Para tornar isso praticável, vamos passar por um exemplo em Python e R usando um conjunto de dados único. Vamos calcular o VIF usando pacotes automatizados e também usando a fórmula VIF para construir intuição. Para praticar, criei deliberadamente um conjunto de dados onde vamos descobrir um valor de VIF alto para uma de nossas variáveis, mesmo que não haja uma correlação muito alta entre quaisquer duas variáveis – então acredito que seja um exemplo convincente. Vamos começar com uma visão geral do conjunto de dados que vamos usar.

Visão Geral do Conjunto de Dados:

Este conjunto de dados fictício representa resultados de uma pesquisa de um estudo realizado em 1.000 lojas de uma gigante do varejo. Os clientes de cada loja foram solicitados a avaliar vários aspectos de sua experiência de compra em uma escala de -5 a +5, onde -5 indica uma experiência muito negativa e +5 indica uma experiência muito positiva. A média das avaliações dos clientes em cada loja foi calculada em quatro parâmetros-chave:

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

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

  • Ofertas: Avaliação das ofertas promocionais, descontos e promoções disponíveis para os clientes.

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

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

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

Vamos começar calculando os valores de VIF usando os pacotes python. O primeiro passo é 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 irá carregar os dados e exibir os primeiros cinco registros.

Como próximo passo, 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, calcula a matriz de correlação par a par usando a função .corr(). O resultado é armazenado no objeto corr_matrix, que é uma tabela mostrando 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, onde 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']] # Calcular a matriz de correlação par a par corr_matrix = correl_data.corr() # Visualizar a matriz de correlação plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Output:

  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, onde valores mais próximos de 1 indicam uma forte correlação positiva, valores mais próximos de -1 indicam uma forte correlação negativa, e valores em torno de 0 sugerem nenhuma correlação. É evidente que não há uma forte correlação par-a-par entre as variáveis, com nenhum dos valores de correlação sendo maior que 0,6. 

O próximo passo é calcular os valores VIF para as variáveis preditoras. O código abaixo calcula os valores para cada variável preditora no conjunto de dados para verificar a multicolinearidade.

Primeiramente, define-se X removendo a coluna alvo Performance e adicionando uma interceptação. Em seguida, cria-se um DataFrame, datacamp_vif_data, para armazenar os nomes dos preditores e seus valores VIF. Utilizando um loop, calcula-se o VIF para cada preditor com a função variance_inflation_factor(), onde VIFs mais altos indicam a presença de multicolinearidade.

# Definir as variáveis preditoras X = datacamp_retail_data.drop(columns=['Performance']) # Adicionar uma constante ao modelo (interceptação) X = add_constant(X) # Calcular o VIF para cada característica 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)

Output:

Exibição dos valores VIF. Imagem por Autor

Esta saída 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 de 1, o que significa que não possui multicolinearidade. Entre as variáveis preditoras, Product_range tem o maior VIF (5.94), o que sugere que precisa de medidas corretivas. Todas as outras variáveis preditoras 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 contra as outras variáveis preditoras.

Então, como funciona é que para cada recurso em retail_data, define-se esse recurso como a variável dependente (y) e os demais recursos 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 discutida 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']) # Cálculo manual do VIF vif_manual = {} for feature in retail_data.columns: # Definir a variável alvo (recurso atual) e os preditores (todos os outros recursos) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Ajustar o modelo de regressão linear model = LinearRegression().fit(X, y) # Calcular R-quadrado r_squared = model.score(X, y) # Calcular VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Converter o dicionário em um DataFrame para melhor exibição 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

A saída mostra cada recurso juntamente com seu valor VIF, ajudando a identificar possíveis problemas de multicolinearidade. Você pode ver que o resultado é obviamente o mesmo que obtivemos acima; e assim será sua interpretação, que é que a variável Product_range está exibindo multicolinearidade.

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

Nesta seção, repetiremos o exercício do fator de inflação de variância acima na seção Python, especialmente para 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)

Output:

O próximo passo é calcular a matriz de correlação par a par e visualizá-la com o mapa de calor. As funções cor() e corrplot nos ajudam a realizar essa tarefa.

# Remover a coluna alvo predictors_data <- data[, !(names(data) %in% "Performance")] # Calcular a matriz de correlação correlation_matrix <- cor(predictors_data) # Plotar o mapa de calor da correlação # Carregar as bibliotecas necessárias library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Plotar o mapa de calor com 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() + # Tema mínimo para uma aparência limpa theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Remover rótulos dos eixos geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Resultado:

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

É evidente a partir do mapa de calor da correlação que não há uma forte correlação par-a-par entre as variáveis, com nenhum dos valores de correlação sendo maior que 0.6. Agora, vamos calcular os valores de VIF e ver se há algo alarmante. A linha de código a seguir realiza essa tarefa.

# Ajustar um modelo de regressão model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Calcular VIF vif(model)

Output:

A partir da saída, podemos ver que entre as variáveis preditoras, apenas a variável Product_range possui o valor VIF maior do que 5, o que sugere alta multicolinearidade que necessita 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 contra as outras variáveis preditoras.

Isso é feito no código abaixo, que utiliza a função sapply() em cada preditor, onde 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. Finalmente, o resultado, vif_values, exibe o VIF para cada preditor, ajudando a identificar problemas de multicolinearidade.

# Cálculo do VIF para cada preditor manualmente 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)

Resultado:

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

VIF vs. Matriz de Correlação e Outros Métodos

Como recapitulação, aqui estão os métodos populares para detectar multicolinearidade:

  • Valores altos de VIF: Um valor alto de VIF é um claro indicador de multicolinearidade. Quando esses valores excedem certos limites, indicam que um preditor está fortemente relacionado a outros preditores, o que pode afetar a estabilidade, confiabilidade e desempenho do modelo.
  • Matrizes de correlação: Ao examinar uma matriz de correlação, é possível ver as correlações entre pares de preditores. Correlações elevadas sugerem multicolinearidade entre esses preditores específicos. No entanto, este método detecta apenas relações lineares diretas entre duas variáveis e pode não identificar multicolinearidade envolvendo interações mais complexas entre várias variáveis.
  • Alterações nos Coeficientes: Se os coeficientes dos preditores mudarem significativamente ao adicionar ou remover outras variáveis do modelo, isso pode ser um sinal de multicolinearidade. Tais flutuações indicam que certos preditores podem estar compartilhando informações em comum, dificultando a identificação do impacto único de cada variável no resultado.

Dentre todos esses métodos, o VIF é particularmente útil porque pode detectar multicolinearidade mesmo quando as correlações em 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 Elevados de VIF

Se os valores de VIF indicarem alta multicolinearidade, e você não necessariamente deseja apenas remover a variável, existem algumas outras estratégias mais avançadas para mitigar 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 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: Aplicar regressão ridge ou lasso, que adicionam termos de penalização ao modelo. Essas técnicas ajudam a reduzir a multicolinearidade ao diminuir 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 clareza dos modelos de regressão. Verificar regularmente os valores do VIF e aplicar medidas corretivas quando necessário ajuda os profissionais de dados e analistas a construir modelos nos quais podem confiar. Essa abordagem garante que o efeito de cada preditor seja claro, tornando mais fácil tirar conclusões confiáveis do modelo e tomar decisões melhores com base nos resultados. Confira nossa trilha de carreira Cientista de Machine Learning em Python para realmente entender como construir modelos e utilizá-los. Além disso, a conclusão do programa é ótima para o currículo.

Também, para aprendizado adicional, considere explorar os seguintes recursos do blog e seções de tutoriais da DataCamp:

Source:
https://www.datacamp.com/tutorial/variance-inflation-factor