Python에서 mahalanobis 거리를 계산하는 방법


마할라노비스 거리는 다변량 공간에서 두 점 사이의 거리입니다. 이는 여러 변수를 포함하는 통계 분석에서 이상값을 탐지하는 데 자주 사용됩니다.

이 튜토리얼에서는 Python에서 Mahalanobis 거리를 계산하는 방법을 설명합니다.

예: Python의 Mahalanobis 거리

Python의 데이터세트에 있는 각 관측값에 대한 Mahalanobis 거리를 계산하려면 다음 단계를 사용하세요.

1단계: 데이터세트를 만듭니다.

먼저, 20명의 학생의 시험 점수와 함께 공부한 시간, 치른 연습 시험 횟수, 코스의 현재 성적을 표시하는 데이터세트를 만듭니다.

 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

2단계: 각 관측값에 대한 Mahalanobis 거리를 계산합니다.

다음으로 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

3단계: 각 Mahalanobis 거리에 대한 p-값을 계산합니다.

일부 Mahalanobis 거리가 다른 거리보다 훨씬 더 크다는 것을 알 수 있습니다. 거리 중 통계적으로 유의미한 것이 있는지 확인하려면 해당 거리의 p-값을 계산해야 합니다.

각 거리에 대한 p-값은 k-1 자유도를 갖는 Mahalanobis 거리의 카이제곱 통계량에 해당하는 p-값으로 계산됩니다. 여기서 k = 변수 수입니다. 따라서 이 경우에는 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

일반적으로 p-값이 0.001보다 작으면 이상값으로 간주됩니다. 첫 번째 관측값은 p-값이 0.001보다 작기 때문에 데이터세트에서 이상값이라는 것을 알 수 있습니다.

문제의 맥락에 따라 이 관찰은 이상치이고 분석 결과에 영향을 미칠 수 있으므로 데이터 세트에서 제거하기로 결정할 수 있습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다