Detección de multicolinealidad con VIF – Python

La multicolinealidad ocurre cuando hay dos o más variables independientes en un modelo de regresión múltiple, que tienen una alta correlación entre sí. Cuando algunas características están altamente correlacionadas, es posible que tengamos dificultades para distinguir entre sus efectos individuales sobre la variable dependiente. La multicolinealidad se puede detectar usando varias técnicas, una de las cuales es el factor de inflación de varianza ( VIF ).

En el método VIF, elegimos cada función y la retrocedemos contra todas las demás funciones. Para cada regresión, el factor se calcula como:

VIF=\frac{1}{1-R^2}

Donde, R-cuadrado es el coeficiente de determinación en regresión lineal. Su valor se encuentra entre 0 y 1.

Como vemos en la fórmula, cuanto mayor sea el valor de R-cuadrado, mayor es el VIF. Por lo tanto, mayor VIF denota mayor correlación. Esto está de acuerdo con el hecho de que un valor alto de R-cuadrado denota una colinealidad más fuerte. Generalmente, un VIF superior a 5 indica una alta multicolinealidad. 

Implementando VIF usando statsmodels:

statsmodels proporciona una función llamada variance_inflation_factor() para calcular el VIF.

Sintaxis: statsmodels.stats.outliers_influence.variance_inflation_factor(exog, exog_idx)

Parámetros:

  • exog: una array que contiene características en las que se realiza una regresión lineal.
  • exog_idx : índice de la característica adicional cuya influencia sobre las otras características se quiere medir.

Veamos un ejemplo para implementar el método en este conjunto de datos.

El conjunto de datos:

El conjunto de datos utilizado en el siguiente ejemplo contiene la altura, el peso, el sexo y el índice de masa corporal de 500 personas. Aquí la variable dependiente es Index

Python3

import pandas as pd 
  
# the dataset
data = pd.read_csv('BMI.csv')
  
# printing first few rows
print(data.head())

Producción :

   Gender  Height  Weight  Index
0    Male     174      96      4
1    Male     189      87      2
2  Female     185     110      4
3  Female     195     104      3
4    Male     149      61      3

Acercarse :

  • Cada uno de los índices de características se pasa a variance_inflation_factor() para encontrar el VIF correspondiente.
  • Estos valores se almacenan en forma de Pandas DataFrame.

Python3

from statsmodels.stats.outliers_influence import variance_inflation_factor
  
# creating dummies for gender
data['Gender'] = data['Gender'].map({'Male':0, 'Female':1})
  
# the independent variables set
X = data[['Gender', 'Height', 'Weight']]
  
# VIF dataframe
vif_data = pd.DataFrame()
vif_data["feature"] = X.columns
  
# calculating VIF for each feature
vif_data["VIF"] = [variance_inflation_factor(X.values, i)
                          for i in range(len(X.columns))]
  
print(vif_data)

Producción :

  feature        VIF
0  Gender   2.028864
1  Height  11.623103
2  Weight  10.688377

Como podemos ver, la altura y el peso tienen valores muy altos de VIF, lo que indica que estas dos variables están altamente correlacionadas. Esto es de esperar ya que la altura de una persona influye en su peso. Por lo tanto, considerar estas dos características juntas conduce a un modelo con alta multicolinealidad.

Publicación traducida automáticamente

Artículo escrito por cosine1509 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *