วิธีการคำนวณระยะทาง mahalanobis ใน python


ระยะทางมหาลาโนบิส คือระยะห่างระหว่างจุดสองจุดในพื้นที่หลายตัวแปร มักใช้เพื่อตรวจจับค่าผิดปกติในการวิเคราะห์ทางสถิติที่เกี่ยวข้องกับตัวแปรหลายตัว

บทช่วยสอนนี้จะอธิบายวิธีคำนวณระยะทาง Mahalanobis ใน Python

ตัวอย่าง: ระยะทาง Mahalanobis ใน Python

ใช้ขั้นตอนต่อไปนี้เพื่อคำนวณระยะทาง 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 สำหรับแต่ละระยะทางคำนวณเป็นค่า p ที่สอดคล้องกับสถิติไคสแควร์ของระยะทางมหาลาโนบิสที่มีดีกรีอิสระ 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

คุณอาจตัดสินใจลบการสังเกตนี้ออกจากชุดข้อมูล ทั้งนี้ขึ้นอยู่กับบริบทของปัญหา เนื่องจากเป็นค่าผิดปกติและอาจส่งผลต่อผลการวิเคราะห์

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *