Python'da mahalanobis mesafesi nasıl hesaplanır?
Mahalanobis mesafesi çok değişkenli bir uzayda iki nokta arasındaki mesafedir. Birden fazla değişkeni içeren istatistiksel analizlerde aykırı değerleri tespit etmek için sıklıkla kullanılır.
Bu eğitimde Python’da Mahalanobis mesafesinin nasıl hesaplanacağı açıklanmaktadır.
Örnek: Python’da Mahalanobis Mesafesi
Python’da bir veri kümesindeki her gözlemin Mahalanobis mesafesini hesaplamak için aşağıdaki adımları kullanın.
Adım 1: Veri kümesini oluşturun.
İlk olarak 20 öğrencinin sınav puanlarını, ders çalışarak geçirdikleri saat sayısını, girdikleri uygulama sınav sayısını ve dersteki mevcut notlarını gösteren bir veri seti oluşturacağız:
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
Adım 2: Her gözlem için Mahalanobis mesafesini hesaplayın.
Daha sonra Mahalanobis mesafesini hesaplamak için kısa bir fonksiyon yazacağız.
#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
Adım 3: Her Mahalanobis mesafesi için p değerini hesaplayın.
Bazı Mahalanobis mesafelerinin diğerlerinden çok daha büyük olduğunu görebiliriz. Mesafelerden herhangi birinin istatistiksel olarak anlamlı olup olmadığını belirlemek için p değerlerini hesaplamamız gerekir.
Her mesafe için p değeri, k = değişken sayısı olmak üzere, k-1 serbestlik derecesine sahip Mahalanobis mesafesinin ki-kare istatistiğine karşılık gelen p değeri olarak hesaplanır. Bu durumda serbestlik derecesi 4-1 = 3’ü kullanacağız.
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
Genellikle 0,001’den küçük bir p değeri aykırı değer olarak kabul edilir. İlk gözlemin veri setinde bir aykırı değer olduğunu görebiliriz çünkü p değeri 0,001’den küçüktür.
Sorunun bağlamına bağlı olarak, aykırı bir değer olduğundan ve analiz sonuçlarını etkileyebileceğinden bu gözlemi veri kümesinden çıkarmaya karar verebilirsiniz.