{ "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", "کلسٹرنگ تکنیکوں کو بہتر طور پر سمجھنے کے لیے اس [لرن ماڈیول](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، 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", "### 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": [ "آئیے دیکھتے ہیں کہ ہمارے ڈیٹا سیٹ میں عددی متغیرات کے درمیان کوئی واضح خطی تعلق موجود ہے یا نہیں۔ اس تعلق کو ریاضیاتی طور پر [correlation statistic](https://en.wikipedia.org/wiki/Correlation) کے ذریعے ماپا جاتا ہے۔\n", "\n", "Correlation statistic ایک قدر ہے جو -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 محور کے ساتھ [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", "[Jen Looper](https://www.twitter.com/jenlooper) جنہوں نے اس ماڈیول کا اصل Python ورژن تخلیق کیا ♥️\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) جنہوں نے شاندار تصویری خاکے تخلیق کیے جو مشین لرننگ کے تصورات کو زیادہ قابل فہم اور آسان بناتے ہیں۔\n", "\n", "خوش رہیں اور سیکھتے رہیں،\n", "\n", "[Eric](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-29T15:13:17+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "ur" } }, "nbformat": 4, "nbformat_minor": 1 }