Python でマハラノビス距離を計算する方法
マハラノビス距離は、多変量空間内の 2 点間の距離です。複数の変数を含む統計分析で外れ値を検出するためによく使用されます。
このチュートリアルでは、Python でマハラノビス距離を計算する方法を説明します。
例: Python のマハラノビス距離
Python でデータセット内の各観測値のマハラノビス距離を計算するには、次の手順を使用します。
ステップ 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: 各観測値のマハラノビス距離を計算します。
次に、マハラノビス距離を計算する短い関数を作成します。
#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: 各マハラノビス距離の p 値を計算します。
一部のマハラノビス距離が他のものよりもはるかに大きいことがわかります。いずれかの距離が統計的に有意であるかどうかを判断するには、その p 値を計算する必要があります。
各距離の p 値は、k-1 自由度のマハラノビス距離のカイ二乗統計量に対応する 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
一般に、 0.001 未満のp 値は外れ値とみなされます。最初の観測値は p 値が 0.001 未満であるため、データセット内の外れ値であることがわかります。
問題の状況に応じて、この観測値は外れ値であり、分析結果に影響を与える可能性があるため、データセットから削除することを決定する場合があります。