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

499 lines
28 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Nigerijska muzyka zebrana ze Spotify - analiza**\n",
"\n",
"Klasteryzacja to rodzaj [uczenia bez nadzoru](https://wikipedia.org/wiki/Unsupervised_learning), który zakłada, że zbiór danych jest nieoznaczony lub że jego dane wejściowe nie są powiązane z wcześniej zdefiniowanymi wynikami. Wykorzystuje różne algorytmy do analizy nieoznaczonych danych i tworzenia grup na podstawie wzorców wykrytych w danych.\n",
"\n",
"[**Quiz przed wykładem**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Wprowadzenie**\n",
"\n",
"[Klasteryzacja](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) jest bardzo przydatna w eksploracji danych. Zobaczmy, czy może pomóc odkryć trendy i wzorce w sposobie, w jaki nigeryjscy odbiorcy konsumują muzykę.\n",
"\n",
"> ✅ Poświęć chwilę na zastanowienie się nad zastosowaniami klasteryzacji. W codziennym życiu klasteryzacja ma miejsce, gdy masz stos prania i musisz posortować ubrania członków rodziny 🧦👕👖🩲. W data science klasteryzacja występuje podczas analizy preferencji użytkownika lub określania cech dowolnego nieoznaczonego zbioru danych. Klasteryzacja w pewnym sensie pomaga uporządkować chaos, jak w przypadku szuflady na skarpetki.\n",
"\n",
"W środowisku zawodowym klasteryzacja może być używana do określania segmentacji rynku, na przykład do ustalenia, jakie grupy wiekowe kupują jakie produkty. Innym zastosowaniem może być wykrywanie anomalii, na przykład w celu wykrycia oszustw w zbiorze danych dotyczących transakcji kartami kredytowymi. Możesz również użyć klasteryzacji do identyfikacji guzów w serii skanów medycznych.\n",
"\n",
"✅ Zastanów się przez chwilę, jak mogłeś spotkać się z klasteryzacją „w terenie”, w bankowości, e-commerce lub biznesie.\n",
"\n",
"> 🎓 Co ciekawe, analiza klastrów wywodzi się z dziedzin antropologii i psychologii w latach 30. XX wieku. Wyobraź sobie, jak mogła być wtedy wykorzystywana.\n",
"\n",
"Alternatywnie, można ją wykorzystać do grupowania wyników wyszukiwania na przykład według linków zakupowych, obrazów lub recenzji. Klasteryzacja jest przydatna, gdy masz duży zbiór danych, który chcesz zredukować i na którym chcesz przeprowadzić bardziej szczegółową analizę, więc technika ta może być używana do poznania danych przed skonstruowaniem innych modeli.\n",
"\n",
"✅ Gdy dane są zorganizowane w klastry, przypisujesz im identyfikator klastra, a ta technika może być przydatna przy zachowaniu prywatności zbioru danych; zamiast bardziej ujawniających danych identyfikacyjnych możesz odwoływać się do punktu danych za pomocą identyfikatora klastra. Czy możesz wymyślić inne powody, dla których warto odwoływać się do identyfikatora klastra zamiast innych elementów klastra, aby go zidentyfikować?\n",
"\n",
"### Wprowadzenie do klasteryzacji\n",
"\n",
"> 🎓 Sposób tworzenia klastrów ma wiele wspólnego z tym, jak grupujemy punkty danych w grupy. Rozpakujmy trochę terminologii:\n",
">\n",
"> 🎓 ['Transdukcyjny' vs. 'indukcyjny'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Wnioskowanie transdukcyjne pochodzi z zaobserwowanych przypadków treningowych, które są mapowane na konkretne przypadki testowe. Wnioskowanie indukcyjne pochodzi z przypadków treningowych, które są mapowane na ogólne reguły, które dopiero potem są stosowane do przypadków testowych.\n",
">\n",
"> Przykład: Wyobraź sobie, że masz zbiór danych, który jest tylko częściowo oznaczony. Niektóre rzeczy to „płyty”, inne „CD”, a niektóre są puste. Twoim zadaniem jest przypisanie etykiet do pustych danych. Jeśli wybierzesz podejście indukcyjne, wytrenujesz model szukający „płyt” i „CD” i zastosujesz te etykiety do nieoznaczonych danych. Podejście to będzie miało trudności z klasyfikacją rzeczy, które są faktycznie „kasetami”. Podejście transdukcyjne natomiast skuteczniej radzi sobie z tymi nieznanymi danymi, ponieważ działa na zasadzie grupowania podobnych elementów razem, a następnie przypisuje etykietę do grupy. W tym przypadku klastry mogą odzwierciedlać „okrągłe muzyczne rzeczy” i „kwadratowe muzyczne rzeczy”.\n",
">\n",
"> 🎓 ['Niepłaska' vs. 'płaska' geometria](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Wywodząca się z terminologii matematycznej, niepłaska vs. płaska geometria odnosi się do pomiaru odległości między punktami za pomocą metod geometrycznych „płaskich” ([euklidesowych](https://wikipedia.org/wiki/Euclidean_geometry)) lub „niepłaskich” (nieeuklidesowych).\n",
">\n",
"> „Płaska” w tym kontekście odnosi się do geometrii euklidesowej (części której są nauczane jako „geometria płaszczyzny”), a niepłaska odnosi się do geometrii nieeuklidesowej. Co geometria ma wspólnego z uczeniem maszynowym? Cóż, jako dwie dziedziny zakorzenione w matematyce, musi istnieć wspólny sposób pomiaru odległości między punktami w klastrach, a to można zrobić w sposób „płaski” lub „niepłaski”, w zależności od charakteru danych. [Odległości euklidesowe](https://wikipedia.org/wiki/Euclidean_distance) są mierzone jako długość odcinka między dwoma punktami. [Odległości nieeuklidesowe](https://wikipedia.org/wiki/Non-Euclidean_geometry) są mierzone wzdłuż krzywej. Jeśli Twoje dane, wizualizowane, wydają się nie istnieć na płaszczyźnie, możesz potrzebować specjalistycznego algorytmu do ich obsługi.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika autorstwa Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Odległości'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Klastry są definiowane przez ich macierz odległości, np. odległości między punktami. Odległość tę można mierzyć na kilka sposobów. Klastry euklidesowe są definiowane przez średnią wartości punktów i zawierają „centroid” lub punkt centralny. Odległości są zatem mierzone względem tego centroidu. Odległości nieeuklidesowe odnoszą się do „clustroidów”, punktu najbliższego innym punktom. Clustroidy z kolei mogą być definiowane na różne sposoby.\n",
">\n",
"> 🎓 ['Ograniczona'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Klasteryzacja ograniczona](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) wprowadza „uczenie półnadzorowane” do tej metody bez nadzoru. Relacje między punktami są oznaczane jako „nie można połączyć” lub „musi być połączone”, więc na zbiór danych nakładane są pewne reguły.\n",
">\n",
"> Przykład: Jeśli algorytm zostanie uruchomiony na partii nieoznaczonych lub częściowo oznaczonych danych, klastry, które tworzy, mogą być niskiej jakości. W powyższym przykładzie klastry mogą grupować „okrągłe muzyczne rzeczy”, „kwadratowe muzyczne rzeczy”, „trójkątne rzeczy” i „ciastka”. Jeśli algorytmowi zostaną nadane pewne ograniczenia lub reguły do przestrzegania („przedmiot musi być wykonany z plastiku”, „przedmiot musi być w stanie produkować muzykę”), może to pomóc „ograniczyć” algorytm do podejmowania lepszych decyzji.\n",
">\n",
"> 🎓 'Gęstość'\n",
">\n",
"> Dane, które są „zakłócone”, są uważane za „gęste”. Odległości między punktami w każdym z jego klastrów mogą okazać się, po zbadaniu, bardziej lub mniej gęste, czyli „zatłoczone”, i dlatego te dane muszą być analizowane za pomocą odpowiedniej metody klasteryzacji. [Ten artykuł](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) pokazuje różnicę między użyciem algorytmów K-Means a HDBSCAN do eksploracji zakłóconego zbioru danych o nierównej gęstości klastrów.\n",
"\n",
"Pogłęb swoją wiedzę na temat technik klasteryzacji w tym [module nauki](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Algorytmy klasteryzacji**\n",
"\n",
"Istnieje ponad 100 algorytmów klasteryzacji, a ich zastosowanie zależy od charakteru danych. Omówmy niektóre z najważniejszych:\n",
"\n",
"- **Klasteryzacja hierarchiczna**. Jeśli obiekt jest klasyfikowany na podstawie swojej bliskości do pobliskiego obiektu, a nie do bardziej oddalonego, klastry są tworzone na podstawie odległości ich członków od innych obiektów. Klasteryzacja hierarchiczna charakteryzuje się wielokrotnym łączeniem dwóch klastrów.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika autorstwa Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Klasteryzacja centroidowa**. Ten popularny algorytm wymaga wyboru „k”, czyli liczby klastrów do utworzenia, po czym algorytm określa punkt centralny klastra i gromadzi dane wokół tego punktu. [Klasteryzacja K-średnich](https://wikipedia.org/wiki/K-means_clustering) jest popularną wersją klasteryzacji centroidowej, która dzieli zbiór danych na z góry określone grupy K. Centrum jest określane przez najbliższą średnią, stąd nazwa. Kwadratowa odległość od klastra jest minimalizowana.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika autorstwa Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Klasteryzacja oparta na rozkładzie**. Opierając się na modelowaniu statystycznym, klasteryzacja oparta na rozkładzie koncentruje się na określeniu prawdopodobieństwa, że punkt danych należy do klastra, i przypisaniu go odpowiednio. Metody mieszanki Gaussa należą do tego typu.\n",
"\n",
"- **Klasteryzacja oparta na gęstości**. Punkty danych są przypisywane do klastrów na podstawie ich gęstości, czyli ich grupowania wokół siebie. Punkty danych oddalone od grupy są uważane za odchylenia lub zakłócenia. DBSCAN, Mean-shift i OPTICS należą do tego typu klasteryzacji.\n",
"\n",
"- **Klasteryzacja oparta na siatce**. Dla wielowymiarowych zbiorów danych tworzona jest siatka, a dane są dzielone między komórki siatki, tworząc w ten sposób klastry.\n",
"\n",
"Najlepszym sposobem na naukę klasteryzacji jest samodzielne jej wypróbowanie, więc to właśnie zrobisz w tym ćwiczeniu.\n",
"\n",
"Będziemy potrzebować kilku pakietów, aby ukończyć ten moduł. Możesz je zainstalować za pomocą: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternatywnie, poniższy skrypt sprawdza, czy masz wymagane pakiety do ukończenia tego modułu, i instaluje je w przypadku brakujących.\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": [
"## Ćwiczenie - grupowanie danych\n",
"\n",
"Grupowanie jako technika jest znacznie ułatwione dzięki odpowiedniej wizualizacji, więc zacznijmy od wizualizacji naszych danych muzycznych. To ćwiczenie pomoże nam zdecydować, którą metodę grupowania najlepiej zastosować do charakteru tych danych.\n",
"\n",
"Zacznijmy od zaimportowania danych.\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": [
"Czasami możemy chcieć uzyskać nieco więcej informacji o naszych danych. Możemy przyjrzeć się `danym` i `ich strukturze`, korzystając z funkcji [*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": [
"Dobra robota!💪\n",
"\n",
"Możemy zauważyć, że `glimpse()` pokaże całkowitą liczbę wierszy (obserwacji) i kolumn (zmiennych), a następnie kilka pierwszych wartości każdej zmiennej w wierszu po nazwie zmiennej. Dodatkowo, *typ danych* zmiennej jest podany bezpośrednio po nazwie zmiennej w `< >`.\n",
"\n",
"`DataExplorer::introduce()` potrafi zwięźle podsumować te informacje:\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": [
"Świetnie! Właśnie dowiedzieliśmy się, że nasze dane nie mają brakujących wartości.\n",
"\n",
"Skoro już przy tym jesteśmy, możemy zbadać popularne statystyki tendencji centralnej (np. [średnia](https://en.wikipedia.org/wiki/Arithmetic_mean) i [mediana](https://en.wikipedia.org/wiki/Median)) oraz miary rozproszenia (np. [odchylenie standardowe](https://en.wikipedia.org/wiki/Standard_deviation)) za pomocą `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": [
"Spójrzmy na ogólne wartości danych. Zauważ, że popularność może wynosić `0`, co oznacza utwory, które nie mają rankingu. Wkrótce je usuniemy.\n",
"\n",
"> 🤔 Jeśli pracujemy z klasteryzacją, niesuperwizowaną metodą, która nie wymaga danych z etykietami, dlaczego pokazujemy te dane z etykietami? W fazie eksploracji danych są one przydatne, ale nie są konieczne do działania algorytmów klasteryzacji.\n",
"\n",
"### 1. Eksploracja popularnych gatunków\n",
"\n",
"Przejdźmy dalej i sprawdźmy najbardziej popularne gatunki 🎶, licząc, ile razy się pojawiają.\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": [
"To było udane! Mówią, że obraz wart jest tysiąca wierszy ramki danych (choć tak naprawdę nikt nigdy tego nie mówi 😅). Ale rozumiesz, o co chodzi, prawda?\n",
"\n",
"Jednym ze sposobów wizualizacji danych kategorycznych (zmiennych typu znakowego lub czynnikowego) jest użycie wykresów słupkowych. Zróbmy wykres słupkowy dla 10 najpopularniejszych gatunków:\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": [
"Teraz znacznie łatwiej zauważyć, że mamy `brakujące` gatunki 🧐!\n",
"\n",
"> Dobra wizualizacja pokaże Ci rzeczy, których się nie spodziewałeś, lub wzbudzi nowe pytania dotyczące danych - Hadley Wickham i Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Uwaga: gdy główny gatunek jest opisany jako `Brakujący`, oznacza to, że Spotify go nie sklasyfikował, więc pozbądźmy się go.\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": [
"Z krótkiej eksploracji danych dowiadujemy się, że trzy najpopularniejsze gatunki dominują w tym zbiorze danych. Skupmy się na `afro dancehall`, `afropop` i `nigerian pop`, a dodatkowo przefiltrujmy zbiór danych, aby usunąć wszystko, co ma wartość popularności równą 0 (co oznacza, że nie zostało sklasyfikowane pod względem popularności w zbiorze danych i może być uznane za szum w naszych analizach):\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": [
"Sprawdźmy, czy istnieje widoczny liniowy związek między zmiennymi numerycznymi w naszym zbiorze danych. Ten związek jest określany matematycznie przez [statystykę korelacji](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Statystyka korelacji to wartość pomiędzy -1 a 1, która wskazuje na siłę związku. Wartości powyżej 0 oznaczają *pozytywną* korelację (wysokie wartości jednej zmiennej zazwyczaj występują razem z wysokimi wartościami drugiej), natomiast wartości poniżej 0 oznaczają *negatywną* korelację (wysokie wartości jednej zmiennej zazwyczaj występują razem z niskimi wartościami drugiej).\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": [
"Dane nie są silnie skorelowane, z wyjątkiem relacji między `energy` a `loudness`, co ma sens, biorąc pod uwagę, że głośna muzyka zazwyczaj jest dość energetyczna. `Popularity` ma związek z `release date`, co również jest logiczne, ponieważ nowsze utwory prawdopodobnie są bardziej popularne. Długość i energia wydają się również wykazywać pewną korelację.\n",
"\n",
"Ciekawe będzie zobaczyć, co algorytm klasteryzacji może wyciągnąć z tych danych!\n",
"\n",
"> 🎓 Pamiętaj, że korelacja nie oznacza przyczynowości! Mamy dowód na istnienie korelacji, ale brak dowodu na istnienie przyczynowości. [Zabawna strona internetowa](https://tylervigen.com/spurious-correlations) zawiera wizualizacje, które podkreślają tę kwestię.\n",
"\n",
"### 2. Zbadaj rozkład danych\n",
"\n",
"Zadajmy sobie kilka bardziej subtelnych pytań. Czy gatunki muzyczne znacząco różnią się w postrzeganiu ich taneczności w zależności od ich popularności? Przyjrzyjmy się rozkładowi danych dla naszych trzech najpopularniejszych gatunków pod względem popularności i taneczności wzdłuż wybranej osi x i y, korzystając z [wykresów gęstości](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": [
"Widzimy, że istnieją koncentryczne okręgi, które się pokrywają, niezależnie od gatunku. Czy to możliwe, że gusta Nigeryjczyków zbiegają się na pewnym poziomie taneczności dla tego gatunku?\n",
"\n",
"Ogólnie rzecz biorąc, te trzy gatunki są zgodne pod względem popularności i taneczności. Określenie klastrów w tych luźno powiązanych danych będzie wyzwaniem. Zobaczmy, czy wykres punktowy może to potwierdzić.\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": [
"Wykres punktowy tych samych osi pokazuje podobny wzór zbieżności.\n",
"\n",
"Ogólnie rzecz biorąc, w przypadku klastrowania można używać wykresów punktowych do przedstawiania grup danych, więc opanowanie tego rodzaju wizualizacji jest bardzo przydatne. W następnej lekcji wykorzystamy te przefiltrowane dane i zastosujemy klastrowanie metodą k-średnich, aby odkryć grupy w tych danych, które interesująco się nakładają.\n",
"\n",
"## **🚀 Wyzwanie**\n",
"\n",
"W ramach przygotowania do następnej lekcji stwórz wykres dotyczący różnych algorytmów klastrowania, które możesz odkryć i wykorzystać w środowisku produkcyjnym. Jakie rodzaje problemów próbuje rozwiązać klastrowanie?\n",
"\n",
"## [**Quiz po lekcji**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Przegląd i samodzielna nauka**\n",
"\n",
"Zanim zastosujesz algorytmy klastrowania, jak się nauczyliśmy, warto zrozumieć naturę swojego zbioru danych. Przeczytaj więcej na ten temat [tutaj](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n",
"\n",
"Pogłęb swoją wiedzę na temat technik klastrowania:\n",
"\n",
"- [Trenuj i oceniaj modele klastrowania za pomocą Tidymodels i innych narzędzi](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",
"## **Zadanie**\n",
"\n",
"[Zbadaj inne wizualizacje dla klastrowania](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## PODZIĘKOWANIA DLA:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) za stworzenie oryginalnej wersji tego modułu w Pythonie ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) za stworzenie niesamowitych ilustracji, które sprawiają, że koncepcje uczenia maszynowego są bardziej zrozumiałe i łatwiejsze do przyswojenia.\n",
"\n",
"Miłej nauki,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Złoty Ambasador Microsoft Learn.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\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-03T20:05:46+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "pl"
}
},
"nbformat": 4,
"nbformat_minor": 1
}