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/ms/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb

499 lines
28 KiB

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Analisis Muzik Nigeria yang diambil dari Spotify**\n",
"\n",
"Pengelompokan adalah sejenis [Pembelajaran Tanpa Pengawasan](https://wikipedia.org/wiki/Unsupervised_learning) yang mengandaikan bahawa dataset tidak berlabel atau inputnya tidak dipadankan dengan output yang telah ditentukan. Ia menggunakan pelbagai algoritma untuk menyusun data yang tidak berlabel dan menyediakan kumpulan berdasarkan corak yang dikenalpasti dalam data.\n",
"\n",
"[**Kuiz sebelum kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Pengenalan**\n",
"\n",
"[Pengelompokan](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) sangat berguna untuk penerokaan data. Mari kita lihat sama ada ia boleh membantu mengenal pasti trend dan corak dalam cara penonton Nigeria menikmati muzik.\n",
"\n",
"> ✅ Luangkan masa untuk memikirkan kegunaan pengelompokan. Dalam kehidupan sebenar, pengelompokan berlaku apabila anda mempunyai timbunan pakaian dan perlu menyusun pakaian ahli keluarga anda 🧦👕👖🩲. Dalam sains data, pengelompokan berlaku apabila cuba menganalisis pilihan pengguna, atau menentukan ciri-ciri dataset yang tidak berlabel. Pengelompokan, dalam satu cara, membantu memahami kekacauan, seperti laci stokin.\n",
"\n",
"Dalam persekitaran profesional, pengelompokan boleh digunakan untuk menentukan perkara seperti segmentasi pasaran, menentukan kumpulan umur yang membeli barangan tertentu, sebagai contoh. Kegunaan lain adalah pengesanan anomali, mungkin untuk mengesan penipuan daripada dataset transaksi kad kredit. Atau anda mungkin menggunakan pengelompokan untuk menentukan tumor dalam kumpulan imbasan perubatan.\n",
"\n",
"✅ Luangkan masa untuk memikirkan bagaimana anda mungkin pernah menemui pengelompokan 'di alam liar', dalam perbankan, e-dagang, atau perniagaan.\n",
"\n",
"> 🎓 Menariknya, analisis pengelompokan berasal dari bidang Antropologi dan Psikologi pada tahun 1930-an. Bolehkah anda bayangkan bagaimana ia mungkin digunakan?\n",
"\n",
"Sebagai alternatif, anda boleh menggunakannya untuk mengelompokkan hasil carian - seperti pautan membeli-belah, imej, atau ulasan, sebagai contoh. Pengelompokan berguna apabila anda mempunyai dataset yang besar yang ingin anda kurangkan dan pada dataset tersebut anda ingin melakukan analisis yang lebih terperinci, jadi teknik ini boleh digunakan untuk mempelajari data sebelum model lain dibina.\n",
"\n",
"✅ Setelah data anda diatur dalam kelompok, anda memberikan Id kelompok, dan teknik ini boleh berguna apabila ingin mengekalkan privasi dataset; anda boleh merujuk kepada titik data dengan Id kelompoknya, dan bukannya data yang lebih mendedahkan. Bolehkah anda memikirkan sebab lain mengapa anda merujuk kepada Id kelompok dan bukannya elemen lain dalam kelompok untuk mengenal pasti data tersebut?\n",
"\n",
"### Memulakan pengelompokan\n",
"\n",
"> 🎓 Cara kita mencipta kelompok banyak berkaitan dengan cara kita mengumpulkan titik data ke dalam kumpulan. Mari kita terokai beberapa istilah:\n",
">\n",
"> 🎓 ['Transduktif' vs. 'Induktif'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Inferens transduktif diperoleh daripada kes latihan yang diperhatikan yang memetakan kepada kes ujian tertentu. Inferens induktif diperoleh daripada kes latihan yang memetakan kepada peraturan umum yang hanya kemudian digunakan pada kes ujian.\n",
">\n",
"> Contoh: Bayangkan anda mempunyai dataset yang hanya sebahagiannya berlabel. Beberapa perkara adalah 'rekod', beberapa 'cd', dan beberapa kosong. Tugas anda adalah memberikan label untuk yang kosong. Jika anda memilih pendekatan induktif, anda akan melatih model mencari 'rekod' dan 'cd', dan menerapkan label tersebut pada data yang tidak berlabel. Pendekatan ini akan menghadapi kesukaran mengklasifikasikan perkara yang sebenarnya 'kaset'. Pendekatan transduktif, sebaliknya, menangani data yang tidak diketahui ini dengan lebih berkesan kerana ia berfungsi untuk mengelompokkan item serupa bersama-sama dan kemudian menerapkan label pada kumpulan. Dalam kes ini, kelompok mungkin mencerminkan 'benda muzik bulat' dan 'benda muzik segi empat'.\n",
">\n",
"> 🎓 ['Geometri tidak rata' vs. 'rata'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Berasal daripada istilah matematik, geometri tidak rata vs. rata merujuk kepada ukuran jarak antara titik sama ada dengan kaedah geometri 'rata' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) atau 'tidak rata' (bukan Euclidean).\n",
">\n",
"> 'Rata' dalam konteks ini merujuk kepada geometri Euclidean (bahagian daripadanya diajar sebagai geometri 'dataran'), dan tidak rata merujuk kepada geometri bukan Euclidean. Apa kaitan geometri dengan pembelajaran mesin? Nah, sebagai dua bidang yang berakar dalam matematik, mesti ada cara umum untuk mengukur jarak antara titik dalam kelompok, dan itu boleh dilakukan dengan cara 'rata' atau 'tidak rata', bergantung pada sifat data. [Jarak Euclidean](https://wikipedia.org/wiki/Euclidean_distance) diukur sebagai panjang segmen garis antara dua titik. [Jarak bukan Euclidean](https://wikipedia.org/wiki/Non-Euclidean_geometry) diukur sepanjang lengkung. Jika data anda, yang divisualisasikan, nampaknya tidak wujud pada satah, anda mungkin perlu menggunakan algoritma khusus untuk menanganinya.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Jarak'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Kelompok ditentukan oleh matriks jaraknya, contohnya jarak antara titik. Jarak ini boleh diukur dengan beberapa cara. Kelompok Euclidean ditentukan oleh purata nilai titik, dan mengandungi 'centroid' atau titik tengah. Jarak diukur berdasarkan jarak ke centroid tersebut. Jarak bukan Euclidean merujuk kepada 'clustroid', titik yang paling dekat dengan titik lain. Clustroid pula boleh ditentukan dengan pelbagai cara.\n",
">\n",
"> 🎓 ['Terkekang'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Pengelompokan Terkekang](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) memperkenalkan pembelajaran 'semi-terawasi' ke dalam kaedah tanpa pengawasan ini. Hubungan antara titik ditandai sebagai 'tidak boleh dihubungkan' atau 'mesti dihubungkan' supaya beberapa peraturan dipaksa pada dataset.\n",
">\n",
"> Contoh: Jika algoritma dibiarkan bebas pada kumpulan data yang tidak berlabel atau separa berlabel, kelompok yang dihasilkannya mungkin berkualiti rendah. Dalam contoh di atas, kelompok mungkin mengelompokkan 'benda muzik bulat' dan 'benda muzik segi empat' dan 'benda segi tiga' dan 'kuki'. Jika diberikan beberapa kekangan, atau peraturan untuk diikuti (\"item mesti diperbuat daripada plastik\", \"item perlu dapat menghasilkan muzik\") ini boleh membantu 'mengekang' algoritma untuk membuat pilihan yang lebih baik.\n",
">\n",
"> 🎓 'Ketumpatan'\n",
">\n",
"> Data yang 'berisik' dianggap 'padat'. Jarak antara titik dalam setiap kelompoknya mungkin terbukti, apabila diperiksa, lebih atau kurang padat, atau 'sesak' dan oleh itu data ini perlu dianalisis dengan kaedah pengelompokan yang sesuai. [Artikel ini](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) menunjukkan perbezaan antara menggunakan pengelompokan K-Means vs. algoritma HDBSCAN untuk meneroka dataset yang berisik dengan ketumpatan kelompok yang tidak sekata.\n",
"\n",
"Perdalam pemahaman anda tentang teknik pengelompokan dalam [modul pembelajaran ini](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Algoritma pengelompokan**\n",
"\n",
"Terdapat lebih daripada 100 algoritma pengelompokan, dan penggunaannya bergantung pada sifat data yang ada. Mari kita bincangkan beberapa yang utama:\n",
"\n",
"- **Pengelompokan hierarki**. Jika objek diklasifikasikan berdasarkan jaraknya dengan objek berdekatan, dan bukannya dengan objek yang lebih jauh, kelompok dibentuk berdasarkan jarak anggota mereka ke dan dari objek lain. Pengelompokan hierarki dicirikan oleh penggabungan dua kelompok berulang kali.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Pengelompokan centroid**. Algoritma popular ini memerlukan pilihan 'k', atau bilangan kelompok untuk dibentuk, selepas itu algoritma menentukan titik tengah kelompok dan mengumpulkan data di sekitar titik tersebut. [Pengelompokan K-means](https://wikipedia.org/wiki/K-means_clustering) adalah versi pengelompokan centroid yang popular yang memisahkan dataset kepada kumpulan K yang telah ditentukan. Pusat ditentukan oleh purata terdekat, maka namanya. Jarak kuasa dua dari kelompok diminimumkan.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Pengelompokan berasaskan pengedaran**. Berdasarkan pemodelan statistik, pengelompokan berasaskan pengedaran berpusat pada menentukan kebarangkalian bahawa titik data tergolong dalam kelompok, dan menetapkannya dengan sewajarnya. Kaedah campuran Gaussian tergolong dalam jenis ini.\n",
"\n",
"- **Pengelompokan berasaskan ketumpatan**. Titik data diberikan kepada kelompok berdasarkan ketumpatannya, atau pengelompokannya di sekitar satu sama lain. Titik data yang jauh dari kumpulan dianggap sebagai pencilan atau bunyi. DBSCAN, Mean-shift dan OPTICS tergolong dalam jenis pengelompokan ini.\n",
"\n",
"- **Pengelompokan berasaskan grid**. Untuk dataset pelbagai dimensi, grid dibuat dan data dibahagikan di antara sel grid, dengan itu mencipta kelompok.\n",
"\n",
"Cara terbaik untuk belajar tentang pengelompokan adalah mencubanya sendiri, jadi itulah yang akan anda lakukan dalam latihan ini.\n",
"\n",
"Kami memerlukan beberapa pakej untuk melengkapkan modul ini. Anda boleh memasangnya seperti berikut: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda jika ada yang hilang.\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": [
"## Latihan - kelompokkan data anda\n",
"\n",
"Pengelompokan sebagai teknik sangat dibantu oleh visualisasi yang tepat, jadi mari kita mulakan dengan memvisualisasikan data muzik kita. Latihan ini akan membantu kita menentukan kaedah pengelompokan mana yang paling berkesan digunakan berdasarkan sifat data ini.\n",
"\n",
"Mari kita teruskan dengan mengimport 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": [
"Kadang-kadang, kita mungkin ingin mendapatkan sedikit lebih banyak maklumat tentang data kita. Kita boleh melihat `data` dan `strukturnya` dengan menggunakan fungsi [*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": [
"Kerja yang bagus!💪\n",
"\n",
"Kita dapat lihat bahawa `glimpse()` akan memberikan jumlah baris (pemerhatian) dan lajur (pemboleh ubah), kemudian, beberapa entri pertama bagi setiap pemboleh ubah dalam satu baris selepas nama pemboleh ubah. Selain itu, *jenis data* bagi pemboleh ubah diberikan serta-merta selepas nama pemboleh ubah di dalam `< >`.\n",
"\n",
"`DataExplorer::introduce()` boleh meringkaskan maklumat ini dengan kemas:\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": [
"Hebat! Kita baru sahaja mengetahui bahawa data kita tidak mempunyai nilai yang hilang.\n",
"\n",
"Sambil kita berada di sini, kita boleh meneroka statistik kecenderungan pusat yang biasa (contohnya [min](https://en.wikipedia.org/wiki/Arithmetic_mean) dan [median](https://en.wikipedia.org/wiki/Median)) serta ukuran penyebaran (contohnya [sisihan piawai](https://en.wikipedia.org/wiki/Standard_deviation)) menggunakan `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": [
"Mari kita lihat nilai umum data. Perlu diingat bahawa populariti boleh menjadi `0`, yang menunjukkan lagu-lagu yang tidak mempunyai kedudukan. Kita akan menghapuskan data tersebut sebentar lagi.\n",
"\n",
"> 🤔 Jika kita bekerja dengan pengelompokan, kaedah tanpa pengawasan yang tidak memerlukan data berlabel, mengapa kita menunjukkan data ini dengan label? Dalam fasa penerokaan data, label ini berguna, tetapi ia tidak diperlukan untuk algoritma pengelompokan berfungsi.\n",
"\n",
"### 1. Terokai genre popular\n",
"\n",
"Mari kita teruskan dan cari genre paling popular 🎶 dengan membuat kiraan berapa kali ia muncul.\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": [
"Itu berjalan dengan baik! Mereka kata gambar bernilai seribu baris data bingkai (sebenarnya tiada siapa yang pernah kata begitu 😅). Tetapi anda faham maksudnya, kan?\n",
"\n",
"Salah satu cara untuk menggambarkan data kategori (pemboleh ubah jenis karakter atau faktor) adalah dengan menggunakan barplot. Mari kita buat barplot untuk 10 genre teratas:\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": [
"Sekarang lebih mudah untuk mengenal pasti bahawa kita mempunyai genre `missing` 🧐!\n",
"\n",
"> Visualisasi yang baik akan menunjukkan perkara yang tidak dijangka, atau menimbulkan soalan baru tentang data - Hadley Wickham dan Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Perhatikan, apabila genre teratas digambarkan sebagai `Missing`, itu bermaksud Spotify tidak mengklasifikasikannya, jadi mari kita hapuskannya.\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": [
"Daripada sedikit penerokaan data, kita mendapati bahawa tiga genre teratas mendominasi dataset ini. Mari kita fokus pada `afro dancehall`, `afropop`, dan `nigerian pop`, serta tapis dataset untuk membuang apa sahaja dengan nilai populariti 0 (bermaksud ia tidak diklasifikasikan dengan populariti dalam dataset dan boleh dianggap sebagai gangguan untuk tujuan kita):\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": [
"Mari kita lihat sama ada terdapat hubungan linear yang jelas antara pemboleh ubah berangka dalam set data kita. Hubungan ini dihitung secara matematik melalui [statistik korelasi](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Statistik korelasi adalah nilai antara -1 dan 1 yang menunjukkan kekuatan hubungan. Nilai di atas 0 menunjukkan korelasi *positif* (nilai tinggi bagi satu pemboleh ubah cenderung bertepatan dengan nilai tinggi bagi pemboleh ubah yang lain), manakala nilai di bawah 0 menunjukkan korelasi *negatif* (nilai tinggi bagi satu pemboleh ubah cenderung bertepatan dengan nilai rendah bagi pemboleh ubah yang lain).\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": [
"Data tidak mempunyai korelasi yang kuat kecuali antara `energy` dan `loudness`, yang masuk akal memandangkan muzik yang kuat biasanya lebih bertenaga. `Popularity` mempunyai hubungan dengan `release date`, yang juga masuk akal kerana lagu yang lebih baru mungkin lebih popular. Panjang dan tenaga juga kelihatan mempunyai korelasi.\n",
"\n",
"Ia akan menarik untuk melihat apa yang algoritma pengelompokan boleh lakukan dengan data ini!\n",
"\n",
"> 🎓 Perhatikan bahawa korelasi tidak bermaksud sebab-akibat! Kita mempunyai bukti korelasi tetapi tiada bukti sebab-akibat. Sebuah [laman web yang menghiburkan](https://tylervigen.com/spurious-correlations) mempunyai beberapa visual yang menekankan perkara ini.\n",
"\n",
"### 2. Terokai pengagihan data\n",
"\n",
"Mari kita ajukan beberapa soalan yang lebih halus. Adakah genre berbeza secara signifikan dalam persepsi kebolehmenarian mereka, berdasarkan populariti? Mari kita periksa pengagihan data tiga genre teratas kita untuk populariti dan kebolehmenarian sepanjang paksi x dan y yang diberikan menggunakan [graf ketumpatan](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": [
"Kami melihat terdapat bulatan sepusat yang sejajar, tanpa mengira genre. Adakah mungkin citarasa rakyat Nigeria bertemu pada tahap tertentu dalam kebolehmenarian untuk genre ini?\n",
"\n",
"Secara umum, ketiga-tiga genre ini sejajar dari segi populariti dan kebolehmenarian. Menentukan kelompok dalam data yang kurang sejajar ini akan menjadi cabaran. Mari kita lihat sama ada plot taburan boleh menyokong perkara ini.\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": [
"Plot penyebaran bagi paksi yang sama menunjukkan corak penumpuan yang serupa.\n",
"\n",
"Secara umum, untuk pengelompokan, anda boleh menggunakan plot penyebaran untuk menunjukkan kelompok data, jadi menguasai jenis visualisasi ini sangat berguna. Dalam pelajaran seterusnya, kita akan mengambil data yang telah ditapis ini dan menggunakan pengelompokan k-means untuk mengenal pasti kumpulan dalam data ini yang kelihatan bertindih dengan cara yang menarik.\n",
"\n",
"## **🚀 Cabaran**\n",
"\n",
"Sebagai persediaan untuk pelajaran seterusnya, buat carta tentang pelbagai algoritma pengelompokan yang mungkin anda temui dan gunakan dalam persekitaran pengeluaran. Apakah jenis masalah yang cuba diselesaikan oleh pengelompokan?\n",
"\n",
"## [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Ulasan & Kajian Kendiri**\n",
"\n",
"Sebelum anda menggunakan algoritma pengelompokan, seperti yang telah kita pelajari, adalah idea yang baik untuk memahami sifat dataset anda. Baca lebih lanjut mengenai topik ini [di sini](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Mendalami pemahaman anda tentang teknik pengelompokan:\n",
"\n",
"- [Latih dan Nilai Model Pengelompokan menggunakan Tidymodels dan rakan-rakan](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",
"## **Tugasan**\n",
"\n",
"[Selidik visualisasi lain untuk pengelompokan](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## TERIMA KASIH KEPADA:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) kerana mencipta versi Python asal modul ini ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) kerana mencipta ilustrasi yang hebat yang menjadikan konsep pembelajaran mesin lebih mudah difahami dan lebih senang untuk difahami.\n",
"\n",
"Selamat Belajar,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\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-09-06T12:09:00+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 1
}