पाठ्यक्रम अंश: डेटा साइंस के लिए इंटरमीडिएट Python - Matplotlib
नीचे डेटा साइंस के लिए इंटरमीडिएट Python कोर्स के पहले अध्याय से वीडियो और लिप्यंतरण का अंश दिया गया है। इंटरैक्टिव अभ्यासों सहित पूरा अध्याय यहाँ उपलब्ध है।
matplotlib के साथ बेसिक प्लॉट्स
नमस्ते, मेरा नाम फिलिप है, और मैं DataCamp में डेटा साइंटिस्ट हूँ। इस इंटरमीडिएट Python कोर्स में, आप डेटा साइंस के लिए अपनी Python स्किल्स को और मजबूत करेंगे। आप सीखेंगे कि डेटा को कैसे विज़ुअलाइज़ करें और नए डेटा स्ट्रक्चर्स में डेटा कैसे स्टोर करें। इसी दौरान, आप कंट्रोल स्ट्रक्चर्स में महारत हासिल करेंगे, जिनकी ज़रूरत आपको अपनी स्क्रिप्ट्स और एल्गोरिदम्स के फ्लो को कस्टमाइज़ करने के लिए पड़ेगी। हम इस अध्याय का समापन एक केस स्टडी से करेंगे, जहाँ आप अब तक सीखी हुई सभी चीज़ों को मिलाकर एक दिलचस्प समस्या हल करेंगे।
यह पहला अध्याय डेटा विज़ुअलाइज़ेशन के बारे में है, जो डेटा विश्लेषण का बेहद महत्वपूर्ण भाग है। सबसे पहले, आप इसे अपने डेटासेट का अन्वेषण करने के लिए लगातार इस्तेमाल करेंगे। जितना बेहतर आप अपने डेटा को समझेंगे, उतनी ही बेहतर आप अंतर्दृष्टियाँ निकाल पाएँगे। और जब आप वे अंतर्दृष्टियाँ खोज लेंगे, तब भी आपको उन्हें दूसरों के साथ साझा करने के लिए विज़ुअलाइज़ेशन की आवश्यकता होगी। उदाहरण के लिए, इस खूबसूरत प्लॉट पर नज़र डालें।
इसे स्वीडिश प्रोफेसर हैंस रोसलिंग ने बनाया है। वैश्विक विकास पर उनके वार्तालाप को लाखों बार देखा गया है। जो बात उन्हें इतना रोचक बनाती है, वह यह है कि सुंदर प्लॉट्स बनाकर वे डेटा को अपनी कहानी खुद कहने देते हैं। यहाँ हम एक बबल चार्ट देखते हैं, जहाँ प्रत्येक बबल एक देश का प्रतिनिधित्व करता है। बबल जितना बड़ा, देश की जनसंख्या उतनी बड़ी; इसलिए यहाँ दो सबसे बड़े बबल चीन और भारत हैं।
यहाँ 2 अक्ष हैं। क्षैतिज अक्ष प्रति व्यक्ति GDP को अमेरिकी डॉलर में दिखाता है। ऊर्ध्वाधर अक्ष जीवन प्रत्याशा दिखाता है। हम साफ़ देखते हैं कि जिन देशों में प्रति व्यक्ति GDP अधिक है, वहाँ लोग अधिक समय तक जीवित रहते हैं। फिर भी, समान आय स्तर वाले देशों में जीवन प्रत्याशा में बहुत बड़ा अंतर है।
अब मैं यह सब आपको क्यों बता रहा हूँ? क्योंकि इस अध्याय के अंत तक, आप स्वयं यह सुंदर प्लॉट बना सकेंगे।
Python में कई विज़ुअलाइज़ेशन पैकेज हैं, लेकिन उन सबकी जननी है matplotlib। आपको इसका उप-पैकेज pyplot चाहिए होगा। परंपरा से, इस उप-पैकेज को plt नाम से इम्पोर्ट किया जाता है, ऐसे।
पहले उदाहरण के लिए, आइए विश्व जनसंख्या के विकास को समझने की कोशिश करें। मेरे पास यहाँ वर्षों की एक सूची है, year, और उससे संबंधित जनसंख्याओं की एक सूची है, जो अरबों में व्यक्त है, pop। उदाहरण के लिए, वर्ष 1970 में, पृथ्वी पर 3.7 अरब लोग रहते थे।
इस डेटा को लाइन चार्ट के रूप में प्लॉट करने के लिए, हम plt.plot() कॉल करते हैं और अपनी दोनों सूचियों को आर्ग्यूमेंट्स के रूप में देते हैं। पहला आर्ग्यूमेंट क्षैतिज अक्ष से मेल खाता है, और दूसरा ऊर्ध्वाधर अक्ष से। आपको लग सकता है कि अभी प्लॉट दिख जाएगा, लेकिन Python काफी आलसी है। यह वास्तव में प्लॉट दिखाने के लिए show() फ़ंक्शन का इंतज़ार करेगा। ऐसा इसलिए है क्योंकि आप प्लॉट दिखाने से पहले उसमें कुछ अतिरिक्त चीज़ें जोड़ना चाह सकते हैं, जैसे टाइटल्स और लेबल कस्टमाइज़ेशन। इस पर मैं आगे और बात करूँगा। बस यह याद रखें: plot() फ़ंक्शन Python को बताता है कि क्या और कैसे प्लॉट करना है। show() वास्तव में प्लॉट को प्रदर्शित करता है।
जब हम अपने प्लॉट को देखते हैं, तो दिखाई देता है कि क्षैतिज अक्ष पर वर्ष हैं और ऊर्ध्वाधर अक्ष पर जनसंख्या। चार डेटा पॉइंट्स हैं, और Python उनके बीच एक रेखा खींच देता है। 1950 में विश्व जनसंख्या लगभग 2 दशमलव 5 अरब थी। 2010 में यह लगभग 7 अरब थी। यानी साठ सालों में विश्व जनसंख्या लगभग तीन गुना हो गई, यह काफ़ी चौंकाने वाला है। अगर जनसंख्या इसी तरह बढ़ती रही तो क्या होगा? क्या दुनिया अतिसंख्या से ग्रस्त हो जाएगी? आप अभ्यासों में जानेंगे।
पहले मैं आपको प्लॉट के एक और प्रकार से परिचित कराता हूँ: स्कैटर प्लॉट। इसे बनाने के लिए, हम पहले वाले कोड से शुरू कर सकते हैं। इस बार, आप plot फ़ंक्शन को scatter में बदल दें। परिणामी स्कैटर प्लॉट सभी व्यक्तिगत डेटा पॉइंट्स को प्लॉट करता है; Python बिंदुओं को रेखा से नहीं जोड़ता। कई अनुप्रयोगों में, स्कैटर प्लॉट लाइन प्लॉट से बेहतर विकल्प होता है, इसलिए इस scatter फ़ंक्शन को अच्छी तरह याद रखें। आप यह भी कह सकते हैं कि यह आपके डेटा को प्लॉट करने का अधिक "ईमानदार" तरीका है, क्योंकि इससे साफ़ दिखता है कि प्लॉट केवल चार डेटा पॉइंट्स पर आधारित है।
अब जबकि हमने matplotlib की बुनियादी बातें कवर कर ली हैं, अब आपकी बारी है कुछ शानदार प्लॉट्स बनाने की!
# define a simple function
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.plot(year, pop)
plt.show()
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.scatter(year, pop)
plt.show()
हिस्टोग्राम
इस वीडियो में, मैं आपको हिस्टोग्राम से परिचित कराऊँगा। हिस्टोग्राम एक ऐसा विज़ुअलाइज़ेशन प्रकार है जो आपके डेटा का अन्वेषण करने में बहुत उपयोगी है। यह आपके वेरिएबल्स के वितरण के बारे में एक अंदाज़ा लगाने में मदद करता है। यह कैसे काम करता है, यह देखने के लिए 0 और 6 के बीच 12 मानों की कल्पना करें। मैंने उन्हें यहाँ एक संख्या रेखा के साथ रखा है। इन मानों के लिए हिस्टोग्राम बनाने हेतु, आप रेखा को बराबर हिस्सों में बाँट सकते हैं, जिन्हें बिन्स कहा जाता है। मान लीजिए आप 3 बिन्स लेते हैं, प्रत्येक की चौड़ाई 2। फिर, आप गिनते हैं कि प्रत्येक बिन में कितने डेटा पॉइंट्स आते हैं। पहले बिन में 4 डेटा पॉइंट्स हैं, दूसरे में 6 और तीसरे में 2। अंत में, आप प्रत्येक बिन के लिए एक बार बनाते हैं। बार की ऊँचाई उस बिन में आने वाले डेटा पॉइंट्स की संख्या के अनुरूप होती है। परिणामस्वरूप एक हिस्टोग्राम मिलता है, जो दिखाता है कि ये 12 मान कैसे वितरित हैं। अधिकांश मान बीच में हैं, लेकिन 2 से कम मान 4 से अधिक मानों की तुलना में ज़्यादा हैं।
बेशक, matplotlib भी हिस्टोग्राम बना सकता है। पहले की तरह, आपको matplotlib के अंदर मौजूद pyplot पैकेज को इम्पोर्ट करना चाहिए। इसके बाद, आप hist() फ़ंक्शन का उपयोग कर सकते हैं। चलिए इसका प्रलेखन खोलते हैं। आप कई आर्ग्यूमेंट्स निर्दिष्ट कर सकते हैं, लेकिन यहाँ पहले दो सबसे महत्वपूर्ण हैं। x वह मानों की सूची होनी चाहिए जिसके लिए आप हिस्टोग्राम बनाना चाहते हैं। दूसरे आर्ग्यूमेंट bins का उपयोग करके आप Python को बता सकते हैं कि डेटा को कितने बिन्स में विभाजित किया जाए। इस संख्या के आधार पर, hist() स्वचालित रूप से सभी बिन्स के लिए उपयुक्त सीमाएँ ढूँढेगा और यह गिनेगा कि प्रत्येक में कितने मान हैं। यदि आप bins आर्ग्यूमेंट निर्दिष्ट नहीं करते, तो यह डिफ़ॉल्ट रूप से 10 होता है।
तो पहले देखा गया हिस्टोग्राम बनाने के लिए, 12 मानों की सूची बनाकर शुरू करते हैं। इसके बाद, आप बस hist() कॉल करते हैं और इस सूची को इनपुट के रूप में पास करते हैं, ताकि यह x आर्ग्यूमेंट से मेल खा जाए। मैंने bins आर्ग्यूमेंट को 3 भी सेट किया है, ताकि मानों को तीन बिन्स में बाँटा जाए। यदि आप अंत में show फ़ंक्शन कॉल करते हैं, तो एक सुंदर हिस्टोग्राम बन जाता है। बड़े परिदृश्य को दिखाने के लिए हिस्टोग्राम वाकई उपयोगी हैं। उदाहरण के लिए, इस तथाकथित पॉप्युलेशन पिरामिड पर नज़र डालें। यूरोपीय संघ में, पुरुषों और महिलाओं दोनों के लिए उम्र का वितरण दिखाया गया है। ध्यान दें कि हिस्टोग्राम 90 डिग्री घुमाए गए हैं; अब बिन्स क्षैतिज हैं। 40 से 44 वर्ष के बीच बिन्स सबसे बड़े हैं, जहाँ 2 करोड़ पुरुष और 2 करोड़ महिलाएँ हैं। इन्हें बेबी बूमर्स कहा जाता है।
ये 2010 के आँकड़े हैं। आपको क्या लगता है 2050 में क्या बदलेगा? आइए देखते हैं। वितरण अधिक सपाट है, और बेबी बूम पीढ़ी की उम्र बढ़ चुकी है। पल झपकते ही आप आसानी से देख सकते हैं कि समय के साथ जनसांख्यिकी कैसे बदलेगी। यही है यहाँ हिस्टोग्राम की असली ताकत! अब अभ्यासों पर जाएँ और खुद हिस्टोग्राम्स के साथ प्रयोग करें!
values = [0,0.6,1.4,1.6,2.2,2.5,2.6,3.2,3.5,3.9,4.2,6]
import matplotlib.pyplot as plt
plt.hist(values,bins=3)
plt.show()
कस्टमाइज़ेशन
प्लॉट बनाना एक बात है। सही प्लॉट बनाना, जो संदेश को बिलकुल स्पष्ट कर दे, असली चुनौती है। हर विज़ुअलाइज़ेशन के लिए आपके पास कई विकल्प होते हैं। सबसे पहले, अलग-अलग प्लॉट प्रकार हैं। और हर प्लॉट के लिए, आप अनगिनत कस्टमाइज़ेशन कर सकते हैं। आप रंग, आकार, लेबल, अक्ष आदि बदल सकते हैं। चुनाव निर्भर करता है, एक, डेटा पर, और दो, उस कहानी पर जो आप इस डेटा के साथ कहना चाहते हैं। चूँकि कस्टमाइज़ेशन की संभावनाएँ बहुत हैं, इसे सीखने का सबसे अच्छा तरीका है उदाहरणों से।
चलिए इस स्क्रिप्ट के कोड से एक सरल लाइन प्लॉट बनाकर शुरू करते हैं। यह उसी लाइन प्लॉट जैसा है जो हमने पहले वीडियो में बनाया था, लेकिन इस बार year और pop सूचियों में और डेटा है, जिसमें संयुक्त राष्ट्र द्वारा 2100 तक के अनुमान भी शामिल हैं। यदि हम इस स्क्रिप्ट को चलाते हैं, तो हमें पहले से ही एक काफ़ी अच्छा प्लॉट मिलता है: यह दिखाता है कि सदी के अंत तक चल रहा जनसंख्या विस्फोट धीमा हो जाएगा।
लेकिन कुछ चीज़ें सुधारी जा सकती हैं। पहला, यह अधिक स्पष्ट होना चाहिए कि हम कौन सा डेटा दिखा रहे हैं, खासकर उनके लिए जो ग्राफ़ पहली बार देख रहे हैं। और दूसरा, प्लॉट को सचमुच जनसंख्या विस्फोट पर ध्यान केंद्रित कराना चाहिए। सबसे पहली चीज़ जो आपको हमेशा करनी चाहिए, वह है अपने अक्षों को लेबल करना। आइए xlabel() और ylabel() फ़ंक्शनों को जोड़कर ऐसा करते हैं। इनपुट के रूप में, हम वे स्ट्रिंग्स पास करते हैं जिन्हें अक्षों के साथ रखा जाना चाहिए। सुनिश्चित करें कि आप इन फ़ंक्शनों को show() मेथड को कॉल करने से पहले कॉल करें, नहीं तो आपके कस्टमाइज़ेशन प्रदर्शित नहीं होंगे। यदि हम स्क्रिप्ट को फिर चलाएँ, तो इस बार अक्षों पर टिप्पणियाँ हैं। हम अपने प्लॉट में शीर्षक भी जोड़ने वाले हैं, title फ़ंक्शन से। हम वास्तविक शीर्षक 'World Population Projections' को आर्ग्यूमेंट के रूप में पास करते हैं। और यह रहा शीर्षक!
तो, xlabel, ylabel और title का उपयोग करके, हम पाठक को प्लॉट पर मौजूद डेटा के बारे में अधिक जानकारी दे सकते हैं: अब वे कम से कम यह तो जान सकते हैं कि प्लॉट किस बारे में है। जनसंख्या वृद्धि को परिप्रेक्ष्य में रखने के लिए, मैं चाहता हूँ कि y-अक्ष शून्य से शुरू हो। आप यह फ़ंक्शन से कर सकते हैं। पहला इनपुट एक सूची है, इस उदाहरण में 0 से 10 तक, 2 के अंतराल के साथ। यदि हम इसे चलाते हैं, तो प्लॉट बदलेगा: कर्व ऊपर की ओर खिसक जाएगा। अब यह स्पष्ट है कि 1950 में ही इस ग्रह पर करीब 2.5 अरब लोग थे।yticks()
अगला, यह स्पष्ट करने के लिए कि हम अरबों की बात कर रहे हैं, हम yticks() फ़ंक्शन में दूसरा आर्ग्यूमेंट जोड़ सकते हैं, जो टिकों के डिस्प्ले नामों की सूची है। इस सूची की लंबाई पहली सूची के बराबर होनी चाहिए। टिक 0 का नाम 0 होगा, टिक 2 का 2B, टिक 4 का 4B, और इसी तरह। वैसे, यहाँ B का अर्थ Billions है। यदि हम स्क्रिप्ट का यह संस्करण चलाते हैं, तो लेबल तदनुसार बदल जाएँगे, बढ़िया।
अंत में, पिछले 60 वर्षों में जनसंख्या विस्फोट को और उभारने के लिए कुछ और ऐतिहासिक डेटा जोड़ते हैं। विकिपीडिया पर, मुझे 1800, 1850 और 1900 के वर्षों के लिए विश्व जनसंख्या डेटा मिला। मैं उन्हें सूची रूप में लिख सकता हूँ और प्लस चिह्न के साथ pop और year सूचियों में जोड़ सकता हूँ। यदि मैं अब स्क्रिप्ट फिर से चलाता हूँ, तो ग्राफ़ में तीन डेटा पॉइंट्स जोड़ दिए जाएँगे, जो एक अधिक संपूर्ण तस्वीर देते हैं। यही है कि कैसे आप एक साधारण लाइन प्लॉट को एक ऐसे विज़ुअल में बदलते हैं जिसकी कहानी साफ़-साफ़ नज़र आती है! अब आपकी बारी। अभ्यासों पर जाएँ, क्रमशः विश्व विकास चार्ट को कस्टमाइज़ करें और अगले हैंस रोसलिंग बनें!
import matplotlib.pyplot as plt
import pandas as pd
year = list(range(1950, 2101))
pop = [2.53,2.57,2.62,2.67,2.71,2.76,2.81,2.86,2.92,2.97,3.03,3.08,3.14,3.2,3.26,3.33,3.4,3.47,3.54,3.62,3.69,3.77,3.84,3.92,4.,4.07,4.15,4.22,4.3,4.37,4.45,4.53,4.61,4.69,4.78,4.86,4.95,5.05,5.14,5.23,5.32,5.41,5.49,5.58,5.66,5.74,5.82,5.9,5.98,6.05,6.13,6.2,6.28,6.36,6.44,6.51,6.59,6.67,6.75,6.83,6.92,7.,7.08,7.16,7.24,7.32,7.4,7.48,7.56,7.64,7.72,7.79,7.87,7.94,8.01,8.08,8.15,8.22,8.29,8.36,8.42,8.49,8.56,8.62,8.68,8.74,8.8,8.86,8.92,8.98,9.04,9.09,9.15,9.2,9.26,9.31,9.36,9.41,9.46,9.5,9.55,9.6,9.64,9.68,9.73,9.77,9.81,9.85,9.88,9.92,9.96,9.99,10.03,10.06,10.09,10.13,10.16,10.19,10.22,10.25,10.28,10.31,10.33,10.36,10.38,10.41,10.43,10.46,10.48,10.5,10.52,10.55,10.57,10.59,10.61,10.63,10.65,10.66,10.68,10.7,10.72,10.73,10.75,10.77,10.78,10.79,10.81,10.82,10.83,10.84,10.85]
pop = [1,1.262,1.650] + pop
year = [1800,1850,1900] + year
plt.plot(year, pop)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('World Population Projections')
plt.yticks([0,2,4,6,8,10],['0','2B','4B','6B','8B','10B'])
plt.show()