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.

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *