पायथन में महालनोबिस दूरी की गणना कैसे करें
महालनोबिस दूरी एक बहुभिन्नरूपी स्थान में दो बिंदुओं के बीच की दूरी है। इसका उपयोग अक्सर कई चर वाले सांख्यिकीय विश्लेषणों में आउटलेर्स का पता लगाने के लिए किया जाता है।
यह ट्यूटोरियल बताता है कि पायथन में महालनोबिस दूरी की गणना कैसे करें।
उदाहरण: पायथन में महालनोबिस दूरी
पायथन में डेटासेट में प्रत्येक अवलोकन के लिए महालनोबिस दूरी की गणना करने के लिए निम्नलिखित चरणों का उपयोग करें।
चरण 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: प्रत्येक महालनोबिस दूरी के लिए पी-मान की गणना करें।
हम देख सकते हैं कि कुछ महालनोबिस दूरियाँ दूसरों की तुलना में बहुत अधिक हैं। यह निर्धारित करने के लिए कि क्या कोई दूरी सांख्यिकीय रूप से महत्वपूर्ण है, हमें उनके पी-मानों की गणना करने की आवश्यकता है।
प्रत्येक दूरी के लिए पी-वैल्यू की गणना पी-वैल्यू के रूप में की जाती है जो कि के-1 डिग्री की स्वतंत्रता के साथ महालनोबिस दूरी के ची-स्क्वायर आंकड़े से मेल खाती है, जहां के = चर की संख्या। तो इस मामले में हम 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 से कम पी-वैल्यू को आउटलायर माना जाता है। हम देख सकते हैं कि पहला अवलोकन डेटासेट में एक बाहरी है क्योंकि इसका पी-मान 0.001 से कम है।
समस्या के संदर्भ के आधार पर, आप इस अवलोकन को डेटासेट से हटाने का निर्णय ले सकते हैं क्योंकि यह एक बाहरी चीज़ है और विश्लेषण परिणामों को प्रभावित कर सकता है।