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.
491 lines
28 KiB
491 lines
28 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **Nigerian Music na Nakalap mula sa Spotify - Isang Pagsusuri**\n",
|
|
"\n",
|
|
"Ang clustering ay isang uri ng [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning) na ipinapalagay na ang isang dataset ay walang label o ang mga input nito ay hindi tumutugma sa mga paunang natukoy na output. Gumagamit ito ng iba't ibang mga algorithm upang ayusin ang mga unlabeled na data at magbigay ng mga pangkat batay sa mga pattern na natutukoy nito sa data.\n",
|
|
"\n",
|
|
"[**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
|
|
"\n",
|
|
"### **Panimula**\n",
|
|
"\n",
|
|
"Ang [Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) ay napaka-kapaki-pakinabang para sa pagsusuri ng data. Tingnan natin kung makakatulong ito sa pagtuklas ng mga uso at pattern sa paraan ng pagkonsumo ng musika ng mga tagapakinig sa Nigeria.\n",
|
|
"\n",
|
|
"> ✅ Maglaan ng isang minuto upang pag-isipan ang mga gamit ng clustering. Sa totoong buhay, nangyayari ang clustering tuwing may tambak kang labahin at kailangang ayusin ang mga damit ng bawat miyembro ng pamilya 🧦👕👖🩲. Sa data science, nangyayari ang clustering kapag sinusubukang suriin ang mga kagustuhan ng isang user, o tukuyin ang mga katangian ng anumang unlabeled na dataset. Sa isang paraan, ang clustering ay tumutulong upang maunawaan ang kaguluhan, tulad ng drawer ng medyas.\n",
|
|
"\n",
|
|
"Sa isang propesyonal na setting, maaaring gamitin ang clustering upang matukoy ang segmentation ng merkado, tulad ng pagtukoy kung anong mga pangkat ng edad ang bumibili ng partikular na mga produkto. Isa pang gamit nito ay ang anomaly detection, halimbawa, upang matukoy ang pandaraya mula sa isang dataset ng mga transaksyon sa credit card. Maaari mo ring gamitin ang clustering upang matukoy ang mga tumor sa isang batch ng mga medikal na scan.\n",
|
|
"\n",
|
|
"✅ Maglaan ng isang minuto upang pag-isipan kung paano mo maaaring naranasan ang clustering sa totoong buhay, tulad ng sa bangko, e-commerce, o negosyo.\n",
|
|
"\n",
|
|
"> 🎓 Nakakatuwang isipin na ang cluster analysis ay nagmula sa mga larangan ng Anthropology at Psychology noong 1930s. Paano kaya ito ginamit noon?\n",
|
|
"\n",
|
|
"Bukod dito, maaari mo itong gamitin para sa pag-grupo ng mga resulta ng paghahanap - tulad ng mga link sa pamimili, mga larawan, o mga review. Ang clustering ay kapaki-pakinabang kapag mayroon kang malaking dataset na nais mong bawasan at suriin nang mas detalyado, kaya't ang teknik na ito ay maaaring gamitin upang matuto tungkol sa data bago bumuo ng iba pang mga modelo.\n",
|
|
"\n",
|
|
"✅ Kapag naayos na ang iyong data sa mga cluster, maaari mo itong bigyan ng cluster Id. Ang teknik na ito ay kapaki-pakinabang din sa pagpapanatili ng privacy ng dataset; maaari mong tukuyin ang isang data point gamit ang cluster Id nito, sa halip na mas detalyado at sensitibong impormasyon. Maaari mo bang maisip ang iba pang dahilan kung bakit mas pipiliin mong tukuyin ang isang cluster gamit ang Id nito kaysa sa iba pang elemento ng cluster?\n",
|
|
"\n",
|
|
"### Pagsisimula sa clustering\n",
|
|
"\n",
|
|
"> 🎓 Ang paraan ng paglikha natin ng mga cluster ay may kinalaman sa kung paano natin pinagsasama-sama ang mga data point sa mga pangkat. Tuklasin natin ang ilang terminolohiya:\n",
|
|
">\n",
|
|
"> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
|
|
">\n",
|
|
"> Ang transductive inference ay nagmumula sa mga naobserbahang training cases na tumutugma sa mga partikular na test cases. Ang inductive inference naman ay nagmumula sa mga training cases na bumubuo ng mga pangkalahatang patakaran na pagkatapos ay inilalapat sa mga test cases.\n",
|
|
">\n",
|
|
"> Halimbawa: Isipin na mayroon kang dataset na bahagyang may label. Ang ilan ay 'records', ang ilan ay 'cds', at ang ilan ay walang label. Ang trabaho mo ay magbigay ng label para sa mga walang label. Kung pipiliin mo ang inductive approach, magtetrain ka ng model na naghahanap ng 'records' at 'cds', at ilalapat ang mga label na iyon sa iyong unlabeled na data. Ang approach na ito ay mahihirapang mag-classify ng mga bagay na aktwal na 'cassettes'. Ang transductive approach, sa kabilang banda, ay mas mahusay sa paghawak ng hindi kilalang data dahil gumagana ito upang pagsama-samahin ang mga magkatulad na item at pagkatapos ay maglapat ng label sa isang pangkat. Sa kasong ito, maaaring ipakita ng mga cluster ang 'mga bilog na bagay na pangmusika' at 'mga parisukat na bagay na pangmusika'.\n",
|
|
">\n",
|
|
"> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
|
|
">\n",
|
|
"> Ang terminong ito ay nagmula sa matematika, kung saan ang 'flat' ay tumutukoy sa [Euclidean](https://wikipedia.org/wiki/Euclidean_geometry) geometry, at ang 'non-flat' ay tumutukoy sa non-Euclidean geometry. Ang geometry ay mahalaga sa machine learning dahil ito ang batayan ng pagsukat ng distansya sa pagitan ng mga puntos sa mga cluster. Ang [Euclidean distances](https://wikipedia.org/wiki/Euclidean_distance) ay sinusukat bilang haba ng linya sa pagitan ng dalawang puntos, habang ang [Non-Euclidean distances](https://wikipedia.org/wiki/Non-Euclidean_geometry) ay sinusukat sa kahabaan ng kurba. Kung ang iyong data ay tila hindi umiiral sa isang patag na eroplano, maaaring kailanganin mong gumamit ng espesyal na algorithm upang hawakan ito.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/flat-nonflat.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infographic ni Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
|
|
">\n",
|
|
"> Ang mga cluster ay tinutukoy ng kanilang distance matrix, halimbawa, ang mga distansya sa pagitan ng mga puntos. Ang distansya ay maaaring sukatin sa iba't ibang paraan. Ang mga Euclidean cluster ay tinutukoy ng average ng mga halaga ng punto, at naglalaman ng isang 'centroid' o gitnang punto. Ang mga distansya ay sinusukat batay sa distansya mula sa centroid. Ang mga non-Euclidean distances naman ay tumutukoy sa 'clustroids', ang puntong pinakamalapit sa iba pang mga punto. Ang mga clustroids ay maaaring tukuyin sa iba't ibang paraan.\n",
|
|
">\n",
|
|
"> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering)\n",
|
|
">\n",
|
|
"> Ang [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) ay nagdadala ng 'semi-supervised' na pag-aaral sa unsupervised na metodolohiya. Ang mga relasyon sa pagitan ng mga puntos ay minamarkahan bilang 'cannot link' o 'must-link' upang magpatupad ng ilang mga patakaran sa dataset.\n",
|
|
">\n",
|
|
"> Halimbawa: Kung ang isang algorithm ay malayang gumagana sa isang batch ng unlabelled o semi-labelled na data, ang mga cluster na mabubuo nito ay maaaring hindi maganda ang kalidad. Sa halimbawa sa itaas, maaaring mag-grupo ang mga cluster ng 'mga bilog na bagay na pangmusika', 'mga parisukat na bagay na pangmusika', 'mga triangular na bagay', at 'cookies'. Kung bibigyan ng ilang mga constraint, tulad ng \"ang item ay dapat gawa sa plastik\" o \"ang item ay kailangang makagawa ng musika\", makakatulong ito upang gawing mas mahusay ang mga pagpipilian ng algorithm.\n",
|
|
">\n",
|
|
"> 🎓 'Density'\n",
|
|
">\n",
|
|
"> Ang data na 'maingay' ay itinuturing na 'dense'. Ang mga distansya sa pagitan ng mga puntos sa bawat cluster nito ay maaaring masuri upang malaman kung masyadong siksik o masyadong maluwag, kaya't ang data na ito ay kailangang suriin gamit ang angkop na clustering method. [Ang artikulong ito](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) ay nagpapakita ng pagkakaiba sa paggamit ng K-Means clustering kumpara sa HDBSCAN algorithms upang suriin ang isang maingay na dataset na may hindi pantay na density ng cluster.\n",
|
|
"\n",
|
|
"Palalimin ang iyong kaalaman sa clustering techniques sa [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
|
|
"\n",
|
|
"### **Mga Algorithm ng Clustering**\n",
|
|
"\n",
|
|
"Mayroong higit sa 100 clustering algorithms, at ang paggamit nito ay nakadepende sa kalikasan ng data. Talakayin natin ang ilan sa mga pangunahing uri:\n",
|
|
"\n",
|
|
"- **Hierarchical clustering**. Kung ang isang bagay ay inuri batay sa kalapitan nito sa isang kalapit na bagay, sa halip na sa mas malayong bagay, ang mga cluster ay nabubuo batay sa distansya ng mga miyembro nito sa isa't isa. Ang hierarchical clustering ay nailalarawan sa pamamagitan ng paulit-ulit na pagsasama-sama ng dalawang cluster.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/hierarchical.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infographic ni Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"- **Centroid clustering**. Ang sikat na algorithm na ito ay nangangailangan ng pagpili ng 'k', o ang bilang ng mga cluster na bubuuin, pagkatapos nito ay tinutukoy ng algorithm ang gitnang punto ng isang cluster at kinokolekta ang data sa paligid ng puntong iyon. Ang [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) ay isang tanyag na bersyon ng centroid clustering na naghihiwalay sa isang dataset sa mga paunang natukoy na K na grupo. Ang sentro ay tinutukoy ng pinakamalapit na mean, kaya't ang pangalan. Ang squared distance mula sa cluster ay pinapaliit.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/centroid.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infographic ni Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"- **Distribution-based clustering**. Nakabatay sa statistical modeling, ang distribution-based clustering ay nakatuon sa pagtukoy ng posibilidad na ang isang data point ay kabilang sa isang cluster, at iniuugnay ito nang naaayon. Ang Gaussian mixture methods ay kabilang sa ganitong uri.\n",
|
|
"\n",
|
|
"- **Density-based clustering**. Ang mga data point ay iniuugnay sa mga cluster batay sa kanilang density, o ang kanilang pagkakagrupo sa isa't isa. Ang mga data point na malayo sa grupo ay itinuturing na outliers o noise. Ang DBSCAN, Mean-shift, at OPTICS ay kabilang sa ganitong uri ng clustering.\n",
|
|
"\n",
|
|
"- **Grid-based clustering**. Para sa mga multi-dimensional na dataset, isang grid ang nililikha at ang data ay hinahati sa mga cell ng grid, kaya't nabubuo ang mga cluster.\n",
|
|
"\n",
|
|
"Ang pinakamahusay na paraan upang matutunan ang clustering ay subukan ito mismo, kaya't iyon ang gagawin mo sa aktibidad na ito.\n",
|
|
"\n",
|
|
"Kakailanganin natin ang ilang mga package upang matapos ang module na ito. Maaari mo silang mai-install gamit ang: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
|
|
"\n",
|
|
"Bilang alternatibo, ang script sa ibaba ay susuriin kung mayroon ka ng mga kinakailangang package upang makumpleto ang module na ito at awtomatikong mai-install ang mga nawawala.\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": [
|
|
"## Ehersisyo - i-cluster ang iyong data\n",
|
|
"\n",
|
|
"Ang clustering bilang isang teknika ay lubos na natutulungan ng tamang visualisasyon, kaya't simulan natin sa pag-visualize ng ating music data. Ang ehersisyong ito ay makakatulong sa atin na magdesisyon kung alin sa mga pamamaraan ng clustering ang pinaka-epektibong gamitin para sa uri ng data na ito.\n",
|
|
"\n",
|
|
"Simulan na natin sa pag-import ng data.\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": [
|
|
"Minsan, maaaring gusto nating magkaroon ng kaunting karagdagang impormasyon tungkol sa ating datos. Maaari nating tingnan ang `data` at ang `istruktura nito` gamit ang [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) na function:\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": [
|
|
"Magaling!💪\n",
|
|
"\n",
|
|
"Makikita natin na ang `glimpse()` ay magbibigay sa iyo ng kabuuang bilang ng mga hilera (observations) at mga kolum (variables), pagkatapos, ang ilang unang entries ng bawat variable sa isang hilera pagkatapos ng pangalan ng variable. Bukod dito, ang *uri ng data* ng variable ay ipinapakita kaagad pagkatapos ng pangalan ng bawat variable sa loob ng `< >`.\n",
|
|
"\n",
|
|
"Ang `DataExplorer::introduce()` ay maaaring magbuod ng impormasyong ito nang maayos:\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": [
|
|
"Ang galing! Natutunan natin na walang nawawalang halaga sa ating datos.\n",
|
|
"\n",
|
|
"Habang nandito na rin tayo, maaari nating tuklasin ang mga karaniwang istatistika ng sentral na tendensya (hal. [mean](https://en.wikipedia.org/wiki/Arithmetic_mean) at [median](https://en.wikipedia.org/wiki/Median)) at mga sukat ng pagkakaiba-iba (hal. [standard deviation](https://en.wikipedia.org/wiki/Standard_deviation)) gamit ang `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": [
|
|
"Tingnan natin ang pangkalahatang halaga ng datos. Tandaan na ang popularity ay maaaring `0`, na nagpapakita ng mga kanta na walang ranking. Tatanggalin natin ang mga ito sa ilang sandali.\n",
|
|
"\n",
|
|
"> 🤔 Kung gumagamit tayo ng clustering, isang unsupervised na pamamaraan na hindi nangangailangan ng labeled data, bakit natin ipinapakita ang datos na may labels? Sa yugto ng paggalugad ng datos, nakakatulong ang mga ito, ngunit hindi naman kinakailangan para gumana ang clustering algorithms.\n",
|
|
"\n",
|
|
"### 1. Tuklasin ang mga sikat na genre\n",
|
|
"\n",
|
|
"Sige, alamin natin ang mga pinakasikat na genre 🎶 sa pamamagitan ng pagbibilang ng bilang ng mga pagkakataon na lumalabas ang mga ito.\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": [
|
|
"Maganda ang kinalabasan! Sabi nila, ang isang larawan ay katumbas ng libu-libong hanay ng isang data frame (bagamat wala talagang nagsasabi niyan 😅). Pero naiintindihan mo ang ibig kong sabihin, di ba?\n",
|
|
"\n",
|
|
"Isang paraan para maipakita ang categorical data (character o factor variables) ay gamit ang barplots. Gumawa tayo ng barplot para sa nangungunang 10 genre:\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": [
|
|
"Ngayon, mas madali nang matukoy na mayroon tayong `missing` na mga genre 🧐!\n",
|
|
"\n",
|
|
"> Ang isang mahusay na visualisasyon ay magpapakita sa iyo ng mga bagay na hindi mo inaasahan, o magtatanong ng mga bagong katanungan tungkol sa datos - Hadley Wickham at Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
|
|
"\n",
|
|
"Tandaan, kapag ang nangungunang genre ay tinukoy bilang `Missing`, ibig sabihin nito ay hindi ito inuri ng Spotify, kaya alisin na natin ito.\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": [
|
|
"Mula sa kaunting pagsusuri ng datos, nalaman natin na ang tatlong nangungunang genre ang nangingibabaw sa dataset na ito. Mag-focus tayo sa `afro dancehall`, `afropop`, at `nigerian pop`, at dagdagan pa ng pag-filter sa dataset upang alisin ang anumang may 0 na halaga ng kasikatan (ibig sabihin, hindi ito nauri na may kasikatan sa dataset at maituturing na ingay para sa ating layunin):\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": [
|
|
"Tingnan natin kung may malinaw na linear na relasyon sa pagitan ng mga numerikal na variable sa ating data set. Ang relasyong ito ay sinusukat nang matematikal gamit ang [correlation statistic](https://en.wikipedia.org/wiki/Correlation).\n",
|
|
"\n",
|
|
"Ang correlation statistic ay isang halaga sa pagitan ng -1 at 1 na nagpapakita ng lakas ng relasyon. Ang mga halaga na mas mataas sa 0 ay nagpapahiwatig ng *positibong* korelasyon (ang mataas na halaga ng isang variable ay karaniwang kasabay ng mataas na halaga ng isa pa), habang ang mga halaga na mas mababa sa 0 ay nagpapahiwatig ng *negatibong* korelasyon (ang mataas na halaga ng isang variable ay karaniwang kasabay ng mababang halaga ng isa pa).\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": [
|
|
"Ang datos ay hindi masyadong magkakaugnay maliban sa pagitan ng `energy` at `loudness`, na may katuturan, dahil ang malalakas na musika ay karaniwang mas masigla. Ang `Popularity` ay may kaugnayan sa `release date`, na may katuturan din, dahil ang mas bagong mga kanta ay malamang na mas sikat. Mukhang may kaugnayan din ang haba at enerhiya.\n",
|
|
"\n",
|
|
"Magiging interesante na makita kung ano ang magagawa ng isang clustering algorithm sa datos na ito!\n",
|
|
"\n",
|
|
"> 🎓 Tandaan na ang korelasyon ay hindi nangangahulugan ng sanhi! Mayroon tayong patunay ng korelasyon ngunit walang patunay ng sanhi. Ang isang [nakakatawang web site](https://tylervigen.com/spurious-correlations) ay may ilang mga visual na binibigyang-diin ang puntong ito.\n",
|
|
"\n",
|
|
"### 2. Suriin ang distribusyon ng datos\n",
|
|
"\n",
|
|
"Magtanong tayo ng mas maseselang tanong. Ang mga genre ba ay may malaking pagkakaiba sa pananaw ng kanilang danceability, batay sa kanilang kasikatan? Suriin natin ang distribusyon ng datos ng ating nangungunang tatlong genre para sa kasikatan at danceability sa isang ibinigay na x at y axis gamit ang [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": [
|
|
"Nakikita natin na may mga magkakapatong na bilog na nagkakatugma, anuman ang genre. Posible kayang nagkakasundo ang panlasa ng mga Nigerian sa isang tiyak na antas ng sayawabilidad para sa genre na ito?\n",
|
|
"\n",
|
|
"Sa pangkalahatan, ang tatlong genre ay nagkakatugma pagdating sa kanilang kasikatan at sayawabilidad. Ang pagtukoy ng mga kumpol sa datos na ito na bahagyang magkakatugma ay magiging isang hamon. Tingnan natin kung makakatulong ang isang scatter plot dito.\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": [
|
|
"Ang scatterplot ng parehong mga axes ay nagpapakita ng katulad na pattern ng convergence.\n",
|
|
"\n",
|
|
"Sa pangkalahatan, para sa clustering, maaari mong gamitin ang scatterplots upang ipakita ang mga kumpol ng data, kaya ang pag-master ng ganitong uri ng visualization ay napakahalaga. Sa susunod na aralin, gagamitin natin ang na-filter na data na ito at gagamit ng k-means clustering upang matuklasan ang mga grupo sa data na ito na tila nag-o-overlap sa mga kawili-wiling paraan.\n",
|
|
"\n",
|
|
"## **🚀 Hamon**\n",
|
|
"\n",
|
|
"Bilang paghahanda para sa susunod na aralin, gumawa ng chart tungkol sa iba't ibang clustering algorithms na maaari mong matuklasan at gamitin sa isang production environment. Anong mga uri ng problema ang sinusubukang tugunan ng clustering?\n",
|
|
"\n",
|
|
"## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
|
|
"\n",
|
|
"## **Review at Pag-aaral sa Sarili**\n",
|
|
"\n",
|
|
"Bago ka mag-apply ng clustering algorithms, tulad ng natutunan natin, magandang ideya na maunawaan ang kalikasan ng iyong dataset. Magbasa pa tungkol sa paksang ito [dito](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
|
|
"\n",
|
|
"Palalimin ang iyong kaalaman sa clustering techniques:\n",
|
|
"\n",
|
|
"- [Mag-train at Mag-evaluate ng Clustering Models gamit ang Tidymodels at mga kaibigan](https://rpubs.com/eR_ic/clustering)\n",
|
|
"\n",
|
|
"- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
|
|
"\n",
|
|
"## **Takdang-Aralin**\n",
|
|
"\n",
|
|
"[Mag-research ng iba pang visualizations para sa clustering](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
|
|
"\n",
|
|
"## SALAMAT SA:\n",
|
|
"\n",
|
|
"[Jen Looper](https://www.twitter.com/jenlooper) para sa paglikha ng orihinal na Python na bersyon ng module na ito ♥️\n",
|
|
"\n",
|
|
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) para sa paglikha ng mga kamangha-manghang ilustrasyon na nagpapadali sa pag-unawa sa mga konsepto ng machine learning.\n",
|
|
"\n",
|
|
"Masayang Pag-aaral,\n",
|
|
"\n",
|
|
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito.\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:14:52+00:00",
|
|
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
|
|
"language_code": "tl"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
} |