La correlazione dice quanto due grandezze sono legate linearmente. La regressione fa un passo in più: descrive come sono legate, con un'equazione che permette di stimare una grandezza a partire dall'altra. Se il carico della CPU di un server cresce con il numero di utenti collegati, la regressione risponde alla domanda pratica: di quanto aumenta il carico per ogni cento utenti in più?
Il modello
La regressione lineare semplice descrive la relazione tra una variabile esplicativa x e una variabile risposta y con una retta:
y = a + b · x + errore
- b è la pendenza: di quanto cambia in media y quando x aumenta di un'unità;
- a è l'intercetta: il valore previsto di y quando x vale zero;
- l'errore rappresenta tutto ciò che la retta non spiega: rumore di misura, fattori non considerati, variabilità naturale.
Il metodo dei minimi quadrati
Tra tutte le rette possibili, si sceglie quella che rende minima la somma dei quadrati dei residui, dove il residuo di un punto è la differenza tra il valore osservato e quello previsto dalla retta. Le formule risultanti sono semplici:
- b = Σ (x − x̄)(y − ȳ) / Σ (x − x̄)²
- a = ȳ − b · x̄
La retta passa sempre per il punto medio (x̄, ȳ).
Un esempio calcolato a mano
Misuriamo il carico della CPU con diversi numeri di utenti, espressi in centinaia:
| Utenti (centinaia) | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| CPU (%) | 22 | 30 | 41 | 48 | 59 |
Le medie sono x̄ = 3 e ȳ = 40.
- Numeratore: (−2)(−18) + (−1)(−10) + 0 · 1 + 1 · 8 + 2 · 19 = 36 + 10 + 0 + 8 + 38 = 92.
- Denominatore: 4 + 1 + 0 + 1 + 4 = 10.
- Pendenza: b = 92 / 10 = 9,2.
- Intercetta: a = 40 − 9,2 · 3 = 12,4.
La retta è CPU = 12,4 + 9,2 · utenti. Ogni cento utenti in più aggiungono in media circa 9,2 punti percentuali di carico. L'intercetta di 12,4 si può leggere come il carico di base del sistema senza utenti, ma solo se il modello resta valido fino a zero, cosa da verificare.
Quanto spiega la retta: R²
Il coefficiente di determinazione R² confronta la variabilità residua con quella totale:
R² = 1 − Σ residui² / Σ (y − ȳ)²
Nell'esempio i valori previsti sono 21,6; 30,8; 40; 49,2; 58,4, e i residui 0,4; −0,8; 1; −1,2; 0,6. La somma dei loro quadrati è 3,6, mentre la variabilità totale è 850. Quindi R² ≈ 1 − 3,6/850 ≈ 0,996. La retta descrive quasi perfettamente questi dati.
Nella regressione semplice R² coincide con il quadrato del coefficiente di correlazione di Pearson. Un R² alto, però, non garantisce che il modello sia corretto, e un R² basso non significa che la relazione sia inutile: anche un effetto piccolo ma stabile può essere importante.
Leggere i residui
I residui sono la parte più informativa di una regressione. Un grafico dei residui contro i valori previsti dovrebbe mostrare una nuvola senza forma, centrata sullo zero. Alcuni schemi segnalano problemi:
- una curva: la relazione non è lineare, e serve una trasformazione o un modello diverso;
- un ventaglio che si allarga: la variabilità cresce con x, e gli intervalli di confidenza standard non sono affidabili;
- punti isolati molto lontani: valori anomali che possono spostare la retta;
- andamenti nel tempo: se i dati sono raccolti in sequenza, residui correlati indicano che le osservazioni non sono indipendenti.
Le ipotesi del modello
Per usare la regressione non solo come descrizione ma anche per fare inferenza, cioè intervalli di confidenza e test sulla pendenza, servono alcune ipotesi:
- linearità della relazione media;
- indipendenza delle osservazioni;
- varianza costante degli errori;
- errori approssimativamente normali, importante soprattutto con campioni piccoli.
Il pericolo dell'estrapolazione
La retta è stata stimata tra 100 e 500 utenti. Usarla per 1.000 utenti darebbe un carico previsto di 12,4 + 9,2 · 10 = 104,4%, un valore impossibile. Nella realtà, avvicinandosi alla saturazione, il comportamento cambia: code, rallentamenti, errori. Un modello vale solo nell'intervallo dei dati su cui è stato costruito, e fuori da quell'intervallo può sbagliare anche di molto.
Con Python
import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([22, 30, 41, 48, 59])
b, a = np.polyfit(x, y, 1)
residui = y - (a + b * x)
r2 = 1 - (residui ** 2).sum() / ((y - y.mean()) ** 2).sum()
print(a, b, r2)
Per intervalli di confidenza, test e diagnostica completa conviene usare librerie dedicate come statsmodels.
Regressione non vuol dire causalità
Una pendenza stimata dice come varia y in media al variare di x nei dati osservati. Non dice che modificando x si otterrà quella variazione di y. Se x e y dipendono entrambe da un terzo fattore, la regressione riproduce fedelmente l'associazione, ma non l'effetto di un intervento.
In sintesi
- La regressione lineare descrive la relazione media tra due grandezze con una retta.
- I minimi quadrati scelgono la retta che minimizza la somma dei quadrati dei residui.
- R² misura la quota di variabilità spiegata, ma non garantisce la correttezza del modello.
- Il grafico dei residui rivela non linearità, varianza non costante e valori anomali.
- Il modello vale solo nell'intervallo dei dati e non dimostra da solo un nesso causale.