Hoe mahalanobis-afstand in python te berekenen


De Mahalanobis-afstand is de afstand tussen twee punten in een multivariate ruimte. Het wordt vaak gebruikt om uitschieters te detecteren in statistische analyses waarbij meerdere variabelen betrokken zijn.

In deze tutorial wordt uitgelegd hoe u de Mahalanobis-afstand in Python kunt berekenen.

Voorbeeld: Mahalanobis-afstand in Python

Gebruik de volgende stappen om de Mahalanobis-afstand voor elke waarneming in een dataset in Python te berekenen.

Stap 1: Maak de gegevensset.

Eerst gaan we een dataset maken die de examenscores van 20 studenten weergeeft, samen met het aantal uren dat ze hebben gestudeerd, het aantal oefenexamens dat ze hebben afgelegd en hun huidige cijfer voor de cursus:

 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

Stap 2: Bereken de Mahalanobis-afstand voor elke waarneming.

Vervolgens zullen we een korte functie schrijven om de Mahalanobis-afstand te berekenen.

 #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

Stap 3: Bereken de p-waarde voor elke Mahalanobis-afstand.

We kunnen zien dat sommige Mahalanobis-afstanden veel groter zijn dan andere. Om te bepalen of een van de afstanden statistisch significant is, moeten we hun p-waarden berekenen.

De p-waarde voor elke afstand wordt berekend als de p-waarde die overeenkomt met de chi-kwadraatstatistiek van de Mahalanobis-afstand met k-1 vrijheidsgraden, waarbij k = aantal variabelen. In dit geval gebruiken we dus vrijheidsgraden van 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

Over het algemeen wordt een p-waarde kleiner dan 0,001 als een uitbijter beschouwd. We kunnen zien dat de eerste waarneming een uitbijter in de dataset is, omdat deze een p-waarde van minder dan 0,001 heeft.

Afhankelijk van de context van het probleem kunt u besluiten deze waarneming uit de dataset te verwijderen, omdat deze een uitschieter is en de analyseresultaten zou kunnen beïnvloeden.

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert