Factor de Inflación de la Varianza (FIV): Abordando la Multicolinealidad en el Análisis de Regresión

En el análisis de regresión, la multicolinealidad ocurre cuando las variables independientes están correlacionadas entre sí. Esto dificulta determinar la influencia única de cada predictor en la variable dependiente. Como resultado, se obtienen errores estándar inflados, lo que a su vez afecta la significancia de los coeficientes.

El factor de inflación de la varianza (VIF) es una excelente herramienta para detectar la multicolinealidad, ofreciendo información más allá de simples correlaciones de pares. Este tutorial explica cómo funciona el VIF, cómo calcularlo e interpretarlo, y qué hacer si encuentras valores altos de VIF. Estos pasos te ayudarán como profesionales de datos y científicos de datos a mejorar la estabilidad de tu modelo.

Aunque el VIF es una herramienta de diagnóstico importante y vale la pena aprenderla, representa solo una pequeña parte del conjunto de habilidades más amplio que desarrollarás en nuestra trayectoria profesional Científico de Aprendizaje Automático en Python, así que inscríbete hoy.

¿Qué es el Factor de Inflación de la Varianza (VIF)?

Desarrollado por el estadístico Cuthbert Daniel, el VIF es una herramienta de diagnóstico ampliamente utilizada en el análisis de regresión para detectar la multicolinealidad, que se sabe que afecta la estabilidad y la interpretabilidad de los coeficientes de regresión. Más técnicamente, el VIF funciona cuantificando cuánto se infla la varianza de un coeficiente de regresión debido a las correlaciones entre predictores.

Todo esto es importante porque estas correlaciones hacen difícil aislar el efecto único de cada predictor en la variable objetivo, lo que lleva a estimaciones de modelo menos confiables. También debo decir que, para contar realmente la historia correcta, el VIF siempre se calcula para cada predictor en un modelo.

La fórmula del factor de inflación de la varianza

El VIF para un predictor X se calcula como:

Donde:

  • R2 es el coeficiente de determinación obtenido al regresar X sobre todos los demás predictores.

Paso a paso cálculo

Encontrar el VIF es un proceso de tres pasos. El primer paso es ajustar un modelo de regresión lineal separado para cada predictor contra todos los demás predictores. El segundo paso es obtener el valor de R2 para cada modelo. El paso final es calcular el VIF utilizando la fórmula anterior.

Interpretación de los valores de VIF

Así es como se interpretan los valores de VIF para comprender el nivel de multicolinealidad:

  • VIF = 1: Esto indica que no hay multicolinealidad. El predictor no está correlacionado con otros predictores, por lo que no infla el error estándar ni afecta la estabilidad del modelo.
  • VIF entre 1 y 5: Esto sugiere una multicolinealidad moderada. Existe cierta correlación con otros predictores, pero generalmente no es grave. Sin embargo, vale la pena vigilar estos predictores para ver si la multicolinealidad se convierte en un problema, especialmente si otros valores de VIF son altos.
  • VIF > 5: Existe una alta multicolinealidad. Es posible que el error estándar del predictor esté notablemente inflado, lo que puede hacer que su coeficiente sea menos confiable. Considere tomar medidas para reducir la multicolinealidad, como eliminar o combinar predictores correlacionados.
  • VIF > 10: Esto indica una multicolinealidad grave. El error estándar del predictor está altamente inflado, y es probable que la estimación del coeficiente sea inestable. Por lo general, se necesitan acciones correctivas, como eliminar el predictor o utilizar técnicas de regularización.

Por ejemplo, si el VIF de un predictor es 10, indica que la varianza del coeficiente de ese predictor es 10 veces mayor de lo que sería si no hubiera multicolinealidad.

Cómo el VIF explica la multicolinealidad en la regresión

La multicolinealidad hace que los errores estándar aumenten, lo que dificulta evaluar la significancia de los predictores individuales. Esto sucede porque las variables colineales llevan información similar, lo que dificulta separar sus efectos individuales específicos sobre la variable de resultado.

Aunque la multicolinealidad no necesariamente daña la capacidad del modelo para predecir, sí reduce la fiabilidad y claridad de los coeficientes. Esto es especialmente problemático cuando queremos entender el impacto individual de cada predictor.

El factor de inflación de la varianza (VIF) sirve como una métrica diagnóstica precisa para identificar la multicolinealidad. A diferencia de las observaciones generales sobre la correlación, el VIF aísla el efecto combinado de todos los predictores en cada variable, destacando interacciones que podrían no ser evidentes a partir de correlaciones de pares.

Factor de Inflación de la Varianza en Python y R

Para hacer esto ejecutable, veamos un ejemplo en Python y R utilizando un conjunto de datos único. Calcularemos el VIF usando paquetes automatizados y también utilizando la fórmula VIF para desarrollar intuición. Con el fin de tener una buena práctica, he creado deliberadamente un conjunto de datos donde descubriremos un valor alto de VIF para una de nuestras variables, aunque no haya una correlación pairwise muy alta entre ninguna de las dos variables, por lo que creo que es un ejemplo convincente. Comencemos con una visión general del conjunto de datos que utilizaremos.

Resumen del conjunto de datos:

Este conjunto de datos ficticio representa los resultados de una encuesta de un estudio realizado en 1,000 tiendas de una cadena minorista gigante. A los clientes de cada tienda se les pidió que calificaran varios aspectos de su experiencia de compra en una escala de -5 a +5, donde -5 indica una experiencia muy negativa, y +5 indica una experiencia muy positiva. Se tomó el promedio de las calificaciones de los clientes en cada tienda para cuatro parámetros clave:

  • Ambiente: Percepción del cliente sobre el entorno de la tienda, como la limpieza, distribución, iluminación y atmósfera general.

  • Servicio_al_cliente: Evaluación del servicio proporcionado por el personal de la tienda, incluyendo la ayuda, amabilidad y respuesta a las necesidades del cliente.

  • Ofertas: Calificación de las ofertas promocionales, descuentos y promociones disponibles para los clientes en la tienda.

  • Product_range: Evaluación de la variedad y calidad de productos disponibles en la tienda.

La variable objetivo, Performance, mide el rendimiento general de cada tienda. Sin embargo, no es relevante desde la perspectiva del VIF. Puedes descargar el conjunto de datos aquí.

Factor de inflación de la varianza en Python

Comenzaremos calculando los valores de VIF usando los paquetes de Python. El primer paso es cargar el conjunto de datos y las bibliotecas requeridas.

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

El código anterior cargará los datos y mostrará los primeros cinco registros.

Como siguiente paso, podemos ejecutar una matriz de correlación para verificar la correlación entre pares.

El código a continuación selecciona cuatro columnas y las almacena en un nuevo DataFrame llamado correl_data. Luego calcula la matriz de correlación de pares usando la función .corr(). El resultado se almacena en el objeto corr_matrix, que es una tabla que muestra los coeficientes de correlación entre cada par de columnas seleccionadas. 

Luego, la matriz se visualiza utilizando la función heatmap() de Seaborn, mostrando cada coeficiente de correlación como una celda codificada por colores, donde el azul representa correlaciones negativas y el rojo representa correlaciones positivas, según el mapa de colores coolwarm

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # Calcular la matriz de correlación de pares corr_matrix = correl_data.corr() # Visualizar la matriz de correlación plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Salida:

  Correlación entre las variables. Imagen por el autor

El gráfico proporciona un resumen visual de las relaciones entre variables en correl_data. Los valores de correlación van de -1 a 1, donde los valores más cercanos a 1 indican una correlación positiva fuerte, los valores más cercanos a -1 indican una correlación negativa fuerte, y los valores alrededor de 0 sugieren que no hay correlación. Es evidente que no hay una correlación pareja fuerte entre las variables, ya que ninguno de los valores de correlación supera siquiera 0.6. 

El siguiente paso es calcular los valores VIF para las variables predictoras. El código a continuación calcula los valores para cada variable predictora en el conjunto de datos para verificar la multicolinealidad.

Primero, define X eliminando la columna objetivo Rendimiento y agregando una intercepción. Luego, crea un DataFrame, datacamp_vif_data, para almacenar los nombres de los predictores y sus valores VIF. Utilizando un bucle, calcula el VIF para cada predictor con la función variance_inflation_factor(), donde VIFs más altos indican presencia de multicolinealidad.

# Define las variables predictoras X = datacamp_retail_data.drop(columns=['Performance']) # Agrega una constante al modelo (intercepción) X = add_constant(X) # Calcula el 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)

Salida:

Salida mostrando los valores de VIF. Imagen por el autor

Esta salida muestra el valor de VIF para cada variable predictora, lo que indica niveles de multicolinealidad en el conjunto de datos. La fila const representa el término de intercepción, con un VIF cercano a 1, lo que significa que no tiene multicolinealidad. Entre las variables predictoras, Product_range tiene el VIF más alto (5.94), lo que sugiere que necesita medidas correctivas. Todas las demás variables predictoras tienen valores de VIF por debajo de 3, lo que indica baja multicolinealidad.

Enfoque manual para el cálculo de VIF

El otro enfoque es calcular los valores por separado al regresar cada variable independiente contra las otras variables predictoras.

Entonces, cómo funciona es que para cada característica en retail_data, se establece esa característica como la variable dependiente (y) y las demás características como variables independientes (X). Luego se ajusta un modelo de regresión lineal para predecir y usando X, y el valor de R-cuadrado del modelo se utiliza para calcular VIF utilizando la fórmula que discutimos en la sección inicial.

Posteriormente, cada característica y sus valores VIF correspondientes se almacenan en un diccionario (vif_manual), que luego se convierte en un DataFrame (vif_manual_df) para su visualización.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Cálculo manual del VIF vif_manual = {} for feature in retail_data.columns: # Definir la variable objetivo (característica actual) y los predictores (todas las demás características) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Ajustar el modelo de regresión lineal model = LinearRegression().fit(X, y) # Calcular R-cuadrado r_squared = model.score(X, y) # Calcular VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Convertir el diccionario a un DataFrame para una mejor visualización vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 Salida:

Salida que muestra los valores VIF. Imagen por Autor

La salida muestra cada característica junto con su valor de VIF, lo que ayuda a identificar posibles problemas de multicolinealidad. Puedes ver que el resultado es obviamente el mismo que obtuvimos anteriormente; y así será su interpretación, que es que la variable Product_range está exhibiendo multicolinealidad.

Factor de inflación de la varianza en R

En esta sección, repetiremos el ejercicio del factor de inflación de la varianza anterior en la sección de Python, especialmente para desarrolladores que trabajan con el lenguaje de programación R. Comenzamos cargando el conjunto de datos y las bibliotecas necesarias.

library(tidyverse) library(car) library(corrplot) data <- read.csv('vif_data.csv') str(data)

Salida:

El siguiente paso es calcular la matriz de correlación par a par y visualizarla con el mapa de calor. Las funciones cor() y corrplot nos ayudan a lograr esta tarea.

# Eliminar la columna objetivo predictors_data <- data[, !(names(data) %in% "Performance")] # Calcular la matriz de correlación correlation_matrix <- cor(predictors_data) # Graficar el mapa de calor de correlación # Cargar las bibliotecas necesarias library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Graficar el mapa de calor con 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 una apariencia limpia theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Eliminar las etiquetas de los ejes geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Salida:

Correlación entre las variables. Imagen por el autor

Es evidente a partir del mapa de calor de correlación que no hay una fuerte correlación par a par entre las variables, con ninguno de los valores de correlación siendo siquiera mayor a 0.6. Ahora, calcularemos los valores de VIF y veremos si hay algo alarmante. La siguiente línea de código realiza esa tarea.

# Ajustar un modelo de regresión model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Calcular VIF vif(model)

Salida:

Desde la salida, podemos ver que entre las variables predictoras, solo la variable Product_range tiene un valor VIF mayor que 5, lo que sugiere una alta multicolinealidad que necesita medidas correctivas.

Enfoque manual para el cálculo de VIF

Otro enfoque para el cálculo de VIF sería calcular los valores VIF para cada variable por separado al regresar cada variable independiente contra las otras variables predictoras.

Esto se realiza en el código a continuación, que utiliza la función sapply() a través de cada predictor, donde cada predictor se establece como la variable dependiente en un modelo de regresión lineal con los otros predictores como variables independientes.

El valor R-cuadrado de cada modelo se utiliza para calcular los valores de VIF con su fórmula. Finalmente, el resultado, vif_values, muestra el VIF para cada predictor, ayudando a identificar problemas de multicolinealidad.

# Cálculo de VIF para cada predictor 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)

Salida:

Obtenemos el mismo resultado y es evidente que la variable Product_range con un alto valor de VIF por encima de 5 necesita intervención.

VIF vs. Matriz de Correlación y Otros Métodos

Como resumen, aquí están los métodos populares para detectar la multicolinealidad:

  • Valores altos de VIF: Un valor alto de VIF es un claro indicador de multicolinealidad. Cuando estos valores exceden ciertos umbrales, indican que un predictor está fuertemente relacionado con otros predictores, lo que puede afectar la estabilidad, confiabilidad y rendimiento del modelo.
  • Matrices de correlación: Al examinar una matriz de correlación, se pueden ver las correlaciones entre pares de predictores. Altas correlaciones entre pares sugieren multicolinealidad entre esos predictores específicos. Sin embargo, este método solo detecta relaciones lineales directas entre dos variables y puede pasar por alto la multicolinealidad que involucra interacciones más complejas entre varias variables.
  • Cambios en los coeficientes: Si los coeficientes de los predictores cambian significativamente cuando se agregan o eliminan otras variables del modelo, esto puede ser un signo de multicolinealidad. Tales fluctuaciones indican que ciertos predictores pueden estar compartiendo información común, lo que dificulta identificar el impacto único de cada variable en el resultado.

Entre todos estos métodos, el VIF es particularmente útil porque puede detectar la multicolinealidad incluso cuando las correlaciones en pares son bajas, como vimos en nuestro propio ejemplo. Esto hace que el VIF sea una herramienta más completa.

Ideas adicionales sobre cómo abordar valores altos de VIF

Si los valores de VIF indican una alta multicolinealidad y no desea necesariamente eliminar la variable, hay algunas estrategias más avanzadas para mitigar la multicolinealidad:

  1. Selección de características: Elimina uno de los predictores altamente correlacionados y recalcula el VIF para ver si ayuda a simplificar el modelo y mejorar la estabilidad.
  2. Análisis de Componentes Principales (PCA): Usa PCA para combinar tus predictores en un conjunto más pequeño de componentes no correlacionados. Esto transforma las variables originales en nuevas, independientes y no correlacionadas que capturan la mayor parte de la variación de los datos, ayudando a abordar la multicolinealidad sin perder información valiosa.
  3. Técnicas de Regularización: Aplica regresión ridge o lasso, que añaden términos de penalización al modelo. Estas técnicas ayudan a reducir la multicolinealidad al disminuir la influencia de variables correlacionadas, lo que hace que el modelo sea más estable y confiable.

Conclusion

Saber cómo usar el VIF es clave para identificar y solucionar la multicolinealidad, lo que mejora la precisión y claridad de los modelos de regresión. Revisar regularmente los valores de VIF y aplicar medidas correctivas cuando sea necesario ayuda a los profesionales de datos y analistas a construir modelos en los que puedan confiar. Este enfoque garantiza que el efecto de cada predictor sea claro, lo que facilita extraer conclusiones fiables del modelo y tomar decisiones mejores basadas en los resultados. Toma nuestra carrera de Científico de Aprendizaje Automático en Python para comprender realmente cómo construir modelos y utilizarlos. Además, completar el programa queda genial en un currículum.

Además, para seguir aprendiendo, considera explorar los siguientes recursos del blog y las secciones de tutoriales de DataCamp:

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