Immagina di osservare i dati clinici di un paziente: la pressione sistolica rientra nei limiti fisiologici e anche il livello di glicemia non desta particolari preoccupazioni. Eppure, il medico alza gli occhi dal referto corrugando la fronte. Presi singolarmente i due valori sono normali, ma trovarli esattamente in quella combinazione è un evento rarissimo, un campanello d’allarme.
Questo scenario riassume uno dei problemi più insidiosi della Data Preparation. Nella maggior parte dei dataset reali, gli outlier non si annunciano con valori estremi o impossibili. Si nascondono nelle pieghe delle correlazioni.
Se controlliamo ogni variabile in isolamento, tutto sembra in ordine. Ma i modelli statistici complessi, come la MANOVA o la Discriminant Analysis, leggono la struttura multidimensionale dei dati. Inserire queste “anomalie nascoste” nei nostri modelli significa inquinare le stime di covarianza e ottenere inferenze distorte.
Per scovarli, la classica distanza euclidea è praticamente inutile. Ci serve uno strumento in grado di leggere non solo quanto un dato è “lontano”, ma quanto è coerente con la geometria dell’intero dataset: la distanza di Mahalanobis.
In questo articolo vedremo matematicamente come funziona, perché sferizzare lo spazio risolve il problema e come implementare tutto in Python in modo robusto.
Perché la distanza euclidea non basta
Supponiamo di analizzare due variabili strettamente collegate tra loro, come l’altezza e il peso di un gruppo di persone.
Trattandosi di grandezze che naturalmente crescono insieme, le variabili sono fortemente correlate.
Se usassimo la classica distanza euclidea, ogni direzione dello spazio verrebbe trattata con lo stesso peso, assumendo un comportamento isotropo. Ma statisticamente non è così: muoversi lungo la direzione della correlazione è un evento perfettamente normale, mentre spostarsi in direzione perpendicolare può indicare un’anomalia. La distanza euclidea ignora completamente questa informazione.
L’idea intuitiva
Immaginiamo di rappresentare i dati su un piano cartesiano:
- Se le variabili sono indipendenti, la nuvola di punti assume una forma quasi circolare e la distanza euclidea funziona egregiamente.
- Quando le variabili sono correlate, la nuvola si deforma assumendo una forma ellittica.
Una misura di distanza corretta deve adattarsi a questa geometria. La distanza di Mahalanobis “deforma” lo spazio eliminando gli effetti della correlazione, riconducendo le ellissi a cerchi perfetti in cui poter misurare la distanza in modo statisticamente coerente.
La figura seguente sintetizza il principio geometrico alla base della distanza di Mahalanobis. Osservando l’evoluzione della distribuzione dei dati nei quattro pannelli è possibile capire perché la distanza euclidea diventa inadeguata quando le variabili sono correlate e come la trasformazione di whitening consenta di misurare le distanze in modo statisticamente corretto.

La figura illustra il percorso geometrico che porta dalla distanza euclidea alla distanza di Mahalanobis.
Nel primo pannello le variabili sono indipendenti: la nube di punti è pressoché circolare e le curve di isodistanza sono cerchi concentrici. In questo caso la distanza euclidea descrive correttamente la struttura dei dati.
Nel secondo pannello compare una forte correlazione tra le variabili. La distribuzione assume una forma ellittica e la distanza euclidea perde efficacia perché attribuisce la stessa importanza a tutte le direzioni dello spazio, ignorando la direzione naturale della variabilità.
Nel terzo pannello viene applicata la trasformazione di whitening, che elimina l’effetto della correlazione e della diversa scala delle variabili. L’ellisse viene trasformata in una nube circolare, nella quale la distanza euclidea coincide con la distanza di Mahalanobis.
Infine, nel quarto pannello, riportando il risultato nello spazio originale, le curve di uguale distanza tornano ad assumere forma ellittica. Le ellissi rappresentano le isodistanze di Mahalanobis e seguono fedelmente la struttura statistica del dataset. Le tre curve mostrate corrispondono ai principali livelli della distribuzione [math]\chi^2[/math] con due gradi di libertà ([math]68\%[/math], [math]95\%[/math] e [math]99\%[/math]), utilizzati nella pratica per individuare osservazioni progressivamente più improbabili e quindi potenziali outlier multivariati.
Anatomia geometrica: dalle variabili indipendenti alle ellissi di isodistanza
La struttura della distribuzione dei dati si sviluppa attraverso quattro passaggi logici fondamentali:
- Variabili indipendenti (Nuvola circolare): Con covarianza prossima a zero e varianza omogenea, le curve di isodistanza sono cerchi concentrici. Qui la distanza euclidea è pienamente efficace.
- Variabili correlate (L’apparizione dell’ellisse): La nube si allunga lungo la diagonale crescente. La distanza euclidea fallisce perché tratta tutte le direzioni allo stesso modo, ignorando la matrice di covarianza.
- Whitening (Sferizzazione): Modificando il sistema di riferimento tramite la covarianza, l’ellisse torna a essere un cerchio. Questo passaggio rappresenta l’essenza geometrica di Mahalanobis: applicare una distanza euclidea dopo aver corretto lo spazio per scala e correlazione.
- Ellissi di isodistanza originali: Nello spazio d’origine, le curve di livello tornano a essere ellissi. Spostarsi lungo l’asse maggiore (direzione di massima variabilità) produce un aumento lento della distanza, mentre muoversi lungo l’asse minore (direzione compressa) fa impennare rapidamente il valore della distanza anche per piccoli scostamenti.
Nota statistica:
I livelli di distanza quadratica ([math]D_M^2 \approx 2.30[/math], [math]6.18[/math], [math]11.83[/math]) derivano direttamente dalla distribuzione [math]\chi^2[/math] con due gradi di libertà, coprendo rispettivamente le soglie di confidenza tipiche della distribuzione normale bivariata.
Definizione matematica
Per un vettore osservazione [math]\mathbf{x} = (x_1, x_2, \dots, x_p)[/math], la distanza di Mahalanobis dalla media campionaria è definita come:
[math]\displaystyle D_M(\mathbf{x}) = \sqrt{(\mathbf{x} – \boldsymbol{\mu})^T \mathbf{S}^{-1} (\mathbf{x} – \boldsymbol{\mu})}[/math]
Dove:
- [math]\boldsymbol{\mu}[/math] è il vettore delle medie;
- [math]\mathbf{S}[/math] è la matrice di covarianza;
- [math]\mathbf{S}^{-1}[/math] è la sua matrice inversa.
Questa formulazione matematica unisce in un unico indicatore la varianza di ogni singola variabile e le correlazioni incrociate tra tutte le dimensioni del dataset.
👉 Matrice di Covarianza: Spiegazione, Formule e 5 Esercizi Pratici Risolti
Calcolo e implementazione in Python
Vediamo come mettere in pratica questi concetti analizzando un dataset di esempio e introducendo fin da subito le buone pratiche per la produzione.
1. Creazione del dataset e limite geometrico
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import numpy as np
import pandas as pd
from scipy.spatial.distance import mahalanobis
from scipy.stats import chi2
from sklearn.covariance import MinCovDet
# Creazione del dataset con un outlier evidente all'indice 6
df = pd.DataFrame(
{
"altezza": [170, 172, 168, 169, 171, 173, 250],
"peso": [68, 70, 66, 67, 69, 71, 180],
}
)
# Visualizzazione a dispersione
plt.figure(figsize=(7, 5))
plt.scatter(df["altezza"], df["peso"], s=100, color="blue", alpha=0.7)
for i, row in df.iterrows():
plt.text(row["altezza"] + 2, row["peso"] - 1, str(i), fontsize=12)
plt.xlabel("Altezza (cm)")
plt.ylabel("Peso (kg)")
plt.title("Distribuzione delle osservazioni")
plt.grid(True, linestyle="--", alpha=0.6)
plt.show()
2. Calcolo base con matrice di covarianza campionaria
features = ["altezza", "peso"]
mean = df[features].mean().values
cov = np.cov(df[features].values.astype(float).T)
inv_cov = np.linalg.inv(cov)
distanze = [mahalanobis(row, mean, inv_cov) for row in df[features].values]
df["Mahalanobis"] = distanze
3. Definizione della soglia statistica ([math]\chi^2[/math])
df["Mahalanobis2"] = df["Mahalanobis"] ** 2
# Gradi di libertà legati al numero effettivo di feature
p = len(features)
alpha = 0.975
soglia = chi2.ppf(alpha, df=p)
print(f"Soglia critica (p={p}, alpha={alpha}): {soglia:.2f}")
df["Outlier"] = df["Mahalanobis2"] > soglia
Soglia critica (p=2, alpha=0.975): 7.38
4. La versione robusta per la produzione (MinCovDet)
Nei contesti reali si incorre spesso nell’effetto di mascheramento: gli outlier stessi distorcono la stima della media e gonfiano la matrice di covarianza. Per ovviare a questo problema, utilizziamo l’estimatore Minimum Covariance Determinant fornito da Scikit-Learn.
def detect_mahalanobis_outliers_robust(data, alpha=0.975):
"""Identifica outlier multivariati utilizzando il Minimum Covariance Determinant."""
X = data.copy()
# Fit dello stimatore robusto
estimator = MinCovDet(random_state=42)
estimator.fit(X)
# Calcolo D_M^2 robusta
distances_sq = estimator.mahalanobis(X)
# Calcolo soglia statistica
threshold = chi2.ppf(alpha, X.shape[1])
# Costruzione del risultato
result = data.copy()
result["MD2_Robust"] = distances_sq
result["Outlier"] = distances_sq > threshold
return result
# Esecuzione sulla porzione numerica del dataset
df_pulito = df[["altezza", "peso"]]
risultati_robusti = detect_mahalanobis_outliers_robust(df_pulito)
display(risultati_robusti)
💡 Nota tecnica: Oltre MinCovDet, gli stimatori a Shrinkage (Ledoit-Wolf e OAS)
Quando ci si sposta su dataset ad alta dimensionalità (molte feature rispetto alle osservazioni), la covarianza empirica (EmpiricalCovariance) e persino il MinCovDet standard possono soffrire di instabilità numerica o sovradattamento. In questi scenari, le pipeline di Machine Learning moderne integrano stimatori di covarianza basati sullo shrinkage (restringimento) come LedoitWolf o OAS (Oracle Approximating Shrinkage) messi a disposizione da Scikit-Learn:
from sklearn.covariance import LedoitWolf
# Stima regolarizzata della covarianza per alta dimensionalità
lw = LedoitWolf().fit(X)
distanze_lw = lw.mahalanobis(X)
Utilizzare Ledoit-Wolf o OAS permette di regolarizzare la matrice di covarianza, migliorando drasticamente la stabilità dell’inversione matriciale ed evitando che il rumore dimensionale falsifichi il calcolo della distanza.
Perché questo esercizio è cruciale?
L’esempio proposto con il punto isolato [math][250\text{ cm}, 180\text{ kg}][/math] mette in luce due dinamiche centrali della Data Science applicata:
- Il superamento dell’isotropia: La distanza Euclidea fallisce perché valuta con la stessa severità variazioni dimensionali non equiparabili. Mahalanobis scala lo spazio in base alla reale interazione tra le feature.
- La gestione dell’effetto mascheramento: Utilizzare una covarianza classica significa lasciare che l’anomalia inquini il centro di gravità della distribuzione, rendendo l’outlier più difficile da sguaisare. L’adozione del
MinCovDetpermette di calcolare i parametri statistici sul “core” sicuro dei dati, facendo emergere l’anomalia con estrema chiarezza.
Limiti del metodo e best practice operative
Nonostante la sua potenza, la distanza di Mahalanobis presenta alcune criticità da tenere a mente:
- Dimensionalità elevata: Quando il numero di feature si avvicina al numero di osservazioni ([math]p \approx n[/math]), l’inversione della matrice di covarianza diventa numericamente instabile.
- Collinearità spinta: La presenza di variabili quasi perfettamente collineari rende la matrice mal condizionata. È consigliabile effettuare controlli preliminari tramite VIF o tecniche di riduzione della dimensionalità come la PCA.
Consiglio operativo: Prima di procedere alla rimozione automatica di un’osservazione etichettata come outlier, investiga sempre la sua natura. Un valore anomalo può rappresentare un errore di inserimento dati, un guasto sensoristico, oppure, ed è lo scenario più affascinante, un segnale rarissimo ma reale, come una frode o un comportamento eccezionale.
Conclusioni
La distanza di Mahalanobis costituisce un pilastro imprescindibile della statistica multivariata e della diagnostica preliminare dei dati. Integrando la struttura di covarianza tra le variabili, consente di superare i limiti geometrici della distanza euclidea e di intercettare anomalie invisibili a un’analisi univariata.
Inserire questo controllo all’interno della tua pipeline, specialmente a monte di tecniche come MANOVA, LDA o QDA, garantisce modelli più stabili, inferenze accurate e una qualità dei dati decisamente superiore.
📚Analisi multivariata, PCA e preparazione dei dati per il Machine Learning
Un modello di Machine Learning è affidabile solo quanto lo sono i dati su cui viene addestrato. Dalla pulizia del dataset all’individuazione degli outlier, passando per la riduzione della dimensionalità con la PCA e l’analisi multivariata tramite MANOVA, queste guide illustrano le principali tecniche utilizzate dai Data Scientist per estrarre informazioni significative e costruire modelli robusti con Python.
👉MANOVA in Python: analisi multivariata della varianza con esempi pratici
👉Esercizio MANOVA svolto: analisi multivariata su sentiment e rating delle app
👉PCA (Analisi delle Componenti Principali): guida completa con Python
👉Segmentazione clienti con Python: K-Means, PCA e t-SNE
👉Outlier: cosa sono, come trovarli e rimuoverli con Pandas (IQR e Z-Score)
👉Dataset di qualità: dalla raccolta dati alla pulizia per costruire una AI affidabile






