मुख्य सामग्री पर जाएँ

Python में अहम सांख्यिकी को आसान भाषा में समझें

Python में डेटा साइंस और मशीन लर्निंग के लिए आवश्यक बुनियादी सांख्यिकी के बारे में जानें।
· 15 मि॰ पढ़ें

AI के साथ खोजें

यदि आपके पास मशीन लर्निंग एल्गोरिद्म लागू करने का थोड़ा अनुभव है, तो आपने पाया होगा कि इसकी पूर्व-आवश्यकता के रूप में सांख्यिकी का ज्ञान अनिवार्य नहीं है।

फिर भी, कुछ सांख्यिकी जानना मशीन लर्निंग को तकनीकी और सहज, दोनों तरह से समझने में सहायक होता है। जब आप अपने परिणामों का वैधीकरण और उनकी व्याख्या करना शुरू करते हैं, तब अंततः सांख्यिकी की जरूरत पड़ती ही है। आखिरकार, जहां डेटा है, वहां सांख्यिकी है। जैसे गणित विज्ञान की भाषा है, वैसे ही सांख्यिकी डेटा साइंस और मशीन लर्निंग के लिए विशिष्ट भाषा है।

सांख्यिकी गणित का एक क्षेत्र है जिसमें बहुत-सी सिद्धांत और खोजें हैं। फिर भी, आज की मशीन लर्निंग को बनाने में इस क्षेत्र की कई अवधारणाएं, टूल, तकनीकें और संकेतन अपनाए गए हैं। आप विवरणात्मक (descriptive) सांख्यिकीय विधियों का उपयोग करके अवलोकनों को उपयोगी जानकारी में बदल सकते हैं जिसे आप समझ सकें और दूसरों के साथ साझा कर सकें। आप अनुमानात्मक (inferential) सांख्यिकीय तकनीकों का उपयोग करके छोटे सैंपल्स से पूरे डोमेन तक निष्कर्ष निकाल सकते हैं। आगे इस पोस्ट में, आप विवरणात्मक और अनुमानात्मक सांख्यिकी पढ़ेंगे। तो, चिंता न करें।

शुरू करने से पहले, आइए उन दस उदाहरणों से गुजरते हैं जहां किसी वास्तविक मशीन लर्निंग प्रोजेक्ट में सांख्यिकीय विधियों का उपयोग होता है:

  • समस्या का फ्रेमिंग: अन्वेषणात्मक डेटा विश्लेषण और डेटा माइनिंग का उपयोग आवश्यक।
  • डेटा की समझ: सार-सांख्यिकी और डेटा विज़ुअलाइज़ेशन का उपयोग आवश्यक।
  • डेटा सफाई: बाह्य मान (outlier) पहचान, इम्प्यूटेशन आदि का उपयोग आवश्यक।
  • डेटा चयन: डेटा सैंपलिंग और फीचर चयन विधियों का उपयोग आवश्यक।
  • डेटा तैयारी: डेटा ट्रांसफॉर्म, स्केलिंग, एनकोडिंग आदि का उपयोग आवश्यक।
  • मॉडल का मूल्यांकन: प्रायोगिक डिज़ाइन और रिसैंपलिंग विधियों की जरूरत।
  • मॉडल कॉन्फ़िगरेशन: सांख्यिकीय परिकल्पना परीक्षण और आकलन (estimation) सांख्यिकी का उपयोग आवश्यक।
  • मॉडल चयन: सांख्यिकीय परिकल्पना परीक्षण और आकलन सांख्यिकी का उपयोग आवश्यक।
  • मॉडल प्रस्तुति: आकलन सांख्यिकी, जैसे कॉन्फिडेंस इंटरवल्स, का उपयोग आवश्यक।
  • मॉडल भविष्यवाणियां: आकलन सांख्यिकी, जैसे प्रेडिक्शन इंटरवल्स, का उपयोग आवश्यक।

स्रोत: Statistical Methods for Machine Learning

क्या यह रोचक नहीं है?

यह पोस्ट आपको उन आवश्यक परंतु बुनियादी सांख्यिकी का मजबूत आधार देगी जो एक अच्छे मशीन लर्निंग प्रैक्टिशनर बनने के लिए जरूरी हैं।

इस पोस्ट में, आप पढ़ेंगे:

  • सांख्यिकी का परिचय और उसके प्रकार
  • डेटा तैयारी के लिए सांख्यिकी
  • मॉडल मूल्यांकन के लिए सांख्यिकी
  • गॉसियन और विवरणात्मक सांख्यिकी
  • चर सहसंबंध (variable correlation)
  • अपरामित (Non-parametric) सांख्यिकी

आपके पास कवर करने के लिए बहुत कुछ है, और सभी विषय समान रूप से महत्वपूर्ण हैं। चलिए शुरुआत करते हैं!

सांख्यिकी का परिचय और उसके प्रकार

आइए संक्षेप में समझते हैं कि सरल शब्दों में सांख्यिकी को कैसे परिभाषित करें।

सांख्यिकी गणित का एक उपक्षेत्र माना जाता है। यह डेटा के साथ काम करने और उस डेटा का उपयोग करके कई तरह के प्रश्नों के उत्तर देने की अनेक विधियों को संदर्भित करता है।

जब बात व्यावहारिक रूप से इस्तेमाल होने वाले सांख्यिकीय टूल्स की आती है, तो क्षेत्र को व्यापक रूप से दो समूहों में बांटना उपयोगी होता है: डेटा का सार प्रस्तुत करने के लिए विवरणात्मक सांख्यिकी, और डेटा के सैंपल्स से निष्कर्ष निकालने के लिए अनुमानात्मक सांख्यिकी (Statistics for Machine Learning (7-Day Mini-Course)).

  • विवरणात्मक सांख्यिकी: किसी अध्ययन में डेटा की आवश्यक विशेषताओं का वर्णन करने के लिए इस्तेमाल होती है। ये सैंपल और मापों के बारे में सरल सारांश देती है। साधारण ग्राफ़िक विश्लेषण के साथ, ये लगभग हर मात्रात्मक डेटा विश्लेषण की नींव बनाती हैं। नीचे दिया इन्फ़ोग्राफिक विवरणात्मक सांख्यिकी का अच्छा सार प्रस्तुत करता है:

Descriptive Statistics

स्रोत: IntellSpot

  • अनुमानात्मक सांख्यिकी: ऐसी विधियां जो डोमेन या जनसंख्या के गुणों को एक छोटे अवलोकनों के सेट (सैंपल) से परिमाणित करने में मदद करती हैं। नीचे एक इन्फ़ोग्राफिक है जो अनुमानात्मक सांख्यिकी को सुंदर ढंग से समझाता है:

    Inferential Statistics

स्रोत: Analytics Vidhya

अगले खंड में, आप डेटा तैयारी के लिए सांख्यिकी का उपयोग पढ़ेंगे।

डेटा तैयारी के लिए सांख्यिकी

आपके मशीन लर्निंग मॉडल के लिए ट्रेन और टेस्ट डेटा के विकास में सांख्यिकीय विधियों की आवश्यकता होती है।

इसमें निम्नलिखित तकनीकें शामिल हैं:

  • बाह्य मान (Outlier) पहचान
  • मिसिंग वैल्यू इम्प्यूटेशन
  • डेटा सैंपलिंग
  • डेटा स्केलिंग
  • वेरिएबल एनकोडिंग

डेटा वितरण, विवरणात्मक सांख्यिकी और डेटा विज़ुअलाइज़ेशन की बुनियादी समझ इन कार्यों के लिए उपयुक्त विधियों की पहचान करने में सहायक होती है।

आइए ऊपर दिए गए प्रत्येक बिंदु का संक्षेप में विश्लेषण करते हैं।

बाह्य मान (Outlier) पहचान:

पहले देखते हैं कि आउट्लायर क्या होता है।

आउट्लायर वह अवलोकन माना जाता है जो सैंपल में अन्य अवलोकनों से विचलित प्रतीत होता है। निम्नलिखित चित्र इस परिभाषा को और स्पष्ट करता है।

Outlier detection

स्रोत: MathWorks

ऊपर दिए चित्र के अनुसार आप डेटा में आउट्लायर देख सकते हैं।

कई मशीन लर्निंग एल्गोरिद्म इनपुट डेटा में एट्रिब्यूट मानों की रेंज और वितरण के प्रति संवेदनशील होते हैं। इनपुट डेटा में आउट्लायर ट्रेनिंग प्रक्रिया को विकृत कर सकते हैं, जिससे ट्रेनिंग समय बढ़ता है, मॉडल कम सटीक होते हैं और अंततः औसत से कम परिणाम मिलते हैं।

संभावित आउट्लायर की पहचान निम्न कारणों से महत्वपूर्ण है:

  • आउट्लायर यह संकेत कर सकता है कि डेटा खराब है। उदाहरण के लिए, डेटा गलत कोडित हो सकता है, या प्रयोग ठीक से नहीं चला। यदि यह निर्धारित किया जा सके कि आउट्लायर पॉइंट वास्तव में त्रुटिपूर्ण है, तो उसे विश्लेषण से हटा देना चाहिए। यदि उसे सुधारना संभव हो, तो वह भी एक विकल्प है।

  • कुछ मामलों में यह निर्धारित करना संभव नहीं होता कि आउट्लायर खराब डेटा पॉइंट है या नहीं। आउट्लायर यादृच्छिक भिन्नता के कारण हो सकते हैं या वैज्ञानिक रूप से रोचक किसी बात का संकेत दे सकते हैं। किसी भी स्थिति में, आप आम तौर पर आउट्लायर अवलोकन को बस हटा देना नहीं चाहेंगे। फिर भी, यदि डेटा में महत्वपूर्ण आउट्लायर हैं, तो आपको मजबूत (robust) सांख्यिकीय तकनीकों पर विचार करना पड़ सकता है।

तो, आउट्लायर अक्सर आपके प्रेडिक्टिव मॉडलों के लिए अच्छे नहीं होते (हालांकि, कभी-कभी इन्हें लाभ के रूप में भी इस्तेमाल किया जा सकता है, पर यह इस पोस्ट के दायरे से बाहर है)। आउट्लायर को कुशलतापूर्वक संभालने के लिए आपको सांख्यिकीय समझ की आवश्यकता है।

मिसिंग वैल्यू इम्प्यूटेशन:

अधिकांश डेटासेट आजकल मिसिंग वैल्यू की समस्या से ग्रस्त होते हैं। यदि आपके द्वारा मॉडल को खिलाया जा रहा डेटा मिसिंग वैल्यू रखता है, तो आपका मशीन लर्निंग मॉडल प्रभावी रूप से प्रशिक्षित नहीं हो पाएगा। यहां सांख्यिकीय टूल और तकनीकें मदद में आती हैं।

कई लोग उन डेटा इंस्टेंस को त्याग देते हैं जिनमें मिसिंग वैल्यू होती है। पर यह अच्छी प्रैक्टिस नहीं है क्योंकि इस प्रक्रिया में आप डेटा की आवश्यक विशेषताएं/प्रतिनिधित्व खो सकते हैं। यद्यपि मिसिंग वैल्यू से निपटने के उन्नत तरीके मौजूद हैं, फिर भी ये तेज़ तकनीकें अक्सर अपनाई जाती हैं: Mean Imputation और Median Imputation।

यह समझना आवश्यक है कि मीन और मीडियन क्या होते हैं।

मान लीजिए, आपके पास एक फीचर X1 है जिसके मान हैं - 13, 18, 13, 14, 13, 16, 14, 21, 13

मीन सामान्य औसत होता है, तो मैं जोड़कर भाग दूंगा:

(13 + 18 + 13 + 14 + 13 + 16 + 14 + 21 + 13) / 9 = 15

ध्यान दें कि इस मामले में मीन मूल सूची का मान नहीं है। यह सामान्य बात है। आपको यह मानकर नहीं चलना चाहिए कि आपका मीन मूल संख्याओं में से कोई एक होगा।

मीडियन मध्य मान होता है, इसलिए पहले आपको सूची को संख्यात्मक क्रम में लिखना होगा:

13, 13, 13, 13, 14, 14, 16, 18, 21

सूची में नौ संख्याएं हैं, इसलिए मध्य वाला (9 + 1) / 2 = 10 / 2 = 5वां नंबर होगा:

13, 13, 13, 13, 14, 14, 16, 18, 21

तो मीडियन 14 है।

डेटा सैंपलिंग:

डेटा को लागू मशीन लर्निंग की मुद्रा माना जाता है। इसलिए, इसका संग्रह और उपयोग, दोनों समान रूप से महत्वपूर्ण हैं।

डेटा सैंपलिंग ऐसे सांख्यिकीय तरीकों को संदर्भित करता है जो डोमेन से अवलोकन चुनते हैं ताकि जनसंख्या पैरामीटर का आकलन किया जा सके। दूसरे शब्दों में, सैंपलिंग अवलोकन एकत्र करने की एक सक्रिय प्रक्रिया है जिसका उद्देश्य किसी जनसंख्या वेरिएबल का आकलन करना है।

डेटासेट की प्रत्येक पंक्ति एक अवलोकन का प्रतिनिधित्व करती है जो किसी विशेष जनसंख्या का संकेतक है। डेटा के साथ काम करते समय, अक्सर आपके पास सभी संभावित अवलोकनों की पहुंच नहीं होती। इसके कई कारण हो सकते हैं, जैसे:

  • अधिक अवलोकन करना कठिन या महंगा हो सकता है।
  • सभी अवलोकनों को एकत्रित करना चुनौतीपूर्ण हो सकता है।
  • भविष्य में और अवलोकन अपेक्षित हो सकते हैं।

अक्सर, आपके पास डेटा सैंपल्स का सही अनुपात नहीं होगा। इसलिए, समस्या के प्रकार के आधार पर आपको अंडर-सैंपलिंग या ओवर-सैंपलिंग करनी होगी।

जब किसी विशेष श्रेणी के लिए डेटा सैंपल्स अन्य की तुलना में बहुत अधिक होते हैं, तब आप अंडर-सैंपलिंग करते हैं, यानी जहां वे ज्यादा हैं वहां से कुछ सैंपल्स हटाते हैं। जब किसी विशेष श्रेणी के सैंपल्स अन्य की तुलना में बहुत कम होते हैं, तब आप ओवर-सैंपलिंग करते हैं। इस स्थिति में, आप सैंपल्स जनरेट करते हैं।

यह बहु-श्रेणी (multi-class) परिदृश्यों पर भी लागू होता है।

सांख्यिकीय सैंपलिंग एक बड़ा अध्ययन क्षेत्र है, लेकिन लागू मशीन लर्निंग में, आप आमतौर पर तीन प्रकार की सैंपलिंग का उपयोग कर सकते हैं: सरल रैंडम सैंपलिंग, व्यवस्थित (systematic) सैंपलिंग, और स्तरीकृत (stratified) सैंपलिंग।

  • Simple Random Sampling: सैंपल्स डोमेन से समान प्रायिकता के साथ लिए जाते हैं।
  • Systematic Sampling: सैंपल्स पूर्व-निर्धारित पैटर्न के अनुसार, जैसे अंतराल पर, लिए जाते हैं।
  • Stratified Sampling: सैंपल्स पूर्व-निर्धारित श्रेणियों (अर्थात् strata) के भीतर से लिए जाते हैं।

यद्यपि ये वे सामान्य प्रकार हैं जिनसे आप रूबरू होंगे, अन्य तकनीकें भी हैं (A Gentle Introduction to Statistical Sampling and Resampling).

डेटा स्केलिंग:

अक्सर आपके डेटासेट की विशेषताओं (features) की रेंज में बहुत अंतर हो सकता है। कुछ फीचर्स 0 से 100 की स्केल पर हो सकते हैं जबकि अन्य 0.01 - 0.001, 10000- 20000 आदि की रेंज में।

यह कुशल मॉडलिंग के लिए समस्याजनक है। क्योंकि निम्न मान-रेंज वाले फीचर में छोटी-सी परिवर्तनशीलता का उच्च रेंज वाले फीचर्स पर पर्याप्त प्रभाव नहीं पड़ता। यह अच्छे लर्निंग की प्रक्रिया को प्रभावित करता है। इस समस्या से निपटने को डेटा स्केलिंग कहते हैं।

डेटा स्केलिंग की विभिन्न तकनीकें हैं, जैसे Min-Max स्केलिंग, Absolute स्केलिंग, Standard स्केलिंग, आदि।

वेरिएबल एनकोडिंग:

कभी-कभी आपके डेटासेट्स में संख्यात्मक और गैर-संख्यात्मक डेटा का मिश्रण होता है। कई मशीन लर्निंग फ्रेमवर्क, जैसे scikit-learn, अपेक्षा करते हैं कि सारा डेटा संख्यात्मक प्रारूप में हो। यह गणना को भी तेज बनाता है।

यहां भी सांख्यिकी आपकी मदद को आती है।

Label encoding, One-Hot encoding जैसी तकनीकों का उपयोग गैर-संख्यात्मक डेटा को संख्यात्मक में बदलने के लिए किया जाता है।

अब तकनीकों को लागू करने का समय!

आपने अभी तक काफी थ्योरी कवर कर ली। अब इनमें से कुछ को लागू करके वास्तविक अनुभव लें।

आप कुछ सांख्यिकीय विधियों को लागू करके आउट्लायर का पता लगाना शुरू करेंगे।

आप आउट्लायर पहचानने के लिए Z-Score सूचकांक का उपयोग करेंगे, और इसके लिए Boston House Price dataset का अध्ययन करेंगे। आइए sklearn की यूटिलिटीज़ से डेटासेट इम्पोर्ट करके शुरू करें, और जैसे-जैसे आगे बढ़ेंगे, आवश्यक अवधारणाएं स्पष्ट होंगी।

import pandas as pd
import numpy as np
from sklearn.datasets import load_boston

# Load the Boston dataset into a variable called boston
boston = load_boston()
# Separate the features from the target
x = boston.data
y = boston.target

डेटासेट को सभी फीचर नामों के साथ मानक सारणीबद्ध प्रारूप में देखने के लिए, आप इसे pandas डेटा फ्रेम में बदलेंगे।

# Take the columns separately in a variable
columns = boston.feature_names

# Create the dataframe
boston_df = pd.DataFrame(boston.data)
boston_df.columns = columns
boston_df.head()
dataframe

आम तौर पर, एकवेरिकी (univariate) आउट्लायर विश्लेषण से शुरुआत करना अच्छा होता है जहां आप एक बार में केवल एक फीचर पर विचार करते हैं। अक्सर, किसी विशेष फीचर का एक साधारण बॉक्स-प्लॉट आपको अच्छा शुरुआती संकेत दे सकता है। आप seaborn से बॉक्स-प्लॉट बनाएंगे और DIS फीचर का उपयोग करेंगे।

import seaborn as sns
sns.boxplot(x=boston_df['DIS'])

import matplotlib.pyplot as plt
plt.show()
<matplotlib.axes._subplots.AxesSubplot at 0x8abded0>
plot

बॉक्स-प्लॉट देखने के लिए आपने matplotlib का दूसरा इम्पोर्ट किया क्योंकि seaborn के प्लॉट साधारण matplotlib प्लॉट की तरह ही दिखाए जाते हैं।

ऊपर के प्लॉट में 10 से 12 के बीच तीन बिंदु दिखते हैं, ये आउट्लायर हैं क्योंकि ये अन्य अवलोकनों के बॉक्स में शामिल नहीं हैं। यहां आपने एकवेरिक आउट्लायर का विश्लेषण किया, यानी आउट्लायर जांचने के लिए केवल DIS फीचर का इस्तेमाल किया।

अब Z-Score पर आगे बढ़ते हैं।

"Z-स्कोर वह साइन किए हुए मानक विचलनों की संख्या है जितना कोई अवलोकन या डेटा बिंदु, देखे/मापे जा रहे समूह के औसत से ऊपर होता है।" - Wikipedia

Z-स्कोर के पीछे विचार यह है कि किसी भी डेटा बिंदु को उस समूह के Mean और Standard Deviation के संदर्भ में वर्णित किया जाए। Z-स्कोर डेटा के उस वितरण को खोजने के बारे में है जहां मीन 0 और मानक विचलन 1 होता है, अर्थात् नार्मल डिस्ट्रीब्यूशन।

रुकिए! यह आउट्लायर पहचानने में कैसे मदद करता है?

जब आप Z-स्कोर की गणना करते हैं तो आप डेटा को री-स्केल और सेंटर करते हैं (मीन 0 और मानक विचलन 1) और उन इंस्टेंस पर नज़र रखते हैं जो शून्य से बहुत दूर हैं। जो डेटा पॉइंट शून्य से बहुत दूर होते हैं उन्हें आउट्लायर माना जाता है। सामान्य मामलों में 3 या -3 की दहलीज (थ्रेशोल्ड) उपयोग होती है। उदाहरण के लिए, यदि Z-स्कोर का मान क्रमशः 3 से बड़ा या -3 से छोटा है, तो वह डेटा पॉइंट आउट्लायर माना जाएगा।

आप आउट्लायर पहचानने के लिए scipy लाइब्रेरी में परिभाषित Z-score फ़ंक्शन का उपयोग करेंगे।

from scipy import stats

z = np.abs(stats.zscore(boston_df))
print(z)
[[0.41771335 0.28482986 1.2879095  ... 1.45900038 0.44105193 1.0755623 ]
 [0.41526932 0.48772236 0.59338101 ... 0.30309415 0.44105193 0.49243937]
 [0.41527165 0.48772236 0.59338101 ... 0.30309415 0.39642699 1.2087274 ]
 ...
 [0.41137448 0.48772236 0.11573841 ... 1.17646583 0.44105193 0.98304761]
 [0.40568883 0.48772236 0.11573841 ... 1.17646583 0.4032249  0.86530163]
 [0.41292893 0.48772236 0.11573841 ... 1.17646583 0.44105193 0.66905833]]

सिर्फ ऊपर के आउटपुट को देखकर आउट्लायर पहचानना संभव नहीं। आप और समझदार हैं! आप खुद के लिए एक थ्रेशोल्ड परिभाषित करेंगे, और उस थ्रेशोल्ड को पार करने वाले आउट्लायर का पता लगाने के लिए सरल शर्त लगाएंगे।

threshold = 3
print(np.where(z > 3))
(array([ 55,  56,  57, 102, 141, 142, 152, 154, 155, 160, 162, 163, 199,
       200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 216, 218, 219,
       220, 221, 222, 225, 234, 236, 256, 257, 262, 269, 273, 274, 276,
       277, 282, 283, 283, 284, 347, 351, 352, 353, 353, 354, 355, 356,
       357, 358, 363, 364, 364, 365, 367, 369, 370, 372, 373, 374, 374,
       380, 398, 404, 405, 406, 410, 410, 411, 412, 412, 414, 414, 415,
       416, 418, 418, 419, 423, 424, 425, 426, 427, 427, 429, 431, 436,
       437, 438, 445, 450, 454, 455, 456, 457, 466], dtype=int32), array([ 1,  1,  1, 11, 12,  3,  3,  3,  3,  3,  3,  3,  1,  1,  1,  1,  1,
        1,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  5,  3,  3,  1,  5,
        5,  3,  3,  3,  3,  3,  3,  1,  3,  1,  1,  7,  7,  1,  7,  7,  7,
        3,  3,  3,  3,  3,  5,  5,  5,  3,  3,  3, 12,  5, 12,  0,  0,  0,
        0,  5,  0, 11, 11, 11, 12,  0, 12, 11, 11,  0, 11, 11, 11, 11, 11,
       11,  0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11],
      dtype=int32))

फिर भी आउटपुट भ्रमित करने वाला है! पहली ऐरे में रो नंबर हैं और दूसरी में उनके संबंधित कॉलम नंबर। उदाहरण के लिए, z[55][1] का Z-स्कोर 3 से अधिक है।

print(z[55][1])
3.375038763517309

तो, 55वीं रिकॉर्ड में ZN कॉलम पर आउट्लायर है। आप यहां से आगे बढ़ा सकते हैं।

आपने देखा कि कैसे Z-स्कोर का उपयोग कर और उसका थ्रेशोल्ड सेट कर, डेटा में संभावित आउट्लायर का पता लगाया जा सकता है। अब आप मिसिंग वैल्यू इम्प्यूटेशन करेंगे।

आप प्रसिद्ध Pima Indian Diabetes डेटासेट का उपयोग करेंगे जो मिसिंग वैल्यू के लिए जाना जाता है। आगे बढ़ने से पहले, आपको डेटासेट को अपने वर्कस्पेस में लोड करना होगा।

आप डेटासेट को data नामक DataFrame ऑब्जेक्ट में लोड करेंगे।

data = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv",header=None)
print(data.describe())
                0           1           2           3           4           5  \
count  768.000000  768.000000  768.000000  768.000000  768.000000  768.000000   
mean     3.845052  120.894531   69.105469   20.536458   79.799479   31.992578   
std      3.369578   31.972618   19.355807   15.952218  115.244002    7.884160   
min      0.000000    0.000000    0.000000    0.000000    0.000000    0.000000   
25%      1.000000   99.000000   62.000000    0.000000    0.000000   27.300000   
50%      3.000000  117.000000   72.000000   23.000000   30.500000   32.000000   
75%      6.000000  140.250000   80.000000   32.000000  127.250000   36.600000   
max     17.000000  199.000000  122.000000   99.000000  846.000000   67.100000   

                6           7           8  
count  768.000000  768.000000  768.000000  
mean     0.471876   33.240885    0.348958  
std      0.331329   11.760232    0.476951  
min      0.078000   21.000000    0.000000  
25%      0.243750   24.000000    0.000000  
50%      0.372500   29.000000    0.000000  
75%      0.626250   41.000000    1.000000  
max      2.420000   81.000000    1.000000  

आपने देखा होगा कि यहां कॉलम के नाम संख्यात्मक हैं। इसका कारण यह है कि आप पहले से प्रीप्रोसेस्ड डेटासेट का उपयोग कर रहे हैं। लेकिन चिंता न करें, नाम आप जल्द ही जान लेंगे।

यह डेटासेट मिसिंग वैल्यू के लिए जाना जाता है, लेकिन ऊपर दिए गए सांख्यिकीय सार से पहली नज़र में ऐसा लग सकता है कि डेटासेट में मिसिंग वैल्यू है ही नहीं। पर थोड़ा ध्यान से देखें, तो कुछ कॉलम ऐसे हैं जहां ज़ीरो मान पूरी तरह अवैध है। यही वे मान हैं जो वास्तव में मिसिंग हैं।

विशेष रूप से, नीचे दिए गए कॉलम में न्यूनतम मान शून्य है जो अवैध है:

  • Plasma glucose concentration
  • Diastolic blood pressure
  • Triceps skinfold thickness
  • 2-Hour serum insulin
  • Body mass index

इसे कच्चे डेटा को देखकर पुष्ट करते हैं, नीचे उदाहरण पहले 20 रो प्रिंट करता है।

data.head(20)
 012345678
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331
55116740025.60.201300
637850328831.00.248261
71011500035.30.134290
82197704554330.50.158531
9812596000.00.232541
104110920037.60.191300
1110168740038.00.537341
1210139800027.11.441570
131189602384630.10.398591
145166721917525.80.587511
15710000030.00.484321
160118844723045.80.551311
177107740029.60.254311
18110330388343.30.183330
19111570309634.60.529321

स्पष्ट है कि कॉलम 2, 3, 4 और 5 में 0 मान मौजूद हैं।

क्योंकि इस डेटासेट में मिसिंग वैल्यू के रूप में 0 इस्तेमाल हुए हैं, इसलिए केवल पारंपरिक उपायों से इसे संभालना पेचीदा हो सकता है। आइए उस दृष्टिकोण को संक्षेप में बताते हैं जिसे आप अपनाएंगे:

  • जिन कॉलमों को आपने पहले देखा, उनमें शून्यों की गिनती निकालें।
  • पिछले चरण से यह निर्धारित करें कि किन कॉलमों में सर्वाधिक शून्य हैं।
  • उन कॉलमों में शून्य मानों को NaN से बदलें।
  • देखें कि NaN सही ढंग से परिलक्षित हो रहे हैं या नहीं।
  • fillna() फ़ंक्शन को चयनित इम्प्यूटेशन रणनीति के साथ कॉल करें।
# Step 1: Get the count of zeros in each of the columns
print((data[[1,2,3,4,5]] == 0).sum())
1      5
2     35
3    227
4    374
5     11
dtype: int64

आप देख सकते हैं कि कॉलम 1, 2 और 5 में कुछ ही शून्य हैं, जबकि कॉलम 3 और 4 में बहुत अधिक, लगभग आधी रो हैं।

# Step -2: Mark zero values as missing or NaN
data[[1,2,3,4,5]] = data[[1,2,3,4,5]].replace(0, np.NaN)

# Count the number of NaN values in each column
print(data.isnull().sum())
0      0
1      5
2     35
3    227
4    374
5     11
6      0
7      0
8      0
dtype: int64

आइए इस समय यह सुनिश्चित कर लें कि आपका NaN प्रतिस्थापन सफल रहा है, पूरे डेटासेट पर एक नज़र डालकर:

# Step 4
data.head(20)
 012345678
06148.072.035.0NaN33.60.627501
1185.066.029.0NaN26.60.351310
28183.064.0NaNNaN23.30.672321
3189.066.023.094.028.10.167210
40137.040.035.0168.043.12.288331
55116.074.0NaNNaN25.60.201300
6378.050.032.088.031.00.248261
710115.0NaNNaNNaN35.30.134290
82197.070.045.0543.030.50.158531
98125.096.0NaNNaNNaN0.232541
104110.092.0NaNNaN37.60.191300
1110168.074.0NaNNaN38.00.537341
1210139.080.0NaNNaN27.11.441570
131189.060.023.0846.030.10.398591
145166.072.019.0175.025.80.587511
157100.0NaNNaNNaN30.00.484321
160118.084.047.0230.045.80.551311
177107.074.0NaNNaN29.60.254311
181103.030.038.083.043.30.183330
191115.070.030.096.034.60.529321

आप देख सकते हैं कि मिसिंग वैल्यू मार्क करना अपेक्षित रूप से काम कर गया।

अब तक आपने देखा कि डेटा मिसिंग होने पर आवश्यक प्रवृत्तियां कैसी होती हैं और सरल सांख्यिकीय उपायों से इसे कैसे संभाला जा सकता है। अब आप Mean Imputation का उपयोग करके मिसिंग वैल्यू भरेंगे, जिसमें संबंधित कॉलम के औसत से मिसिंग वैल्यू को बदला जाता है।

# Step 5: Call the fillna() function with the imputation strategy
data.fillna(data.mean(), inplace=True)

# Count the number of NaN values in each column to verify
print(data.isnull().sum())
0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0
8    0
dtype: int64

उत्तम!

यह DataCamp लेख डेटा प्रीप्रोसेसिंग चरण के रूप में डेटा स्केलिंग लागू करने में प्रभावी मार्गदर्शन देता है। जरूर देखें।

अब आप वेरिएबल एनकोडिंग करेंगे।

उससे पहले, आपको ऐसा डेटासेट चाहिए जिसमें वास्तव में गैर-संख्यात्मक डेटा हो। इसके लिए आप प्रसिद्ध Iris डेटासेट का उपयोग करेंगे।

# Load the dataset to a DataFrame object iris
iris = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",header=None)
# See first 20 rows of the dataset
iris.head(20)
 01234
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
55.43.91.70.4Iris-setosa
64.63.41.40.3Iris-setosa
75.03.41.50.2Iris-setosa
84.42.91.40.2Iris-setosa
94.93.11.50.1Iris-setosa
105.43.71.50.2Iris-setosa
114.83.41.60.2Iris-setosa
124.83.01.40.1Iris-setosa
134.33.01.10.1Iris-setosa
145.84.01.20.2Iris-setosa
155.74.41.50.4Iris-setosa
165.43.91.30.4Iris-setosa
175.13.51.40.3Iris-setosa
185.73.81.70.3Iris-setosa
195.13.81.50.3Iris-setosa

आप LabelEncoder का उपयोग करके स्ट्रिंग मानों को आसानी से पूर्णांक मानों में बदल सकते हैं। तीन क्लास मान (Iris-setosa, Iris-versicolor, Iris-virginica) को पूर्णांकों (0, 1, 2) में मैप किया जाता है।

इस मामले में, डेटासेट का चौथा कॉलम/फीचर गैर-संख्यात्मक मान रखता है। इसलिए आपको इसे अलग करना होगा।

# Convert the DataFrame to a NumPy array
iris = iris.values

# Separate
Y = iris[:,4]
# Label Encode string class values as integers
from sklearn.preprocessing import LabelEncoder

label_encoder = LabelEncoder()
label_encoder = label_encoder.fit(Y)
label_encoded_y = label_encoder.transform(Y)

अब, एक और क्षेत्र पढ़ते हैं जहां सांख्यिकी के प्राथमिक ज्ञान की आवश्यकता बहुत महत्वपूर्ण है।

मॉडल मूल्यांकन के लिए सांख्यिकी

आपने अपना मशीन लर्निंग मॉडल डिज़ाइन और विकसित कर लिया है। अब आप अपने मॉडल के प्रदर्शन का टेस्ट डेटा पर मूल्यांकन करना चाहते हैं। इस संदर्भ में, आप Precision, Recall, ROC, AUC, RMSE आदि जैसे विभिन्न सांख्यिकीय मेट्रिक्स की मदद लेते हैं। आप k-fold Cross-Validation जैसी कई डेटा रिसैंपलिंग तकनीकों की भी मदद लेते हैं।

सांख्यिकी का प्रभावी उपयोग इन कार्यों में किया जा सकता है:

यह ध्यान रखना महत्वपूर्ण है कि यहां परिकल्पना से तात्पर्य सीखे गए मॉडलों से है; यानी किसी डेटासेट पर लर्निंग एल्गोरिद्म चलाने के परिणाम। परिकल्पनाओं का मूल्यांकन और तुलना करना मतलब सीखे गए मॉडलों की तुलना करना है, जो मशीन लर्निंग एल्गोरिद्म के मूल्यांकन/तुलना से भिन्न है क्योंकि एल्गोरिद्म अलग-अलग सैंपल्स या अलग समस्याओं पर प्रशिक्षित हो सकते हैं।

अब गॉसियन और विवरणात्मक सांख्यिकी पढ़ते हैं।

गॉसियन और विवरणात्मक सांख्यिकी का परिचय

डेटा का एक सैंपल किसी व्यापक जनसंख्या का स्नैपशॉट भर होता है, जो किसी डोमेन से लिए जा सकने वाले या किसी प्रक्रिया द्वारा जनरेट किए जा सकने वाले संभावित अवलोकनों का समूह है।

रोचक रूप से, कई अवलोकन एक विशिष्ट पैटर्न या वितरण में फिट होते हैं जिसे सामान्य वितरण या औपचारिक रूप से गॉसियन वितरण कहा जाता है। यह वह घंटी-आकार (bell-shaped) वितरण है जिससे आप परिचित होंगे। निम्नलिखित चित्र एक गॉसियन वितरण दिखाता है:

gaussian graph

स्रोत: HyperPhysics

गॉसियन प्रक्रियाएं और गॉसियन वितरण अपने आप में बड़े उप-क्षेत्र हैं। लेकिन अब आप उन दो सबसे आवश्यक अवयवों का अध्ययन करेंगे जो सामान्य तौर पर गॉसियन वितरणों की दुनिया बनाते हैं।

गॉसियन वितरण से लिए गए किसी भी सैंपल डेटा को दो पैरामीटर से सारांशित किया जा सकता है:

  • Mean: वितरण में केंद्रीय प्रवृत्ति या सबसे संभावित मान (घंटी का शीर्ष)।
  • Variance: अवलोकनों का औसत अंतर जो वे वितरण के मीन से रखते हैं (फैलाव)।

Variance शब्द एक और महत्वपूर्ण पद को जन्म देता है, यानी Standard Deviation, जो बस वैरिएंस का वर्गमूल है।

मीन, वैरिएंस और स्टैंडर्ड डिविएशन को सीधे numpy की मदद से डेटा सैंपल्स से गणना किया जा सकता है।

आप पहले 50 के मीन और 5 के स्टैंडर्ड डिविएशन वाले गॉसियन वितरण से 100 यादृच्छिक संख्याओं का सैंपल जनरेट करेंगे। फिर आप सार-सांख्यिकी की गणना करेंगे।

सबसे पहले, सभी निर्भरताएं इम्पोर्ट करेंगे।

#  Dependencies
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import var
from numpy import std

इसके बाद, आप रैंडम नंबर जेनरेटर का सीड सेट करेंगे ताकि आपके परिणाम पुनरुत्पाद्य (reproducible) हों।

seed(1)
# Generate univariate observations
data = 5 * randn(10000) + 50
# Calculate statistics
print('Mean: %.3f' % mean(data))
print('Variance: %.3f' % var(data))
print('Standard Deviation: %.3f' % std(data))
Mean: 50.049
Variance: 24.939
Standard Deviation: 4.994

काफी करीब, है न?

अब अगले विषय पर चलते हैं।

वेरिएबल सहसंबंध

आम तौर पर, किसी डेटासेट में शामिल फीचर्स आपस में संबंधित हो सकते हैं, जो व्यवहार में स्वाभाविक है। सांख्यिकीय भाषा में, आपके डेटासेट के फीचर्स के बीच इस संबंध (चाहे सरल हो या जटिल) को अक्सर correlation कहा जाता है।

किसी डेटासेट में फीचर्स के सहसंबंध की डिग्री जानना महत्वपूर्ण है। यह चरण मूलतः फीचर चयन का कार्य करता है, जिसका उद्देश्य किसी डेटासेट से सबसे महत्वपूर्ण फीचर्स चुनना है। यह मानक मशीन लर्निंग पाइपलाइन के सबसे महत्वपूर्ण चरणों में से एक है क्योंकि इससे कम समय में ही आपके एक्यूरेसी में उल्लेखनीय बढ़ोतरी हो सकती है।

बेहतर समझ और अधिक व्यावहारिक रखने के लिए, आइए समझते हैं कि फीचर्स आपस में क्यों संबंधित हो सकते हैं:

  • एक फीचर दूसरे फीचर का निर्धारक हो सकता है
  • एक फीचर किसी संयोजनात्मक डिग्री में दूसरे फीचर से संबद्ध हो सकता है
  • कई फीचर्स मिलकर किसी अन्य फीचर को जन्म दे सकते हैं

फीचर्स के बीच सहसंबंध तीन प्रकार का हो सकता है: - सकारात्मक सहसंबंध जहां दोनों फीचर एक ही दिशा में बदलते हैं, तटस्थ सहसंबंध जब दोनों के परिवर्तन में कोई संबंध नहीं, नकारात्मक सहसंबंध जहां दोनों फीचर विपरीत दिशाओं में बदलते हैं।

सहसंबंध माप फिल्टर-आधारित फीचर चयन तकनीकों की नींव बनते हैं। यदि आप फीचर चयन के बारे में अधिक पढ़ना चाहते हैं, तो यह लेख देखें।

आप दो वेरिएबल्स के सैंपल्स के बीच संबंध को गणितीय रूप से Pearson’s correlation coefficient से माप सकते हैं, जिसे इस विधि के विकासकर्ता Karl Pearson के नाम पर रखा गया है।

आप pandas की corr() फ़ंक्शन में method पैरामीटर को pearson देकर Pearson का सहसंबंध स्कोर निकाल सकते हैं। आइए पहले इस्तेमाल किए गए Pima Indians Diabetes डेटासेट के फीचर्स के बीच सहसंबंध का अध्ययन करते हैं। आपका डेटा पहले से ठीक रूप में है।

# Data
data.head()
 012345678
06148.072.035.00000155.54822333.60.627501
1185.066.029.00000155.54822326.60.351310
28183.064.029.15342155.54822323.30.672321
3189.066.023.0000094.00000028.10.167210
40137.040.035.00000168.00000043.12.288331
# Create the matrix of correlation score between the features and the label
scoreTable = data.corr(method='pearson')
# Visulaize the matrix
data.corr(method='pearson').style.format("{:.2}").background_gradient(cmap=plt.get_cmap('coolwarm'), axis=1)
correlation

आप स्पष्ट रूप से डेटासेट के सभी फीचर्स और लेबल के बीच Pearson का सहसंबंध देख सकते हैं।

अगले खंड में, आप अपरामित सांख्यिकी पढ़ेंगे।

अपरामित (Non-parametric) सांख्यिकी

सांख्यिकी और सांख्यिकीय विधियों का बड़ा हिस्सा ऐसे डेटा को समर्पित है जहां वितरण ज्ञात होता है।

जब जनसंख्या पैरामीटर्स के बारे में कम या कोई सूचना नहीं होती, तब अपरामित सांख्यिकी काम आती है। अपरामित परीक्षण डेटा के वितरण के बारे में कोई मान्यताएं नहीं लगाते।

जहां आप नॉन-पैरामेट्रिक डेटा के साथ काम कर रहे हों, वहां विशिष्ट नॉन-पैरामेट्रिक सांख्यिकीय विधियां इस्तेमाल की जा सकती हैं जो वितरण के बारे में सभी जानकारी त्याग देती हैं। इसलिए इन्हें अक्सर distribution-free विधियां कहा जाता है।

पर किसी नॉन-पैरामेट्रिक सांख्यिकीय विधि को लागू करने से पहले, डेटा को रैंक प्रारूप में बदला जाना चाहिए। जो विधियां रैंक प्रारूप में डेटा की अपेक्षा करती हैं, उन्हें कभी-कभी rank statistics कहा जाता है। रैंक सांख्यिकी के उदाहरण रैंक सहसंबंध और रैंक सांख्यिकीय परिकल्पना परीक्षण हो सकते हैं। रैंकिंग डेटा नाम से ही स्पष्ट है।

दो स्वतंत्र सैंपल्स के बीच भिन्नता की जांच करने के लिए व्यापक रूप से इस्तेमाल होने वाला अपरामित सांख्यिकीय परिकल्पना परीक्षण Mann-Whitney U test है, जिसका नाम Henry Mann और Donald Whitney के नाम पर है।

आप इस परीक्षण को Python में SciPy के दिए गए mannwhitneyu() के जरिए लागू करेंगे।

# The dependencies that you need
from scipy.stats import mannwhitneyu
from numpy.random import rand

# seed the random number generator
seed(1)
# Generate two independent samples
data1 = 50 + (rand(100) * 10)
data2 = 51 + (rand(100) * 10)
# Compare samples
stat, p = mannwhitneyu(data1, data2)
print('Statistics = %.3f, p = %.3f' % (stat, p))
# Interpret
alpha = 0.05
if p > alpha:
    print('Same distribution (fail to reject H0)')
else:
    print('Different distribution (reject H0)')
Statistics = 4077.000, p = 0.012
Different distribution (reject H0)

alpha वह थ्रेशोल्ड पैरामीटर है जिसे आप तय करते हैं। mannwhitneyu() दो चीजें लौटाता है:

  • statistic: Mann-Whitney U सांख्यिक, जो alternative None होने पर min(U for x, U for y) के बराबर होता है (डिप्रिकेटेड; बैकवर्ड कंपैटिबिलिटी हेतु), अन्यथा U for y।

  • pvalue: असिम्प्टोटिक नार्मल वितरण मानकर p-वैल्यू।

यदि आप अपरामित सांख्यिकी की अन्य विधियां पढ़ना चाहते हैं, तो यहां देखें।

अन्य दो लोकप्रिय अपरामित सांख्यिकीय महत्वपूर्णता परीक्षण जिन्हें आप उपयोग कर सकते हैं:

अब समापन का समय!

आप अंत तक पहुंच गए हैं। इस लेख में, आपने कई आवश्यक सांख्यिकीय अवधारणाएं पढ़ीं जो आपके मशीन लर्निंग प्रोजेक्ट्स में बहुत महत्वपूर्ण भूमिका निभाती हैं। इसलिए, उन्हें समझना उतना ही महत्वपूर्ण है।

सिर्फ एक परिचय से शुरू करके, आप सांख्यिकीय रैंकिंग तक गए, वह भी कई इम्प्लिमेंटेशंस के साथ। यह निश्चित रूप से एक उल्लेखनीय उपलब्धि है। आपने तीन अलग-अलग डेटासेट पढ़े, pandas और numpy की क्षमताओं का भरपूर उपयोग किया और साथ ही SciPy का भी इस्तेमाल किया। यदि आप आगे बढ़ना चाहते हैं, तो कुछ लिंक नीचे हैं:

इस ब्लॉग को लिखने में मैंने जिन संसाधनों की मदद ली, वे हैं:

कमेंट्स सेक्शन में अपने विचार/प्रश्न बताएं। साथ ही DataCamp का "Statistical Thinking in Python" कोर्स भी देखें, जो व्यावहारिक रूप से काफ़ी अनुकूल है।

विषय