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

No análise de regressão, a multicolinearidade ocorre quando variáveis independentes estão correlacionadas entre si. Isso dificulta determinar a influência única de cada preditor sobre a variável dependente. Como resultado, você tem 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 excelente ferramenta para detectar multicolinearidade, oferecendo insights além de simples correlações pareadas. Este tutorial explica como o VIF funciona, como calculá-lo e interpretá-lo, e o que fazer se você encontrar altos valores de VIF. Esses passos ajudarão você, como 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 vale a pena aprender, ele representa apenas uma pequena parte do conjunto de habilidades mais amplo que você desenvolverá em nossa Caminho de Carreira em Cientista de Aprendizado de Máquina em Python, então inscreva-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, o 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 sobre a variável alvo, levando a estimativas de modelo menos confiáveis. Devo também dizer que, para realmente contar a história correta, 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.

Passo a passo da cálculo

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 ausência de multicolinearidade. O preditor não está correlacionado com outros preditores, portanto, 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 é severa. 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: Alta multicolinearidade está presente. 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 sinaliza uma multicolinearidade séria. O erro padrão do preditor está altamente inflado, e sua estimativa de 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 causa um aumento nos erros padrão, o que torna mais difícil avaliar a significância dos preditores individuais. 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 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 acioná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 do VIF para construir intuição. Para ter uma boa prática, eu criei deliberadamente um conjunto de dados onde vamos descobrir um valor alto de VIF 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 os resultados de uma pesquisa de um estudo conduzido em 1.000 lojas de um 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 considerada 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 fornecido pela equipe da loja, incluindo prestatividade, simpatia e prontidão em atender às necessidades do cliente.

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

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

A variável alvo, Desempenho, 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 de 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 carregará os dados e exibirá os cinco primeiros registros.

Como próximo passo, podemos executar uma matriz de correlação para verificar a correlação par a par.

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 cor, 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']] # Calcule a matriz de correlação par a par corr_matrix = correl_data.corr() # Visualize 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()

Saída:

  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 de 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, ele define X removendo a coluna alvo Performance e adicionando uma interceptação. Em seguida, cria um DataFrame, datacamp_vif_data, para armazenar os nomes dos preditores e seus valores de VIF. Usando um loop, então calcula o VIF para cada preditor com a função variance_inflation_factor(), onde VIFs maiores indicam presença de multicolinearidade.

# Define as variáveis preditoras X = datacamp_retail_data.drop(columns=['Performance']) # Adiciona uma constante ao modelo (interceptação) X = add_constant(X) # Calcula 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)

Saída:

Exibindo os valores VIF. Imagem por Autor

Esta saída mostra o valor do VIF para cada variável preditora, indicando níveis de multicolinearidade no conjunto de dados. A linha const representa o termo de interceptação, com um VIF próximo de 1, significando que não possui multicolinearidade. Entre as variáveis preditoras, Product_range possui o maior VIF (5.94), o que sugere que precisa de medidas corretivas. Todas as outras variáveis preditoras possuem valores de VIF abaixo de 3, indicando baixa multicolinearidade.

Abordagem manual para o cálculo do VIF

A outra abordagem é calcular os valores separadamente, regressando cada variável independente contra as outras variáveis preditoras.

Então, como funciona é que para cada característica em retail_data, ela define essa característica como a variável dependente (y) e as demais características como variáveis independentes (X). Um modelo de regressão linear é então ajustado para prever y usando X, e o valor de R-quadrado do modelo é usado para calcular o VIF usando a fórmula discutida na seção inicial.

Posteriormente, cada característica 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 (característica atual) e os preditores (todas as outras características) 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 por 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 anteriormente; e assim será sua interpretação, que é que a variável Product_range está exibindo multicolinearidade.

Fator de inflação da 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 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)

Resultado:

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 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 minimal 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))

Output:

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

É evidente a partir do mapa de calor de 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 sequer maior que 0,6. Agora, vamos calcular os valores de VIF e ver se há algo alarmante. A linha de código a seguir executa essa tarefa.

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

Saída:

A partir da saída, podemos ver que, entre as variáveis preditoras, apenas a variável Product_range tem o valor de VIF maior 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 de VIF para cada variável separadamente, regredindo cada variável independente contra as outras variáveis preditoras.

Isto é realizado 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 do VIF com sua fórmula. Finalmente, o resultado, vif_values, exibe o VIF de 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)

Output:

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

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

Para recapitular, 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 determinados 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 em pares entre os preditores. Altas correlações em 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 captar a multicolinearidade envolvendo interações mais complexas entre várias variáveis.
  • Alterações nos Coeficientes: Se os coeficientes dos preditores mudarem significativamente quando você adiciona ou remove outras variáveis do modelo, isso pode ser um sinal de multicolinearidade. Tais flutuações indicam que certos preditores podem estar compartilhando informações comuns, tornando mais difícil identificar o impacto único de cada variável no resultado.

Entre 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 de VIF Elevados

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

  1. Seleção de Características: 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 penalidade 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 melhores decisões com base nos resultados. Aproveite nossa trilha de carreira Cientista de Aprendizado de Máquina 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 tutorial da DataCamp:

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