{ "cells": [ { "cell_type": "markdown", "source": [ "## **Muzica nigeriană extrasă de pe Spotify - o analiză**\n", "\n", "Clusteringul este un tip de [Învățare Nesupervizată](https://wikipedia.org/wiki/Unsupervised_learning) care presupune că un set de date nu este etichetat sau că intrările sale nu sunt asociate cu rezultate predefinite. Folosește diverse algoritmi pentru a analiza datele neetichetate și a oferi grupări în funcție de modelele pe care le identifică în date.\n", "\n", "[**Chestionar înainte de lecție**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **Introducere**\n", "\n", "[Clusteringul](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) este foarte util pentru explorarea datelor. Să vedem dacă poate ajuta la descoperirea tendințelor și modelelor în modul în care publicul nigerian consumă muzică.\n", "\n", "> ✅ Ia un minut să te gândești la utilizările clusteringului. În viața reală, clusteringul se întâmplă ori de câte ori ai o grămadă de rufe și trebuie să sortezi hainele membrilor familiei tale 🧦👕👖🩲. În știința datelor, clusteringul se întâmplă atunci când încerci să analizezi preferințele unui utilizator sau să determini caracteristicile unui set de date neetichetat. Clusteringul, într-un fel, ajută la organizarea haosului, cum ar fi un sertar de șosete.\n", "\n", "Într-un mediu profesional, clusteringul poate fi utilizat pentru a determina lucruri precum segmentarea pieței, identificarea grupelor de vârstă care cumpără anumite produse, de exemplu. O altă utilizare ar fi detectarea anomaliilor, poate pentru a identifica fraude într-un set de date cu tranzacții de carduri de credit. Sau ai putea folosi clusteringul pentru a identifica tumori într-un lot de scanări medicale.\n", "\n", "✅ Gândește-te un minut la modul în care ai întâlnit clusteringul 'în natură', într-un context bancar, de comerț electronic sau de afaceri.\n", "\n", "> 🎓 Interesant, analiza clusterelor a apărut în domeniile Antropologiei și Psihologiei în anii 1930. Îți poți imagina cum ar fi fost utilizată?\n", "\n", "Alternativ, ai putea să-l folosești pentru gruparea rezultatelor căutării - după linkuri de cumpărături, imagini sau recenzii, de exemplu. Clusteringul este util atunci când ai un set de date mare pe care vrei să-l reduci și pe care vrei să efectuezi o analiză mai detaliată, astfel încât tehnica poate fi utilizată pentru a învăța despre date înainte de a construi alte modele.\n", "\n", "✅ Odată ce datele tale sunt organizate în clustere, le atribui un Id de cluster, iar această tehnică poate fi utilă pentru a păstra confidențialitatea unui set de date; poți să te referi la un punct de date prin Id-ul său de cluster, mai degrabă decât prin date identificabile mai revelatoare. Poți să te gândești la alte motive pentru care ai prefera să te referi la un Id de cluster în loc de alte elemente ale clusterului pentru identificare?\n", "\n", "### Începerea cu clusteringul\n", "\n", "> 🎓 Modul în care creăm clustere are mult de-a face cu modul în care grupăm punctele de date în grupuri. Să deslușim câteva concepte:\n", ">\n", "> 🎓 ['Transductiv' vs. 'inductiv'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> Inferența transductivă este derivată din cazurile de antrenament observate care se mapază la cazuri de testare specifice. Inferența inductivă este derivată din cazurile de antrenament care se mapază la reguli generale care sunt aplicate ulterior cazurilor de testare.\n", ">\n", "> Un exemplu: Imaginează-ți că ai un set de date care este doar parțial etichetat. Unele lucruri sunt 'discuri', altele 'cd-uri', iar unele sunt goale. Sarcina ta este să oferi etichete pentru cele goale. Dacă alegi o abordare inductivă, ai antrena un model căutând 'discuri' și 'cd-uri' și ai aplica aceste etichete datelor neetichetate. Această abordare va avea dificultăți în clasificarea lucrurilor care sunt de fapt 'casete'. O abordare transductivă, pe de altă parte, gestionează aceste date necunoscute mai eficient, deoarece lucrează pentru a grupa obiecte similare împreună și apoi aplică o etichetă unui grup. În acest caz, clusterele ar putea reflecta 'lucruri muzicale rotunde' și 'lucruri muzicale pătrate'.\n", ">\n", "> 🎓 ['Geometrie neplată' vs. 'geometrie plată'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> Derivată din terminologia matematică, geometria neplată vs. plată se referă la măsurarea distanțelor între puncte fie prin metode geometrice 'plate' ([Euclidiene](https://wikipedia.org/wiki/Euclidean_geometry)) fie 'neplate' (non-Euclidiene).\n", ">\n", "> 'Plat' în acest context se referă la geometria Euclidiană (părți din care sunt predate ca geometrie 'plană'), iar neplat se referă la geometria non-Euclidiană. Ce legătură are geometria cu învățarea automată? Ei bine, ca două domenii care sunt bazate pe matematică, trebuie să existe o modalitate comună de a măsura distanțele între puncte în clustere, iar acest lucru poate fi făcut într-un mod 'plat' sau 'neplat', în funcție de natura datelor. [Distanțele Euclidiene](https://wikipedia.org/wiki/Euclidean_distance) sunt măsurate ca lungimea unui segment de linie între două puncte. [Distanțele non-Euclidiene](https://wikipedia.org/wiki/Non-Euclidean_geometry) sunt măsurate de-a lungul unei curbe. Dacă datele tale, vizualizate, par să nu existe pe un plan, s-ar putea să fie nevoie să folosești un algoritm specializat pentru a le gestiona.\n", "\n", "

\n", " \n", "

Infografic de Dasani Madipalli
\n", "\n", "\n", "\n", "> 🎓 ['Distanțe'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> Clusterele sunt definite de matricea lor de distanțe, de exemplu, distanțele între puncte. Această distanță poate fi măsurată în câteva moduri. Clusterele Euclidiene sunt definite de media valorilor punctelor și conțin un 'centroid' sau punct central. Distanțele sunt astfel măsurate prin distanța față de acel centroid. Distanțele non-Euclidiene se referă la 'clustroizi', punctul cel mai apropiat de alte puncte. Clustroizii, la rândul lor, pot fi definiți în diverse moduri.\n", ">\n", "> 🎓 ['Constrâns'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> [Clusteringul Constrâns](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introduce învățarea 'semi-supervizată' în această metodă nesupervizată. Relațiile dintre puncte sunt marcate ca 'nu se pot lega' sau 'trebuie să se lege', astfel încât unele reguli sunt impuse setului de date.\n", ">\n", "> Un exemplu: Dacă un algoritm este lăsat liber pe un lot de date neetichetate sau semi-etichetate, clusterele pe care le produce pot fi de calitate slabă. În exemplul de mai sus, clusterele ar putea grupa 'lucruri muzicale rotunde', 'lucruri muzicale pătrate', 'lucruri triunghiulare' și 'fursecuri'. Dacă i se oferă câteva constrângeri sau reguli de urmat (\"obiectul trebuie să fie din plastic\", \"obiectul trebuie să poată produce muzică\"), acest lucru poate ajuta la 'constrângerea' algoritmului să facă alegeri mai bune.\n", ">\n", "> 🎓 'Densitate'\n", ">\n", "> Datele care sunt 'zgomotoase' sunt considerate a fi 'dense'. Distanțele între punctele din fiecare cluster pot fi, la examinare, mai mult sau mai puțin dense, sau 'aglomerate', și astfel aceste date trebuie analizate cu metoda de clustering adecvată. [Acest articol](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonstrează diferența dintre utilizarea clusteringului K-Means și algoritmii HDBSCAN pentru explorarea unui set de date zgomotos cu densitate de cluster inegală.\n", "\n", "Aprofundează-ți înțelegerea tehnicilor de clustering în acest [modul de învățare](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n", "\n", "### **Algoritmi de clustering**\n", "\n", "Există peste 100 de algoritmi de clustering, iar utilizarea lor depinde de natura datelor disponibile. Să discutăm câțiva dintre cei mai importanți:\n", "\n", "- **Clustering ierarhic**. Dacă un obiect este clasificat în funcție de proximitatea sa față de un obiect apropiat, mai degrabă decât față de unul mai îndepărtat, clusterele sunt formate pe baza distanței membrilor lor față de alte obiecte. Clusteringul ierarhic se caracterizează prin combinarea repetată a două clustere.\n", "\n", "\n", "

\n", " \n", "

Infografic de Dasani Madipalli
\n", "\n", "\n", "\n", "- **Clustering pe bază de centroid**. Acest algoritm popular necesită alegerea 'k', sau numărul de clustere care trebuie formate, după care algoritmul determină punctul central al unui cluster și adună date în jurul acelui punct. [Clusteringul K-means](https://wikipedia.org/wiki/K-means_clustering) este o versiune populară a clusteringului pe bază de centroid care separă un set de date în K grupuri predefinite. Centrul este determinat de media cea mai apropiată, de aici și numele. Distanța pătrată față de cluster este minimizată.\n", "\n", "

\n", " \n", "

Infografic de Dasani Madipalli
\n", "\n", "\n", "\n", "- **Clustering bazat pe distribuție**. Bazat pe modelarea statistică, clusteringul bazat pe distribuție se concentrează pe determinarea probabilității ca un punct de date să aparțină unui cluster și îl atribuie în consecință. Metodele de amestec Gaussian aparțin acestui tip.\n", "\n", "- **Clustering bazat pe densitate**. Punctele de date sunt atribuite clusterelor pe baza densității lor, sau a grupării lor în jurul altor puncte. Punctele de date aflate departe de grup sunt considerate anomalii sau zgomot. DBSCAN, Mean-shift și OPTICS aparțin acestui tip de clustering.\n", "\n", "- **Clustering bazat pe grilă**. Pentru seturi de date multidimensionale, se creează o grilă, iar datele sunt împărțite între celulele grilei, creând astfel clustere.\n", "\n", "Cel mai bun mod de a învăța despre clustering este să încerci singur, așa că asta vei face în acest exercițiu.\n", "\n", "Vom avea nevoie de câteva pachete pentru a finaliza acest modul. Le poți instala astfel: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "Alternativ, scriptul de mai jos verifică dacă ai pachetele necesare pentru a finaliza acest modul și le instalează pentru tine în cazul în care lipsesc.\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": [ "## Exercițiu - grupează datele tale\n", "\n", "Tehnica de grupare este mult îmbunătățită printr-o vizualizare adecvată, așa că haide să începem prin a vizualiza datele noastre despre muzică. Acest exercițiu ne va ajuta să decidem care dintre metodele de grupare ar fi cel mai eficient de utilizat pentru natura acestor date.\n", "\n", "Să trecem direct la treabă prin importarea datelor.\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": [ "Uneori, este posibil să dorim mai multe informații despre datele noastre. Putem analiza `datele` și `structura lor` utilizând funcția [*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": [ "Bravo! 💪\n", "\n", "Putem observa că `glimpse()` îți va oferi numărul total de rânduri (observații) și coloane (variabile), apoi primele câteva valori ale fiecărei variabile, afișate pe un rând după numele variabilei. În plus, *tipul de date* al variabilei este indicat imediat după numele acesteia, între `< >`.\n", "\n", "`DataExplorer::introduce()` poate rezuma aceste informații într-un mod ordonat:\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": [ "Super! Tocmai am aflat că datele noastre nu au valori lipsă.\n", "\n", "În timp ce suntem aici, putem explora statistici comune ale tendinței centrale (de exemplu, [media aritmetică](https://en.wikipedia.org/wiki/Arithmetic_mean) și [mediana](https://en.wikipedia.org/wiki/Median)) și măsuri de dispersie (de exemplu, [deviația standard](https://en.wikipedia.org/wiki/Standard_deviation)) folosind `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": [ "Să analizăm valorile generale ale datelor. Observați că popularitatea poate fi `0`, ceea ce indică melodii fără clasament. Le vom elimina în curând.\n", "\n", "> 🤔 Dacă lucrăm cu clustering, o metodă nesupravegheată care nu necesită date etichetate, de ce arătăm aceste date cu etichete? În faza de explorare a datelor, acestea sunt utile, dar nu sunt necesare pentru ca algoritmii de clustering să funcționeze.\n", "\n", "### 1. Explorează genurile populare\n", "\n", "Haideți să descoperim cele mai populare genuri 🎶 prin numărarea instanțelor în care apar.\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": [ "A mers bine! Se spune că o imagine valorează cât o mie de rânduri dintr-un cadru de date (de fapt, nimeni nu spune asta 😅). Dar ai prins ideea, nu-i așa?\n", "\n", "O modalitate de a vizualiza datele categorice (variabile de tip caracter sau factor) este utilizarea diagramelor cu bare. Hai să facem o diagramă cu bare pentru primele 10 genuri:\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": [ "Acum este mult mai ușor să identificăm că avem genuri `lipsă` 🧐!\n", "\n", "> O bună vizualizare îți va arăta lucruri la care nu te așteptai sau îți va ridica noi întrebări despre date - Hadley Wickham și Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "Reține, când genul principal este descris ca `Lipsă`, asta înseamnă că Spotify nu l-a clasificat, așa că hai să scăpăm de el.\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": [ "Din mica explorare a datelor, aflăm că primele trei genuri domină acest set de date. Să ne concentrăm pe `afro dancehall`, `afropop` și `nigerian pop`, și să filtrăm suplimentar setul de date pentru a elimina orice element cu valoarea de popularitate 0 (ceea ce înseamnă că nu a fost clasificat cu o popularitate în setul de date și poate fi considerat zgomot pentru scopurile noastre):\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": [ "Să vedem dacă există vreo relație liniară evidentă între variabilele numerice din setul nostru de date. Această relație este cuantificată matematic prin [statistica de corelație](https://en.wikipedia.org/wiki/Correlation).\n", "\n", "Statistica de corelație este o valoare cuprinsă între -1 și 1 care indică puterea unei relații. Valorile mai mari decât 0 indică o corelație *pozitivă* (valorile mari ale unei variabile tind să coincidă cu valorile mari ale celeilalte), în timp ce valorile mai mici decât 0 indică o corelație *negativă* (valorile mari ale unei variabile tind să coincidă cu valorile mici ale celeilalte).\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": [ "Datele nu sunt puternic corelate, cu excepția relației dintre `energy` și `loudness`, ceea ce are sens, având în vedere că muzica tare este, de obicei, destul de energică. `Popularity` are o corespondență cu `release date`, ceea ce, de asemenea, are sens, deoarece melodiile mai recente sunt probabil mai populare. De asemenea, se pare că există o corelație între lungime și energie.\n", "\n", "Va fi interesant să vedem ce poate face un algoritm de clustering cu aceste date!\n", "\n", "> 🎓 Rețineți că corelația nu implică cauzalitate! Avem dovada unei corelații, dar nu și a unei cauzalități. Un [site web amuzant](https://tylervigen.com/spurious-correlations) oferă câteva vizualizări care subliniază acest aspect.\n", "\n", "### 2. Explorarea distribuției datelor\n", "\n", "Să ne punem câteva întrebări mai subtile. Genurile sunt semnificativ diferite în percepția lor asupra dansabilității, în funcție de popularitate? Să examinăm distribuția datelor pentru popularitate și dansabilitate ale primelor noastre trei genuri de-a lungul unei axe x și y date, utilizând [grafice de densitate](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": [ "Observăm că există cercuri concentrice care se aliniază, indiferent de gen. Ar putea fi posibil ca preferințele nigeriene să convergă la un anumit nivel de dansabilitate pentru acest gen?\n", "\n", "În general, cele trei genuri se aliniază în ceea ce privește popularitatea și dansabilitatea. Determinarea clusterelor în aceste date slab aliniate va fi o provocare. Să vedem dacă un grafic scatter poate susține acest lucru.\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": [ "Un grafic de dispersie al acelorași axe arată un model similar de convergență.\n", "\n", "În general, pentru grupare, poți utiliza graficele de dispersie pentru a arăta grupuri de date, așa că stăpânirea acestui tip de vizualizare este foarte utilă. În lecția următoare, vom lua aceste date filtrate și vom folosi algoritmul k-means clustering pentru a descoperi grupuri în aceste date care par să se suprapună în moduri interesante.\n", "\n", "## **🚀 Provocare**\n", "\n", "Pentru a te pregăti pentru lecția următoare, creează un grafic despre diferitele algoritmi de grupare pe care i-ai putea descoperi și folosi într-un mediu de producție. Ce tipuri de probleme încearcă să rezolve gruparea?\n", "\n", "## [**Quiz după lecție**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **Recapitulare & Studiu Individual**\n", "\n", "Înainte de a aplica algoritmi de grupare, așa cum am învățat, este o idee bună să înțelegi natura setului tău de date. Citește mai multe despre acest subiect [aici](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n", "\n", "Aprofundează-ți înțelegerea tehnicilor de grupare:\n", "\n", "- [Antrenează și evaluează modele de grupare folosind Tidymodels și prietenii](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", "## **Temă**\n", "\n", "[Studiază alte vizualizări pentru grupare](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## MULȚUMIRI SPECIALE:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) pentru crearea versiunii originale în Python a acestui modul ♥️\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) pentru crearea ilustrațiilor uimitoare care fac conceptele de învățare automată mai ușor de interpretat și de înțeles.\n", "\n", "Învățare plăcută,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\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:13:32+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "ro" } }, "nbformat": 4, "nbformat_minor": 1 }