Come calcolare la distanza di mahalanobis in python
La distanza di Mahalanobis è la distanza tra due punti in uno spazio multivariato. Viene spesso utilizzato per rilevare valori anomali nelle analisi statistiche che coinvolgono più variabili.
Questo tutorial spiega come calcolare la distanza Mahalanobis in Python.
Esempio: distanza Mahalanobis in Python
Utilizzare i passaggi seguenti per calcolare la distanza Mahalanobis per ciascuna osservazione in un set di dati in Python.
Passaggio 1: crea il set di dati.
Innanzitutto, creeremo un set di dati che mostra i punteggi degli esami di 20 studenti, insieme al numero di ore trascorse a studiare, il numero di esami pratici che hanno sostenuto e il loro voto attuale nel corso:
import numpy as np import pandas as pd import scipy as stats data = {'score': [91, 93, 72, 87, 86, 73, 68, 87, 78, 99, 95, 76, 84, 96, 76, 80, 83, 84, 73, 74], 'hours': [16, 6, 3, 1, 2, 3, 2, 5, 2, 5, 2, 3, 4, 3, 3, 3, 4, 3, 4, 4], 'prep': [3, 4, 0, 3, 4, 0, 1, 2, 1, 2, 3, 3, 3, 2, 2, 2, 3, 3, 2, 2], 'grade': [70, 88, 80, 83, 88, 84, 78, 94, 90, 93, 89, 82, 95, 94, 81, 93, 93, 90, 89, 89] } df = pd.DataFrame(data,columns=['score', 'hours', 'prep','grade']) df.head() score hours prep grade 0 91 16 3 70 1 93 6 4 88 2 72 3 0 80 3 87 1 3 83 4 86 2 4 88
Passaggio 2: calcolare la distanza di Mahalanobis per ciascuna osservazione.
Successivamente, scriveremo una breve funzione per calcolare la distanza di Mahalanobis.
#create function to calculate Mahalanobis distance def mahalanobis(x= None , data= None , cov= None ): x_mu = x - np.mean(data) if not cov: cov = np.cov(data.values.T) inv_covmat = np.linalg.inv(cov) left = np.dot(x_mu, inv_covmat) mahal = np.dot(left, x_mu.T) return mahal.diagonal() #create new column in dataframe that contains Mahalanobis distance for each row df['mahalanobis'] = mahalanobis(x=df, data=df[['score', 'hours', 'prep', 'grade']]) #display first five rows of dataframe df.head() score hours prep grade mahalanobis 0 91 16 3 70 16.501963 1 93 6 4 88 2.639286 2 72 3 0 80 4.850797 3 87 1 3 83 5.201261 4 86 2 4 88 3.828734
Passaggio 3: calcolare il valore p per ciascuna distanza Mahalanobis.
Possiamo vedere che alcune distanze di Mahalanobis sono molto più grandi di altre. Per determinare se qualcuna delle distanze è statisticamente significativa, dobbiamo calcolare i loro valori p.
Il valore p per ciascuna distanza viene calcolato come valore p che corrisponde alla statistica chi quadrato della distanza Mahalanobis con k-1 gradi di libertà, dove k = numero di variabili. Quindi in questo caso utilizzeremo i gradi di libertà 4-1 = 3.
from scipy.stats import chi2 #calculate p-value for each mahalanobis distance df['p'] = 1 - chi2.cdf(df['mahalanobis'], 3) #display p-values for first five rows in dataframe df.head() score hours prep grade mahalanobis p 0 91 16 3 70 16.501963 0.000895 1 93 6 4 88 2.639286 0.450644 2 72 3 0 80 4.850797 0.183054 3 87 1 3 83 5.201261 0.157639 4 86 2 4 88 3.828734 0.280562
Generalmente, un valore p inferiore a 0,001 è considerato un valore anomalo. Possiamo vedere che la prima osservazione è un valore anomalo nel set di dati perché ha un valore p inferiore a 0,001.
A seconda del contesto del problema, potresti decidere di rimuovere questa osservazione dal set di dati perché è un valore anomalo e potrebbe influenzare i risultati dell’analisi.