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보다 작기 때문에 데이터세트에서 이상값이라는 것을 알 수 있습니다.
문제의 맥락에 따라 이 관찰은 이상치이고 분석 결과에 영향을 미칠 수 있으므로 데이터 세트에서 제거하기로 결정할 수 있습니다.