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.

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *