كيفية حساب المسافة 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.

اعتمادًا على سياق المشكلة، قد تقرر إزالة هذه الملاحظة من مجموعة البيانات لأنها تمثل قيمة متطرفة ويمكن أن تؤثر على نتائج التحليل.

Add a Comment

ایمئیل یایینلانمایاجاق ایسته‎نیله‎ن بوشلوقلار خاللانمیشدیر *