Regressione in Python: guida pratica

Collegamenti rapidi
- Regressione lineare semplice: trovare tendenze
- Regressione lineare multipla: portare la regressione nella terza dimensione e oltre
- Regressione non lineare: adattare curve
- Regressione logistica: adattare categorie binarie
Introduzione breve: raccogliere dati non basta. Devi saperli interpretare e trasformare in decisioni. La regressione ti aiuta a scoprire relazioni numeriche tra variabili e a prevedere valori futuri. Python offre librerie semplici e potenti (Seaborn, Pingouin, NumPy, pandas, scikit-learn) che rendono l’analisi riproducibile e scalabile rispetto ai fogli di calcolo.
Important: definizione rapida — regressione: tecnica statistica per modellare la relazione tra una variabile dipendente e una o più variabili indipendenti.
1. Regressione lineare semplice: trovare tendenze
Obiettivo: capire se esiste una relazione lineare tra due variabili. La variabile indipendente (x) viene tracciata sull’asse x; la variabile dipendente (y) sull’asse y. Il risultato visivo tipico è uno scatterplot con una retta che approssima la tendenza.
Esempio pratico: dataset “tips” (mance) fornito con Seaborn. Vogliamo verificare se l’importo totale del conto predice la mancia.
Passaggi iniziali — import e caricamento dati:
import seaborn as sns
tips = sns.load_dataset('tips')
Se usi un notebook Jupyter, assicurati di visualizzare i grafici inline:
%matplotlib inline
Creiamo uno scatterplot con relplot:
sns.relplot(x='total_bill',y='tip',data=tips)
Osservazione: lo scatterplot suggerisce una relazione approssimativamente lineare positiva tra conto e mancia.
Ora aggiungiamo la retta di regressione con regplot:
sns.regplot(x='total_bill',y='tip',data=tips)
La retta sembra adattarsi bene: è una conferma visiva, ma serve un’analisi numerica per quantificare il legame.
Usiamo Pingouin per un’analisi formale. La funzione linear_regression calcola i coefficienti della retta e statistiche di adattamento:
import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
Nota: il valore a cui prestare attenzione è l’r² (coefficiente di determinazione). Nel nostro esempio r² = 0.46. La radice quadrata di r² (~0.68) è la correlazione lineare (r). Valori di r prossimi a 1 indicano una relazione positiva robusta.
La forma della retta è y = m*x + b. Con i coefficienti estratti otteniamo (arrotondati):
tip = 0.11 * total_bill + 0.92
Implementiamo una semplice funzione predittiva in Python (attenzione all’indentazione in Python):
def tip(total_bill):
return 0.92 + 0.11 * total_bill
Esempio di previsione: forniamo un conto di €100:
tip(100)
La mancia prevista è intorno a €12.
Diagnostica minima per regressione lineare
- Residui: plottare residui vs valori predetti per verificare omoschedasticità.
- Normalità dei residui: QQ-plot o test statistico.
- Influenza e outlier: leverage e Cook’s distance.
- Multicollinearità (solo per modelli multipli): VIF.
Esempi rapidi di diagnostica (scikit-learn e statsmodels sono utili per test avanzati).
2. Regressione lineare multipla: più variabili, più potenza
Estensione naturale: più variabili indipendenti. Invece di una retta, il modello stima un piano (o un iperpiano) nello spazio delle feature.
Esempio: aggiungiamo la dimensione del gruppo (colonna “size”) al modello che predice la mancia.
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
Nota: il doppio paio di parentesi quadre specifica un DataFrame con due colonne.
Osservazione: nel dataset di esempio l’r² resta molto simile, il che indica che sia total_bill sia size contribuiscono a predire la tip.
Modello risultante (esempio con coefficienti arrotondati):
def tip(total_bill, size):
return 0.67 + 0.09 * total_bill + 0.19 * size
Consigli pratici per la regressione multipla:
- Standardizza le variabili quando hanno scale molto diverse (es. prezzo in euro vs numero di unità).
- Controlla la multicollinearità con il Variance Inflation Factor (VIF).
- Valuta l’importanza delle feature (coefficiente, intervallo di confidenza, p-value).
3. Regressione non lineare: adattare curve (polinomi e altro)
A volte la relazione non è lineare. Un modo semplice è usare polinomi (grado 2, 3, …). Questo trasforma il problema in una regressione lineare sulle feature polinomiali.
Esempio artificiale: generiamo punti per una parabola con NumPy.
import numpy as np
x = np.linspace(-100,100,1000)
y = 4*x**2 + 2*x + 3
Creiamo un DataFrame con pandas:
import pandas as pd
df = pd.DataFrame({'x': x, 'y': y})
Visualizziamo i punti:
sns.relplot(x='x',y='y',data=df)
Seaborn permette di adattare un polinomio tramite l’argomento order in regplot:
sns.regplot(x='x',y='y',order=2,data=df)
Per la regressione polinomiale con Pingouin basta creare una colonna con x al quadrato e usare linear_regression sulle due feature:
df['x2'] = df['x']**2
pg.linear_regression(df[['x','x2']],df['y']).round(2)
Per i dati sintetici creati con una formula esatta otteniamo r² = 1 (fit perfetto). Nei dati reali raramente si vede un r² perfetto.
Funzione predittiva corrispondente:
def quad(x):
return 3 + 2*x + 4*x**2
Nota: puoi estendere lo stesso approccio a polinomi di grado superiore. Valuta sempre il rischio di overfitting: più alti sono i gradi polinomiali, maggiore è la capacità del modello di adattarsi al rumore.
4. Regressione logistica: categorie binarie
Quando l’output è binario (es. sopravvivenza sì/no), la regressione logistica stima la probabilità dell’evento. La funzione di link è logit; il risultato è una curva a forma di S (sigmoide).
Esempio con il dataset Titanic incluso in Seaborn. Vogliamo capire se il prezzo del biglietto (fare) predice la probabilità di sopravvivenza.
titanic = sns.load_dataset('titanic')
Diamo un’occhiata ai dati:
titanic.head()
Seaborn supporta l’adattamento logistico con lmplot:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)
Con Pingouin possiamo ottenere una stima formale della regressione logistica:
pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
Nel nostro esempio il p-value indicato è 0.0, suggerendo che il prezzo del biglietto è un predittore significativo della sopravvivenza (attenzione: p-value arrotondato a 0.0 nel report, interpretare in contesto e controllare la granularità dei dati).
Quando la regressione funziona e quando fallisce
Important: la regressione lineare e i suoi derivati riposano su ipotesi. Violazioni possono compromettere i risultati.
Segnali di avvertimento:
- Residui non casuali o pattern nei residui → modello non cattura la struttura.
- Ettere forte multicollinearità → coefficienti instabili.
- Outlier influenti → distorcono la stima della retta.
- Dati non indipendenti (autocorrelazione) → errori di inferenza.
- Overfitting con modelli polinomiali di alto grado.
Counterexample pratico: provare a usare la regressione lineare su dati con relazione periodica (es. temperatura oraria giornaliera) senza trasformazioni porterà a fit scadenti. In quel caso valuta trasformazioni (sin/cos) o modelli a componenti stagionali.
Alternative quando il modello fallisce:
- Modelli non lineari avanzati (alberi, gradient boosting, reti neurali).
- Regressione robusta (RANSAC, Huber) per gestire outlier.
- Regularizzazione (Ridge, Lasso) per mitigare multicollinearità.
- Trasformazioni delle variabili (log, box-cox).
Mini-metodologia: workflow rapido per analisi di regressione
- Definisci l’obiettivo e la variabile target.
- Esplora i dati (distribuzioni, valori mancanti, outlier).
- Scegli il modello iniziale (lineare semplice) e diagnostica residuale.
- Itera con feature engineering e valutazione (cross-validation).
- Documenta il modello, verifica la stabilità e implementa il monitoraggio.
Fact box: interpretazioni rapide
- r²: frazione di varianza spiegata dal modello (0 a 1).
- r (correlazione): segno e intensità della relazione lineare (-1 a 1).
- p-value: misura la significatività statistica (più piccolo → più probabile che l’effetto non sia dovuto al caso).
- Coefficiente: variazione media della target per unità di variazione della feature, mantenendo le altre fisse.
Checklist operativa per ruoli
Data Scientist
- Validazione incrociata implementata.
- Matrice di confusione per modelli binari.
- Intervalli di confidenza per coefficienti.
- Analisi di feature importance e VIF.
Analista di business
- Interpretazione delle elasticità delle variabili.
- Dashboard con predizioni e intervallo di confidenza.
- Verifica delle ipotesi di business prima di distribuire il modello.
Ingegnere ML / DevOps
- Pipeline di preprocessamento riproducibile.
- Test di regressione sull’output del modello.
- Monitoraggio drift e alert su SLI/SLO del modello.
SOP rapida: come eseguire una regressione in 10 minuti
- Carica i dati (pandas).
- Pulisci e rimuovi valori mancanti o imputali.
- Esplora correlazioni e crea scatterplot per le coppie più rilevanti.
- Inizia con un modello semplice (linear_regression o scikit-learn LinearRegression).
- Valuta r², p-value, residui.
- Applica trasformazioni o regularizzazione se necessario.
- Esegui cross-validation.
- Salva il modello e documenta le metriche.
Decisione rapida: quale regressione usare?
flowchart TD
A[Inizio: cos'è la variabile target?] --> B{Target è binario?}
B -- Sì --> C[Regressione logistica o classificatore probabilistico]
B -- No --> D{Relazione appare lineare?}
D -- Sì --> E{Quante feature?}
E -- 1 --> F[Regressione lineare semplice]
E -- >1 --> G[Regressione lineare multipla '+ regularizzazione se necessario']
D -- No --> H{Relazione polinomiale?}
H -- Sì --> I[Polinomial regression 'crea feature polinomiali']
H -- No --> J[Usa modelli non lineari: alberi, boosting, reti]
Criteri di valutazione e test di accettazione
- R² o AUC (per classificazione) entro soglia business definita.
- Residuos medi prossimi a zero e distribuiti casualmente.
- Nessun singolo outlier che altera >10% dei coefficienti.
- Stability test: r² sulla validazione differisce poco da quello di training.
Esempi pratici aggiuntivi e snippet utili
Regularizzazione con scikit-learn (Ridge e Lasso):
from sklearn.linear_model import Ridge, Lasso
from sklearn.model_selection import cross_val_score
model = Ridge(alpha=1.0)
scores = cross_val_score(model, X, y, cv=5, scoring='r2')
print(scores.mean())
Regressione robusta con statsmodels:
import statsmodels.api as sm
rlm_model = sm.RLM(y, X)
rlm_results = rlm_model.fit()
print(rlm_results.summary())
Cross-validation e pipeline (scikit-learn):
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
pipe = Pipeline([
('scaler', StandardScaler()),
('reg', LinearRegression())
])
scores = cross_val_score(pipe, X, y, cv=5, scoring='r2')
print('CV r2:', scores.mean())
Sicurezza, privacy e note di conformità
- Quando lavori con dati personali, anonimizza o pseudonimizza le feature identificabili prima dell’analisi.
- Valuta l’impatto della decisione automatizzata sulla privacy (GDPR): registrare finalità e basi giuridiche se il modello prende decisioni automatizzate rilevanti.
Risorse e prossimi passi consigliati
- Seaborn per la visualizzazione statistica rapida.
- Pingouin per test statistici semplici e leggibili.
- scikit-learn per produzione e validazione con pipeline.
- statsmodels per report statistici dettagliati.
Conclusione
La regressione in Python è versatile: dai modelli lineari semplici fino a polinomi e regressione logistica. Combina visualizzazione, test statistici e pratiche di validazione per ottenere modelli solidi e interpretabili. Parti sempre da un modello semplice, diagnostica i residui, e scala la complessità solo se i benefici superano i rischi di overfitting.
Nota finale: la comprensione delle ipotesi e la verifica empirica sono più importanti di qualunque punteggio di adattamento. Usa la regressione come strumento per informare decisioni, non come stregoneria che giustifica ogni risultato.
Materiali simili

Collega iPhone a un aspirapolvere robot

Lavorare dallo smartphone: consigli pratici

Cancellare cronologia ricerca YouTube — Guida rapida

Regressione in Python: guida pratica

Ordine di visione: uscita o cronologia?
