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

Installare e usare Podman su Debian 11
DevOps

Installare e usare Podman su Debian 11

Guida rapida a apt-pinning su Debian
Linux

Guida rapida a apt-pinning su Debian

Forzare FSR 4 con OptiScaler: guida completa
Guide.

Forzare FSR 4 con OptiScaler: guida completa

Dansguardian + Squid NTLM su Debian Etch
Rete

Dansguardian + Squid NTLM su Debian Etch

Riparare errore installazione SD su Android
Android

Riparare errore installazione SD su Android

Cartelle di rete con KNetAttach e remote:/
Linux

Cartelle di rete con KNetAttach e remote:/