{ "cells": [ { "cell_type": "markdown", "source": [ "## **Spotify से प्राप्त नाइजीरियाई संगीत - एक विश्लेषण**\n", "\n", "क्लस्टरिंग [अनसुपरवाइज्ड लर्निंग](https://wikipedia.org/wiki/Unsupervised_learning) का एक प्रकार है, जो मानता है कि डेटा सेट लेबल रहित है या इसके इनपुट्स को पहले से परिभाषित आउटपुट्स के साथ मिलाया नहीं गया है। यह विभिन्न एल्गोरिदम का उपयोग करके लेबल रहित डेटा को वर्गीकृत करता है और डेटा में पहचाने गए पैटर्न के अनुसार समूह प्रदान करता है।\n", "\n", "[**प्री-लेक्चर क्विज**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **परिचय**\n", "\n", "[क्लस्टरिंग](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) डेटा एक्सप्लोरेशन के लिए बहुत उपयोगी है। आइए देखें कि क्या यह नाइजीरियाई दर्शकों के संगीत उपभोग के तरीकों में रुझान और पैटर्न खोजने में मदद कर सकता है।\n", "\n", "> ✅ क्लस्टरिंग के उपयोगों के बारे में सोचने के लिए एक मिनट लें। असल जिंदगी में, क्लस्टरिंग तब होती है जब आपके पास कपड़ों का ढेर होता है और आपको अपने परिवार के सदस्यों के कपड़े अलग करने होते हैं 🧦👕👖🩲। डेटा साइंस में, क्लस्टरिंग तब होती है जब उपयोगकर्ता की प्राथमिकताओं का विश्लेषण करने या किसी लेबल रहित डेटा सेट की विशेषताओं को निर्धारित करने की कोशिश की जाती है। क्लस्टरिंग, एक तरह से, अराजकता को समझने में मदद करती है, जैसे मोजे की दराज।\n", "\n", "पेशेवर सेटिंग में, क्लस्टरिंग का उपयोग बाजार विभाजन, यह निर्धारित करने के लिए कि कौन सी आयु वर्ग कौन सी वस्तुएं खरीदती हैं, जैसे चीजों को निर्धारित करने के लिए किया जा सकता है। एक अन्य उपयोग अनियमितता का पता लगाना हो सकता है, जैसे कि क्रेडिट कार्ड लेनदेन के डेटा सेट से धोखाधड़ी का पता लगाना। या आप इसे मेडिकल स्कैन के बैच में ट्यूमर का पता लगाने के लिए उपयोग कर सकते हैं।\n", "\n", "✅ एक मिनट सोचें कि आपने बैंकिंग, ई-कॉमर्स, या व्यवसाय सेटिंग में 'क्लस्टरिंग' को 'वास्तविक जीवन' में कैसे देखा होगा।\n", "\n", "> 🎓 दिलचस्प बात यह है कि क्लस्टर विश्लेषण की शुरुआत 1930 के दशक में मानवशास्त्र और मनोविज्ञान के क्षेत्रों में हुई थी। क्या आप कल्पना कर सकते हैं कि इसका उपयोग कैसे किया गया होगा?\n", "\n", "इसके अलावा, आप इसे खोज परिणामों को समूहित करने के लिए उपयोग कर सकते हैं - जैसे शॉपिंग लिंक, छवियां, या समीक्षाएं। क्लस्टरिंग तब उपयोगी होती है जब आपके पास एक बड़ा डेटा सेट होता है जिसे आप कम करना चाहते हैं और जिस पर आप अधिक गहन विश्लेषण करना चाहते हैं, इसलिए इस तकनीक का उपयोग अन्य मॉडलों के निर्माण से पहले डेटा के बारे में जानने के लिए किया जा सकता है।\n", "\n", "✅ एक बार जब आपका डेटा क्लस्टर्स में व्यवस्थित हो जाता है, तो आप इसे एक क्लस्टर आईडी असाइन करते हैं, और यह तकनीक डेटा सेट की गोपनीयता बनाए रखने में उपयोगी हो सकती है; आप क्लस्टर के अधिक खुलासा करने वाले पहचान योग्य डेटा के बजाय क्लस्टर आईडी द्वारा डेटा पॉइंट का उल्लेख कर सकते हैं। क्या आप अन्य कारणों के बारे में सोच सकते हैं कि आप इसे पहचानने के लिए क्लस्टर आईडी का उपयोग क्यों करेंगे?\n", "\n", "### क्लस्टरिंग के साथ शुरुआत\n", "\n", "> 🎓 हम क्लस्टर्स कैसे बनाते हैं, इसका बहुत कुछ इस बात से लेना-देना है कि हम डेटा पॉइंट्स को समूहों में कैसे इकट्ठा करते हैं। आइए कुछ शब्दावली को समझें:\n", ">\n", "> 🎓 ['ट्रांसडक्टिव' बनाम 'इंडक्टिव'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> ट्रांसडक्टिव इनफेरेंस उन देखे गए प्रशिक्षण मामलों से प्राप्त होता है जो विशिष्ट परीक्षण मामलों से मेल खाते हैं। इंडक्टिव इनफेरेंस उन प्रशिक्षण मामलों से प्राप्त होता है जो सामान्य नियमों से मेल खाते हैं, जिन्हें केवल बाद में परीक्षण मामलों पर लागू किया जाता है।\n", ">\n", "> उदाहरण: कल्पना करें कि आपके पास एक डेटा सेट है जो केवल आंशिक रूप से लेबल किया गया है। कुछ चीजें 'रिकॉर्ड्स' हैं, कुछ 'सीडी' हैं, और कुछ खाली हैं। आपका काम खाली स्थानों के लिए लेबल प्रदान करना है। यदि आप इंडक्टिव दृष्टिकोण चुनते हैं, तो आप 'रिकॉर्ड्स' और 'सीडी' की तलाश में एक मॉडल को प्रशिक्षित करेंगे और उन लेबल्स को अपने लेबल रहित डेटा पर लागू करेंगे। यह दृष्टिकोण उन चीजों को वर्गीकृत करने में कठिनाई करेगा जो वास्तव में 'कैसेट्स' हैं। दूसरी ओर, ट्रांसडक्टिव दृष्टिकोण इस अज्ञात डेटा को अधिक प्रभावी ढंग से संभालता है क्योंकि यह समान वस्तुओं को एक साथ समूहित करने और फिर समूह को एक लेबल लागू करने का काम करता है। इस मामले में, क्लस्टर्स 'गोल संगीत चीजें' और 'चौकोर संगीत चीजें' को दर्शा सकते हैं।\n", ">\n", "> 🎓 ['नॉन-फ्लैट' बनाम 'फ्लैट' ज्योमेट्री](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> गणितीय शब्दावली से लिया गया, नॉन-फ्लैट बनाम फ्लैट ज्योमेट्री पॉइंट्स के बीच की दूरी को 'फ्लैट' ([यूक्लिडियन](https://wikipedia.org/wiki/Euclidean_geometry)) या 'नॉन-फ्लैट' (नॉन-यूक्लिडियन) ज्योमेट्रिकल तरीकों से मापने को संदर्भित करता है।\n", ">\n", "> 'फ्लैट' इस संदर्भ में यूक्लिडियन ज्योमेट्री (जिसके कुछ हिस्से 'प्लेन' ज्योमेट्री के रूप में पढ़ाए जाते हैं) को संदर्भित करता है, और नॉन-फ्लैट नॉन-यूक्लिडियन ज्योमेट्री को संदर्भित करता है। मशीन लर्निंग में ज्योमेट्री का क्या काम? खैर, गणित में जड़ें होने के कारण, पॉइंट्स के बीच की दूरी को मापने का एक सामान्य तरीका होना चाहिए, और इसे 'फ्लैट' या 'नॉन-फ्लैट' तरीके से किया जा सकता है, डेटा की प्रकृति के आधार पर। [यूक्लिडियन डिस्टेंस](https://wikipedia.org/wiki/Euclidean_distance) को दो पॉइंट्स के बीच की लाइन सेगमेंट की लंबाई के रूप में मापा जाता है। [नॉन-यूक्लिडियन डिस्टेंस](https://wikipedia.org/wiki/Non-Euclidean_geometry) को एक वक्र के साथ मापा जाता है। यदि आपका डेटा, विज़ुअलाइज़ किया गया, एक प्लेन पर मौजूद नहीं लगता है, तो आपको इसे संभालने के लिए एक विशेष एल्गोरिदम का उपयोग करने की आवश्यकता हो सकती है।\n", "\n", "

\n", " \n", "

डासानी मडिपल्ली द्वारा इन्फोग्राफिक
\n", "\n", "\n", "\n", "> 🎓 ['डिस्टेंस'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> क्लस्टर्स को उनके डिस्टेंस मैट्रिक्स द्वारा परिभाषित किया जाता है, जैसे कि पॉइंट्स के बीच की दूरी। इस दूरी को कुछ तरीकों से मापा जा सकता है। यूक्लिडियन क्लस्टर्स पॉइंट वैल्यूज के औसत द्वारा परिभाषित होते हैं, और इनमें एक 'सेंट्रॉइड' या केंद्र बिंदु होता है। दूरी को उस सेंट्रॉइड से दूरी के रूप में मापा जाता है। नॉन-यूक्लिडियन डिस्टेंस 'क्लस्ट्रॉइड्स' को संदर्भित करता है, जो अन्य पॉइंट्स के सबसे करीब होता है। क्लस्ट्रॉइड्स को विभिन्न तरीकों से परिभाषित किया जा सकता है।\n", ">\n", "> 🎓 ['कंस्ट्रेन्ड'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> [कंस्ट्रेन्ड क्लस्टरिंग](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) इस अनसुपरवाइज्ड विधि में 'सेमी-सुपरवाइज्ड' लर्निंग को पेश करती है। पॉइंट्स के बीच के संबंधों को 'कैनॉट लिंक' या 'मस्ट-लिंक' के रूप में चिह्नित किया जाता है ताकि डेटा सेट पर कुछ नियम लागू किए जा सकें।\n", ">\n", "> उदाहरण: यदि किसी एल्गोरिदम को लेबल रहित या सेमी-लेबल्ड डेटा के बैच पर स्वतंत्र रूप से छोड़ दिया जाता है, तो यह जो क्लस्टर्स उत्पन्न करता है, वे खराब गुणवत्ता के हो सकते हैं। ऊपर दिए गए उदाहरण में, क्लस्टर्स 'गोल संगीत चीजें', 'चौकोर संगीत चीजें', 'त्रिकोणीय चीजें', और 'कुकीज़' को समूहित कर सकते हैं। यदि कुछ बाधाएं दी जाती हैं, या पालन करने के लिए नियम (\"आइटम प्लास्टिक का बना होना चाहिए\", \"आइटम को संगीत उत्पन्न करने में सक्षम होना चाहिए\") तो यह एल्गोरिदम को बेहतर विकल्प बनाने में मदद कर सकता है।\n", ">\n", "> 🎓 'डेंसिटी'\n", ">\n", "> डेटा जो 'शोरयुक्त' है, उसे 'घना' माना जाता है। इसके प्रत्येक क्लस्टर्स में पॉइंट्स के बीच की दूरी, जांच करने पर, अधिक या कम घनी, या 'भीड़भाड़ वाली' साबित हो सकती है, और इस प्रकार इस डेटा को उपयुक्त क्लस्टरिंग विधि के साथ विश्लेषण करने की आवश्यकता होती है। [यह लेख](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) दिखाता है कि शोरयुक्त डेटा सेट के साथ असमान क्लस्टर डेंसिटी का पता लगाने के लिए K-Means क्लस्टरिंग बनाम HDBSCAN एल्गोरिदम का उपयोग कैसे किया जाता है।\n", "\n", "क्लस्टरिंग तकनीकों की अपनी समझ को इस [लर्न मॉड्यूल](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) में गहराई से बढ़ाएं।\n", "\n", "### **क्लस्टरिंग एल्गोरिदम**\n", "\n", "100 से अधिक क्लस्टरिंग एल्गोरिदम हैं, और उनका उपयोग डेटा की प्रकृति पर निर्भर करता है। आइए कुछ प्रमुख एल्गोरिदम पर चर्चा करें:\n", "\n", "- **हायरार्किकल क्लस्टरिंग**। यदि किसी वस्तु को उसके पास की वस्तु की निकटता के आधार पर वर्गीकृत किया जाता है, बजाय दूर की वस्तु के, तो क्लस्टर्स उनके सदस्यों की दूरी के आधार पर बनते हैं। हायरार्किकल क्लस्टरिंग की विशेषता दो क्लस्टर्स को बार-बार मिलाने से होती है।\n", "\n", "

\n", " \n", "

डासानी मडिपल्ली द्वारा इन्फोग्राफिक
\n", "\n", "\n", "\n", "- **सेंट्रॉइड क्लस्टरिंग**। यह लोकप्रिय एल्गोरिदम 'k' या बनने वाले क्लस्टर्स की संख्या चुनने की आवश्यकता करता है, जिसके बाद एल्गोरिदम क्लस्टर के केंद्र बिंदु को निर्धारित करता है और उस बिंदु के चारों ओर डेटा इकट्ठा करता है। [K-means क्लस्टरिंग](https://wikipedia.org/wiki/K-means_clustering) सेंट्रॉइड क्लस्टरिंग का एक लोकप्रिय संस्करण है जो डेटा सेट को पूर्व-निर्धारित K समूहों में विभाजित करता है। केंद्र निकटतम औसत द्वारा निर्धारित किया जाता है, इसलिए इसका नाम। क्लस्टर से वर्ग दूरी को न्यूनतम किया जाता है।\n", "\n", "

\n", " \n", "

डासानी मडिपल्ली द्वारा इन्फोग्राफिक
\n", "\n", "\n", "\n", "- **डिस्ट्रिब्यूशन-आधारित क्लस्टरिंग**। सांख्यिकीय मॉडलिंग पर आधारित, डिस्ट्रिब्यूशन-आधारित क्लस्टरिंग इस बात की संभावना निर्धारित करने पर केंद्रित है कि कोई डेटा पॉइंट किसी क्लस्टर से संबंधित है, और इसे उसी के अनुसार असाइन करता है। Gaussian मिश्रण विधियां इस प्रकार से संबंधित हैं।\n", "\n", "- **डेंसिटी-आधारित क्लस्टरिंग**। डेटा पॉइंट्स को उनकी डेंसिटी, या उनके एक-दूसरे के चारों ओर समूह बनाने के आधार पर क्लस्टर्स में असाइन किया जाता है। समूह से दूर डेटा पॉइंट्स को आउटलीयर या शोर माना जाता है। DBSCAN, Mean-shift और OPTICS इस प्रकार की क्लस्टरिंग से संबंधित हैं।\n", "\n", "- **ग्रिड-आधारित क्लस्टरिंग**। बहु-आयामी डेटा सेट के लिए, एक ग्रिड बनाया जाता है और डेटा को ग्रिड की कोशिकाओं के बीच विभाजित किया जाता है, जिससे क्लस्टर्स बनते हैं।\n", "\n", "क्लस्टरिंग के बारे में सीखने का सबसे अच्छा तरीका इसे खुद आजमाना है, और यही आप इस अभ्यास में करेंगे।\n", "\n", "इस मॉड्यूल को पूरा करने के लिए हमें कुछ पैकेजों की आवश्यकता होगी। आप उन्हें इस प्रकार इंस्टॉल कर सकते हैं: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "वैकल्पिक रूप से, नीचे दिया गया स्क्रिप्ट जांचता है कि क्या आपके पास इस मॉड्यूल को पूरा करने के लिए आवश्यक पैकेज हैं और यदि कुछ गायब हैं तो उन्हें आपके लिए इंस्टॉल करता है।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n", "\r\n", "pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "## अभ्यास - अपने डेटा को क्लस्टर करें\n", "\n", "क्लस्टरिंग एक ऐसी तकनीक है जो उचित विज़ुअलाइज़ेशन से बहुत लाभान्वित होती है, तो चलिए अपने म्यूज़िक डेटा को विज़ुअलाइज़ करके शुरुआत करते हैं। यह अभ्यास हमें यह तय करने में मदद करेगा कि इस डेटा की प्रकृति के लिए क्लस्टरिंग के कौन से तरीके का सबसे प्रभावी रूप से उपयोग किया जाना चाहिए।\n", "\n", "चलिए डेटा को इंपोर्ट करके शुरुआत करते हैं।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core tidyverse and make it available in your current R session\r\n", "library(tidyverse)\r\n", "\r\n", "# Import the data into a tibble\r\n", "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n", "\r\n", "# View the first 5 rows of the data set\r\n", "df %>% \r\n", " slice_head(n = 5)\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "कभी-कभी, हम अपने डेटा के बारे में थोड़ी अधिक जानकारी प्राप्त करना चाह सकते हैं। हम [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) फ़ंक्शन का उपयोग करके `डेटा` और `उसकी संरचना` पर एक नज़र डाल सकते हैं:\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Glimpse into the data set\r\n", "df %>% \r\n", " glimpse()\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "शानदार काम!💪\n", "\n", "हम देख सकते हैं कि `glimpse()` आपको कुल पंक्तियों (observations) और स्तंभों (variables) की संख्या दिखाएगा, फिर प्रत्येक वेरिएबल के नाम के बाद, पंक्ति में प्रत्येक वेरिएबल के पहले कुछ प्रविष्टियों को। इसके अलावा, वेरिएबल का *डेटा प्रकार* प्रत्येक वेरिएबल के नाम के तुरंत बाद `< >` के अंदर दिया जाता है।\n", "\n", "`DataExplorer::introduce()` इस जानकारी को व्यवस्थित रूप से संक्षेप में प्रस्तुत कर सकता है:\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Describe basic information for our data\r\n", "df %>% \r\n", " introduce()\r\n", "\r\n", "# A visual display of the same\r\n", "df %>% \r\n", " plot_intro()\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "बहुत बढ़िया! हमने अभी-अभी सीखा कि हमारे डेटा में कोई भी मान गायब नहीं है।\n", "\n", "जब हम इस पर काम कर रहे हैं, तो हम सामान्य केंद्रीय प्रवृत्ति सांख्यिकी (जैसे [औसत](https://en.wikipedia.org/wiki/Arithmetic_mean) और [मध्यिका](https://en.wikipedia.org/wiki/Median)) और प्रसार के माप (जैसे [मानक विचलन](https://en.wikipedia.org/wiki/Standard_deviation)) का पता लगा सकते हैं `summarytools::descr()` का उपयोग करके।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Describe common statistics\r\n", "df %>% \r\n", " descr(stats = \"common\")\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "आइए डेटा के सामान्य मानों पर नज़र डालते हैं। ध्यान दें कि लोकप्रियता `0` हो सकती है, जो उन गानों को दिखाती है जिनकी कोई रैंकिंग नहीं है। हम इन्हें जल्द ही हटा देंगे।\n", "\n", "> 🤔 अगर हम क्लस्टरिंग पर काम कर रहे हैं, जो एक अनसुपरवाइज्ड विधि है और लेबल वाले डेटा की आवश्यकता नहीं होती, तो हम यह डेटा लेबल्स के साथ क्यों दिखा रहे हैं? डेटा एक्सप्लोरेशन चरण में ये उपयोगी होते हैं, लेकिन क्लस्टरिंग एल्गोरिदम के काम करने के लिए ये आवश्यक नहीं हैं।\n", "\n", "### 1. लोकप्रिय शैलियों का अन्वेषण करें\n", "\n", "आइए आगे बढ़ते हैं और यह पता लगाते हैं कि सबसे लोकप्रिय शैलियां 🎶 कौन सी हैं, इसके उदाहरणों की गिनती करके।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Popular genres\r\n", "top_genres <- df %>% \r\n", " count(artist_top_genre, sort = TRUE) %>% \r\n", "# Encode to categorical and reorder the according to count\r\n", " mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n", "\r\n", "# Print the top genres\r\n", "top_genres\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "यह अच्छा रहा! कहते हैं कि एक तस्वीर हजार पंक्तियों के डेटा फ्रेम के बराबर होती है (वैसे, ऐसा कोई नहीं कहता 😅)। लेकिन आप समझ ही गए होंगे, है ना?\n", "\n", "श्रेणीबद्ध डेटा (character या factor वेरिएबल्स) को विज़ुअलाइज़ करने का एक तरीका बारप्लॉट्स का उपयोग करना है। चलिए, शीर्ष 10 शैलियों (genres) का एक बारप्लॉट बनाते हैं:\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Change the default gray theme\r\n", "theme_set(theme_light())\r\n", "\r\n", "# Visualize popular genres\r\n", "top_genres %>%\r\n", " slice(1:10) %>% \r\n", " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n", " fill = artist_top_genre)) +\r\n", " geom_col(alpha = 0.8) +\r\n", " paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n", " ggtitle(\"Top genres\") +\r\n", " theme(plot.title = element_text(hjust = 0.5),\r\n", " # Rotates the X markers (so we can read them)\r\n", " axis.text.x = element_text(angle = 90))\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "अब यह पहचानना काफी आसान हो गया है कि हमारे पास `missing` शैलियां हैं 🧐!\n", "\n", "> एक अच्छी विज़ुअलाइज़ेशन आपको ऐसी चीजें दिखाएगी जिनकी आपने उम्मीद नहीं की थी, या डेटा के बारे में नए सवाल उठाएगी - हैडली विकहम और गैरेट ग्रोलमंड, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "ध्यान दें, जब शीर्ष शैली को `Missing` के रूप में वर्णित किया जाता है, तो इसका मतलब है कि Spotify ने इसे वर्गीकृत नहीं किया है, तो चलिए इसे हटा देते हैं।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Visualize popular genres\r\n", "top_genres %>%\r\n", " filter(artist_top_genre != \"Missing\") %>% \r\n", " slice(1:10) %>% \r\n", " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n", " fill = artist_top_genre)) +\r\n", " geom_col(alpha = 0.8) +\r\n", " paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n", " ggtitle(\"Top genres\") +\r\n", " theme(plot.title = element_text(hjust = 0.5),\r\n", " # Rotates the X markers (so we can read them)\r\n", " axis.text.x = element_text(angle = 90))\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "थोड़े डेटा अन्वेषण से, हम सीखते हैं कि शीर्ष तीन शैलियां इस डेटा सेट पर हावी हैं। चलिए `afro dancehall`, `afropop`, और `nigerian pop` पर ध्यान केंद्रित करते हैं, और साथ ही डेटा सेट को फ़िल्टर करते हैं ताकि 0 लोकप्रियता मान वाले किसी भी चीज़ को हटा दिया जाए (जिसका मतलब है कि इसे डेटा सेट में लोकप्रियता के साथ वर्गीकृत नहीं किया गया था और हमारे उद्देश्यों के लिए इसे शोर माना जा सकता है):\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "nigerian_songs <- df %>% \r\n", " # Concentrate on top 3 genres\r\n", " filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n", " # Remove unclassified observations\r\n", " filter(popularity != 0)\r\n", "\r\n", "\r\n", "\r\n", "# Visualize popular genres\r\n", "nigerian_songs %>%\r\n", " count(artist_top_genre) %>%\r\n", " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n", " fill = artist_top_genre)) +\r\n", " geom_col(alpha = 0.8) +\r\n", " paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n", " ggtitle(\"Top genres\") +\r\n", " theme(plot.title = element_text(hjust = 0.5))\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "आइए देखें कि हमारे डेटा सेट में संख्यात्मक चर के बीच कोई स्पष्ट रेखीय संबंध है या नहीं। इस संबंध को गणितीय रूप से [सहसंबंध सांख्यिकी](https://en.wikipedia.org/wiki/Correlation) द्वारा मापा जाता है।\n", "\n", "सहसंबंध सांख्यिकी -1 और 1 के बीच का एक मान होता है, जो संबंध की ताकत को दर्शाता है। 0 से ऊपर के मान *सकारात्मक* सहसंबंध को इंगित करते हैं (एक चर के उच्च मान आमतौर पर दूसरे चर के उच्च मान के साथ मेल खाते हैं), जबकि 0 से नीचे के मान *नकारात्मक* सहसंबंध को इंगित करते हैं (एक चर के उच्च मान आमतौर पर दूसरे चर के निम्न मान के साथ मेल खाते हैं)।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Narrow down to numeric variables and fid correlation\r\n", "corr_mat <- nigerian_songs %>% \r\n", " select(where(is.numeric)) %>% \r\n", " cor()\r\n", "\r\n", "# Visualize correlation matrix\r\n", "corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "डेटा में मज़बूत सहसंबंध नहीं है, सिवाय `energy` और `loudness` के बीच, जो समझ में आता है क्योंकि तेज़ संगीत आमतौर पर काफी ऊर्जावान होता है। `Popularity` का `release date` के साथ एक संबंध है, जो भी समझ में आता है, क्योंकि हाल के गाने शायद अधिक लोकप्रिय होते हैं। लंबाई और ऊर्जा के बीच भी एक सहसंबंध दिखाई देता है।\n", "\n", "यह देखना दिलचस्प होगा कि क्लस्टरिंग एल्गोरिदम इस डेटा से क्या निष्कर्ष निकाल सकता है!\n", "\n", "> 🎓 ध्यान दें कि सहसंबंध का मतलब कारण नहीं होता! हमारे पास सहसंबंध का प्रमाण है लेकिन कारण का कोई प्रमाण नहीं है। एक [मज़ेदार वेबसाइट](https://tylervigen.com/spurious-correlations) में कुछ विज़ुअल्स हैं जो इस बात को उजागर करते हैं।\n", "\n", "### 2. डेटा वितरण का अन्वेषण करें\n", "\n", "आइए कुछ और सूक्ष्म सवाल पूछते हैं। क्या लोकप्रियता के आधार पर उनके डांस करने की क्षमता की धारणा में शैलियाँ (genres) महत्वपूर्ण रूप से अलग हैं? आइए हमारे शीर्ष तीन शैलियों के डेटा वितरण को लोकप्रियता और डांस करने की क्षमता के लिए दिए गए x और y अक्ष पर [घनत्व प्लॉट्स](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) का उपयोग करके जांचें।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Perform 2D kernel density estimation\r\n", "density_estimate_2d <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n", " geom_density_2d(bins = 5, size = 1) +\r\n", " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " xlim(-20, 80) +\r\n", " ylim(0, 1.2)\r\n", "\r\n", "# Density plot based on the popularity\r\n", "density_estimate_pop <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n", " geom_density(size = 1, alpha = 0.5) +\r\n", " paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " theme(legend.position = \"none\")\r\n", "\r\n", "# Density plot based on the danceability\r\n", "density_estimate_dance <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n", " geom_density(size = 1, alpha = 0.5) +\r\n", " paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n", "\r\n", "\r\n", "# Patch everything together\r\n", "library(patchwork)\r\n", "density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "हम देखते हैं कि कुछ समकेंद्रित वृत्त एक पंक्ति में आते हैं, चाहे शैली कोई भी हो। क्या ऐसा हो सकता है कि इस शैली के लिए नाइजीरियाई पसंद एक निश्चित स्तर की नृत्य क्षमता पर मिलती हो?\n", "\n", "सामान्य तौर पर, इन तीन शैलियों की लोकप्रियता और नृत्य क्षमता के मामले में समानता है। इस ढीले-संरेखित डेटा में समूहों को निर्धारित करना एक चुनौती होगी। आइए देखें कि क्या एक स्कैटर प्लॉट इसमें मदद कर सकता है।\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# A scatter plot of popularity and danceability\r\n", "scatter_plot <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n", " geom_point(size = 2, alpha = 0.8) +\r\n", " paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n", "\r\n", "# Add a touch of interactivity\r\n", "ggplotly(scatter_plot)\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "एक ही अक्षों का स्कैटरप्लॉट समान अभिसरण पैटर्न दिखाता है।\n", "\n", "सामान्यतः, क्लस्टरिंग के लिए, आप स्कैटरप्लॉट्स का उपयोग डेटा के क्लस्टर्स दिखाने के लिए कर सकते हैं, इसलिए इस प्रकार की विज़ुअलाइज़ेशन में महारत हासिल करना बहुत उपयोगी है। अगले पाठ में, हम इस फ़िल्टर किए गए डेटा का उपयोग करेंगे और k-means क्लस्टरिंग का उपयोग करके इस डेटा में समूहों की खोज करेंगे जो दिलचस्प तरीकों से ओवरलैप होते हैं।\n", "\n", "## **🚀 चुनौती**\n", "\n", "अगले पाठ की तैयारी के लिए, विभिन्न क्लस्टरिंग एल्गोरिदम के बारे में एक चार्ट बनाएं जिन्हें आप प्रोडक्शन वातावरण में खोज सकते हैं और उपयोग कर सकते हैं। क्लस्टरिंग किस प्रकार की समस्याओं को हल करने की कोशिश कर रही है?\n", "\n", "## [**पाठ के बाद क्विज़**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **समीक्षा और स्व-अध्ययन**\n", "\n", "जैसा कि हमने सीखा है, क्लस्टरिंग एल्गोरिदम लागू करने से पहले, अपने डेटा सेट की प्रकृति को समझना एक अच्छा विचार है। इस विषय पर अधिक पढ़ें [यहां](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n", "\n", "क्लस्टरिंग तकनीकों की अपनी समझ को गहरा करें:\n", "\n", "- [Tidymodels और दोस्तों का उपयोग करके क्लस्टरिंग मॉडल को ट्रेन और मूल्यांकन करें](https://rpubs.com/eR_ic/clustering)\n", "\n", "- ब्रैडली बोएमके और ब्रैंडन ग्रीनवेल, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n", "\n", "## **असाइनमेंट**\n", "\n", "[क्लस्टरिंग के लिए अन्य विज़ुअलाइज़ेशन पर शोध करें](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## धन्यवाद:\n", "\n", "[जेन लूपर](https://www.twitter.com/jenlooper) इस मॉड्यूल के मूल Python संस्करण को बनाने के लिए ♥️\n", "\n", "[`दसानी मडिपल्ली`](https://twitter.com/dasani_decoded) अद्भुत चित्रण बनाने के लिए जो मशीन लर्निंग अवधारणाओं को अधिक व्याख्यात्मक और समझने में आसान बनाते हैं।\n", "\n", "खुशहाल सीखना,\n", "\n", "[एरिक](https://twitter.com/ericntay), गोल्ड Microsoft Learn स्टूडेंट एंबेसडर।\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।\n" ] } ], "metadata": { "anaconda-cloud": "", "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.1" }, "coopTranslator": { "original_hash": "99c36449cad3708a435f6798cfa39972", "translation_date": "2025-09-04T02:08:58+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "hi" } }, "nbformat": 4, "nbformat_minor": 1 }