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.
500 lines
27 KiB
500 lines
27 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **Musik Nigeria yang diambil dari Spotify - sebuah analisis**\n",
|
|
"\n",
|
|
"Clustering adalah jenis [Pembelajaran Tanpa Pengawasan](https://wikipedia.org/wiki/Unsupervised_learning) yang mengasumsikan bahwa dataset tidak memiliki label atau bahwa inputnya tidak dipasangkan dengan output yang telah ditentukan sebelumnya. Clustering menggunakan berbagai algoritma untuk memilah data yang tidak berlabel dan memberikan pengelompokan berdasarkan pola yang ditemukan dalam data tersebut.\n",
|
|
"\n",
|
|
"[**Kuis sebelum pelajaran**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
|
|
"\n",
|
|
"### **Pendahuluan**\n",
|
|
"\n",
|
|
"[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) sangat berguna untuk eksplorasi data. Mari kita lihat apakah clustering dapat membantu menemukan tren dan pola dalam cara audiens Nigeria mengonsumsi musik.\n",
|
|
"\n",
|
|
"> ✅ Luangkan waktu sejenak untuk memikirkan kegunaan clustering. Dalam kehidupan sehari-hari, clustering terjadi ketika Anda memiliki tumpukan cucian dan perlu memilah pakaian anggota keluarga 🧦👕👖🩲. Dalam ilmu data, clustering terjadi saat mencoba menganalisis preferensi pengguna, atau menentukan karakteristik dari dataset yang tidak berlabel. Clustering, dalam beberapa hal, membantu memahami kekacauan, seperti laci kaus kaki.\n",
|
|
"\n",
|
|
"Dalam lingkungan profesional, clustering dapat digunakan untuk menentukan hal-hal seperti segmentasi pasar, misalnya menentukan kelompok usia mana yang membeli barang tertentu. Penggunaan lainnya adalah deteksi anomali, mungkin untuk mendeteksi penipuan dari dataset transaksi kartu kredit. Atau Anda dapat menggunakan clustering untuk menentukan tumor dalam kumpulan pemindaian medis.\n",
|
|
"\n",
|
|
"✅ Luangkan waktu sejenak untuk memikirkan bagaimana Anda mungkin pernah menemui clustering 'di alam liar', dalam konteks perbankan, e-commerce, atau bisnis.\n",
|
|
"\n",
|
|
"> 🎓 Menariknya, analisis cluster berasal dari bidang Antropologi dan Psikologi pada tahun 1930-an. Bisakah Anda membayangkan bagaimana ini mungkin digunakan?\n",
|
|
"\n",
|
|
"Sebagai alternatif, Anda dapat menggunakannya untuk mengelompokkan hasil pencarian - misalnya berdasarkan tautan belanja, gambar, atau ulasan. Clustering berguna ketika Anda memiliki dataset besar yang ingin Anda kurangi dan analisis lebih mendalam, sehingga teknik ini dapat digunakan untuk mempelajari data sebelum model lain dibangun.\n",
|
|
"\n",
|
|
"✅ Setelah data Anda diorganisasi dalam cluster, Anda memberikan Id cluster, dan teknik ini dapat berguna untuk menjaga privasi dataset; Anda dapat merujuk pada titik data dengan Id cluster-nya, daripada dengan data identifikasi yang lebih mengungkapkan. Bisakah Anda memikirkan alasan lain mengapa Anda akan merujuk pada Id cluster daripada elemen lain dari cluster untuk mengidentifikasinya?\n",
|
|
"\n",
|
|
"### Memulai dengan clustering\n",
|
|
"\n",
|
|
"> 🎓 Cara kita membuat cluster sangat bergantung pada bagaimana kita mengelompokkan titik data ke dalam grup. Mari kita bahas beberapa istilah:\n",
|
|
">\n",
|
|
"> 🎓 ['Transduktif' vs. 'induktif'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
|
|
">\n",
|
|
"> Inferensi transduktif berasal dari kasus pelatihan yang diamati yang dipetakan ke kasus uji tertentu. Inferensi induktif berasal dari kasus pelatihan yang dipetakan ke aturan umum yang kemudian diterapkan pada kasus uji.\n",
|
|
">\n",
|
|
"> Contoh: Bayangkan Anda memiliki dataset yang hanya sebagian berlabel. Beberapa hal adalah 'rekaman', beberapa 'cd', dan beberapa kosong. Tugas Anda adalah memberikan label untuk yang kosong. Jika Anda memilih pendekatan induktif, Anda akan melatih model untuk mencari 'rekaman' dan 'cd', dan menerapkan label tersebut pada data yang tidak berlabel. Pendekatan ini akan kesulitan mengklasifikasikan hal-hal yang sebenarnya adalah 'kaset'. Pendekatan transduktif, di sisi lain, menangani data yang tidak diketahui ini lebih efektif karena bekerja untuk mengelompokkan item serupa bersama-sama dan kemudian menerapkan label ke grup. Dalam kasus ini, cluster mungkin mencerminkan 'benda musik bulat' dan 'benda musik persegi'.\n",
|
|
">\n",
|
|
"> 🎓 ['Geometri tidak datar' vs. 'geometri datar'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
|
|
">\n",
|
|
"> Berasal dari terminologi matematika, geometri tidak datar vs. datar mengacu pada pengukuran jarak antara titik-titik dengan metode geometris 'datar' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) atau 'tidak datar' (non-Euclidean).\n",
|
|
">\n",
|
|
"> 'Datar' dalam konteks ini mengacu pada geometri Euclidean (bagian dari geometri ini diajarkan sebagai geometri 'bidang'), dan tidak datar mengacu pada geometri non-Euclidean. Apa hubungannya geometri dengan pembelajaran mesin? Nah, sebagai dua bidang yang berakar pada matematika, harus ada cara umum untuk mengukur jarak antara titik-titik dalam cluster, dan itu dapat dilakukan dengan cara 'datar' atau 'tidak datar', tergantung pada sifat data. [Jarak Euclidean](https://wikipedia.org/wiki/Euclidean_distance) diukur sebagai panjang segmen garis antara dua titik. [Jarak non-Euclidean](https://wikipedia.org/wiki/Non-Euclidean_geometry) diukur sepanjang kurva. Jika data Anda, ketika divisualisasikan, tampaknya tidak ada di bidang, Anda mungkin perlu menggunakan algoritma khusus untuk menanganinya.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/flat-nonflat.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"> 🎓 ['Jarak'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
|
|
">\n",
|
|
"> Cluster didefinisikan oleh matriks jaraknya, misalnya jarak antara titik-titik. Jarak ini dapat diukur dengan beberapa cara. Cluster Euclidean didefinisikan oleh rata-rata nilai titik, dan memiliki 'centroid' atau titik pusat. Jarak diukur berdasarkan jarak ke centroid tersebut. Jarak non-Euclidean mengacu pada 'clustroid', titik yang paling dekat dengan titik lainnya. Clustroid pada gilirannya dapat didefinisikan dengan berbagai cara.\n",
|
|
">\n",
|
|
"> 🎓 ['Terkendala'](https://wikipedia.org/wiki/Constrained_clustering)\n",
|
|
">\n",
|
|
"> [Clustering Terkendala](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) memperkenalkan pembelajaran 'semi-terawasi' ke dalam metode tanpa pengawasan ini. Hubungan antara titik-titik diberi tanda 'tidak dapat terhubung' atau 'harus terhubung' sehingga beberapa aturan dipaksakan pada dataset.\n",
|
|
">\n",
|
|
"> Contoh: Jika algoritma dibiarkan bebas pada kumpulan data yang tidak berlabel atau semi-berlabel, cluster yang dihasilkan mungkin berkualitas buruk. Dalam contoh di atas, cluster mungkin mengelompokkan 'benda musik bulat', 'benda musik persegi', 'benda segitiga', dan 'kue'. Jika diberikan beberapa kendala, atau aturan untuk diikuti (\"item harus terbuat dari plastik\", \"item harus dapat menghasilkan musik\") ini dapat membantu 'membatasi' algoritma untuk membuat pilihan yang lebih baik.\n",
|
|
">\n",
|
|
"> 🎓 'Kepadatan'\n",
|
|
">\n",
|
|
"> Data yang 'berisik' dianggap 'padat'. Jarak antara titik-titik dalam masing-masing cluster mungkin terbukti, setelah diperiksa, lebih atau kurang padat, atau 'penuh sesak' dan dengan demikian data ini perlu dianalisis dengan metode clustering yang sesuai. [Artikel ini](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) menunjukkan perbedaan antara menggunakan algoritma clustering K-Means vs. HDBSCAN untuk mengeksplorasi dataset yang berisik dengan kepadatan cluster yang tidak merata.\n",
|
|
"\n",
|
|
"Perdalam pemahaman Anda tentang teknik clustering dalam [modul pembelajaran ini](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
|
|
"\n",
|
|
"### **Algoritma clustering**\n",
|
|
"\n",
|
|
"Ada lebih dari 100 algoritma clustering, dan penggunaannya bergantung pada sifat data yang ada. Mari kita bahas beberapa yang utama:\n",
|
|
"\n",
|
|
"- **Clustering hierarkis**. Jika sebuah objek diklasifikasikan berdasarkan kedekatannya dengan objek terdekat, bukan dengan yang lebih jauh, cluster terbentuk berdasarkan jarak anggota mereka ke dan dari objek lain. Clustering hierarkis ditandai dengan penggabungan dua cluster secara berulang.\n",
|
|
"\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/hierarchical.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"- **Clustering centroid**. Algoritma populer ini membutuhkan pilihan 'k', atau jumlah cluster yang akan dibentuk, setelah itu algoritma menentukan titik pusat cluster dan mengumpulkan data di sekitar titik tersebut. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) adalah versi populer dari clustering centroid yang memisahkan dataset menjadi K grup yang telah ditentukan sebelumnya. Pusat ditentukan oleh rata-rata terdekat, sehingga dinamakan demikian. Jarak kuadrat dari cluster diminimalkan.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/centroid.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografis oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"- **Clustering berbasis distribusi**. Berdasarkan pemodelan statistik, clustering berbasis distribusi berpusat pada menentukan probabilitas bahwa titik data termasuk dalam cluster, dan menetapkannya sesuai. Metode campuran Gaussian termasuk dalam jenis ini.\n",
|
|
"\n",
|
|
"- **Clustering berbasis kepadatan**. Titik data ditetapkan ke cluster berdasarkan kepadatannya, atau pengelompokannya di sekitar satu sama lain. Titik data yang jauh dari grup dianggap sebagai outlier atau noise. DBSCAN, Mean-shift, dan OPTICS termasuk dalam jenis clustering ini.\n",
|
|
"\n",
|
|
"- **Clustering berbasis grid**. Untuk dataset multi-dimensi, grid dibuat dan data dibagi di antara sel-sel grid, sehingga menciptakan cluster.\n",
|
|
"\n",
|
|
"Cara terbaik untuk belajar tentang clustering adalah mencobanya sendiri, jadi itulah yang akan Anda lakukan dalam latihan ini.\n",
|
|
"\n",
|
|
"Kita memerlukan beberapa paket untuk menyelesaikan modul ini. Anda dapat menginstalnya dengan: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
|
|
"\n",
|
|
"Sebagai alternatif, skrip di bawah ini memeriksa apakah Anda memiliki paket yang diperlukan untuk menyelesaikan modul ini dan menginstalnya 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",
|
|
"Teknik pengelompokan sangat terbantu dengan visualisasi yang tepat, jadi mari kita mulai dengan memvisualisasikan data musik kita. Latihan ini akan membantu kita menentukan metode pengelompokan mana yang paling efektif digunakan untuk karakteristik data ini.\n",
|
|
"\n",
|
|
"Mari kita mulai dengan mengimpor 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": [
|
|
"Terkadang, kita mungkin ingin mendapatkan informasi lebih lanjut tentang data kita. Kita dapat 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 bagus!💪\n",
|
|
"\n",
|
|
"Kita dapat melihat bahwa `glimpse()` akan memberikan jumlah total baris (observasi) dan kolom (variabel), kemudian beberapa entri pertama dari setiap variabel dalam satu baris setelah nama variabel. Selain itu, *tipe data* dari variabel ditampilkan langsung setelah nama variabel di dalam `< >`.\n",
|
|
"\n",
|
|
"`DataExplorer::introduce()` dapat merangkum informasi ini dengan rapi:\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": [
|
|
"Luar biasa! Kita baru saja mengetahui bahwa data kita tidak memiliki nilai yang hilang.\n",
|
|
"\n",
|
|
"Sambil melanjutkan, kita dapat mengeksplorasi statistik kecenderungan sentral umum (misalnya [mean](https://en.wikipedia.org/wiki/Arithmetic_mean) dan [median](https://en.wikipedia.org/wiki/Median)) serta ukuran penyebaran (misalnya [standard deviation](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 dari data. Perhatikan bahwa popularitas bisa bernilai `0`, yang menunjukkan lagu-lagu tanpa peringkat. Kita akan menghapusnya sebentar lagi.\n",
|
|
"\n",
|
|
"> 🤔 Jika kita bekerja dengan clustering, sebuah metode tanpa pengawasan yang tidak memerlukan data berlabel, mengapa kita menampilkan data ini dengan label? Pada fase eksplorasi data, label-label ini berguna, tetapi mereka tidak diperlukan agar algoritma clustering dapat bekerja.\n",
|
|
"\n",
|
|
"### 1. Jelajahi genre populer\n",
|
|
"\n",
|
|
"Mari kita cari tahu genre paling populer 🎶 dengan menghitung jumlah kemunculannya.\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 lancar! Mereka bilang sebuah gambar bernilai seribu baris dari sebuah data frame (sebenarnya tidak ada yang pernah mengatakan itu 😅). Tapi kamu mengerti maksudnya, kan?\n",
|
|
"\n",
|
|
"Salah satu cara untuk memvisualisasikan data kategorikal (variabel karakter atau faktor) adalah dengan menggunakan barplot. Mari kita buat barplot dari 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 jauh lebih mudah untuk mengidentifikasi bahwa kita memiliki genre `missing` 🧐!\n",
|
|
"\n",
|
|
"> Visualisasi yang baik akan menunjukkan hal-hal yang tidak Anda duga, atau memunculkan pertanyaan baru tentang data - Hadley Wickham dan Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
|
|
"\n",
|
|
"Perhatikan, ketika genre teratas dijelaskan sebagai `Missing`, itu berarti Spotify tidak mengklasifikasikannya, jadi mari kita singkirkan.\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": [
|
|
"Dari eksplorasi data singkat, kita mengetahui bahwa tiga genre teratas mendominasi dataset ini. Mari kita fokus pada `afro dancehall`, `afropop`, dan `nigerian pop`, serta menyaring dataset untuk menghapus apa pun dengan nilai popularitas 0 (yang berarti tidak diklasifikasikan dengan popularitas dalam dataset dan dapat dianggap sebagai noise 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 apakah ada hubungan linear yang jelas di antara variabel numerik dalam kumpulan data kita. Hubungan ini diukur secara matematis dengan [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 dari satu variabel cenderung bertepatan dengan nilai tinggi dari variabel lainnya), sedangkan nilai di bawah 0 menunjukkan korelasi *negatif* (nilai tinggi dari satu variabel cenderung bertepatan dengan nilai rendah dari variabel lainnya).\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 memiliki korelasi yang kuat kecuali antara `energy` dan `loudness`, yang masuk akal, mengingat musik yang keras biasanya cukup energik. `Popularity` memiliki hubungan dengan `release date`, yang juga masuk akal, karena lagu-lagu yang lebih baru mungkin lebih populer. Panjang lagu dan energi tampaknya memiliki korelasi juga.\n",
|
|
"\n",
|
|
"Akan menarik untuk melihat apa yang dapat dilakukan algoritma clustering terhadap data ini!\n",
|
|
"\n",
|
|
"> 🎓 Perlu diingat bahwa korelasi tidak berarti sebab-akibat! Kita memiliki bukti korelasi tetapi tidak memiliki bukti sebab-akibat. Sebuah [situs web yang menghibur](https://tylervigen.com/spurious-correlations) memiliki beberapa visual yang menekankan poin ini.\n",
|
|
"\n",
|
|
"### 2. Jelajahi distribusi data\n",
|
|
"\n",
|
|
"Mari kita ajukan beberapa pertanyaan yang lebih mendalam. Apakah genre-genre secara signifikan berbeda dalam persepsi danceability mereka, berdasarkan popularitasnya? Mari kita periksa distribusi data tiga genre teratas kita untuk popularitas dan danceability sepanjang sumbu x dan y tertentu menggunakan [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": [
|
|
"Kami melihat bahwa ada lingkaran-lingkaran konsentris yang sejajar, terlepas dari genre. Apakah mungkin selera masyarakat Nigeria bertemu pada tingkat danceability tertentu untuk genre ini?\n",
|
|
"\n",
|
|
"Secara umum, ketiga genre tersebut sejajar dalam hal popularitas dan danceability. Menentukan klaster dalam data yang kurang terstruktur ini akan menjadi tantangan. Mari kita lihat apakah scatter plot dapat mendukung hal 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": [
|
|
"Sebuah scatterplot pada sumbu yang sama menunjukkan pola konvergensi yang serupa.\n",
|
|
"\n",
|
|
"Secara umum, untuk clustering, Anda dapat menggunakan scatterplot untuk menunjukkan kelompok data, sehingga menguasai jenis visualisasi ini sangat berguna. Dalam pelajaran berikutnya, kita akan mengambil data yang telah difilter ini dan menggunakan k-means clustering untuk menemukan kelompok dalam data yang tampaknya saling tumpang tindih dengan cara yang menarik.\n",
|
|
"\n",
|
|
"## **🚀 Tantangan**\n",
|
|
"\n",
|
|
"Sebagai persiapan untuk pelajaran berikutnya, buatlah sebuah grafik tentang berbagai algoritma clustering yang mungkin Anda temukan dan gunakan dalam lingkungan produksi. Masalah apa yang coba diatasi oleh clustering?\n",
|
|
"\n",
|
|
"## [**Kuis setelah pelajaran**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
|
|
"\n",
|
|
"## **Tinjauan & Studi Mandiri**\n",
|
|
"\n",
|
|
"Sebelum Anda menerapkan algoritma clustering, seperti yang telah kita pelajari, ada baiknya memahami sifat dataset Anda. Baca lebih lanjut tentang topik ini [di sini](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
|
|
"\n",
|
|
"Perdalam pemahaman Anda tentang teknik clustering:\n",
|
|
"\n",
|
|
"- [Latih dan Evaluasi Model Clustering menggunakan Tidymodels dan teman-temannya](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",
|
|
"## **Tugas**\n",
|
|
"\n",
|
|
"[Teliti visualisasi lain untuk clustering](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) atas pembuatan versi Python asli dari modul ini ♥️\n",
|
|
"\n",
|
|
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) atas ilustrasi luar biasa yang membuat konsep machine learning lebih mudah dipahami dan dimengerti.\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 layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemah manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari 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-04T07:57:05+00:00",
|
|
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
|
|
"language_code": "id"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
} |