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:
- 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.
- 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.
- 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.
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor