كيفية حساب المسافة mahalanobis في بايثون
مسافة Mahalanobis هي المسافة بين نقطتين في مساحة متعددة المتغيرات. وغالبا ما يستخدم للكشف عن القيم المتطرفة في التحليلات الإحصائية التي تنطوي على متغيرات متعددة.
يشرح هذا البرنامج التعليمي كيفية حساب مسافة Mahalanobis في بايثون.
مثال: مسافة ماهالانوبيس في بايثون
استخدم الخطوات التالية لحساب مسافة Mahalanobis لكل ملاحظة في مجموعة بيانات في 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 التي تتوافق مع إحصائية مربع كاي لمسافة Mahalanobis مع درجات حرية k-1، حيث 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.
اعتمادًا على سياق المشكلة، قد تقرر إزالة هذه الملاحظة من مجموعة البيانات لأنها تمثل قيمة متطرفة ويمكن أن تؤثر على نتائج التحليل.