{ "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", "> 🎓 रोचक कुरा, क्लस्टर विश्लेषण १९३० को दशकमा मानवशास्त्र र मनोविज्ञानका क्षेत्रहरूमा उत्पत्ति भएको थियो। तपाईं कल्पना गर्न सक्नुहुन्छ कि यसलाई कसरी प्रयोग गरिएको हुन सक्छ?\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", "क्लस्टरिङ एल्गोरिदमहरू १०० भन्दा बढी छन्, र तिनीहरूको प्रयोग डाटाको प्रकृतिमा निर्भर गर्दछ। केही प्रमुख एल्गोरिदमहरू छलफल गरौं:\n", "\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", "- **डिस्ट्रिब्युसन-आधारित क्लस्टरिङ**। सांख्यिकीय मोडलिङमा आधारित, डिस्ट्रिब्युसन-आधारित क्लस्टरिङले डाटा पोइन्ट क्लस्टरमा पर्ने सम्भावना निर्धारणमा केन्द्रित गर्दछ, र त्यस अनुसार असाइन गर्दछ। गाउसीयन मिश्रण विधिहरू यस प्रकारमा पर्छन्।\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": [ "कहिलेकाहीं, हामी हाम्रो डाटाबारे केही थप जानकारी चाहन सक्छौं। हामी `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", "यसै क्रममा, हामी साधारण केन्द्रीय प्रवृत्ति तथ्यांकहरू (जस्तै [औसत](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", "### १. लोकप्रिय विधाहरू अन्वेषण गर्नुहोस्\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 भेरिएबलहरू) दृश्यात्मक बनाउनको लागि एउटा तरिका बारप्लटहरू प्रयोग गर्नु हो। अब शीर्ष १० विधाहरूको बारप्लट बनाउँ:\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` भनेर वर्णन गरिएको छ, यसको मतलब स्पोटिफाइले यसलाई वर्गीकृत गरेको छैन, त्यसैले यसलाई हटाउँ।\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` मा ध्यान केन्द्रित गरौं, साथै डेटासेटलाई फिल्टर गरेर ० लोकप्रियता मान भएका वस्तुहरू हटाऔं (जसको अर्थ यो डेटासेटमा लोकप्रियता वर्गीकृत गरिएको थिएन र हाम्रो उद्देश्यका लागि यसलाई शोर मान्न सकिन्छ):\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", "अब केही सूक्ष्म प्रश्नहरू सोधौं। के लोकप्रियताको आधारमा नृत्ययोग्यता (danceability) को धारणा अनुसार विधाहरू (genres) महत्वपूर्ण रूपमा फरक छन्? हाम्रो शीर्ष तीन विधाहरूको लोकप्रियता र नृत्ययोग्यताको डाटा वितरणलाई दिइएको x र y अक्षमा [density plots](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), गोल्ड माइक्रोसफ्ट लर्न स्टुडेन्ट एम्बेसडर।\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:16:05+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "ne" } }, "nbformat": 4, "nbformat_minor": 1 }