Der Mahalanobis-Abstand ist der Abstand zwischen zwei Punkten in einem multivariaten Raum. Es wird häufig verwendet, um Ausreißer in statistischen Analysen zu finden, die mehrere Variablen umfassen.

In diesem Tutorial wird erklärt, wie die Mahalanobis-Entfernung in Python berechnet wird.

Beispiel: Mahalanobis-Entfernung in Python

Verwenden Sie die folgenden Schritte, um die Mahalanobis-Entfernung für jede Beobachtung in einem Datensatz in Python zu berechnen.

Schritt 1: Erstellen Sie den Datensatz.

Zunächst erstellen wir einen Datensatz, in dem die Prüfungsergebnisse von 20 Studenten zusammen mit der Anzahl der Stunden, die sie verbracht haben, der Anzahl der Vorbereitungsprüfungen und der aktuellen Note im Kurs angezeigt werden:

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

Schritt 2: Berechnen Sie die Mahalanobis-Entfernung für jede Beobachtung.

Als nächstes werden wir eine kurze Funktion schreiben, um die Mahalanobis-Entfernung zu berechnen.

#create Funktion zur Berechnung der Mahalanobis-Entfernung
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()

#Erstellen Sie eine neue Spalte im Dataframe, die den Mahalanobis-Abstand für jede Zeile enthält
df['mahalanobis'] = mahalanobis(x=df, data=df[['score', 'hours', 'prep', 'grade']])

#Die ersten fünf Zeilen des Dataframes anzeigen
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

Schritt 3: Berechnen Sie den p-Wert für jede Mahalanobis-Entfernung.

Wir können sehen, dass einige der Mahalanobis-Entfernungen viel größer sind als andere. Um festzustellen, ob einer der Abstände statistisch signifikant ist, müssen wir ihre p-Werte berechnen.

Der p-Wert für jede Entfernung wird als der p-Wert berechnet, der der Chi-Quadrat-Statistik der Mahalanobis-Entfernung mit k-1 Freiheitsgraden entspricht, wobei k = Anzahl der Variablen. In diesem Fall verwenden wir also einen Freiheitsgrad von 4-1 = 3.

from scipy.stats import chi2

# Berechnen Sie den p-Wert für jeden Mahalanobis-Abstand 
df['p'] = 1 - chi2.cdf(df['mahalanobis'], 3)

# p-Werte für die ersten fünf Zeilen im Dataframe anzeigen
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

In der Regel wird ein p-Wert von weniger als 0,001 als Ausreißer betrachtet. Wir können sehen, dass die erste Beobachtung ein Ausreißer im Datensatz ist, da sie einen p-Wert von weniger als 0,001 hat.

Abhängig vom Kontext des Problems können Sie diese Beobachtung aus dem Datensatz entfernen, da es sich um einen Ausreißer handelt, der die Ergebnisse der Analyse beeinflussen kann.

Statistik: Der Weg zur Datenanalyse

* Amazon Affiliate Link


Das könnte Sie auch interessieren: