Una temperatura leggermente alta non significa necessariamente che una macchina stia per guastarsi. Una pressione leggermente superiore alla media, presa da sola, potrebbe essere perfettamente normale. Anche una vibrazione un po’ più elevata potrebbe non meritare alcun allarme.
Il problema cambia quando le tre cose accadono contemporaneamente.
Se temperatura, pressione e vibrazione sono legate tra loro, infatti, non basta più chiedersi quanto ogni variabile sia distante dalla propria media. Bisogna capire se la combinazione osservata è compatibile con il comportamento abituale del sistema.
È qui che la distanza di Mahalanobis diventa interessante.
La distanza euclidea guarda lo spazio dei dati come se tutte le direzioni fossero equivalenti. La Mahalanobis utilizza invece la struttura statistica della popolazione per modificare quella geometria: tiene conto della scala delle variabili e, soprattutto, delle loro correlazioni.
La formula è:
[math]\displaystyle \boxed{d_M(x,\mu)=\sqrt{(x-\mu)^T\Sigma^{-1}(x-\mu)}}[/math]
e il suo quadrato è:
[math]\displaystyle \boxed{d_M^2(x,\mu)=(x-\mu)^T\Sigma^{-1}(x-\mu)}[/math]
Questa seconda espressione è particolarmente interessante perché è una forma quadratica.
La matrice che compare nella forma quadratica non è scelta arbitrariamente: è l’inversa della matrice di covarianza.
Da qui nasce un collegamento molto elegante:
[math]\displaystyle \boxed{ \text{algebra lineare} \rightarrow \text{covarianza} \rightarrow \text{geometria} \rightarrow \text{statistica} \rightarrow \text{anomaly detection} }[/math]
L’obiettivo di questo articolo è seguire proprio questo percorso, fino ad arrivare a un’implementazione Python e a una domanda che nella Data Science è spesso più importante della formula stessa:
quando una distanza elevata deve davvero diventare un alert?
Dalla distanza euclidea alla distanza statistica
Supponiamo di avere un’osservazione descritta da [math]p[/math] variabili:
[math]\displaystyle x= \begin{pmatrix} x_1\\ x_2\\ \vdots\\ x_p \end{pmatrix} [/math]
e un vettore delle medie:
[math]\displaystyle \mu= \begin{pmatrix} \mu_1\\ \mu_2\\ \vdots\\ \mu_p \end{pmatrix}. [/math]
La differenza
[math]\displaystyle x-\mu[/math]
descrive quanto il punto si discosta dal centro della distribuzione.
Con la distanza euclidea, il quadrato della distanza sarebbe:
[math]\displaystyle d_E^2(x,\mu)=(x-\mu)^T(x-\mu).[/math]
In due dimensioni, questa è semplicemente la versione matriciale del teorema di Pitagora.
Il problema è che questa misura considera allo stesso modo tutte le direzioni.
Supponiamo, per esempio, di avere una variabile con una variabilità enorme e una seconda variabile molto stabile. Uno spostamento di 10 unità nella prima direzione potrebbe essere perfettamente normale, mentre uno spostamento di 10 unità nella seconda potrebbe essere eccezionale.
La distanza euclidea non lo sa.
La distanza di Mahalanobis introduce invece la matrice di covarianza:
[math]\displaystyle \Sigma= \begin{pmatrix} \sigma_1^2 & \sigma_{12}\\ \sigma_{21} & \sigma_2^2 \end{pmatrix}. [/math]
La formula diventa:
[math]\displaystyle \begin{aligned} d_M^2(x,\mu) &= (x-\mu)^T\Sigma^{-1}(x-\mu). \end{aligned}[/math]
La differenza rispetto alla distanza euclidea sembra concentrarsi in una sola matrice.
In realtà cambia la geometria dell’intero problema.
La covarianza contiene la geometria dei dati
La matrice di covarianza contiene due tipi di informazione.
Gli elementi sulla diagonale:
[math]\displaystyle \sigma_1^2,\sigma_2^2,\ldots,\sigma_p^2 [/math]
descrivono la variabilità delle singole variabili.
Gli elementi fuori diagonale:
[math]\displaystyle \sigma_{ij} [/math]
descrivono invece come le variabili tendono a muoversi insieme.
Se due variabili hanno covarianza positiva, valori elevati dell’una tendono ad associarsi a valori elevati dell’altra.
Se la covarianza è negativa, la relazione tende ad avere direzione opposta.
Questa informazione modifica la forma della nuvola dei dati.
Se rappresentiamo altezza e peso di una popolazione, per esempio, i punti potrebbero distribuirsi lungo una direzione inclinata anziché occupare uniformemente il piano.
La nuvola potrebbe avere una forma approssimativamente ellittica:
- lunga nella direzione in cui i dati sono molto variabili;
- stretta nella direzione in cui i dati sono poco variabili.
Ed è proprio questa forma che la distanza di Mahalanobis incorpora.
Nel caso gaussiano multivariato, le superfici a distanza di Mahalanobis costante sono ellissoidi. In due dimensioni diventano ellissi; in tre dimensioni ellissoidi; in dimensioni superiori non sono più facilmente visualizzabili, ma la struttura matematica rimane la stessa.
La correlazione può trasformare una distanza normale in un’anomalia
Consideriamo una situazione semplice in cui la relazione normale tra due variabili sia approssimativamente:
[math]\displaystyle y\approx x.[/math]
Prendiamo due punti:
[math]\displaystyle A=(10,10)[/math]
e
[math]\displaystyle B=(10,-10).[/math]
Rispetto all’origine, entrambi hanno la stessa distanza euclidea:
[math]\displaystyle d_E(A)=d_E(B)=\sqrt{10^2+10^2}. [/math]
Per la geometria euclidea, quindi, i due punti sono equivalenti.
Ma supponiamo che la popolazione reale sia fortemente concentrata intorno alla relazione [math]y\approx x[/math].
Il punto [math]A[/math] si trova lungo la direzione in cui i dati normalmente si muovono.
Il punto [math]B[/math] si trova invece nella direzione trasversale, dove la popolazione presenta poca variabilità.
La Mahalanobis attribuisce quindi ai due punti distanze statistiche molto diverse.
Questa è l’idea fondamentale:
una deviazione nella direzione in cui i dati sono naturalmente variabili può essere poco sorprendente, mentre una deviazione nella direzione in cui i dati sono molto stabili può essere fortemente anomala.
La correlazione, in questo modo, non è più un dettaglio descrittivo della matrice di covarianza. Diventa parte della definizione stessa di distanza.
Perché compare proprio l’inversa della covarianza?
La domanda è naturale.
Per capirlo, conviene partire dal caso più semplice.
In una dimensione, lo z-score è:
[math]\displaystyle z=\frac{x-\mu}{\sigma}. [/math]
Elevandolo al quadrato:
[math]\displaystyle z^2= \frac{(x-\mu)^2}{\sigma^2}. [/math]
Se la variabile ha una grande varianza, una certa deviazione dal valore medio è relativamente poco sorprendente.
Se la varianza è piccola, la stessa deviazione è molto più significativa.
Nel caso multivariato, il ruolo di [math]1/\sigma^2[/math] viene generalizzato dalla matrice:
[math]\displaystyle \Sigma^{-1}. [/math]
La distanza di Mahalanobis diventa quindi una sorta di z-score multivariato, con una differenza decisiva: non considera soltanto la scala delle singole variabili, ma anche le loro relazioni.
Se la matrice di covarianza fosse diagonale:
[math]\displaystyle \Sigma= \begin{pmatrix} \sigma_1^2 & 0 & \cdots & 0\\ 0 & \sigma_2^2 & \cdots & 0\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \cdots & \sigma_p^2 \end{pmatrix}, [/math]
allora:
[math]\displaystyle \begin{aligned} d_M^2 &= \sum_{i=1}^{p} \frac{(x_i-\mu_i)^2}{\sigma_i^2}. \end{aligned}[/math]
Definendo:
[math]\displaystyle z_i=\frac{x_i-\mu_i}{\sigma_i}, [/math]
otteniamo:
[math]\displaystyle \boxed{d_M^2=\sum_{i=1}^{p}z_i^2.}[/math]
Questo risultato è molto utile perché mostra con chiarezza il rapporto tra i due concetti.
Quando le variabili sono incorrelate, la Mahalanobis coincide con la somma dei quadrati degli z-score. Quando esiste correlazione, entra in gioco la struttura completa della covarianza.
La forma quadratica non è soltanto una notazione elegante
Una forma quadratica generale può essere scritta come:
[math]\displaystyle Q(x)=x^TAx. [/math]
Nel nostro caso:
[math]\displaystyle A=\Sigma^{-1}. [/math]
Centrando il punto rispetto alla media:
[math]\displaystyle \begin{aligned} Q(x-\mu) &= (x-\mu)^T\Sigma^{-1}(x-\mu). \end{aligned}[/math]
Quindi:
[math]\displaystyle \boxed{d_M^2=Q(x-\mu).} [/math]
Questa osservazione permette di leggere la Mahalanobis con gli strumenti dell’algebra lineare.
La matrice [math]\Sigma^{-1}[/math], chiamata anche matrice di precisione, determina quanto le diverse direzioni dello spazio contribuiscano alla distanza.
Non stiamo quindi semplicemente inserendo una matrice dentro una formula.
Stiamo definendo una nuova geometria dello spazio delle osservazioni.
La lettura più profonda: autovalori e autovettori
Qui l’algebra lineare permette di vedere cosa sta realmente accadendo.
Poiché la matrice di covarianza è simmetrica, nel caso regolare può essere diagonalizzata:
[math]\displaystyle \Sigma=Q\Lambda Q^T, [/math]
dove [math]Q[/math] contiene gli autovettori e [math]\Lambda[/math] contiene gli autovalori:
[math]\displaystyle \Lambda= \begin{pmatrix} \lambda_1 & 0 & \cdots & 0\\ 0 & \lambda_2 & \cdots & 0\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \cdots & \lambda_p \end{pmatrix}. [/math]
L’inversa è:
[math]\displaystyle \Sigma^{-1}=Q\Lambda^{-1}Q^T. [/math]
Sostituendo nella distanza:
[math]\displaystyle \begin{aligned} d_M^2 &= (x-\mu)^TQ\Lambda^{-1}Q^T(x-\mu). \end{aligned}[/math]
Definiamo:
[math]\displaystyle z=Q^T(x-\mu). [/math]
Stiamo semplicemente esprimendo la deviazione [math]x-\mu[/math] nelle nuove coordinate determinate dagli autovettori della covarianza.
Otteniamo:
[math]\displaystyle \begin{aligned} d_M^2 &= z^T\Lambda^{-1}z \end{aligned}[/math]
e quindi:
[math]\displaystyle \boxed{ d_M^2= \sum_{i=1}^{p} \frac{z_i^2}{\lambda_i} }. [/math]
Questa è forse la formula più importante per comprendere la geometria della Mahalanobis.
Ogni [math]\lambda_i[/math] rappresenta la variabilità lungo una particolare direzione principale.
Se [math]\lambda_i[/math] è grande, i dati sono molto dispersi lungo quella direzione. Una deviazione in quella direzione viene quindi penalizzata relativamente poco.
Se [math]\lambda_i[/math] è piccola, i dati sono molto concentrati. Una deviazione nella stessa direzione è molto più significativa.
In altre parole, la Mahalanobis:
- ruota il sistema di riferimento;
- individua le direzioni principali della variabilità;
- valuta la deviazione in quelle direzioni;
- pesa ogni deviazione in funzione della variabilità disponibile.
Le ellissi che vediamo nei grafici della Mahalanobis nascono esattamente da questo meccanismo.
Un esempio numerico: altezza e peso
Supponiamo di avere:
[math]\displaystyle \mu= \begin{pmatrix} 170\\ 70 \end{pmatrix} [/math]
dove le due componenti rappresentano altezza e peso.
Consideriamo:
[math]\displaystyle x= \begin{pmatrix} 180\\ 80 \end{pmatrix}. [/math]
La deviazione dal centro è:
[math]\displaystyle x-\mu= \begin{pmatrix} 10\\ 10 \end{pmatrix}. [/math]
Con la distanza euclidea:
[math]\displaystyle \begin{aligned} d_E &= \sqrt{10^2+10^2} \\ &= \sqrt{200} \\ &\approx14.14. \end{aligned}[/math]
Il valore 14.14, tuttavia, non ci dice se il punto sia statisticamente insolito.
Supponiamo che la covarianza sia:
[math]\displaystyle \Sigma= \begin{pmatrix} 100 & 72\\ 72 & 100 \end{pmatrix}. [/math]
La correlazione positiva indica che altezza e peso tendono a crescere insieme.
Calcoliamo la distanza di Mahalanobis:
import numpy as np
mu = np.array([170, 70])
x = np.array([180, 80])
Sigma = np.array([
[100, 72],
[72, 100]
])
diff = x - mu
Sigma_inv = np.linalg.inv(Sigma)
d2 = diff @ Sigma_inv @ diff
d = np.sqrt(d2)
print("Distanza di Mahalanobis^2:", d2)
print("Distanza di Mahalanobis:", d)
Output:
Distanza di Mahalanobis^2: 1.1627906976744182
Distanza di Mahalanobis: 1.078327732034384
La differenza rispetto alla distanza euclidea è enorme.
Non perché una delle due formule sia “giusta” e l’altra “sbagliata”, ma perché stanno rispondendo a domande differenti.
La distanza euclidea chiede:
Quanto sono lontani geometricamente questi due punti nello spazio delle coordinate originali?
La Mahalanobis chiede:
Quanto è grande questa deviazione rispetto alla variabilità e alle correlazioni che caratterizzano la popolazione?
Per un problema di anomaly detection, la seconda domanda è spesso quella più interessante.
La distanza di Mahalanobis definisce ellissi, non cerchi
Consideriamo l’insieme dei punti per cui:
[math]\displaystyle d_M^2(x,\mu)=c. [/math]
Otteniamo:
[math]\displaystyle (x-\mu)^T\Sigma^{-1}(x-\mu)=c. [/math]
In due dimensioni questa equazione descrive un’ellisse.
Con la distanza euclidea, invece:
[math]\displaystyle (x-\mu)^T(x-\mu)=c [/math]
descrive un cerchio.
Questa differenza geometrica riassume bene l’intero concetto.
Il cerchio tratta tutte le direzioni allo stesso modo.
L’ellisse si allunga nelle direzioni in cui i dati hanno maggiore variabilità e si restringe nelle direzioni in cui la variabilità è minore.
La Mahalanobis non “disegna semplicemente un’ellisse”: usa la forma della distribuzione per stabilire cosa significhi essere lontani dal centro.
Dalla geometria all’anomaly detection
A questo punto possiamo passare dal problema matematico a quello operativo.
Supponiamo di monitorare una macchina industriale attraverso tre sensori:
- temperatura;
- pressione;
- vibrazione.
Durante il funzionamento considerato normale raccogliamo migliaia di osservazioni.
Costruiamo un dataset simulato:
import numpy as np
import pandas as pd
np.random.seed(42)
mu = np.array([70, 100, 5])
Sigma = np.array([
[25, 12, 4],
[12, 36, 6],
[4, 6, 2]
])
X_normal = np.random.multivariate_normal(
mean=mu,
cov=Sigma,
size=1000
)
df = pd.DataFrame(
X_normal,
columns=["temperatura", "pressione", "vibrazione"]
)
print(df.head())
La funzione multivariate_normal genera osservazioni che rispettano la struttura di covarianza specificata.
Quindi non stiamo simulando tre sensori indipendenti: stiamo costruendo una popolazione nella quale esistono relazioni tra temperatura, pressione e vibrazione.
Questa distinzione è essenziale perché la Mahalanobis trae proprio dalla covarianza la propria informazione geometrica.
Inseriamo alcune osservazioni anomale
Aggiungiamo quattro osservazioni artificialmente costruite per rappresentare comportamenti sospetti:
anomalies = np.array([
[95, 140, 12],
[50, 60, 1],
[72, 145, 2],
[92, 90, 11]
])
X = np.vstack([X_normal, anomalies])
print("Numero di osservazioni:", len(X))
Il dataset contiene ora 1004 osservazioni.
Sappiamo che le ultime quattro sono state inserite artificialmente come anomalie.
Ma nella pratica il modello non dispone di questa informazione.
Deve stabilire quanto ogni osservazione sia distante dalla struttura considerata normale.
Calcolare la Mahalanobis con SciPy
Possiamo stimare media e covarianza utilizzando soltanto le osservazioni considerate normali:
from scipy.spatial.distance import mahalanobis
mu_est = X_normal.mean(axis=0)
cov_est = np.cov(X_normal, rowvar=False)
cov_inv = np.linalg.inv(cov_est)
distances = np.array([
mahalanobis(x, mu_est, cov_inv)
for x in X
])
print("Ultime quattro distanze:")
print(distances[-4:])
Otteniamo:
[ 7.50669165 7.98722486 13.39688705 8.07002117]
Le quattro osservazioni artificialmente anomale hanno quindi distanze molto elevate rispetto a molte delle osservazioni normali.
Ma qui arriva un passaggio metodologico importante.
Una distanza elevata non è ancora una decisione.
Serve una soglia.
Perché lavoriamo con il quadrato della distanza?
La quantità:
[math]\displaystyle d_M^2=(x-\mu)^T\Sigma^{-1}(x-\mu) [/math]
è particolarmente comoda perché, sotto l’ipotesi di una distribuzione normale multivariata con parametri della popolazione noti, segue una distribuzione chi-quadrato con [math]p[/math] gradi di libertà:
[math]\displaystyle d_M^2\sim\chi_p^2. [/math]
Questa relazione permette di collegare la distanza geometrica a una soglia statistica.
Nel nostro caso:
[math]\displaystyle p=3. [/math]
Per esempio, il quantile al 99% della distribuzione [math]\chi^2_3[/math] è circa:
[math]\displaystyle 11.345. [/math]
Possiamo calcolarlo con SciPy:
from scipy.stats import chi2
p = X_normal.shape[1]
threshold = chi2.ppf(0.99, df=p)
print("Soglia al 99%:", threshold)
e classificare come sospette le osservazioni per cui:
[math]\displaystyle d_M^2>\chi^2_{p,0.99}. [/math]
In Python:
d2 = distances ** 2
is_anomaly = d2 > threshold
print("Numero di osservazioni oltre la soglia:",
is_anomaly.sum())
Nel dataset simulato, però, la soglia al 99% non identifica soltanto le quattro osservazioni inserite artificialmente.
Questo è un risultato importante e va lasciato nel codice proprio perché racconta qualcosa di utile.
La soglia produce anche alcuni falsi positivi tra le osservazioni generate come normali.
Il motivo non è necessariamente un errore del calcolo.
Una soglia al 99% non significa infatti che il 99% delle osservazioni di un dataset finito sarà certamente sotto la soglia, né garantisce un tasso di falsi positivi esattamente pari all’1% quando i parametri sono stimati e il modello è applicato a dati reali.
La relazione con la [math]\chi^2[/math] deve essere interpretata alla luce delle ipotesi statistiche e del fatto che nel codice [math]\mu[/math] e [math]\Sigma[/math] non sono conosciuti: vengono stimati dai dati.
Questa distinzione è fondamentale.
[math]\Sigma[/math] vera e [math]\hat{\Sigma}[/math] stimata non sono la stessa cosa
Nel nostro esempio abbiamo inizialmente definito:
[math]\displaystyle \Sigma= \begin{pmatrix} 25 & 12 & 4\\ 12 & 36 & 6\\ 4 & 6 & 2 \end{pmatrix}. [/math]
Questa è la matrice utilizzata per generare artificialmente i dati.
Ma quando lavoriamo come analisti, normalmente non conosciamo la vera matrice di covarianza della popolazione.
La stimiamo:
cov_est = np.cov(X_normal, rowvar=False)
Quella che usiamo realmente nella formula è quindi:
[math]\displaystyle \hat{\Sigma}. [/math]
Analogamente, la vera media [math]\mu[/math] viene sostituita dalla media stimata:
[math]\displaystyle \hat{\mu}. [/math]
La statistica effettivamente calcolata diventa:
[math]\displaystyle \boxed{ \hat d_M^2= (x-\hat\mu)^T \hat\Sigma^{-1} (x-\hat\mu) }. [/math]
Questa distinzione è importante perché la relazione teorica con la [math]\chi^2[/math] è più semplice quando i parametri della distribuzione sono noti. Quando vengono stimati dallo stesso campione, la calibrazione della soglia richiede maggiore cautela.
In un’applicazione reale, quindi, non conviene trasformare automaticamente il quantile della [math]\chi^2[/math] in una verità assoluta.
È una soglia modellistica, non un timbro di certezza.
Detection, threshold e diagnosis sono tre problemi diversi
Questo è uno dei punti più importanti dell’intero metodo.
La detection consiste nel calcolare una misura di quanto un’osservazione sia distante dal comportamento di riferimento:
[math]\displaystyle d_M^2. [/math]
Il thresholding stabilisce quando quella distanza è abbastanza elevata da generare un alert.
La diagnosi cerca invece di capire perché l’osservazione sia anomala.
Sono tre problemi distinti.
| Domanda | Mahalanobis |
|---|---|
| Quanto è distante il punto dal comportamento di riferimento? | Sì |
| Tiene conto delle correlazioni? | Sì |
| Individua combinazioni insolite di variabili? | Sì |
| Stabilisce automaticamente la causa? | No |
| Dimostra che esiste un guasto? | No |
| Dimostra che esiste una frode? | No |
| Identifica automaticamente il sensore responsabile? | No |
| Richiede una stima della covarianza? | Sì |
| È sempre affidabile con dati non gaussiani? | No |
Questa distinzione evita un errore frequente nell’anomaly detection: confondere un segnale statistico con una diagnosi.
Se la Mahalanobis segnala un’osservazione, il sistema sta dicendo:
“Questa combinazione di valori è poco compatibile con la struttura di riferimento.”
Non sta dicendo:
“Il sensore 2 è guasto.”
E soprattutto non sta dicendo:
“La macchina si romperà.”
La seconda fase richiede altri strumenti e altre informazioni.
Un’anomalia può essere perfettamente valida
Un punto lontano dal comportamento abituale non è necessariamente un errore.
Potrebbe rappresentare:
- un guasto;
- un errore di acquisizione;
- una frode;
- un comportamento eccezionale ma corretto;
- un nuovo segmento di clienti;
- un cambiamento del processo;
- una situazione mai osservata prima;
- un cambiamento strutturale della popolazione.
Questa distinzione è importante soprattutto nei sistemi aziendali.
Un cliente che acquista dieci volte più del normale potrebbe essere un problema oppure il cliente migliore dell’anno.
Un pagamento molto diverso dal comportamento abituale potrebbe essere una frode oppure una grande operazione perfettamente legittima.
Il modello segnala la deviazione.
La decisione richiede contesto.
Mahalanobis e z-score: simili, ma non equivalenti
Il confronto con lo z-score aiuta a capire cosa aggiunga realmente la Mahalanobis.
Per ogni variabile possiamo calcolare:
[math]\displaystyle z_i= \frac{x_i-\mu_i}{\sigma_i}. [/math]
Lo z-score standardizza le singole variabili.
La Mahalanobis considera invece contemporaneamente:
[math]\displaystyle d_M^2= (x-\mu)^T\Sigma^{-1}(x-\mu). [/math]
La differenza diventa particolarmente importante quando le variabili sono correlate.
Supponiamo che due clienti abbiano:
- numero di ordini;
- valore medio degli ordini;
- numero di sessioni.
Un cliente potrebbe avere valori che non sono particolarmente estremi se osservati separatamente, ma una combinazione molto insolita.
Per esempio, molti ordini associati a pochissime sessioni potrebbe essere un comportamento raro se normalmente ordini e sessioni sono fortemente collegati.
Gli z-score univariati potrebbero non evidenziare nulla di particolare.
La Mahalanobis può invece segnalare la combinazione.
È proprio questo il vantaggio dell’approccio multivariato.
Un esempio ancora più intuitivo: il cliente che “non dovrebbe esistere”
Supponiamo che in un e-commerce il numero di ordini e il numero di sessioni siano fortemente correlati.
In generale:
[math]\displaystyle \text{più sessioni} \quad\Longrightarrow\quad \text{più ordini}. [/math]
Un cliente con 100 sessioni e 20 ordini potrebbe essere perfettamente normale.
Un cliente con 100 sessioni e 19 ordini potrebbe esserlo altrettanto.
Ma un cliente con 100 sessioni e 0 ordini potrebbe avere una combinazione molto meno frequente.
Nessuna delle due variabili deve necessariamente essere estrema.
Il punto anomalo nasce dalla relazione tra le variabili.
Questo è esattamente il tipo di situazione in cui la distanza di Mahalanobis è più interessante di una semplice serie di controlli univariati.
Visualizzare la geometria: cerchio contro ellisse
Quando si lavora con due variabili, una visualizzazione rende il concetto immediato.
Possiamo rappresentare:
- i dati normali;
- il centro [math]\mu[/math];
- una regione di Mahalanobis;
- i punti che superano una determinata soglia.
La regione di riferimento non sarà generalmente un cerchio.
Sarà un’ellisse orientata secondo la struttura di covarianza.
La sua forma racconta quindi qualcosa sui dati:
- l’orientamento riflette le correlazioni;
- la lunghezza degli assi riflette la variabilità;
- la distanza dal centro determina quanto un punto sia statisticamente lontano.
Per un articolo sulla Mahalanobis, questa visualizzazione è più di un semplice elemento grafico: è una rappresentazione della formula.
La forma quadratica che appare nell’equazione diventa letteralmente una forma geometrica.
Perché la matrice di covarianza può diventare un problema
La formula richiede:
[math]\displaystyle \Sigma^{-1}. [/math]
Per poter calcolare l’inversa, la matrice deve essere invertibile.
In applicazioni reali questo può diventare problematico quando:
- abbiamo molte variabili rispetto alle osservazioni;
- alcune variabili sono quasi linearmente dipendenti;
- alcune feature sono fortemente ridondanti;
- la matrice di covarianza è mal condizionata.
In questi casi una semplice inversione:
cov_inv = np.linalg.inv(cov_est)
può essere numericamente instabile.
Inoltre, la stima empirica della covarianza può essere molto sensibile alla presenza di outlier. Se gli stessi punti anomali che vogliamo trovare partecipano alla costruzione di [math]\hat\mu[/math] e [math]\hat\Sigma[/math], possono deformare il modello di riferimento. La documentazione di scikit-learn evidenzia proprio la sensibilità della covarianza empirica agli outlier e il ruolo degli stimatori robusti nella Mahalanobis.
È un problema concettualmente importante:
se gli anomali contribuiscono a definire la normalità, la normalità può finire per assomigliare troppo agli anomali.
Approfondimento: Shrinkage, quando la matrice di covarianza è troppo instabile
La distanza di Mahalanobis richiede l’inversione della matrice di covarianza.
È qui che può comparire un problema importante: la matrice stimata direttamente dai dati può essere instabile, soprattutto quando abbiamo poche
osservazioni rispetto al numero di variabili oppure quando alcune variabili sono molto correlate tra loro.
Lo shrinkage è una tecnica che rende la stima della matrice di covarianza più stabile. L’idea è semplice: invece di utilizzare completamente la matrice di covarianza campionaria, la spostiamo parzialmente verso una matrice più semplice e regolare.
dove:
- [math]\Sigma_{\text{campionaria}}[/math] è la matrice stimata dai dati;
- [math]T[/math] è una matrice obiettivo (target), più semplice e stabile;
- [math]\lambda[/math], con [math]0 \leq \lambda \leq 1[/math], controlla l’intensità dello shrinkage.
Se [math]\lambda=0[/math], utilizziamo completamente la matrice campionaria.
Se [math]\lambda=1[/math], utilizziamo invece soltanto la matrice target.
Nella pratica scegliamo un valore intermedio.
Un target molto comune è una matrice diagonale o una matrice proporzionale all’identità. In questo modo riduciamo l’influenza di correlazioni stimate
in modo poco affidabile.
Perché è utile per la distanza di Mahalanobis?
Supponiamo di avere 50 variabili ma soltanto 60 osservazioni. La matrice di covarianza campionaria viene stimata con pochissimi dati rispetto al numero di parametri necessari. Piccoli cambiamenti nel dataset possono produrre grandi cambiamenti nella sua inversa.
Poiché la distanza di Mahalanobis utilizza:
un’inversione numericamente instabile può produrre distanze poco affidabili o addirittura rendere impossibile il calcolo.
Lo shrinkage agisce quindi come una forma di regolarizzazione:
introduce una piccola semplificazione nella stima della covarianza in cambio di una maggiore stabilità.
Il compromesso è importante. Accettiamo una stima leggermente più distorta (bias) per ridurre la sua variabilità. Spesso, soprattutto con dataset
piccoli o ad alta dimensionalità, questo produce una stima complessivamente più affidabile.
Un modo intuitivo per interpretarlo
Immagina di voler capire la struttura del traffico di una città osservandola per un solo giorno. Potresti rilevare correlazioni molto forti tra alcune
strade semplicemente perché quel giorno c’è stato un evento particolare.
Lo shrinkage dice, in sostanza:
fidiamoci dei dati, ma non completamente quando abbiamo poche informazioni per stimare una struttura così complessa.
Nella pratica esistono stimatori automatici, come quelli di Ledoit-Wolf e OAS (Oracle Approximating Shrinkage), che scelgono l’intensità dello shrinkage in modo statistico.
Per la distanza di Mahalanobis, questo significa ottenere una matrice di covarianza generalmente più stabile, meglio condizionata e più sicura da utilizzare quando i dati sono pochi, numerosi in dimensione o caratterizzati da forte multicollinearità.
Shrinkage: quando la covarianza ha bisogno di stabilità
Una soluzione possibile consiste nell’utilizzare una stima regolarizzata della covarianza.
Uno degli approcci più noti è Ledoit-Wolf.
L’idea generale è combinare la covarianza empirica con una struttura più stabile, riducendo il rischio di ottenere una matrice mal condizionata.
Scikit-learn mette a disposizione direttamente LedoitWolf, che stima la covarianza con shrinkage e fornisce anche la matrice di precisione associata.
Possiamo quindi scrivere:
from sklearn.covariance import LedoitWolf
estimator = LedoitWolf()
estimator.fit(X_normal)
mu_est = estimator.location_
cov_est = estimator.covariance_
precision = estimator.precision_
d2 = np.array([
(x - mu_est) @ precision @ (x - mu_est)
for x in X
])
print("Prime cinque Mahalanobis^2:")
print(d2[:5])
Qui:
estimator.precision_
rappresenta direttamente la matrice di precisione, cioè l’inversa stimata e regolarizzata della covarianza. La classe LedoitWolf di scikit-learn espone esplicitamente location_, covariance_ e precision_ come risultati della stima.
Questo non significa che Ledoit-Wolf sia automaticamente la scelta migliore in ogni dataset.
Significa che, quando la covarianza empirica è instabile, possiamo trattare il problema della stima come parte integrante del modello di anomaly detection.
Covarianza robusta e shrinkage non risolvono lo stesso problema
È utile distinguere due situazioni.
Lo shrinkage mira soprattutto a ottenere una stima più stabile della covarianza, particolarmente utile in presenza di molte variabili o di problemi numerici.
Gli stimatori robusti, invece, cercano di ridurre l’influenza delle osservazioni anomale sulla stima stessa.
Sono problemi diversi.
Se il dataset contiene già una forte contaminazione da outlier, uno stimatore robusto della posizione e della covarianza può essere più appropriato rispetto alla semplice covarianza empirica. Scikit-learn propone, tra gli altri, MinCovDet proprio per la stima robusta della covarianza.
La scelta dello stimatore, quindi, non dovrebbe essere relegata a un dettaglio tecnico.
Fa parte della definizione di ciò che intendiamo per “comportamento normale”.
La Mahalanobis non è una bacchetta magica
La formula è compatta, ma le sue condizioni di utilizzo non lo sono.
La relazione con la distribuzione [math]\chi^2[/math] è particolarmente naturale quando il riferimento è una distribuzione normale multivariata e i parametri della popolazione sono noti. Nelle applicazioni reali, però, media e covarianza vengono normalmente stimate dai dati.
Inoltre, la Mahalanobis può diventare poco affidabile come misura unica quando la distribuzione è:
- fortemente asimmetrica;
- multimodale;
- caratterizzata da code pesanti;
- fortemente contaminata da outlier;
- composta da gruppi distinti.
Consideriamo, per esempio, una popolazione composta da due gruppi molto diversi.
La media globale potrebbe trovarsi in una zona in cui praticamente nessun individuo reale si trova.
In questo caso un singolo modello ellittico potrebbe descrivere male la struttura della popolazione.
Il problema non sarebbe nella formula.
Sarebbe nel modello di riferimento.
Un’altra questione: la soglia non è solo una questione matematica
Supponiamo di scegliere il 99%.
È una scelta statistica, ma anche operativa.
Se il sistema controlla un milione di transazioni, anche una piccola percentuale di falsi positivi può produrre moltissimi alert.
Se invece stiamo monitorando una macchina industriale il cui guasto costa centinaia di migliaia di euro, potrebbe essere ragionevole accettare più falsi allarmi pur di ridurre il rischio di perdere un’anomalia reale.
La soglia dovrebbe quindi essere collegata alla decisione.
Possiamo rappresentare il processo in questo modo:
[math]\displaystyle \boxed{ \text{distanza} \rightarrow \text{soglia} \rightarrow \text{alert} \rightarrow \text{diagnosi} \rightarrow \text{azione} }[/math]
La matematica determina la distanza.
La statistica aiuta a calibrare la soglia.
Il contesto aziendale determina quanto costa sbagliare nei due sensi.
Una pipeline Data Science più realistica
Una pipeline completa potrebbe quindi essere:
Dati grezzi
↓
Controllo qualità
↓
Selezione delle variabili
↓
Definizione del periodo di riferimento
↓
Stima di μ e Σ
↓
Eventuale robustezza / shrinkage
↓
Calcolo Mahalanobis²
↓
Calibrazione della soglia
↓
Flag anomalo
↓
Analisi diagnostica
↓
Decisione
↓
Monitoraggio nel tempo
La parte spesso trascurata è la definizione del periodo di riferimento.
Se il processo cambia nel tempo, la media e la covarianza storiche potrebbero non rappresentare più il comportamento attuale.
Un’anomalia statistica può quindi essere semplicemente un cambiamento di regime.
Questo è particolarmente importante nei sistemi industriali, nei dati commerciali e nei processi digitali, dove il comportamento normale può evolvere.
Un caso applicativo: predictive maintenance
Torniamo alla macchina industriale.
Supponiamo che il comportamento abituale sia caratterizzato da una relazione abbastanza stabile tra:
- temperatura;
- pressione;
- vibrazione.
Un giorno il sistema registra:
- temperatura leggermente superiore;
- pressione leggermente superiore;
- vibrazione leggermente superiore.
Se analizziamo ogni variabile separatamente, nessuna supera una soglia particolarmente preoccupante.
La Mahalanobis può però produrre una distanza elevata perché la combinazione dei tre valori è poco compatibile con la struttura abituale.
Questo può generare un alert.
L’alert non significa che il guasto sia certo.
Significa che vale la pena approfondire.
A quel punto possiamo utilizzare:
- trend temporali;
- diagnostica dei singoli sensori;
- modelli di classificazione;
- informazioni manutentive;
- log degli eventi;
- analisi delle cause;
- modelli di survival o predictive maintenance.
La Mahalanobis svolge quindi bene il ruolo di prima sentinella multivariata.
Un secondo caso: comportamento anomalo dei clienti
La stessa logica funziona in un contesto completamente diverso.
Supponiamo di descrivere ogni cliente attraverso:
- numero di ordini mensili;
- valore medio dell’ordine;
- numero di sessioni;
- tempo medio tra due acquisti.
Non ci interessa soltanto sapere se un cliente ha un numero di ordini molto elevato.
Potrebbe essere perfettamente normale per un cliente che visita frequentemente il sito.
Ci interessa sapere se la combinazione complessiva delle caratteristiche è compatibile con i comportamenti osservati nella popolazione.
La Mahalanobis può quindi essere utilizzata per individuare:
- clienti con pattern comportamentali insoliti;
- possibili anomalie operative;
- transazioni sospette;
- profili che meritano un controllo;
- cambiamenti nel comportamento della clientela.
Anche in questo caso, però, “anomalo” non significa automaticamente “fraudolento” o “sbagliato”.
Significa soltanto poco compatibile con il riferimento statistico scelto.
La vera differenza rispetto a un semplice controllo delle soglie
Immaginiamo un sistema con tre regole:
temperatura > soglia
pressione > soglia
vibrazione > soglia
Questa è una logica univariata.
Funziona bene quando le anomalie sono associate a valori estremi delle singole variabili.
Ma potrebbe non vedere un’anomalia come:
temperatura = leggermente alta
pressione = leggermente alta
vibrazione = leggermente alta
se nessuna delle tre supera individualmente la propria soglia.
La Mahalanobis aggiunge una domanda diversa:
Questa combinazione di valori è compatibile con il modo in cui le tre variabili normalmente si muovono insieme?
È una domanda più sofisticata, ma anche più vicina alla struttura reale di molti sistemi.
Rilevare un’anomalia non significa spiegare l’anomalia
Questo punto merita di essere ribadito perché è fondamentale nell’uso professionale.
La Mahalanobis fornisce un indice globale:
[math]\displaystyle d_M^2. [/math]
Ma un indice globale non identifica automaticamente il contributo delle singole variabili.
Un’osservazione potrebbe essere anomala perché:
- una variabile è estremamente distante;
- due variabili presentano una combinazione insolita;
- una relazione normalmente molto forte si è spezzata;
- il punto si trova in una direzione poco variabile della distribuzione.
Per questo, dopo il rilevamento, serve una fase diagnostica.
In un processo industriale potrebbe significare esaminare i sensori.
In fraud detection potrebbe significare analizzare la transazione e la storia del cliente.
Nel monitoraggio IT potrebbe significare osservare simultaneamente latenza, throughput, errori e carico.
La Mahalanobis dice:
“qui c’è qualcosa che merita attenzione.”
Non dice automaticamente:
“ecco perché è successo.”
Il problema degli outlier che contaminano la normalità
Supponiamo di avere un dataset che contiene già molti punti anomali.
Se calcoliamo:
mu_est = X.mean(axis=0)
cov_est = np.cov(X, rowvar=False)
gli stessi outlier partecipano alla definizione del centro e della forma della distribuzione.
Il centro può spostarsi.
La covarianza può aumentare.
L’ellisse di riferimento può allargarsi.
E alcuni punti che prima sembravano anomali possono diventare apparentemente normali.
È un paradosso importante:
il modello può diventare meno capace di riconoscere le anomalie proprio perché le anomalie hanno contribuito alla sua costruzione.
Per questo, in un’applicazione reale, bisogna ragionare attentamente su come definire il campione di riferimento.
Possiamo usare:
- un periodo storico ritenuto affidabile;
- dati validati dagli esperti;
- stime robuste;
- procedure iterative;
- campioni di training separati dai dati di monitoraggio.
Mahalanobis come ponte tra matematica e Data Science
A questo punto possiamo rileggere la formula iniziale con occhi diversi.
Partiamo da:
[math]\displaystyle d_M^2=(x-\mu)^T\Sigma^{-1}(x-\mu). [/math]
Il termine:
[math]\displaystyle x-\mu [/math]
ci dice dove si trova l’osservazione rispetto al centro.
La matrice:
[math]\displaystyle \Sigma [/math]
descrive la struttura della variabilità.
La matrice:
[math]\displaystyle \Sigma^{-1} [/math]
trasforma quella struttura in una misura di precisione.
Il prodotto finale costruisce una forma quadratica che assegna una distanza diversa alle diverse direzioni dello spazio.
Da qui deriva la geometria ellittica.
Dalla geometria deriva la possibilità di misurare quanto un punto sia lontano dalla struttura di riferimento.
E da quella misura possiamo costruire un sistema di anomaly detection.
La sequenza è:
[math]\displaystyle \boxed{ \text{forma quadratica} \rightarrow \text{matrice di covarianza} \rightarrow \text{geometria} \rightarrow \text{distanza statistica} \rightarrow \text{soglia} \rightarrow \text{alert} }[/math]
La lezione matematica
La distanza di Mahalanobis è interessante perché mostra concretamente come l’algebra lineare possa diventare uno strumento di analisi dei dati.
Partiamo da una forma quadratica:
[math]\displaystyle Q(x)=x^TAx. [/math]
Poniamo:
[math]\displaystyle A=\Sigma^{-1} [/math]
e centriamo il vettore rispetto alla media:
[math]\displaystyle x\rightarrow x-\mu. [/math]
Otteniamo:
[math]\displaystyle (x-\mu)^T\Sigma^{-1}(x-\mu). [/math]
Quella forma quadratica diventa una distanza statistica.
Quella distanza può diventare un indicatore di anomalia.
E l’indicatore può diventare il primo elemento di un processo decisionale.
È un percorso che parte da una matrice e arriva a una decisione:
[math]\displaystyle \boxed{ \text{Algebra lineare} \rightarrow \text{Covarianza} \rightarrow \text{Geometria} \rightarrow \text{Statistica} \rightarrow \text{Python} \rightarrow \text{Anomaly Detection} \rightarrow \text{Decisione} }[/math]
Ma c’è una conclusione ancora più importante.
Nei dati multivariati non basta chiedersi se una singola variabile sia alta, bassa, lontana dalla media o oltre una soglia.
Bisogna guardare come le variabili si muovono insieme.
Una combinazione di valori moderatamente insoliti può essere molto più significativa di un singolo valore estremo.
La distanza di Mahalanobis serve proprio a dare una misura quantitativa a questa idea.
Non stabilisce da sola che cosa sia successo.
Non sostituisce la diagnosi.
Non rende automaticamente corretta una soglia.
E non elimina i problemi legati alla qualità dei dati, alla distribuzione scelta o alla stima della covarianza.
Ma offre una cosa molto preziosa: una distanza costruita sulla geometria reale del dataset, invece che su uno spazio in cui tutte le direzioni vengono trattate allo stesso modo.
Ed è forse questa la lezione più generale che possiamo portare fuori dalla Mahalanobis:
[math]\displaystyle \boxed{ \text{nei dati multivariati, la distanza dipende dalla struttura del mondo che stiamo misurando.} }[/math]
Quando le variabili sono correlate, quella struttura non è un dettaglio statistico da mettere in una matrice e dimenticare.
È parte della distanza stessa.
📚 Covarianza, distanza di Mahalanobis e geometria dei dati
Se vuoi capire come la struttura delle relazioni tra variabili influenzi la geometria dei dati multivariati, questi approfondimenti collegano matrice di covarianza, distanza di Mahalanobis e forme quadratiche, con esempi applicativi e codice Python.
👉Matrice di covarianza: spiegazione, formule e 5 esercizi pratici risolti
👉Distanza di Mahalanobis in Python: guida pratica agli outlier multivariati
👉Forme bilineari e forme quadratiche in Data Science: teoria e codice Python





