Comment calculer VIF en Python
La multicolinéarité dans l’analyse de régression se produit lorsque deux ou plusieurs variables explicatives sont fortement corrélées les unes aux autres, de sorte qu’elles ne fournissent pas d’informations uniques ou indépendantes dans le modèle de régression.
Si le degré de corrélation est suffisamment élevé entre les variables, cela peut poser des problèmes lors de l’ajustement et de l’interprétation du modèle de régression.
Une façon de détecter la multicolinéarité consiste à utiliser une métrique connue sous le nom de facteur d’inflation de la variance (VIF) , qui mesure la corrélation et la force de la corrélation entre les variables explicatives dans un modèle de régression .
Ce tutoriel explique comment calculer VIF en Python.
Exemple : Calculer VIF en Python
Pour cet exemple, nous utiliserons un ensemble de données qui décrit les attributs de 10 joueurs de basket-ball :
import numpy as np import pandas as pd #create dataset df = pd.DataFrame({'rating': [90, 85, 82, 88, 94, 90, 76, 75, 87, 86], 'points': [25, 20, 14, 16, 27, 20, 12, 15, 14, 19], 'assists': [5, 7, 7, 8, 5, 7, 6, 9, 9, 5], 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10, 10, 7]}) #view dataset df rating points assists rebounds 0 90 25 5 11 1 85 20 7 8 2 82 14 7 10 3 88 16 8 6 4 94 27 5 6 5 90 20 7 9 6 76 12 6 6 7 75 15 9 10 8 87 14 9 10 9 86 19 5 7
Supposons que nous souhaitions ajuster un modèle de régression linéaire multiple en utilisant la notation comme variable de réponse et les points, les passes décisives et les rebonds comme variables explicatives.
Pour calculer le VIF pour chaque variable explicative du modèle, nous pouvons utiliser la fonction variance_inflation_factor() de la bibliothèque statsmodels :
from patsy import dmatrices from statsmodels.stats.outliers_influence import variance_inflation_factor #find design matrix for linear regression model using 'rating' as response variable y, X = dmatrices('rating ~ points+assists+rebounds', data=df, return_type='dataframe') #calculate VIF for each explanatory variable vif = pd.DataFrame() vif['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] vif['variable'] = X.columns #view VIF for each explanatory variable vif VIF variable 0 101.258171 Intercept 1 1.763977 points 2 1.959104 assists 3 1.175030 rebounds
On peut observer les valeurs VIF pour chacune des variables explicatives :
- points : 1,76
- passes décisives : 1,96
- rebonds : 1,18
Remarque : Ignorez le VIF pour « Interception » dans le modèle car cette valeur n’est pas pertinente.
Comment interpréter les valeurs VIF
La valeur de VIF commence à 1 et n’a pas de limite supérieure. Une règle générale pour interpréter les VIF est la suivante :
- Une valeur de 1 indique qu’il n’y a aucune corrélation entre une variable explicative donnée et toute autre variable explicative du modèle.
- Une valeur comprise entre 1 et 5 indique une corrélation modérée entre une variable explicative donnée et d’autres variables explicatives du modèle, mais elle n’est souvent pas suffisamment grave pour nécessiter une attention particulière.
- Une valeur supérieure à 5 indique une corrélation potentiellement sévère entre une variable explicative donnée et d’autres variables explicatives du modèle. Dans ce cas, les estimations des coefficients et les valeurs p dans les résultats de la régression ne sont probablement pas fiables.
Étant donné que chacune des valeurs VIF des variables explicatives de notre modèle de régression est proche de 1, la multicolinéarité n’est pas un problème dans notre exemple.