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