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/my/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb

639 lines
46 KiB

{
"nbformat": 4,
"nbformat_minor": 0,
"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"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-09-06T12:18:11+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## R နှင့် Tidy data အခြေခံများကို အသုံးပြု၍ K-Means clustering ကို လေ့လာပါ။\n",
"\n",
"### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"ဒီသင်ခန်းစာမှာ Tidymodels package နဲ့ R ecosystem (သူငယ်ချင်းတွေ 🧑‍🤝‍🧑) ထဲက အခြား package တွေကို အသုံးပြုပြီး cluster တွေကို ဖန်တီးနည်းကို သင်ယူပါမယ်။ သင်ရင်းနှီးပြီးသား Nigerian music dataset ကို အသုံးပြုပါမယ်။ K-Means Clustering အခြေခံကို လေ့လာပါမယ်။ အရင်သင်ခန်းစာမှာ သင်ယူခဲ့သလို၊ cluster တွေကို အလုပ်လုပ်စေဖို့ နည်းလမ်းများစွာရှိပြီး သင့် data ပေါ်မူတည်ပြီး သင့်လျော်တဲ့နည်းလမ်းကို ရွေးချယ်ရပါမယ်။ K-Means က အများဆုံး အသုံးပြုတဲ့ clustering နည်းလမ်းဖြစ်လို့ အဲဒီနည်းလမ်းကို စမ်းကြည့်ပါမယ်။ စလိုက်ကြစို့!\n",
"\n",
"သင်လေ့လာရမယ့် အကြောင်းအရာများ:\n",
"\n",
"- Silhouette scoring\n",
"\n",
"- Elbow method\n",
"\n",
"- Inertia\n",
"\n",
"- Variance\n",
"\n",
"### **Introduction**\n",
"\n",
"[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) က signal processing နယ်ပယ်က ဆင်းသက်လာတဲ့ နည်းလမ်းတစ်ခုဖြစ်ပြီး data တွေကို `k clusters` အဖြစ် feature တွေတူညီမှုအပေါ် မူတည်ပြီး ခွဲခြားပေးပါတယ်။\n",
"\n",
"ဒီ cluster တွေကို [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) အနေနဲ့ မြင်နိုင်ပြီး၊ diagram တွေမှာ point (သို့မဟုတ် 'seed') နဲ့ အဲဒီ point ရဲ့ region ပါဝင်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Jen Looper ရဲ့ Infographic</figcaption>\n",
"\n",
"K-Means clustering ရဲ့ အဆင့်တွေက:\n",
"\n",
"1. Data scientist က ဖန်တီးလိုတဲ့ cluster အရေအတွက်ကို သတ်မှတ်ပါမယ်။\n",
"\n",
"2. Algorithm က data set ထဲက K observations ကို random ရွေးပြီး cluster တွေရဲ့ center (centroids) အဖြစ် သတ်မှတ်ပါမယ်။\n",
"\n",
"3. ကျန် observations တွေကို အနီးဆုံး centroid ကို assign လုပ်ပါမယ်။\n",
"\n",
"4. Cluster တစ်ခုစီရဲ့ mean ကို ပြန်တွက်ပြီး centroid ကို mean ရဲ့နေရာကို ရွှေ့ပါမယ်။\n",
"\n",
"5. Center တွေ ပြန်တွက်ပြီးတဲ့အခါ၊ observation တစ်ခုစီကို ပြန်စစ်ပြီး အခြား cluster နဲ့ ပိုနီးနိုင်မလား စစ်ပါမယ်။ Object တွေကို ပြန် assign လုပ်ပြီး cluster mean အသစ်နဲ့ update လုပ်ပါမယ်။ Cluster assignment နဲ့ centroid update အဆင့်တွေကို iteration ပြုလုပ်ပြီး cluster assignment မပြောင်းလဲတော့တဲ့အချိန် (convergence ရောက်တဲ့အချိန်) မှာ algorithm ရပ်တန့်ပါမယ်။ Typically, centroid တွေ အနည်းငယ်ရွှေ့သွားတဲ့ iteration တွေမှာ algorithm ရပ်တန့်ပြီး cluster တွေ static ဖြစ်သွားပါမယ်။\n",
"\n",
"<div>\n",
"\n",
"> အစပိုင်းမှာ randomization လုပ်ထားတဲ့ k observations တွေကြောင့် procedure ကို အသုံးပြုတဲ့အခါ အနည်းငယ်ကွာခြားတဲ့ရလဒ်တွေ ရနိုင်ပါတယ်။ ဒီအကြောင်းကြောင့် algorithm အများစုက *random starts* အများကြီး အသုံးပြုပြီး WCSS အနည်းဆုံးရတဲ့ iteration ကို ရွေးချယ်ပါတယ်။ အဲဒီအကြောင်းကြောင့် K-Means ကို *nstart* အတော်များများနဲ့ always run လုပ်ဖို့ strongly recommend လုပ်ပါတယ်။ ဒါက *undesirable local optimum* ရှောင်ရှားနိုင်စေပါတယ်။\n",
"\n",
"</div>\n",
"\n",
"Allison Horst ရဲ့ [artwork](https://github.com/allisonhorst/stats-illustrations) ကို အသုံးပြုထားတဲ့ animation လေးက clustering process ကို ရှင်းပြထားပါတယ်:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>@allison_horst ရဲ့ Artwork</figcaption>\n",
"\n",
"Clustering နဲ့ပတ်သက်ပြီး အခြေခံမေးခွန်းတစ်ခုက: သင့် data ကို ဘယ်နှစ်ခု cluster အဖြစ် ခွဲခြားရမလဲဆိုတာကို ဘယ်လိုသိနိုင်မလဲ? K-Means ရဲ့ drawback တစ်ခုက `k` ကို သတ်မှတ်ရမယ်ဆိုတာပါ။ ဒါက `centroids` အရေအတွက်ကို ဆိုလိုပါတယ်။ ကံကောင်းစွာ `elbow method` က `k` ရဲ့ အကောင်းဆုံး value ကို ခန့်မှန်းဖို့ ကူညီပေးပါတယ်။ မကြာခင်မှာ စမ်းကြည့်ပါမယ်။\n",
"\n",
"### \n",
"\n",
"**Prerequisite**\n",
"\n",
"အရင်သင်ခန်းစာ [previous lesson](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) မှာ ရပ်ထားတဲ့နေရာကနေ ဆက်လုပ်ပါမယ်။ အဲဒီမှာ data set ကို ခွဲခြမ်းစိတ်ဖြာပြီး visualization အများကြီးလုပ်ခဲ့ပြီး observation တွေကို filter လုပ်ထားပါတယ်။ သေချာစွာ ပြန်ကြည့်ပါ။\n",
"\n",
"ဒီ module ကို ပြီးမြောက်စေဖို့ package အချို့လိုအပ်ပါမယ်။ အဲဒီ package တွေကို `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))` လို့ install လုပ်နိုင်ပါတယ်။\n",
"\n",
"အခြားနည်းလမ်းအနေနဲ့ အောက်ပါ script က module ကို ပြီးမြောက်စေဖို့လိုအပ်တဲ့ package တွေရှိမရှိ စစ်ဆေးပြီး မရှိတဲ့ package တွေကို install လုပ်ပေးပါမယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ah_tBi58LXyi"
},
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7e--UCUTLXym"
},
"source": [
"အရင်ဆုံး စတင်လိုက်ကြစို့!\n",
"\n",
"## 1. ဒေတာနှင့်အတူ အကအဖြစ်: အများဆုံးလူကြိုက်များသော ဂီတအမျိုးအစား ၃ မျိုးကို ရှာဖွေပါ\n",
"\n",
"ဒီဟာက အရင်စာသင်ခန်းမှာ ကျွန်တော်တို့ လုပ်ခဲ့တာတွေကို ပြန်လည်သုံးသပ်ခြင်းဖြစ်ပါတယ်။ ဒေတာကို ခွဲခြမ်းစိတ်ဖြာပြီး စမ်းကြည့်ရအောင်!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ycamx7GGLXyn"
},
"source": [
"# Load the core tidyverse and make it available in your current R session\n",
"library(tidyverse)\n",
"\n",
"# Import the data into a tibble\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
"\n",
"# Narrow down to top 3 popular genres\n",
"nigerian_songs <- df %>% \n",
" # Concentrate on top 3 genres\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
" # Remove unclassified observations\n",
" filter(popularity != 0)\n",
"\n",
"\n",
"\n",
"# Visualize popular genres using bar plots\n",
"theme_set(theme_light())\n",
"nigerian_songs %>%\n",
" count(artist_top_genre) %>%\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
" fill = artist_top_genre)) +\n",
" geom_col(alpha = 0.8) +\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
" ggtitle(\"Top genres\") +\n",
" theme(plot.title = element_text(hjust = 0.5))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "b5h5zmkPLXyp"
},
"source": [
"🤩 ဒါကောင်းတယ်!\n",
"\n",
"## 2. ဒေတာကို ပိုမိုလေ့လာခြင်း။\n",
"\n",
"ဒီဒေတာက ဘယ်လောက်သန့်ရှင်းလဲ? Boxplot တွေကို သုံးပြီး အထူးထင်ရှားနေတဲ့အချက်တွေကို စစ်ဆေးကြည့်ရအောင်။ အထူးထင်ရှားနေတဲ့အချက်တွေ နည်းတဲ့ နံပါတ်ဆိုင်ရာကော်လံတွေကို အဓိကထားပြီး စစ်ဆေးပါမယ် (သို့ပင်မဟုတ် အထူးထင်ရှားနေတဲ့အချက်တွေကို ဖယ်ရှားနိုင်ပါတယ်။) Boxplot တွေက ဒေတာရဲ့ အကွာအဝေးကို ပြသနိုင်ပြီး ဘယ်ကော်လံတွေကို အသုံးပြုရမလဲဆိုတာ ရွေးချယ်ဖို့ အထောက်အကူဖြစ်စေပါတယ်။ သို့သော် Boxplot တွေက ကွဲပြားမှု (variance) ကို မပြသနိုင်ပါဘူး၊ ကောင်းမွန်တဲ့ clusterable ဒေတာအတွက် အရေးကြီးတဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ်။ ပိုမိုသိရှိရန် [ဒီဆွေးနွေးချက်](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) ကို ကြည့်ပါ။\n",
"\n",
"[Boxplot](https://en.wikipedia.org/wiki/Box_plot) တွေကို `numeric` ဒေတာရဲ့ ဖြန့်ဝေမှုကို ဂရပ်ဖစ်ပုံစံနဲ့ ဖော်ပြဖို့ အသုံးပြုပါတယ်၊ ဒါကြောင့် နံပါတ်ဆိုင်ရာကော်လံအားလုံးကို လူကြိုက်များတဲ့ ဂီတအမျိုးအစားတွေနဲ့အတူ *ရွေးချယ်* လုပ်ပြီး စတင်ကြည့်ရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HhNreJKLLXyq"
},
"source": [
"# Select top genre column and all other numeric columns\n",
"df_numeric <- nigerian_songs %>% \n",
" select(artist_top_genre, where(is.numeric)) \n",
"\n",
"# Display the data\n",
"df_numeric %>% \n",
" slice_head(n = 5)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYXrwJRaLXyq"
},
"source": [
"`where` အကူအညီကို သုံးပြီး ရွေးချယ်မှုကို လွယ်ကူစေတဲ့ နည်းလမ်းကို ကြည့်ပါ 💁။ ဒီလို အခြားသော function များကို [ဒီမှာ](https://tidyselect.r-lib.org/) ရှာဖွေပါ။\n",
"\n",
"အရေအတွက်ဆိုင်ရာ feature တစ်ခုစီအတွက် boxplot တစ်ခုစီ ပြုလုပ်မည်ဖြစ်ပြီး loop မသုံးရန် ရှောင်ရှားလိုသောကြောင့်၊ `facets` ကို အသုံးပြုနိုင်ရန်အတွက် *longer* format သို့ data ကို ပြောင်းလဲဖွဲ့စည်းပါမည်။ `facets` သည် data ၏ subset တစ်ခုစီကို ပြသသော subplot များဖြစ်သည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gd5bR3f8LXys"
},
"source": [
"# Pivot data from wide to long\n",
"df_numeric_long <- df_numeric %>% \n",
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
"\n",
"# Print out data\n",
"df_numeric_long %>% \n",
" slice_head(n = 15)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-7tE1swnLXyv"
},
"source": [
"အရမ်းရှည်လို့ပါ! အခုတော့ `ggplots` တချို့လုပ်ကြည့်မယ်! ဒါဆိုရင် ဘယ် `geom` ကိုသုံးမလဲ?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "r88bIsyuLXyy"
},
"source": [
"# Make a box plot\n",
"df_numeric_long %>% \n",
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
" geom_boxplot() +\n",
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
" theme(legend.position = \"none\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYVyKIUELXyz"
},
"source": [
"အရမ်းလွယ်တယ်-ဂျီဂျီ!\n",
"\n",
"အခုတော့ ဒီဒေတာက အနည်းငယ် ရွှံ့ရွှံ့လေးဖြစ်နေတယ်ဆိုတာ မြင်နိုင်ပါပြီ။ ကော်လံတစ်ခုချင်းစီကို boxplot အနေနဲ့ ကြည့်ရှုရင်း၊ outliers တွေကို တွေ့နိုင်ပါတယ်။ ဒီ outliers တွေကို dataset ထဲကနေ ဖယ်ရှားနိုင်ပေမယ့် ဒါက ဒေတာကို အရမ်းနည်းသွားစေမှာပါ။\n",
"\n",
"အခုအချိန်မှာတော့ clustering exercise အတွက် အသုံးပြုမယ့် ကော်လံတွေကို ရွေးချယ်ကြမယ်။ range တူတဲ့ numeric ကော်လံတွေကို ရွေးချယ်ကြမယ်။ `artist_top_genre` ကို numeric အနေနဲ့ encode လုပ်နိုင်ပေမယ့် အခုအချိန်မှာတော့ ဒါကို drop လုပ်လိုက်မယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wkpINyZLXy0"
},
"source": [
"# Select variables with similar ranges\n",
"df_numeric_select <- df_numeric %>% \n",
" select(popularity, danceability, acousticness, loudness, energy) \n",
"\n",
"# Normalize data\n",
"# df_numeric_select <- scale(df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "D7dLzgpqLXy1"
},
"source": [
"## 3. R မှာ k-means clustering ကိုတွက်ချက်ခြင်း\n",
"\n",
"R မှာ `kmeans` ဆိုတဲ့ built-in function ကိုသုံးပြီး k-means ကိုတွက်ချက်နိုင်ပါတယ်၊ `help(\"kmeans()\")` ကိုကြည့်ပါ။ `kmeans()` function က အဓိက argument အနေနဲ့ အားလုံးနံပါတ်ဖြစ်တဲ့ column တွေပါဝင်တဲ့ data frame ကို လက်ခံပါတယ်။\n",
"\n",
"k-means clustering ကိုသုံးတဲ့အခါ ပထမဆုံးအဆင့်ကတော့ နောက်ဆုံးရလဒ်မှာ ဖွဲ့စည်းမယ့် cluster (k) အရေအတွက်ကို သတ်မှတ်ရမှာဖြစ်ပါတယ်။ Dataset ထဲကနေ သီချင်းအမျိုးအစား ၃ မျိုးကို ခွဲထုတ်ထားတာကို သိပြီးသားဖြစ်တဲ့အတွက် ၃ ကိုစမ်းကြည့်ရအောင်:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "uC4EQ5w7LXy5"
},
"source": [
"set.seed(2056)\n",
"# Kmeans clustering for 3 clusters\n",
"kclust <- kmeans(\n",
" df_numeric_select,\n",
" # Specify the number of clusters\n",
" centers = 3,\n",
" # How many random initial configurations\n",
" nstart = 25\n",
")\n",
"\n",
"# Display clustering object\n",
"kclust\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzfhscWrLXy-"
},
"source": [
"kmeans အရာဝတ္ထုတွင် `help(\"kmeans()\")` တွင်ကောင်းစွာရှင်းပြထားသော အချက်အလက်များစွာပါရှိသည်။ အခုအချိန်မှာတော့ အချို့အချက်အလက်များကိုသာ အာရုံစိုက်ကြမယ်။ အချက်အလက်များကို 65, 110, 111 အရွယ်အစားရှိသော 3 ခုအုပ်စုအလိုက် ခွဲထားသည်ကို တွေ့ရသည်။ ထို့အပြင် အထွက်မှာ 5 ခုသော အပြောင်းအလဲများအတွက် အုပ်စု 3 ခု၏ အုပ်စုအလယ်ဗဟို (mean) များကိုလည်း ပါရှိသည်။\n",
"\n",
"Clustering vector သည် တစ်ခုချင်းစီသော observation အတွက် အုပ်စုခွဲခြင်းအမည်ဖြစ်သည်။ `augment` function ကို အသုံးပြု၍ အုပ်စုခွဲခြင်းအမည်ကို မူရင်းဒေတာအစုအဝေးထဲသို့ ထည့်သွင်းကြရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0XwwpFGQLXy_"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"augment(kclust, df_numeric_select) %>% \n",
" relocate(.cluster) %>% \n",
" slice_head(n = 10)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NXIVXXACLXzA"
},
"source": [
"ကျွန်တော်တို့ dataset ကို ၃ အုပ်အုပ်စုအဖြစ် ခွဲခြားပြီးပြီ။ ဒါဆိုရင် ကျွန်တော်တို့ clustering က ဘယ်လောက်ကောင်းလဲ 🤷? `Silhouette score` ကိုကြည့်လိုက်ရအောင်။\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Silhouette analysis](https://en.wikipedia.org/wiki/Silhouette_(clustering)) ကို အသုံးပြုပြီး အုပ်စုတွေကြားက ခွဲခြားမှုအကွာအဝေးကို လေ့လာနိုင်ပါတယ်။ ဒီ score ဟာ -1 ကနေ 1 အထိ ပြောင်းလဲနိုင်ပြီး၊ score က 1 နီးစပ်ရင် အုပ်စုဟာ တင်းကျပ်ပြီး အခြားအုပ်စုတွေနဲ့ ကောင်းစွာ ခွဲခြားထားတယ်လို့ ဆိုနိုင်ပါတယ်။ 0 နီးစပ်တဲ့ value ကတော့ အနီးအနားမှာရှိတဲ့ အုပ်စုတွေရဲ့ decision boundary နဲ့ sample တွေ overlap ဖြစ်နေတယ်လို့ ပြသပါတယ်။ [source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)\n",
"\n",
"Average silhouette method က observations တွေရဲ့ average silhouette ကို *k* ရဲ့ အမျိုးမျိုးသော value တွေအတွက် တွက်ချက်ပေးပါတယ်။ Average silhouette score မြင့်မားရင် clustering ကောင်းတယ်လို့ ဆိုနိုင်ပါတယ်။\n",
"\n",
"`silhouette` function ကို cluster package ထဲမှာ အသုံးပြုပြီး average silhouette width ကို တွက်ချက်နိုင်ပါတယ်။\n",
"\n",
"> Silhouette ကို [distance](https://en.wikipedia.org/wiki/Distance \"Distance\") metric မျိုးစုံနဲ့ တွက်ချက်နိုင်ပါတယ်၊ ဥပမာ [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") နဲ့ [Manhattan distance](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") တို့ဖြစ်ပြီး၊ အဲဒီ distance တွေကို [ယခင်သင်ခန်းစာ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) မှာ ဆွေးနွေးခဲ့ပါတယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jn0McL28LXzB"
},
"source": [
"# Load cluster package\n",
"library(cluster)\n",
"\n",
"# Compute average silhouette score\n",
"ss <- silhouette(kclust$cluster,\n",
" # Compute euclidean distance\n",
" dist = dist(df_numeric_select))\n",
"mean(ss[, 3])\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QyQRn97nLXzC"
},
"source": [
"ကျွန်ုပ်တို့၏ အမှတ်သည် **.549** ဖြစ်ပြီး အလယ်အလတ်တွင် ရှိနေသည်။ ဤသည်မှာ ကျွန်ုပ်တို့၏ ဒေတာသည် ဤအမျိုးအစား၏ clustering အတွက် အထူးသင့်လျော်မှုမရှိကြောင်း ပြသသည်။ ဤအယူအဆကို မြင်သာစွာ အတည်ပြုနိုင်မလားဆိုတာ ကြည့်ကြရအောင်။ [factoextra package](https://rpkgs.datanovia.com/factoextra/index.html) သည် clustering ကို မြင်သာစေသော (`fviz_cluster()`) function များကို ပံ့ပိုးပေးသည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7a6Km1_FLXzD"
},
"source": [
"library(factoextra)\n",
"\n",
"# Visualize clustering results\n",
"fviz_cluster(kclust, df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBwCWt-0LXzD"
},
"source": [
"အုပ်စုများအကြားအပြန်အလှန်ကျယ်ကျယ်ပြန့်ပြန့်ဖြစ်နေသည်မှာ ကျွန်ုပ်တို့၏ဒေတာသည် ဤအမျိုးအစားအုပ်စုဖွဲ့ခြင်းအတွက် အထူးသင့်လျော်မှုမရှိကြောင်းကို ဖော်ပြနေသော်လည်း ဆက်လက်လုပ်ဆောင်ကြပါစို့။\n",
"\n",
"## 4. အကောင်းဆုံးအုပ်စုများကိုသတ်မှတ်ခြင်း\n",
"\n",
"K-Means အုပ်စုဖွဲ့ခြင်းတွင် မကြာခဏပေါ်လာသော အခြေခံမေးခွန်းတစ်ခုမှာ - အတန်းအမှတ်အသားများမသိဘဲ ဒေတာကို အုပ်စုများအဖြစ် ဘယ်နှစ်ခုခွဲရမလဲဆိုတာကို ဘယ်လိုသိနိုင်မလဲဆိုတာဖြစ်သည်။\n",
"\n",
"သိနိုင်ရန်နည်းလမ်းတစ်ခုမှာ `အုပ်စုဖွဲ့မော်ဒယ်များစီးရီး` ကို အုပ်စုအရေအတွက်တိုးတက်လာစေပြီး (ဥပမာ 1-10) ဒေတာနမူနာကို အသုံးပြုကာ **Silhouette score** ကဲ့သို့သော အုပ်စုဖွဲ့မီထရစ်များကို အကဲဖြတ်ခြင်းဖြစ်သည်။\n",
"\n",
"အကောင်းဆုံးအုပ်စုအရေအတွက်ကို *k* ရဲ့ တန်ဖိုးအမျိုးမျိုးအတွက် အုပ်စုဖွဲ့အယ်လဂိုရီသုံးပြီး **Within Cluster Sum of Squares** (WCSS) ကိုတွက်ချက်ခြင်းဖြင့် သတ်မှတ်ကြမည်။ အစုအတွင်း စုစုပေါင်း စတုရန်းပမာဏ (WCSS) သည် အုပ်စုဖွဲ့ခြင်း၏ တိကျမှုကိုတိုင်းတာပြီး ဒေတာအချက်အလက်များနီးစပ်မှုကို ဖော်ပြသည့်အတွက် တန်ဖိုးနည်းသင့်သည်။ တန်ဖိုးနည်းသည့်အခါ ဒေတာအချက်အလက်များ ပိုနီးစပ်သည်ကိုဆိုလိုသည်။\n",
"\n",
"အုပ်စုအရေအတွက် `k` ကို 1 မှ 10 အထိ ရွေးချယ်မှုများ၏ သက်ရောက်မှုကို လေ့လာကြစို့။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hSeIiylDLXzE"
},
"source": [
"# Create a series of clustering models\n",
"kclusts <- tibble(k = 1:10) %>% \n",
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
" # Farm out clustering metrics eg WCSS\n",
" glanced = map(model, ~ glance(.x))) %>% \n",
" unnest(cols = glanced)\n",
" \n",
"\n",
"# View clustering rsulsts\n",
"kclusts\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "m7rS2U1eLXzE"
},
"source": [
"ယခုအခါတွင် center *k* ဖြင့် clustering algorithm တစ်ခုစီအတွက် total within-cluster sum-of-squares (tot.withinss) ရရှိပြီးနောက်၊ [elbow method](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) ကိုအသုံးပြု၍ cluster အရေအတွက်အကောင်းဆုံးကိုရှာဖွေပါသည်။ ဤနည်းလမ်းသည် cluster အရေအတွက်၏ function အနေဖြင့် WCSS ကိုပုံဖော်ခြင်းနှင့် [curve ၏ elbow](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") ကို cluster အရေအတွက်အဖြစ်ရွေးချယ်ခြင်းဖြင့် ဖွဲ့စည်းထားသည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_DjHGItLXzF"
},
"source": [
"set.seed(2056)\n",
"# Use elbow method to determine optimum number of clusters\n",
"kclusts %>% \n",
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "pLYyt5XSLXzG"
},
"source": [
"ဒီဇာတ်ကြောင်းမှာ WCSS အတွက် အလွန်လျော့ကျမှု (ထို့ကြောင့် *တင်းကျပ်မှု* ပိုများလာခြင်း) ကို ကလပ်စတာအရေအတွက် တစ်ခုမှ နှစ်ခုသို့ တိုးလာသည့်အခါ တွေ့ရပြီး၊ နှစ်ခုမှ သုံးခုသို့ တိုးလာသည့်အခါတွင်လည်း ထင်ရှားသော လျော့ကျမှုကို တွေ့ရသည်။ ထို့နောက်တွင်တော့ လျော့ကျမှုသည် သိသာစွာ မရှိတော့ဘဲ၊ ချတ်တွင် သုံးခုခန့်ရှိသော ကလပ်စတာများတွင် `elbow` 💪 တစ်ခု ဖြစ်ပေါ်လာသည်ကို တွေ့ရသည်။ ဒါကတော့ ဒေတာအချက်အလက်များကို သီးခြားကွဲထွက်စွာ သုံးခုခန့်ရှိကြောင်းကို ကောင်းမွန်စွာ ပြသနေသည်။\n",
"\n",
"အခုတော့ `k = 3` ဖြစ်သော clustering မော်ဒယ်ကို ထုတ်ယူနိုင်ပြီဖြစ်သည်။\n",
"\n",
"> `pull()`: တစ်ခုတည်းသော ကော်လံကို ထုတ်ယူရန် အသုံးပြုသည် \n",
">\n",
"> `pluck()`: စာရင်းများကဲ့သို့သော ဒေတာဖွဲ့စည်းမှုများကို အညွှန်းပြရန် အသုံးပြုသည် \n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JP_JPKBILXzG"
},
"source": [
"# Extract k = 3 clustering\n",
"final_kmeans <- kclusts %>% \n",
" filter(k == 3) %>% \n",
" pull(model) %>% \n",
" pluck(1)\n",
"\n",
"\n",
"final_kmeans\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_PDTu8tLXzI"
},
"source": [
"အိုကေ! အခုရထားတဲ့ cluster တွေကို မြင်တွေ့ကြည့်ရှုကြမယ်။ `plotly` ကိုသုံးပြီး အပြန်အလှန်ဆက်သွယ်နိုင်တဲ့ visualization လုပ်ချင်ပါသလား?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dNcleFe-LXzJ"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
"\n",
"# Plot cluster assignments\n",
"clust_plt <- results %>% \n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
" geom_point(size = 2, alpha = 0.8) +\n",
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
"\n",
"ggplotly(clust_plt)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6JUM_51VLXzK"
},
"source": [
"သင့်အားဖြင့် အရောင်အမျိုးမျိုးဖြင့် ဖော်ပြထားသော အစုအဖွဲ့တစ်ခုစီသည် အမျိုးအစားအမျိုးမျိုး (ပုံသဏ္ဍာန်အမျိုးမျိုးဖြင့် ဖော်ပြထားသော) ကို သီးခြားထားမည်ဟု မျှော်လင့်နိုင်ပါသည်။\n",
"\n",
"အခုတော့ မော်ဒယ်၏ တိကျမှုကို ကြည့်ရှုကြမည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HdIMUGq7LXzL"
},
"source": [
"# Assign genres to predefined integers\n",
"label_count <- results %>% \n",
" group_by(artist_top_genre) %>% \n",
" mutate(id = cur_group_id()) %>% \n",
" ungroup() %>% \n",
" summarise(correct_labels = sum(.cluster == id))\n",
"\n",
"\n",
"# Print results \n",
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
"\n",
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C50wvaAOLXzM"
},
"source": [
"ဒီမော်ဒယ်ရဲ့တိကျမှုက မဆိုးဘူး၊ ဒါပေမယ့် အလွန်ကောင်းလို့မရောက်သေးဘူး။ ဒေတာဟာ K-Means Clustering နဲ့အတူ အလုပ်လုပ်ဖို့မသင့်တော်နိုင်ဘူးလို့ဖြစ်နိုင်ပါတယ်။ ဒီဒေတာဟာ မျှတမှုမရှိလွန်းတာ၊ ဆက်စပ်မှုနည်းလွန်းတာ၊ နဲ့ ကော်လံတန်ဖိုးတွေကြားမှာ အပြောင်းအလဲများလွန်းတာကြောင့် အုပ်စုဖွဲ့ဖို့မလွယ်ကူပါဘူး။ အမှန်တကယ်တော့ ဖွဲ့စည်းထားတဲ့အုပ်စုတွေဟာ အထက်မှာသတ်မှတ်ထားတဲ့ ဇာနီးသုံးမျိုးကဏ္ဍတွေက အလွန်အကျွံသက်ရောက်မှုရှိတာဖြစ်နိုင်ပါတယ်။\n",
"\n",
"ဒါပေမယ့်လည်း၊ ဒီလေ့လာမှုက အတော်လေးအကျိုးရှိတဲ့လုပ်ငန်းစဉ်တစ်ခုပါပဲ!\n",
"\n",
"Scikit-learn ရဲ့စာရွက်စာတမ်းတွေမှာ၊ ဒီလိုမော်ဒယ်တစ်ခု၊ အုပ်စုတွေက အလွန်ရှင်းလင်းစွာမသတ်မှတ်ထားတဲ့အခါမှာ 'variance' ပြဿနာရှိတယ်လို့တွေ့နိုင်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Scikit-learn မှ Infographic</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variance**\n",
"\n",
"Variance ကို \"Mean မှအကွာအဝေးရဲ့စတုရန်းတန်ဖိုးတွေရဲ့ပျမ်းမျှ\" ဟုသတ်မှတ်ထားသည် [အရင်းအမြစ်](https://www.mathsisfun.com/data/standard-deviation.html)။ ဒီ clustering ပြဿနာရဲ့အခြေအနေမှာတော့၊ ဒေတာတွေဟာ Mean မှအလွန်အကျွံကွာဟမှုရှိတယ်ဆိုတာကိုရည်ညွှန်းပါတယ်။\n",
"\n",
"✅ ဒီပြဿနာကိုပြင်ဆင်နိုင်တဲ့နည်းလမ်းတွေကိုစဉ်းစားဖို့အချိန်ကောင်းတစ်ခုပါပဲ။ ဒေတာကိုနည်းနည်းပိုပြီးပြင်ဆင်မလား? ကော်လံအခြားတွေကိုသုံးမလား? အခြား algorithm ကိုသုံးမလား? အကြံပြုချက်: [ဒေတာကို scale လုပ်ပါ](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/)၊ ဒေတာကို normalize လုပ်ပြီး အခြားကော်လံတွေကိုစမ်းသပ်ပါ။\n",
"\n",
"> ဒီ '[variance calculator](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ကိုသုံးပြီး concept ကိုနည်းနည်းပိုနားလည်နိုင်ပါတယ်။\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Challenge**\n",
"\n",
"ဒီ notebook ကိုနည်းနည်းအချိန်ယူပြီး parameter တွေကိုပြင်ဆင်ပါ။ ဒေတာကိုပိုပြီးသန့်စင်ခြင်း (ဥပမာ - outliers ဖယ်ရှားခြင်း) ကတဆင့် မော်ဒယ်ရဲ့တိကျမှုကိုတိုးတက်စေနိုင်မလား? သတ်မှတ်ထားတဲ့ဒေတာ sample တွေကိုပိုပြီးအလေးပေးဖို့ weight တွေကိုအသုံးပြုနိုင်ပါတယ်။ အုပ်စုတွေကိုပိုကောင်းစွာဖွဲ့စည်းဖို့အခြားဘာတွေလုပ်နိုင်မလဲ?\n",
"\n",
"အကြံပြုချက်: ဒေတာကို scale လုပ်ကြည့်ပါ။ notebook မှာ commented code ရှိပါတယ်၊ ဒါဟာ standard scaling ကိုထည့်သွင်းပြီး ဒေတာကော်လံတွေကို range ရဲ့အနီးအနားမှာတူညီစေဖို့အတွက်ပါ။ Silhouette score ကကျသွားပေမယ့် elbow graph ရဲ့ 'kink' က smooth ဖြစ်သွားတာကိုတွေ့ရပါမယ်။ ဒါဟာ ဒေတာကို unscaled ထားလိုက်ရင် variance နည်းတဲ့ဒေတာတွေကပိုအလေးပေးခံရတာကြောင့်ဖြစ်ပါတယ်။ ဒီပြဿနာအကြောင်းနည်းနည်းပိုဖတ်ရှုပါ [ဒီမှာ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)။\n",
"\n",
"## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Review & Self Study**\n",
"\n",
"- K-Means Simulator [ဒီလိုတစ်ခု](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) ကိုကြည့်ရှုပါ။ ဒီ tool ကို sample data point တွေကို visualization လုပ်ပြီး centroid တွေကိုသတ်မှတ်ဖို့အသုံးပြုနိုင်ပါတယ်။ ဒေတာရဲ့ randomness, အုပ်စုအရေအတွက်နဲ့ centroid အရေအတွက်တွေကိုပြင်ဆင်နိုင်ပါတယ်။ ဒေတာကိုအုပ်စုဖွဲ့စည်းနိုင်တဲ့နည်းလမ်းကိုနားလည်စေဖို့ကူညီနိုင်ပါသလား?\n",
"\n",
"- [Stanford မှ K-Means အကြောင်း handout](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) ကိုလည်းကြည့်ရှုပါ။\n",
"\n",
"K-Means clustering နဲ့အလုပ်လုပ်ဖို့သင့်တော်တဲ့ဒေတာ set တွေကိုစမ်းသပ်ချင်ပါသလား? ဒီနေရာတွေကိုကြည့်ရှုပါ-\n",
"\n",
"- [Train and Evaluate Clustering Models](https://rpubs.com/eR_ic/clustering) Tidymodels နဲ့အတူ\n",
"\n",
"- [K-means Cluster Analysis](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-means clustering with tidy data principles](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Assignment**\n",
"\n",
"[Clustering နည်းလမ်းအမျိုးမျိုးကိုစမ်းကြည့်ပါ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## THANK YOU TO:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) က ဒီ module ရဲ့ Python version ကိုဖန်တီးပေးခဲ့တာအတွက် ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) က R ကိုပိုပြီးကြိုဆိုဖို့နဲ့စိတ်ဝင်စားဖို့ကူညီတဲ့အံ့မခန်း illustration တွေကိုဖန်တီးပေးခဲ့ပါတယ်။ သူမရဲ့ [gallery](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) မှာ illustration တွေကိုရှာဖွေကြည့်ရှုနိုင်ပါတယ်။\n",
"\n",
"ပညာရရှိပါစေ၊\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>@allison_horst ရဲ့အနုပညာ</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}