Guida alle tecnologie

Regressione in Python: guida pratica

8 min read Analisi dati Aggiornato 20 Sep 2025
Regressione in Python: guida pratica
Regressione in Python: guida pratica

logo di Python e Seaborn sopra un grafico stilizzato con barre, una linea ondulata e punti sparsi, che rappresentano la visualizzazione dei dati.

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)

Grafico a dispersione di tip rispetto al conto totale con Seaborn in Python.

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)

Retta di regressione di tip vs conto totale sovrapposta allo scatterplot con Seaborn.

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)

Risultato della regressione lineare semplice di tip vs conto usando Pingouin in Jupyter notebook.

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)

Grafico a dispersione che mostra una curva parabolica tipica.

Seaborn permette di adattare un polinomio tramite l’argomento order in regplot:

sns.regplot(x='x',y='y',order=2,data=df)

Regressione quadratica che si adatta a una parabola usando Seaborn.

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)

Risultato della regressione quadratica con Pingouin mostra un r² = 1 per dati sintetici.

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

Tabella che mostra le colonne del dataset dei passeggeri del Titanic presenti in Seaborn.

Seaborn supporta l’adattamento logistico con lmplot:

sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)

Regressione logistica: curva logistica di probabilità di sopravvivenza in funzione del prezzo del biglietto.

Con Pingouin possiamo ottenere una stima formale della regressione logistica:

pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)

Output della regressione logistica di Pingouin che mostra, tra le altre cose, il p-value.

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

  1. Definisci l’obiettivo e la variabile target.
  2. Esplora i dati (distribuzioni, valori mancanti, outlier).
  3. Scegli il modello iniziale (lineare semplice) e diagnostica residuale.
  4. Itera con feature engineering e valutazione (cross-validation).
  5. 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

  1. Carica i dati (pandas).
  2. Pulisci e rimuovi valori mancanti o imputali.
  3. Esplora correlazioni e crea scatterplot per le coppie più rilevanti.
  4. Inizia con un modello semplice (linear_regression o scikit-learn LinearRegression).
  5. Valuta r², p-value, residui.
  6. Applica trasformazioni o regularizzazione se necessario.
  7. Esegui cross-validation.
  8. 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.

Autore
Redazione

Materiali simili

Collega iPhone a un aspirapolvere robot
Casa Intelligente

Collega iPhone a un aspirapolvere robot

Lavorare dallo smartphone: consigli pratici
Produttività

Lavorare dallo smartphone: consigli pratici

Cancellare cronologia ricerca YouTube — Guida rapida
Privacy

Cancellare cronologia ricerca YouTube — Guida rapida

Regressione in Python: guida pratica
Analisi dati

Regressione in Python: guida pratica

Ordine di visione: uscita o cronologia?
Cinema

Ordine di visione: uscita o cronologia?

Verificare integrità file: MD5, SHA e strumenti
Sicurezza

Verificare integrità file: MD5, SHA e strumenti