{ "cells": [ { "cell_type": "markdown", "source": [ "## **स्पॉटिफायवरून संकलित नायजेरियन संगीत - एक विश्लेषण**\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", "> 🎓 ['अंतर'](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", "क्लस्टरिंग तंत्रांचा सखोल अभ्यास करण्यासाठी [Learn module](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", "- **सेंट्रॉइड क्लस्टरिंग**. हा लोकप्रिय अल्गोरिदम 'k' किंवा तयार करावयाच्या क्लस्टर्सची संख्या निवडण्याची आवश्यकता करतो, त्यानंतर अल्गोरिदम क्लस्टरचा मध्यबिंदू ठरवतो आणि त्या बिंदूभोवती डेटा गोळा करतो. [K-means क्लस्टरिंग](https://wikipedia.org/wiki/K-means_clustering) सेंट्रॉइड क्लस्टरिंगचा एक लोकप्रिय प्रकार आहे जो डेटासेटला पूर्वनिर्धारित K गटांमध्ये विभाजित करतो. मध्यबिंदू जवळच्या सरासरीने ठरवला जातो, म्हणूनच याला हे नाव दिले आहे. क्लस्टरपासूनचे चौरस अंतर कमी केले जाते.\n", "\n", "

\n", " \n", "

दासानी मदीपल्ली यांचे माहितीपट
\n", "\n", "- **डिस्ट्रिब्युशन-आधारित क्लस्टरिंग**. सांख्यिकी मॉडेलिंगवर आधारित, डिस्ट्रिब्युशन-आधारित क्लस्टरिंग एका क्लस्टरशी डेटा पॉइंट संबंधित असण्याची शक्यता ठरवते आणि त्यानुसार त्याला असाइन करते. गॉसियन मिश्रण पद्धती या प्रकारात येतात.\n", "\n", "- **डेंसिटी-आधारित क्लस्टरिंग**. डेटा पॉइंट्स त्यांच्या घनतेच्या आधारावर, किंवा एकमेकांभोवती गटबद्ध होण्याच्या आधारावर क्लस्टर्समध्ये असाइन केले जातात. गटापासून दूर असलेले डेटा पॉइंट्स बाहेरचे किंवा गोंधळलेले मानले जातात. DBSCAN, मीन-शिफ्ट आणि 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": [ "कधी कधी, आपल्याला आपल्या डेटाबद्दल थोडी अधिक माहिती हवी असते. आपण `data` आणि `त्याची रचना` [*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()` तुम्हाला एकूण पंक्ती (निरीक्षणे) आणि स्तंभ (चल) यांची संख्या देईल, त्यानंतर, प्रत्येक चलाच्या नावानंतर एका पंक्तीत त्या चलाचे काही सुरुवातीचे नोंदी दिसतील. याशिवाय, *चलाचा डेटा प्रकार* प्रत्येक चलाच्या नावानंतर `< >` मध्ये लगेच दिला जातो.\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", "आता आपण सामान्य केंद्रीय प्रवृत्तीचे सांख्यिकी (उदा. [mean](https://en.wikipedia.org/wiki/Arithmetic_mean) आणि [median](https://en.wikipedia.org/wiki/Median)) आणि प्रसरणाचे मोजमाप (उदा. [standard deviation](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", "वर्गीकृत डेटा (अक्षर किंवा घटक व्हेरिएबल्स) दृश्यरूपात दाखवण्याचा एक मार्ग म्हणजे बारप्लॉट्स वापरणे. चला टॉप 10 शैलींचा बारप्लॉट तयार करूया:\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", "### २. डेटा वितरणाचा अभ्यास करा\n", "\n", "आता काही अधिक सूक्ष्म प्रश्न विचारूया. त्यांच्या लोकप्रियतेच्या आधारे, विविध संगीत प्रकारांमध्ये त्यांच्या नृत्ययोग्यतेच्या आकलनात लक्षणीय फरक आहे का? आपले शीर्ष तीन संगीत प्रकार लोकप्रियता आणि नृत्ययोग्यतेसाठी दिलेल्या 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-08-29T19:14:46+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "mr" } }, "nbformat": 4, "nbformat_minor": 1 }