You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/bn/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb

499 lines
48 KiB

{
"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",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ডাসানি মাদিপাল্লি দ্বারা ইনফোগ্রাফিক</figcaption>\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",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ডাসানি মাদিপাল্লি দ্বারা ইনফোগ্রাফিক</figcaption>\n",
"\n",
"\n",
"\n",
"- **সেন্ট্রয়েড ক্লাস্টারিং**। এই জনপ্রিয় অ্যালগরিদম 'k', বা তৈরি করার ক্লাস্টারের সংখ্যা নির্বাচন করার প্রয়োজন হয়, এর পরে অ্যালগরিদম একটি ক্লাস্টারের কেন্দ্র বিন্দু নির্ধারণ করে এবং সেই বিন্দুর চারপাশে ডেটা সংগ্রহ করে। [K-means ক্লাস্টারিং](https://wikipedia.org/wiki/K-means_clustering) সেন্ট্রয়েড ক্লাস্টারিং এর একটি জনপ্রিয় সংস্করণ যা একটি ডেটাসেটকে পূর্বনির্ধারিত K গ্রুপে বিভক্ত করে। কেন্দ্রটি নিকটতম গড় দ্বারা নির্ধারিত হয়, তাই নাম। ক্লাস্টারের বর্গক্ষেত্র দূরত্ব কমানো হয়।\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ডাসানি মাদিপাল্লি দ্বারা ইনফোগ্রাফিক</figcaption>\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` হিসেবে বর্ণিত হয়, তার মানে হলো 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` এর একটি সম্পর্ক রয়েছে, যা স্বাভাবিক, কারণ সাম্প্রতিক গানগুলো সম্ভবত বেশি জনপ্রিয়। দৈর্ঘ্য এবং `energy` এর মধ্যেও একটি সম্পর্ক দেখা যায়।\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",
"সাধারণভাবে, ক্লাস্টারিংয়ের জন্য, আপনি স্ক্যাটারপ্লট ব্যবহার করতে পারেন ডেটার ক্লাস্টার দেখানোর জন্য, তাই এই ধরনের ভিজ্যুয়ালাইজেশন আয়ত্ত করা খুবই উপকারী। পরবর্তী পাঠে, আমরা এই ফিল্টার করা ডেটা ব্যবহার করব এবং কি-মিন্স ক্লাস্টারিং ব্যবহার করে এই ডেটায় এমন কিছু গ্রুপ আবিষ্কার করব যা আকর্ষণীয়ভাবে ওভারল্যাপ করে।\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) মূল পাইথন সংস্করণ তৈরি করার জন্য ♥️\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-29T23:27:51+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "bn"
}
},
"nbformat": 4,
"nbformat_minor": 1
}