Comment calculer la distance de Mahalanobis en Python
La distance de Mahalanobis est la distance entre deux points dans un espace multivarié. Il est souvent utilisé pour détecter des valeurs aberrantes dans des analyses statistiques impliquant plusieurs variables.
Ce tutoriel explique comment calculer la distance Mahalanobis en Python.
Exemple : Distance de Mahalanobis en Python
Utilisez les étapes suivantes pour calculer la distance de Mahalanobis pour chaque observation dans un ensemble de données en Python.
Étape 1 : Créez l’ensemble de données.
Tout d’abord, nous allons créer un ensemble de données qui affiche les résultats à l’examen de 20 étudiants, ainsi que le nombre d’heures qu’ils ont passées à étudier, le nombre d’examens préparatoires qu’ils ont passés et leur note actuelle dans le cours :
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
Étape 2 : Calculez la distance de Mahalanobis pour chaque observation.
Ensuite, nous écrirons une courte fonction pour calculer la distance de 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
Étape 3 : Calculez la valeur p pour chaque distance de Mahalanobis.
Nous pouvons voir que certaines distances de Mahalanobis sont beaucoup plus grandes que d’autres. Pour déterminer si l’une des distances est statistiquement significative, nous devons calculer leurs valeurs p.
La valeur p pour chaque distance est calculée comme la valeur p qui correspond à la statistique du chi carré de la distance de Mahalanobis avec k-1 degrés de liberté, où k = nombre de variables. Donc, dans ce cas, nous utiliserons des degrés de liberté de 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
En règle générale, une valeur p inférieure à 0,001 est considérée comme une valeur aberrante. Nous pouvons voir que la première observation est une valeur aberrante dans l’ensemble de données car elle a une valeur p inférieure à 0,001.
En fonction du contexte du problème, vous pouvez décider de supprimer cette observation de l’ensemble de données car il s’agit d’une valeur aberrante et pourrait affecter les résultats de l’analyse.