Facteur d’Inflation de Variance (VIF) : Traiter la Multicolinéarité dans l’Analyse de Régression

En analyse de régression, la multicolinéarité se produit lorsque les variables indépendantes sont corrélées entre elles. Cela rend difficile de déterminer l’influence unique de chaque prédicteur sur la variable dépendante. En conséquence, vous avez des erreurs-types gonflées, ce qui affecte à son tour la signification des coefficients.

Le facteur d’inflation de la variance (VIF) est un excellent outil pour détecter la multicolinéarité, offrant des informations au-delà des simples corrélations par paires. Ce tutoriel explique comment fonctionne le VIF, comment le calculer et l’interpréter, et que faire si vous trouvez des valeurs de VIF élevées. Ces étapes vous aideront en tant que professionnels des données et scientifiques des données à améliorer la stabilité de votre modèle.

Maintenant, bien que le VIF soit un outil de diagnostic important et qu’il vaut la peine d’être appris, il représente juste une petite partie de l’ensemble de compétences plus vaste que vous développerez dans notre parcours professionnel Scientifique en Machine Learning en Python, alors inscrivez-vous dès aujourd’hui.

Qu’est-ce que le Facteur d’Inflation de la Variance (VIF) ?

Développé par le statisticien Cuthbert Daniel, le VIF est un outil de diagnostic largement utilisé dans l’analyse de régression pour détecter la multicolinéarité, qui est connue pour affecter la stabilité et l’interprétabilité des coefficients de régression. Plus techniquement, le VIF fonctionne en quantifiant dans quelle mesure la variance d’un coefficient de régression est gonflée en raison des corrélations entre les prédicteurs.

Tout cela est important car ces corrélations rendent difficile d’isoler l’effet unique de chaque prédicteur sur la variable cible, ce qui conduit à des estimations de modèle moins fiables. Je devrais également dire que, pour vraiment raconter la bonne histoire, le VIF est toujours calculé pour chaque prédicteur dans un modèle.

La formule du facteur d’inflation de la variance.

Le VIF pour un prédicteur X est calculé comme suit:

Où:

  • R2 est le coefficient de détermination obtenu lorsque X est régressé sur tous les autres prédicteurs.

Calcul étape par étape

Le calcul du VIF est un processus en trois étapes. La première étape consiste à ajuster un modèle de régression linéaire séparé pour chaque prédicteur par rapport à tous les autres prédicteurs. La deuxième étape consiste à obtenir la valeur de R2 pour chaque modèle. La dernière étape consiste à calculer le VIF en utilisant la formule ci-dessus.

Interprétation des valeurs de VIF

Voici comment interpréter les valeurs VIF pour comprendre le niveau de multicolinéarité:

  • VIF = 1: Cela indique qu’il n’y a pas de multicolinéarité. Le prédicteur n’est pas corrélé avec les autres prédicteurs, donc il ne gonfle pas l’erreur standard ou n’affecte pas la stabilité du modèle.
  • VIF entre 1 et 5: Cela suggère une multicolinéarité modérée. Il y a une certaine corrélation avec d’autres prédicteurs, mais ce n’est généralement pas grave. Cependant, il est bon de surveiller ces prédicteurs pour voir si la multicolinéarité devient un problème, surtout si d’autres valeurs VIF sont élevées.
  • VIF > 5: Une forte multicollinéarité est présente. L’erreur standard du prédicteur peut être nettement surestimée, ce qui rend son coefficient moins fiable. Envisagez de prendre des mesures pour réduire la multicollinéarité, comme supprimer ou combiner des prédicteurs corrélés.
  • VIF > 10: Cela indique une multicollinéarité sérieuse. L’erreur standard du prédicteur est fortement surestimée, et son estimation de coefficient est probablement instable. Des actions correctives, telles que supprimer le prédicteur ou utiliser des techniques de régularisation, sont généralement nécessaires.

Par exemple, si le VIF d’un prédicteur est de 10, cela indique que la variance du coefficient de ce prédicteur est 10 fois plus élevée que ce qu’elle serait en l’absence de multicollinéarité.

Comment le VIF explique la multicollinéarité en régression

La multicolinéarité provoque une augmentation des erreurs standards, ce qui rend plus difficile l’évaluation de la signification des prédicteurs individuels. Cela se produit car les variables collinéaires contiennent des informations similaires, rendant difficile la séparation de leurs effets individuels spécifiques sur la variable de résultat.

Bien que la multicolinéarité n’affecte pas nécessairement la capacité du modèle à prédire, elle réduit la fiabilité et la clarté des coefficients. Cela pose particulièrement problème lorsque nous voulons comprendre l’impact individuel de chaque prédicteur.

Le facteur d’inflation de la variance (VIF) sert de métrique diagnostique précise pour identifier la multicolinéarité. Contrairement aux observations générales sur la corrélation, le VIF isole l’effet combiné de tous les prédicteurs sur chaque variable, mettant en évidence des interactions qui pourraient ne pas être évidentes à partir des corrélations par paires.

Facteur d’inflation de la variance en Python et R

Pour rendre cela concret, passons par un exemple en Python et en R en utilisant un jeu de données unique. Nous calculerons le VIF en utilisant des packages automatisés et également en utilisant la formule VIF pour développer notre intuition. Afin d’avoir une bonne pratique, j’ai délibérément créé un jeu de données où nous découvrirons une valeur VIF élevée pour l’une de nos variables même s’il n’y a pas de corrélation très élevée entre deux variables – donc je pense que c’est un exemple convaincant. Commençons par un aperçu du jeu de données que nous allons utiliser.

Aperçu du jeu de données:

Ce jeu de données fictif représente les résultats d’une enquête menée auprès de 1 000 magasins d’un géant de la vente au détail. Les clients de chaque magasin ont été invités à évaluer divers aspects de leur expérience d’achat sur une échelle de -5 à +5, où -5 indique une expérience très négative et +5 une expérience très positive. La moyenne des évaluations des clients de chaque magasin a été prise pour quatre paramètres clés:

  • Ambiance: Perception du client de l’environnement du magasin, comme la propreté, l’agencement, l’éclairage et l’atmosphère générale.

  • Service_client: Évaluation du service fourni par le personnel du magasin, y compris la serviabilité, la convivialité et la réactivité aux besoins des clients.

  • Offres: Évaluation des offres promotionnelles, remises et offres disponibles pour les clients.

  • Product_range: Évaluation de la variété et de la qualité des produits disponibles en magasin.

La variable cible, Performance, mesure la performance globale de chaque magasin. Cependant, elle n’est pas pertinente du point de vue du VIF. Vous pouvez télécharger l’ensemble de données ici.

Facteur d’inflation de la variance en Python

Nous commencerons par calculer les valeurs VIF en utilisant les packages python. La première étape consiste à charger l’ensemble de données et les bibliothèques requises.

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

Le code ci-dessus chargera les données et affichera les cinq premiers enregistrements.

Ensuite, nous pouvons exécuter une matrice de corrélation pour vérifier les corrélations par paires.

Le code ci-dessous sélectionne quatre colonnes et les stocke dans un nouveau DataFrame appelé correl_data. Il calcule ensuite la matrice de corrélation paire à paire en utilisant la fonction .corr(). Le résultat est stocké dans l’objet corr_matrix, qui est un tableau montrant les coefficients de corrélation entre chaque paire des colonnes sélectionnées. 

La matrice est ensuite visualisée en utilisant la fonction heatmap() de Seaborn, affichant chaque coefficient de corrélation sous forme de cellule codée par couleur, où le bleu représente les corrélations négatives et le rouge représente les corrélations positives, basé sur la carte de couleurs coolwarm

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # Calculer la matrice de corrélation paire à paire corr_matrix = correl_data.corr() # Visualiser la matrice de corrélation plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Sortie :

  Corrélation entre les variables. Image par l’auteur

Le graphique fournit un résumé visuel des relations entre les variables dans correl_data. Les valeurs de corrélation vont de -1 à 1, où les valeurs proches de 1 indiquent une forte corrélation positive, les valeurs proches de -1 indiquent une forte corrélation négative, et les valeurs autour de 0 suggèrent aucune corrélation. Il est évident qu’il n’y a pas de corrélation forte entre les variables, aucun des valeurs de corrélation n’étant supérieur à 0,6. 

La prochaine étape consiste à calculer les valeurs VIF pour les variables prédictives. Le code ci-dessous calcule les valeurs pour chaque variable prédictive dans l’ensemble de données pour vérifier la multicollinéarité. 

Tout d’abord, il définit X en supprimant la colonne cible Performance et en ajoutant une constante. Ensuite, il crée un DataFrame, datacamp_vif_data, pour stocker les noms des prédicteurs et leurs valeurs VIF. En utilisant une boucle, il calcule ensuite le VIF pour chaque prédicteur avec la fonction variance_inflation_factor(), où des VIF plus élevés indiquent la présence de multicollinéarité. 

# Définir les variables prédictives X = datacamp_retail_data.drop(columns=['Performance']) # Ajouter une constante au modèle (intercept) X = add_constant(X) # Calculer le VIF pour chaque caractéristique 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)

Sortie:

Sortie montrant les valeurs VIF. Image par l’auteur

Ce résultat montre la valeur du VIF pour chaque variable prédictive, indiquant les niveaux de multicolinéarité dans l’ensemble de données. La ligne const représente le terme d’interception, avec un VIF proche de 1, ce qui signifie qu’il n’a pas de multicolinéarité. Parmi les variables prédictives, Product_range a le VIF le plus élevé (5,94), ce qui suggère qu’il a besoin de mesures correctives. Toutes les autres variables prédictives ont des valeurs de VIF inférieures à 3, indiquant une faible multicolinéarité.

Approche manuelle du calcul du VIF

L’autre approche consiste à calculer les valeurs séparément en régressant chaque variable indépendante par rapport aux autres variables prédictives.

Donc, pour chaque caractéristique dans retail_data, elle définit cette caractéristique comme la variable dépendante (y) et les caractéristiques restantes comme variables indépendantes (X). Un modèle de régression linéaire est ensuite ajusté pour prédire y en utilisant X, et la valeur de R carré du modèle est utilisée pour calculer le VIF en utilisant la formule que nous avons discutée dans la section initiale.

Par la suite, chaque caractéristique et ses valeurs VIF correspondantes sont stockées dans un dictionnaire (vif_manual), qui est ensuite converti en un DataFrame (vif_manual_df) pour affichage.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Calcul Manuel du VIF vif_manual = {} for feature in retail_data.columns: # Définir la variable cible (caractéristique actuelle) et les prédicteurs (toutes les autres caractéristiques) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Ajuster le modèle de régression linéaire model = LinearRegression().fit(X, y) # Calculer R-carré r_squared = model.score(X, y) # Calculer le VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Convertir le dictionnaire en DataFrame pour un meilleur affichage vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 Sortie :

Sortie montrant les valeurs VIF. Image par l’Auteur

La sortie montre chaque fonctionnalité avec sa valeur VIF, ce qui permet d’identifier d’éventuels problèmes de multicolinéarité. Vous pouvez voir que le résultat est clairement le même que celui que nous avons obtenu précédemment; et donc son interprétation sera que la variable Product_range présente de la multicolinéarité.

Facteur d’inflation de la variance en R

Dans cette section, nous allons répéter l’exercice du facteur d’inflation de la variance ci-dessus dans la section Python, notamment pour les développeurs qui travaillent avec le langage de programmation R. Nous commençons par charger l’ensemble de données et les bibliothèques nécessaires.

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

Sortie:

La prochaine étape consiste à calculer la matrice de corrélation par paires et à la visualiser avec le heatmap. Les fonctions cor() et corrplot nous aident à accomplir cette tâche.

# Supprimer la colonne cible predictors_data <- data[, !(names(data) %in% "Performance")] # Calculer la matrice de corrélation correlation_matrix <- cor(predictors_data) # Tracer la carte de chaleur de corrélation # Charger les bibliothèques nécessaires library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Tracer la carte de chaleur avec 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() + # Thème minimal pour un aspect propre theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Supprimer les étiquettes des axes geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Sortie:

Corrélation entre les variables. Image par l’auteur

Il est évident à partir de la carte de chaleur de corrélation qu’il n’y a pas de corrélation forte en paire parmi les variables, aucun des valeurs de corrélation n’étant même supérieur à 0,6. Maintenant, nous allons calculer les valeurs de VIF et voir s’il y a quelque chose d’alarmant. La ligne de code suivante effectue cette tâche.

# Adapter un modèle de régression model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Calculer le VIF vif(model)

Sortie :

D’après la sortie, nous pouvons voir que parmi les variables prédictives, seule la variable Product_range a une valeur VIF supérieure à 5, ce qui suggère une forte multicolinéarité nécessitant des mesures correctives.

Approche manuelle pour le calcul du VIF

L’autre approche pour le calcul du VIF consisterait à calculer les valeurs VIF pour chaque variable séparément en régressant chaque variable indépendante contre les autres variables prédictives.

Cela est effectué dans le code ci-dessous, qui utilise la fonction sapply() pour chaque prédicteur, où chaque prédicteur est défini comme la variable dépendante dans un modèle de régression linéaire avec les autres prédicteurs comme variables indépendantes.

La valeur R-carré de chaque modèle est ensuite utilisée pour calculer les valeurs VIF avec sa formule. Enfin, le résultat, vif_values, affiche le VIF pour chaque prédicteur, aidant à identifier les problèmes de multicolinéarité.

# Calcul du VIF pour chaque prédicteur manuellement 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)

Sortie :

Nous obtenons le même résultat et il est évident que la variable Product_range avec une valeur VIF élevée au-dessus de 5 nécessite une intervention.

VIF vs. Matrice de Corrélation et Autres Méthodes

En résumé, voici les méthodes populaires pour détecter la multicolinéarité :

  • Valeurs VIF élevées: Une valeur VIF élevée est un indicateur clair de la multicolinéarité. Lorsque ces valeurs dépassent certains seuils, elles indiquent qu’un prédicteur est fortement lié à d’autres prédicteurs, ce qui peut affecter la stabilité, la fiabilité et les performances du modèle.
  • Matrices de corrélation: En examinant une matrice de corrélation, vous pouvez voir les corrélations par paires entre les prédicteurs. Des corrélations par paires élevées suggèrent une multicolinéarité entre ces prédicteurs spécifiques. Cependant, cette méthode ne détecte que les relations linéaires directes entre deux variables et peut passer à côté de la multicolinéarité impliquant des interactions plus complexes entre plusieurs variables.
  • Changements de Coefficient: Si les coefficients des prédicteurs changent de manière significative lorsque vous ajoutez ou supprimez d’autres variables du modèle, cela peut être un signe de multicolinéarité. De telles fluctuations indiquent que certains prédicteurs peuvent partager des informations communes, rendant plus difficile l’identification de l’impact unique de chaque variable sur le résultat.

Parmi toutes ces méthodes, le VIF est particulièrement utile car il peut détecter la multicolinéarité même lorsque les corrélations par paires sont faibles, comme nous l’avons vu dans notre exemple. Cela fait du VIF un outil plus complet.

Idées Supplémentaires sur la Façon de Gérer les Valeurs Élevées de VIF

Si les valeurs de VIF indiquent une multicolinéarité élevée, et que vous ne voulez pas nécessairement simplement supprimer la variable, il existe d’autres stratégies plus avancées pour atténuer la multicolinéarité:

  1. Sélection des caractéristiques: Supprimez l’un des prédicteurs fortement corrélés, et recalculez le VIF pour voir si cela contribue à simplifier le modèle et à améliorer sa stabilité.
  2. Analyse en composantes principales (ACP): Utilisez l’ACP pour combiner vos prédicteurs en un ensemble plus restreint de composantes non corrélées. Cela transforme les variables originales en nouvelles variables indépendantes et non corrélées qui capturent la plupart des variations des données, aidant ainsi à traiter la multicolinéarité sans perdre d’informations précieuses.
  3. Techniques de régularisation: Appliquer une régression ridge ou lasso, qui ajoutent des termes de pénalité au modèle. Ces techniques aident à réduire la multicolinéarité en réduisant l’influence des variables corrélées, rendant le modèle plus stable et fiable.

Conclusion

Savoir comment utiliser le VIF est essentiel pour identifier et corriger la multicollinéarité, ce qui améliore la précision et la clarté des modèles de régression. Vérifier régulièrement les valeurs de VIF et appliquer des mesures correctives lorsque nécessaire aide les professionnels des données et les analystes à construire des modèles en qui ils peuvent avoir confiance. Cette approche garantit que l’effet de chaque prédicteur est clair, facilitant ainsi la formulation de conclusions fiables à partir du modèle et la prise de meilleures décisions basées sur les résultats. Prenez notre parcours professionnel Scientifique en Machine Learning en Python pour vraiment comprendre comment construire des modèles et les utiliser. De plus, l’achèvement du programme est un atout indéniable sur un CV.

De plus, pour un apprentissage plus approfondi, envisagez d’explorer les ressources suivantes du blog et des sections tutoriels de DataCamp :

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