Indice di inflazione della varianza (VIF): Affrontare la multicollinearità nell’analisi di regressione

Nell’analisi di regressione, si verifica la presenza di multicollinearità quando le variabili indipendenti sono correlate tra loro. Ciò rende difficile determinare l’influenza unica di ciascun predittore sulla variabile dipendente. Di conseguenza, si hanno errori standard gonfiati, che a loro volta influenzano la significatività dei coefficienti.

Il fattore di inflazione della varianza (VIF) è un ottimo strumento per rilevare la multicollinearità, offrendo approfondimenti al di là delle semplici correlazioni a coppie. Questo tutorial spiega come funziona il VIF, come calcolarlo e interpretarlo, e cosa fare se si trovano valori di VIF elevati. Questi passaggi aiuteranno voi professionisti dei dati e scienziati dei dati a migliorare la stabilità del vostro modello.

Ora, mentre il VIF è uno strumento diagnostico importante e vale sicuramente la pena impararlo, rappresenta solo una piccola parte dell’ampio set di competenze che svilupperete nel nostro percorso professionale Scienziato dell’Apprendimento Automatico in Python, quindi iscrivetevi oggi.

Cos’è il Fattore di Inflazione della Varianza (VIF)?

Sviluppato dallo statistico Cuthbert Daniel, il VIF è uno strumento diagnostico ampiamente utilizzato nell’analisi di regressione per rilevare la multicollinearità, che è nota per influenzare la stabilità e l’interpretabilità dei coefficienti di regressione. Più tecnicamente, il VIF funziona quantificando quanto la varianza di un coefficiente di regressione è inflazionata a causa delle correlazioni tra i predittori.

Tutto ciò è importante perché queste correlazioni rendono difficile isolare l’effetto unico di ciascun predittore sulla variabile target, portando a stime del modello meno affidabili. Dovrei anche dire che, per raccontare davvero la storia giusta, il VIF viene sempre calcolato per ciascun predittore in un modello.

La formula del fattore di inflazione della varianza

Il VIF per un predittore X viene calcolato come:

Dove:

  • Il coefficiente di determinazione R2 è ottenuto quando X è regredito su tutti gli altri predittori.

Calcolo passo dopo passo

Il calcolo del VIF è un processo in tre fasi. Il primo passo consiste nel adattare un modello di regressione lineare separato per ciascun predittore rispetto a tutti gli altri predittori. Il secondo passo è ottenere il valore R2 per ciascun modello. Il passo finale è calcolare il VIF utilizzando la formula sopra.

Interpretazione dei Valori VIF

Ecco come interpretare i valori VIF per comprendere il livello di multicollinearità:

  • VIF = 1: Questo indica l’assenza di multicollinearità. Il predittore non è correlato con gli altri predittori, quindi non gonfia l’errore standard o influisce sulla stabilità del modello.
  • VIF tra 1 e 5: Questo suggerisce una moderata multicollinearità. C’è una certa correlazione con gli altri predittori, ma di solito non è grave. Tuttavia, è bene tenere d’occhio questi predittori per vedere se la multicollinearità diventa un problema, specialmente se gli altri valori VIF sono elevati.
  • VIF > 5: È presente un’alta multicollinearità. L’errore standard del predittore potrebbe essere notevolmente inflazionato, rendendo il suo coefficiente meno affidabile. Valuta di intraprendere azioni per ridurre la multicollinearità, come rimuovere o combinare predittori correlati.
  • VIF > 10: Questo segnala una grave multicollinearità. L’errore standard del predittore è altamente inflazionato e la stima del suo coefficiente è probabilmente instabile. Di solito sono necessarie azioni correttive, come rimuovere il predittore o utilizzare tecniche di regolarizzazione.

Ad esempio, se il VIF di un predittore è 10, indica che la varianza del coefficiente di quel predittore è 10 volte maggiore di quanto sarebbe in assenza di multicollinearità.

Come il VIF Spiega la Multicollinearità nella Regressione

La multicollinearità fa aumentare gli errori standard, rendendo più difficile valutare la significatività dei singoli predittori. Ciò accade perché le variabili collineari trasportano informazioni simili, rendendo difficile separare i loro effetti specifici sulla variabile di risultato.

Anche se la multicollinearità non danneggia necessariamente la capacità del modello di prevedere, riduce la affidabilità e la chiarezza dei coefficienti. Questo è particolarmente problematico quando vogliamo comprendere l’impatto individuale di ciascun predittore.

Il fattore di inflazione della varianza (VIF) funge da metrica diagnostica precisa per identificare la multicollinearità. A differenza delle osservazioni generali sulla correlazione, il VIF isola l’effetto combinato di tutti i predittori su ciascuna variabile, evidenziando interazioni che potrebbero non essere evidenti dalle correlazioni a coppie.

Fattore di Inflazione della Varianza in Python e R

Per rendere tutto questo pratico, passiamo attraverso un esempio sia in Python che in R utilizzando un dataset unico. Calcoleremo il VIF utilizzando pacchetti automatizzati e anche la formula VIF per sviluppare intuizione. Per avere una buona pratica, ho creato deliberatamente un dataset dove scopriremo un alto valore di VIF per una delle nostre variabili anche se non c’è una correlazione molto alta tra le coppie di variabili – quindi penso che sia un esempio convincente. Cominciamo con una panoramica del dataset che useremo.

Panoramica del Dataset:

Questo dataset fittizio rappresenta i risultati di un sondaggio da uno studio condotto in 1.000 negozi di un gigante della vendita al dettaglio. Ai clienti di ogni negozio è stato chiesto di valutare vari aspetti della loro esperienza di shopping su una scala da -5 a +5, dove -5 indica un’esperienza molto negativa e +5 indica un’esperienza molto positiva. La media delle valutazioni dei clienti in ogni negozio è stata presa su quattro parametri chiave:

  • Ambiente: Percezione del cliente dell’ambiente del negozio, come pulizia, disposizione, illuminazione e atmosfera generale.

  • Servizio_clienti: Valutazione del servizio fornito dal personale del negozio, tra cui disponibilità, cordialità e prontezza nel rispondere alle esigenze del cliente.

  • Offerte:Valutazione delle offerte promozionali, sconti e offerte disponibili ai clienti nel negozio.

  • Product_range: Valutazione della varietà e qualità dei prodotti disponibili nel negozio.

La variabile target, Performance, misura le prestazioni complessive di ciascun negozio. Tuttavia, non è rilevante dal punto di vista del VIF. È possibile scaricare il dataset qui.

Il fattore di inflazione della varianza in Python

Cominceremo calcolando i valori VIF utilizzando i pacchetti python. Il primo passo è caricare il set di dati e le librerie richieste.

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

Il codice sopra caricherà i dati e visualizzerà i primi cinque record.

Come prossimo passo, possiamo eseguire una matrice di correlazione per verificare le correlazioni due a due.

Il codice qui sotto seleziona quattro colonne e le memorizza in un nuovo DataFrame chiamato correl_data. Calcola quindi la matrice di correlazione a coppie utilizzando la funzione .corr(). Il risultato è memorizzato nell’oggetto corr_matrix, che è una tabella che mostra i coefficienti di correlazione tra ciascuna coppia delle colonne selezionate. 

La matrice viene quindi visualizzata utilizzando la funzione heatmap() di Seaborn, mostrando ciascun coefficiente di correlazione come una cella colorata, dove il blu rappresenta correlazioni negative e il rosso rappresenta correlazioni positive, basato sulla mappa dei colori coolwarm

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # Calcola la matrice di correlazione a coppie corr_matrix = correl_data.corr() # Visualizza la matrice di correlazione plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Output:

  Correlazione tra le variabili. Immagine dell’Autore

Il grafico fornisce un riassunto visivo delle relazioni tra le variabili in correl_data. I valori di correlazione vanno da -1 a 1, dove i valori più vicini a 1 indicano una forte correlazione positiva, i valori più vicini a -1 indicano una forte correlazione negativa e i valori intorno a 0 suggeriscono nessuna correlazione. È evidente che non c’è una forte correlazione tra le coppie di variabili, con nessuno dei valori di correlazione che supera 0.6.

Il passo successivo è calcolare i valori VIF per le variabili predittive. Il codice qui sotto calcola i valori per ciascuna variabile predittiva nel dataset per controllare la multicollinearità.

Innanzitutto, definisce X rimuovendo la colonna target Performance e aggiungendo un’intercetta. Poi, crea un DataFrame, datacamp_vif_data, per memorizzare i nomi dei predittori e i loro valori VIF. Utilizzando un ciclo, calcola quindi il VIF per ciascun predittore con la variance_inflation_factor() funzione, dove valori VIF più alti indicano la presenza di multicollinearità.

# Definisci le variabili predittive X = datacamp_retail_data.drop(columns=['Performance']) # Aggiungi una costante al modello (intercetta) X = add_constant(X) # Calcola il VIF per ciascuna caratteristica 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)

Output:

Output che mostra i valori VIF. Immagine dell’autore

Questo output mostra il valore VIF per ciascuna variabile predittiva, indicando i livelli di multicollinearità nel dataset. La riga const rappresenta il termine di intercetta, con un VIF vicino a 1, il che significa che non ha multicollinearità. Tra le variabili predittive, Product_range ha il VIF più alto (5.94), il che suggerisce che ha bisogno di misure correttive. Tutte le altre variabili predittive hanno valori VIF inferiori a 3, indicando una bassa multicollinearità.

Approccio manuale al calcolo del VIF

L’altro approccio consiste nel calcolare i valori separatamente regredendo ciascuna variabile indipendente rispetto alle altre variabili predittive.

Quindi, per ciascuna feature in retail_data, imposta tale feature come la variabile dipendente (y) e le altre feature come variabili indipendenti (X). Viene quindi adattato un modello di regressione lineare per prevedere y utilizzando X, e il valore R-quadrato del modello viene utilizzato per calcolare il VIF utilizzando la formula che abbiamo discusso nella sezione iniziale.

Successivamente, ciascuna caratteristica e i relativi valori VIF corrispondenti sono memorizzati in un dizionario (vif_manual), che viene poi convertito in un DataFrame (vif_manual_df) per la visualizzazione.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Calcolo manuale del VIF vif_manual = {} for feature in retail_data.columns: # Definire la variabile target (caratteristica attuale) e i predittori (tutte le altre caratteristiche) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Addestrare il modello di regressione lineare model = LinearRegression().fit(X, y) # Calcolare il R-quadrato r_squared = model.score(X, y) # Calcolare il VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Convertire il dizionario in un DataFrame per una migliore visualizzazione vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

Output:

Output che mostra i valori VIF. Immagine dell’Autore

L’output mostra ogni caratteristica insieme al suo valore VIF, aiutando a identificare potenziali problemi di multicollinearità. Si può vedere che il risultato è ovviamente lo stesso di quello che abbiamo ottenuto in precedenza; e così sarà la sua interpretazione, che è che la variabile Product_range sta mostrando multicollinearità.

Fattore di inflazione della varianza in R

In questa sezione, ripeteremo l’esercizio del fattore di inflazione della varianza sopra nella sezione Python, specialmente per gli sviluppatori che lavorano con il linguaggio di programmazione R. Iniziamo caricando il dataset e le librerie necessarie.

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

Output:

Il passo successivo è calcolare la matrice di correlazione a coppie e visualizzarla con la mappa di calore. Le funzioni cor() e corrplot ci aiutano a completare questo compito.

# Rimuovere la colonna target predictors_data <- data[, !(names(data) %in% "Performance")] # Calcolare la matrice di correlazione correlation_matrix <- cor(predictors_data) # Tracciare la mappa di correlazione # Caricare le librerie necessarie library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Tracciare la mappa di calore 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 minimale per un aspetto pulito theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Rimuovere le etichette degli assi geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Output:

Correlazione tra le variabili. Immagine dell’Autore

Dal grafico di correlazione è evidente che non vi sia una forte correlazione a coppie tra le variabili, con nessuno dei valori di correlazione che supera anche 0,6. Ora calcoleremo i valori VIF e vedremo se ci sia qualcosa di preoccupante. La riga di codice seguente svolge questo compito.

# Adattare un modello di regressione model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Calcolare il VIF vif(model)

Output:

Dall’output, possiamo vedere che tra le variabili predittive, solo la variabile Product_range ha un valore VIF maggiore di 5, il che suggerisce una forte multicollinearità che necessita di misure correttive.

Approccio manuale al calcolo del VIF

L’altro approccio al calcolo del VIF sarebbe calcolare i valori VIF per ciascuna variabile separatamente regredendo ciascuna variabile indipendente contro le altre variabili predittive.

Questo viene eseguito nel codice sottostante, che utilizza la funzione sapply() su ciascun predittore, dove ciascun predittore è impostato come variabile dipendente in un modello di regressione lineare con gli altri predittori come variabili indipendenti.

Il valore R-quadrato di ciascun modello viene quindi utilizzato per calcolare i valori VIF con la relativa formula. Infine, il risultato, vif_values, visualizza il VIF per ciascun predittore, aiutando a identificare i problemi di multicollinearità.

# Calcolo del VIF per ciascun predittore 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:

Otteniamo lo stesso risultato ed è evidente che la variabile Product_range con un alto valore di VIF superiore a 5 necessita di intervento.

VIF vs. Matrice di Correlazione e Altri Metodi

Come riepilogo, ecco i metodi popolari per rilevare la multicollinearità:

  • Valori elevati di VIF: Un valore elevato di VIF è un chiaro indicatore di multicollinearità. Quando questi valori superano determinate soglie, indicano che un predittore è fortemente correlato ad altri predittori, il che può influire sulla stabilità, affidabilità e prestazioni del modello.
  • Matrici di correlazione: Esaminando una matrice di correlazione, è possibile vedere le correlazioni tra coppie di predittori. Alte correlazioni tra coppie suggeriscono la presenza di multicollinearità tra quei predittori specifici. Tuttavia, questo metodo rileva solo relazioni lineari dirette tra due variabili e potrebbe non individuare multicollinearità che coinvolge interazioni più complesse tra diverse variabili.
  • Variazioni dei coefficienti: Se i coefficienti dei predittori cambiano significativamente quando si aggiungono o si rimuovono altre variabili dal modello, questo può essere un segno di multicollinearità. Tali fluttuazioni indicano che alcuni predittori potrebbero condividere informazioni comuni, rendendo più difficile identificare l’impatto unico di ciascuna variabile sull’outcome.

Tra tutti questi metodi, il VIF è particolarmente utile perché può rilevare la multicollinearità anche quando le correlazioni a coppie sono basse, come abbiamo visto nel nostro esempio. Ciò rende il VIF uno strumento più completo.

Idee aggiuntive su come affrontare i valori di VIF elevati

Se i valori di VIF indicano una forte multicollinearità e non si desidera necessariamente rimuovere la variabile, ci sono altre strategie più avanzate per mitigare la multicollinearità:

  1. Selezione delle caratteristiche: Rimuovere uno dei predittori altamente correlati e ricalcolare il VIF per vedere se aiuta a semplificare il modello e migliorare la stabilità.
  2. Analisi dei componenti principali (PCA): Utilizzare PCA per combinare i predittori in un insieme più piccolo di componenti non correlate. Questo trasforma le variabili originali in nuove variabili indipendenti e non correlate che catturano la maggior parte della variazione dei dati, aiutando ad affrontare la multicollinearità senza perdere informazioni preziose.
  3. Tecniche di regolarizzazione: Applica la regressione ridge o lasso, che aggiunge termini di penalizzazione al modello. Queste tecniche aiutano a ridurre la multicollinearità restringendo l’influenza delle variabili correlate, rendendo il modello più stabile e affidabile.

Conclusion

Conoscere come utilizzare il VIF è fondamentale per identificare e risolvere la multicollinearità, migliorando l’accuratezza e la chiarezza dei modelli di regressione. Controllare regolarmente i valori del VIF e applicare misure correttive quando necessario aiuta i professionisti dei dati e gli analisti a costruire modelli su cui possono fare affidamento. Questo approccio garantisce che l’effetto di ciascun predittore sia chiaro, rendendo più facile trarre conclusioni affidabili dal modello e prendere decisioni migliori basate sui risultati. Prendi il nostro percorso professionale di Scienziato del Machine Learning in Python per capire davvero come costruire modelli e utilizzarli. Inoltre, il completamento del programma valorizza il curriculum.

Inoltre, per ulteriori approfondimenti, considera di esplorare le seguenti risorse dal blog e dalle sezioni tutorial di DataCamp:

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