{ "cells": [ { "cell_type": "markdown", "source": [ "## **Ανάλυση της Νιγηριανής Μουσικής από το Spotify**\n", "\n", "Η ομαδοποίηση (clustering) είναι ένας τύπος [Μη Εποπτευόμενης Μάθησης](https://wikipedia.org/wiki/Unsupervised_learning) που υποθέτει ότι ένα σύνολο δεδομένων δεν έχει ετικέτες ή ότι οι είσοδοι του δεν αντιστοιχούν σε προκαθορισμένες εξόδους. Χρησιμοποιεί διάφορους αλγορίθμους για να ταξινομήσει μη επισημασμένα δεδομένα και να παρέχει ομαδοποιήσεις σύμφωνα με τα μοτίβα που εντοπίζει στα δεδομένα.\n", "\n", "[**Κουίζ πριν τη διάλεξη**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **Εισαγωγή**\n", "\n", "Η [ομαδοποίηση](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) είναι πολύ χρήσιμη για την εξερεύνηση δεδομένων. Ας δούμε αν μπορεί να βοηθήσει στην ανακάλυψη τάσεων και μοτίβων στον τρόπο που το κοινό της Νιγηρίας καταναλώνει μουσική.\n", "\n", "> ✅ Σκεφτείτε για ένα λεπτό τις χρήσεις της ομαδοποίησης. Στην καθημερινή ζωή, η ομαδοποίηση συμβαίνει κάθε φορά που έχετε ένα σωρό από ρούχα και πρέπει να ξεχωρίσετε τα ρούχα των μελών της οικογένειάς σας 🧦👕👖🩲. Στην επιστήμη δεδομένων, η ομαδοποίηση συμβαίνει όταν προσπαθείτε να αναλύσετε τις προτιμήσεις ενός χρήστη ή να προσδιορίσετε τα χαρακτηριστικά ενός μη επισημασμένου συνόλου δεδομένων. Με έναν τρόπο, η ομαδοποίηση βοηθά να βάλουμε τάξη στο χάος, όπως ένα συρτάρι με κάλτσες.\n", "\n", "Σε επαγγελματικό περιβάλλον, η ομαδοποίηση μπορεί να χρησιμοποιηθεί για πράγματα όπως η τμηματοποίηση της αγοράς, ο προσδιορισμός των ηλικιακών ομάδων που αγοράζουν συγκεκριμένα προϊόντα, για παράδειγμα. Μια άλλη χρήση θα μπορούσε να είναι η ανίχνευση ανωμαλιών, όπως η ανίχνευση απάτης από ένα σύνολο δεδομένων συναλλαγών με πιστωτικές κάρτες. Ή μπορεί να χρησιμοποιηθεί για τον εντοπισμό όγκων σε μια παρτίδα ιατρικών σαρώσεων.\n", "\n", "✅ Σκεφτείτε για ένα λεπτό πώς μπορεί να έχετε συναντήσει την ομαδοποίηση «στην πράξη», σε τραπεζικές, ηλεκτρονικές αγορές ή επιχειρηματικές εφαρμογές.\n", "\n", "> 🎓 Ενδιαφέρον είναι ότι η ανάλυση ομαδοποίησης ξεκίνησε από τους τομείς της Ανθρωπολογίας και της Ψυχολογίας τη δεκαετία του 1930. Μπορείτε να φανταστείτε πώς μπορεί να είχε χρησιμοποιηθεί τότε;\n", "\n", "Εναλλακτικά, θα μπορούσατε να τη χρησιμοποιήσετε για την ομαδοποίηση αποτελεσμάτων αναζήτησης - για παράδειγμα, ανάμεσα σε συνδέσμους αγορών, εικόνες ή κριτικές. Η ομαδοποίηση είναι χρήσιμη όταν έχετε ένα μεγάλο σύνολο δεδομένων που θέλετε να μειώσετε και στο οποίο θέλετε να πραγματοποιήσετε πιο λεπτομερή ανάλυση. Έτσι, η τεχνική μπορεί να χρησιμοποιηθεί για να μάθετε περισσότερα για τα δεδομένα πριν κατασκευάσετε άλλα μοντέλα.\n", "\n", "✅ Αφού οργανώσετε τα δεδομένα σας σε ομάδες, τους αναθέτετε ένα Id ομάδας (cluster Id). Αυτή η τεχνική μπορεί να είναι χρήσιμη για τη διατήρηση της ιδιωτικότητας ενός συνόλου δεδομένων. Αντί να αναφέρεστε σε ένα σημείο δεδομένων με πιο αποκαλυπτικά στοιχεία, μπορείτε να το αναφέρετε με το Id της ομάδας του. Μπορείτε να σκεφτείτε άλλους λόγους για τους οποίους θα προτιμούσατε να αναφέρεστε σε ένα Id ομάδας αντί για άλλα στοιχεία της ομάδας για την ταυτοποίησή του;\n", "\n", "### Ξεκινώντας με την ομαδοποίηση\n", "\n", "> 🎓 Ο τρόπος που δημιουργούμε ομάδες έχει να κάνει πολύ με το πώς συγκεντρώνουμε τα σημεία δεδομένων σε ομάδες. Ας αναλύσουμε μερικές έννοιες:\n", ">\n", "> 🎓 ['Επαγωγική' vs. 'μεταγωγική'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> Η μεταγωγική συμπερασματολογία προκύπτει από παρατηρούμενες περιπτώσεις εκπαίδευσης που αντιστοιχούν σε συγκεκριμένες περιπτώσεις δοκιμής. Η επαγωγική συμπερασματολογία προκύπτει από περιπτώσεις εκπαίδευσης που οδηγούν σε γενικούς κανόνες, οι οποίοι στη συνέχεια εφαρμόζονται σε περιπτώσεις δοκιμής.\n", ">\n", "> Παράδειγμα: Φανταστείτε ότι έχετε ένα σύνολο δεδομένων που είναι μόνο εν μέρει επισημασμένο. Κάποια αντικείμενα είναι «δίσκοι», κάποια «cd» και κάποια είναι κενά. Η δουλειά σας είναι να παρέχετε ετικέτες για τα κενά. Αν επιλέξετε μια επαγωγική προσέγγιση, θα εκπαιδεύσετε ένα μοντέλο αναζητώντας «δίσκους» και «cd» και θα εφαρμόσετε αυτές τις ετικέτες στα μη επισημασμένα δεδομένα. Αυτή η προσέγγιση θα δυσκολευτεί να ταξινομήσει αντικείμενα που είναι στην πραγματικότητα «κασέτες». Μια μεταγωγική προσέγγιση, από την άλλη, χειρίζεται αυτά τα άγνωστα δεδομένα πιο αποτελεσματικά, καθώς εργάζεται για να ομαδοποιήσει παρόμοια αντικείμενα και στη συνέχεια να εφαρμόσει μια ετικέτα σε μια ομάδα. Σε αυτή την περίπτωση, οι ομάδες μπορεί να αντικατοπτρίζουν «στρογγυλά μουσικά αντικείμενα» και «τετράγωνα μουσικά αντικείμενα».\n", ">\n", "> 🎓 ['Επίπεδη' vs. 'μη επίπεδη' γεωμετρία](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> Προερχόμενη από τη μαθηματική ορολογία, η επίπεδη vs. μη επίπεδη γεωμετρία αναφέρεται στη μέτρηση αποστάσεων μεταξύ σημείων είτε με «επίπεδες» ([Ευκλείδειες](https://wikipedia.org/wiki/Euclidean_geometry)) είτε με μη επίπεδες (μη Ευκλείδειες) γεωμετρικές μεθόδους.\n", ">\n", "> «Επίπεδη» σε αυτό το πλαίσιο αναφέρεται στην Ευκλείδεια γεωμετρία (μέρη της οποίας διδάσκονται ως «επίπεδη» γεωμετρία), ενώ η μη επίπεδη αναφέρεται στη μη Ευκλείδεια γεωμετρία. Τι σχέση έχει η γεωμετρία με τη μηχανική μάθηση; Καθώς και οι δύο τομείς βασίζονται στα μαθηματικά, πρέπει να υπάρχει ένας κοινός τρόπος μέτρησης αποστάσεων μεταξύ σημείων στις ομάδες, και αυτό μπορεί να γίνει με «επίπεδο» ή «μη επίπεδο» τρόπο, ανάλογα με τη φύση των δεδομένων. Οι [Ευκλείδειες αποστάσεις](https://wikipedia.org/wiki/Euclidean_distance) μετρώνται ως το μήκος ενός ευθύγραμμου τμήματος μεταξύ δύο σημείων. Οι [μη Ευκλείδειες αποστάσεις](https://wikipedia.org/wiki/Non-Euclidean_geometry) μετρώνται κατά μήκος μιας καμπύλης. Αν τα δεδομένα σας, όταν απεικονίζονται, φαίνεται να μην υπάρχουν σε ένα επίπεδο, ίσως χρειαστεί να χρησιμοποιήσετε έναν εξειδικευμένο αλγόριθμο για να τα χειριστείτε.\n", "\n", "

\n", " \n", "

Γραφικό από τον Dasani Madipalli
\n", "\n", "> 🎓 ['Αποστάσεις'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> Οι ομάδες ορίζονται από τον πίνακα αποστάσεών τους, π.χ. τις αποστάσεις μεταξύ σημείων. Αυτή η απόσταση μπορεί να μετρηθεί με διάφορους τρόπους. Οι Ευκλείδειες ομάδες ορίζονται από τον μέσο όρο των τιμών των σημείων και περιέχουν ένα «κέντρο» ή κεντρικό σημείο. Οι αποστάσεις μετρώνται έτσι από την απόσταση από αυτό το κέντρο. Οι μη Ευκλείδειες αποστάσεις αναφέρονται σε «clustroids», το σημείο που είναι πιο κοντά στα άλλα σημεία. Οι clustroids με τη σειρά τους μπορούν να οριστούν με διάφορους τρόπους.\n", ">\n", "> 🎓 ['Περιορισμένη'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> Η [Περιορισμένη Ομαδοποίηση](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) εισάγει τη «ημι-εποπτευόμενη» μάθηση σε αυτή τη μη εποπτευόμενη μέθοδο. Οι σχέσεις μεταξύ σημείων επισημαίνονται ως «δεν μπορούν να συνδεθούν» ή «πρέπει να συνδεθούν», ώστε να επιβληθούν κάποιοι κανόνες στο σύνολο δεδομένων.\n", ">\n", "> Παράδειγμα: Αν ένας αλγόριθμος αφεθεί ελεύθερος σε μια παρτίδα μη επισημασμένων ή ημι-επισημασμένων δεδομένων, οι ομάδες που παράγει μπορεί να είναι χαμηλής ποιότητας. Στο παραπάνω παράδειγμα, οι ομάδες μπορεί να ομαδοποιήσουν «στρογγυλά μουσικά αντικείμενα», «τετράγωνα μουσικά αντικείμενα», «τριγωνικά αντικείμενα» και «μπισκότα». Αν δοθούν κάποιοι περιορισμοί ή κανόνες για να ακολουθήσει («το αντικείμενο πρέπει να είναι πλαστικό», «το αντικείμενο πρέπει να μπορεί να παράγει μουσική»), αυτό μπορεί να βοηθήσει να «περιοριστεί» ο αλγόριθμος ώστε να κάνει καλύτερες επιλογές.\n", ">\n", "> 🎓 'Πυκνότητα'\n", ">\n", "> Τα δεδομένα που είναι «θορυβώδη» θεωρούνται «πυκνά». Οι αποστάσεις μεταξύ σημείων σε κάθε ομάδα τους μπορεί, κατά την εξέταση, να αποδειχθούν περισσότερο ή λιγότερο πυκνές ή «συμπιεσμένες», και έτσι αυτά τα δεδομένα χρειάζονται ανάλυση με την κατάλληλη μέθοδο ομαδοποίησης. [Αυτό το άρθρο](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) δείχνει τη διαφορά μεταξύ της χρήσης των αλγορίθμων K-Means και HDBSCAN για την εξερεύνηση ενός θορυβώδους συνόλου δεδομένων με άνιση πυκνότητα ομάδων.\n", "\n", "Εμβαθύνετε την κατανόησή σας για τις τεχνικές ομαδοποίησης σε αυτή τη [μονάδα εκμάθησης](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n", "\n", "### **Αλγόριθμοι ομαδοποίησης**\n", "\n", "Υπάρχουν πάνω από 100 αλγόριθμοι ομαδοποίησης, και η χρήση τους εξαρτάται από τη φύση των δεδομένων. Ας συζητήσουμε μερικούς από τους βασικούς:\n", "\n", "- **Ιεραρχική ομαδοποίηση**. Αν ένα αντικείμενο ταξινομείται με βάση την εγγύτητά του σε ένα κοντινό αντικείμενο, αντί για ένα πιο απομακρυσμένο, οι ομάδες σχηματίζονται με βάση την απόσταση των μελών τους από άλλα αντικείμενα. Η ιεραρχική ομαδοποίηση χαρακτηρίζεται από τον επαναλαμβανόμενο συνδυασμό δύο ομάδων.\n", "\n", "

\n", " \n", "

Γραφικό από τον Dasani Madipalli
\n", "\n", "- **Ομαδοποίηση με κέντρο**. Αυτός ο δημοφιλής αλγόριθμος απαιτεί την επιλογή του 'k', δηλαδή του αριθμού των ομάδων που θα σχηματιστούν, μετά την οποία ο αλγόριθμος καθορίζει το κεντρικό σημείο μιας ομάδας και συγκεντρώνει δεδομένα γύρω από αυτό το σημείο. Η [ομαδοποίηση K-means](https://wikipedia.org/wiki/K-means_clustering) είναι μια δημοφιλής εκδοχή της ομαδοποίησης με κέντρο, η οποία διαχωρίζει ένα σύνολο δεδομένων σε προκαθορισμένες ομάδες K. Το κέντρο καθορίζεται από τον πλησιέστερο μέσο όρο, εξ ου και το όνομα. Η τετραγωνική απόσταση από την ομάδα ελαχιστοποιείται.\n", "\n", "

\n", " \n", "

Γραφικό από τον Dasani Madipalli
\n", "\n", "- **Ομαδοποίηση βάσει κατανομής**. Βασισμένη στη στατιστική μοντελοποίηση, η ομαδοποίηση βάσει κατανομής επικεντρώνεται στον προσδιορισμό της πιθανότητας ότι ένα σημείο δεδομένων ανήκει σε μια ομάδα και το αναθέτει ανάλογα. Οι μέθοδοι Gaussian mixture ανήκουν σε αυτόν τον τύπο.\n", "\n", "- **Ομαδοποίηση βάσει πυκνότητας**. Τα σημεία δεδομένων ανατίθενται σε ομάδες με βάση την πυκνότητά τους ή τη συγκέντρωσή τους γύρω από άλλα σημεία. Τα σημεία δεδομένων που βρίσκονται μακριά από την ομάδα θεωρούνται ανωμαλίες ή θόρυβος. Οι DBSCAN, Mean-shift και OPTICS ανήκουν σε αυτόν τον τύπο ομαδοποίησης.\n", "\n", "- **Ομαδοποίηση βάσει πλέγματος**. Για πολυδιάστατα σύνολα δεδομένων, δημιουργείται ένα πλέγμα και τα δεδομένα διαιρούνται μεταξύ των κελιών του πλέγματος, δημιουργώντας έτσι ομάδες.\n", "\n", "Ο καλύτερος τρόπος για να μάθετε για την ομαδοποίηση είναι να τη δοκιμάσετε μόνοι σας, και αυτό θα κάνετε σε αυτή την άσκηση.\n", "\n", "Θα χρειαστούμε μερικά πακέτα για να ολοκληρώσουμε αυτή τη μονάδα. Μπορείτε να τα εγκαταστήσετε ως εξής: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "Εναλλακτικά, το παρακάτω script ελέγχει αν έχετε τα πακέτα που απαιτούνται για την ολοκλήρωση αυτής της μονάδας και τα εγκαθιστά για εσάς σε περίπτωση που λείπουν.\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": [ "## Άσκηση - Ομαδοποιήστε τα δεδομένα σας\n", "\n", "Η ομαδοποίηση ως τεχνική υποστηρίζεται σημαντικά από την κατάλληλη οπτικοποίηση, οπότε ας ξεκινήσουμε με την οπτικοποίηση των δεδομένων μουσικής μας. Αυτή η άσκηση θα μας βοηθήσει να αποφασίσουμε ποια από τις μεθόδους ομαδοποίησης θα πρέπει να χρησιμοποιήσουμε πιο αποτελεσματικά για τη φύση αυτών των δεδομένων.\n", "\n", "Ας ξεκινήσουμε δυναμικά εισάγοντας τα δεδομένα.\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": [ "Μερικές φορές, μπορεί να θέλουμε λίγες περισσότερες πληροφορίες για τα δεδομένα μας. Μπορούμε να ρίξουμε μια ματιά στα `δεδομένα` και στη `δομή τους` χρησιμοποιώντας τη συνάρτηση [*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": [ "Μπράβο!💪\n", "\n", "Μπορούμε να παρατηρήσουμε ότι το `glimpse()` θα σου δώσει τον συνολικό αριθμό γραμμών (παρατηρήσεων) και στηλών (μεταβλητών), και στη συνέχεια, τις πρώτες εγγραφές κάθε μεταβλητής σε μια γραμμή μετά το όνομα της μεταβλητής. Επιπλέον, ο *τύπος δεδομένων* της μεταβλητής εμφανίζεται αμέσως μετά το όνομα της μεταβλητής μέσα σε `< >`.\n", "\n", "Το `DataExplorer::introduce()` μπορεί να συνοψίσει αυτές τις πληροφορίες με οργανωμένο τρόπο:\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": [ "Υπέροχα! Μόλις μάθαμε ότι τα δεδομένα μας δεν έχουν ελλείπουσες τιμές.\n", "\n", "Εφόσον είμαστε σε αυτό το σημείο, μπορούμε να εξερευνήσουμε κοινά στατιστικά μέτρα κεντρικής τάσης (π.χ. [μέσος όρος](https://en.wikipedia.org/wiki/Arithmetic_mean) και [διάμεσος](https://en.wikipedia.org/wiki/Median)) και μέτρα διασποράς (π.χ. [τυπική απόκλιση](https://en.wikipedia.org/wiki/Standard_deviation)) χρησιμοποιώντας `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": [ "Ας δούμε τις γενικές τιμές των δεδομένων. Σημειώστε ότι η δημοτικότητα μπορεί να είναι `0`, που δείχνει τραγούδια χωρίς κατάταξη. Θα τα αφαιρέσουμε σύντομα.\n", "\n", "> 🤔 Αν δουλεύουμε με την ομαδοποίηση, μια μη εποπτευόμενη μέθοδο που δεν απαιτεί δεδομένα με ετικέτες, γιατί δείχνουμε αυτά τα δεδομένα με ετικέτες; Στη φάση εξερεύνησης δεδομένων, είναι χρήσιμες, αλλά δεν είναι απαραίτητες για να λειτουργήσουν οι αλγόριθμοι ομαδοποίησης.\n", "\n", "### 1. Εξερεύνηση δημοφιλών ειδών\n", "\n", "Ας προχωρήσουμε και ας ανακαλύψουμε τα πιο δημοφιλή είδη 🎶 μετρώντας τις εμφανίσεις τους.\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": [ "Αυτό πήγε καλά! Λένε ότι μια εικόνα αξίζει όσο χίλιες γραμμές ενός πίνακα δεδομένων (στην πραγματικότητα κανείς δεν το λέει αυτό 😅). Αλλά καταλαβαίνεις το νόημα, σωστά;\n", "\n", "Ένας τρόπος να οπτικοποιήσεις κατηγορικά δεδομένα (μεταβλητές χαρακτήρων ή παραγόντων) είναι χρησιμοποιώντας ραβδογράμματα. Ας φτιάξουμε ένα ραβδόγραμμα για τα 10 κορυφαία είδη:\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": [ "Τώρα είναι πολύ πιο εύκολο να εντοπίσουμε ότι έχουμε `missing` είδη 🧐!\n", "\n", "> Μια καλή οπτικοποίηση θα σας δείξει πράγματα που δεν περιμένατε ή θα σας δημιουργήσει νέες ερωτήσεις σχετικά με τα δεδομένα - Hadley Wickham και Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "Σημειώστε ότι όταν το κορυφαίο είδος περιγράφεται ως `Missing`, αυτό σημαίνει ότι το Spotify δεν το ταξινόμησε, οπότε ας το αφαιρέσουμε.\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": [ "Από την αρχική εξερεύνηση δεδομένων, μαθαίνουμε ότι τα τρία κορυφαία είδη κυριαρχούν σε αυτό το σύνολο δεδομένων. Ας επικεντρωθούμε στα `afro dancehall`, `afropop` και `nigerian pop`, και επιπλέον ας φιλτράρουμε το σύνολο δεδομένων ώστε να αφαιρέσουμε οτιδήποτε έχει τιμή δημοφιλίας 0 (που σημαίνει ότι δεν ταξινομήθηκε με δημοφιλία στο σύνολο δεδομένων και μπορεί να θεωρηθεί θόρυβος για τους σκοπούς μας):\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": [ "Ας δούμε αν υπάρχει κάποια εμφανής γραμμική σχέση μεταξύ των αριθμητικών μεταβλητών στο σύνολο δεδομένων μας. Αυτή η σχέση ποσοτικοποιείται μαθηματικά από τη [στατιστική συσχέτιση](https://en.wikipedia.org/wiki/Correlation).\n", "\n", "Η στατιστική συσχέτιση είναι μια τιμή μεταξύ -1 και 1 που υποδεικνύει τη δύναμη μιας σχέσης. Τιμές πάνω από το 0 υποδεικνύουν *θετική* συσχέτιση (υψηλές τιμές μιας μεταβλητής τείνουν να συμπίπτουν με υψηλές τιμές της άλλης), ενώ τιμές κάτω από το 0 υποδεικνύουν *αρνητική* συσχέτιση (υψηλές τιμές μιας μεταβλητής τείνουν να συμπίπτουν με χαμηλές τιμές της άλλης).\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": [ "Τα δεδομένα δεν έχουν ισχυρή συσχέτιση, εκτός από τη σχέση μεταξύ `energy` και `loudness`, κάτι που βγάζει νόημα, δεδομένου ότι η δυνατή μουσική είναι συνήθως αρκετά ενεργητική. Η `Popularity` έχει μια αντιστοιχία με την `release date`, κάτι που επίσης βγάζει νόημα, καθώς τα πιο πρόσφατα τραγούδια είναι πιθανότατα πιο δημοφιλή. Το μήκος και η ενέργεια φαίνεται να έχουν επίσης κάποια συσχέτιση.\n", "\n", "Θα έχει ενδιαφέρον να δούμε τι μπορεί να αποκαλύψει ένας αλγόριθμος ομαδοποίησης για αυτά τα δεδομένα!\n", "\n", "> 🎓 Σημειώστε ότι η συσχέτιση δεν συνεπάγεται αιτιότητα! Έχουμε απόδειξη συσχέτισης, αλλά όχι απόδειξη αιτιότητας. Ένας [διασκεδαστικός ιστότοπος](https://tylervigen.com/spurious-correlations) περιέχει οπτικοποιήσεις που τονίζουν αυτό το σημείο.\n", "\n", "### 2. Εξερεύνηση της κατανομής των δεδομένων\n", "\n", "Ας θέσουμε μερικές πιο λεπτές ερωτήσεις. Είναι τα είδη μουσικής σημαντικά διαφορετικά στην αντίληψη της χορευτικότητάς τους, με βάση τη δημοτικότητά τους; Ας εξετάσουμε την κατανομή δεδομένων για τα τρία κορυφαία είδη μας όσον αφορά τη δημοτικότητα και τη χορευτικότητα κατά μήκος ενός δεδομένου άξονα x και y χρησιμοποιώντας [διαγράμματα πυκνότητας](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": [ "Βλέπουμε ότι υπάρχουν ομόκεντροι κύκλοι που ευθυγραμμίζονται, ανεξαρτήτως είδους. Μήπως οι προτιμήσεις των Νιγηριανών συγκλίνουν σε ένα συγκεκριμένο επίπεδο χορευτικότητας για αυτό το είδος;\n", "\n", "Γενικά, τα τρία είδη ευθυγραμμίζονται όσον αφορά τη δημοτικότητα και τη χορευτικότητα. Η αναγνώριση συστάδων σε αυτά τα χαλαρά ευθυγραμμισμένα δεδομένα θα είναι πρόκληση. Ας δούμε αν ένα διάγραμμα διασποράς μπορεί να υποστηρίξει αυτό.\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": [ "Ένα διάγραμμα διασποράς των ίδιων αξόνων δείχνει ένα παρόμοιο μοτίβο σύγκλισης.\n", "\n", "Γενικά, για την ομαδοποίηση, μπορείτε να χρησιμοποιήσετε διαγράμματα διασποράς για να δείξετε ομάδες δεδομένων, οπότε η εξοικείωση με αυτόν τον τύπο απεικόνισης είναι πολύ χρήσιμη. Στο επόμενο μάθημα, θα πάρουμε αυτά τα φιλτραρισμένα δεδομένα και θα χρησιμοποιήσουμε την ομαδοποίηση k-means για να ανακαλύψουμε ομάδες σε αυτά τα δεδομένα που φαίνεται να αλληλεπικαλύπτονται με ενδιαφέροντες τρόπους.\n", "\n", "## **🚀 Πρόκληση**\n", "\n", "Ως προετοιμασία για το επόμενο μάθημα, δημιουργήστε ένα διάγραμμα σχετικά με τους διάφορους αλγόριθμους ομαδοποίησης που μπορεί να ανακαλύψετε και να χρησιμοποιήσετε σε ένα παραγωγικό περιβάλλον. Τι είδους προβλήματα προσπαθεί να αντιμετωπίσει η ομαδοποίηση;\n", "\n", "## [**Κουίζ μετά το μάθημα**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **Ανασκόπηση & Αυτομελέτη**\n", "\n", "Πριν εφαρμόσετε αλγόριθμους ομαδοποίησης, όπως έχουμε μάθει, είναι καλή ιδέα να κατανοήσετε τη φύση του συνόλου δεδομένων σας. Διαβάστε περισσότερα για αυτό το θέμα [εδώ](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n", "\n", "Εμβαθύνετε την κατανόησή σας στις τεχνικές ομαδοποίησης:\n", "\n", "- [Εκπαίδευση και Αξιολόγηση Μοντέλων Ομαδοποίησης χρησιμοποιώντας Tidymodels και φίλους](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", "## **Εργασία**\n", "\n", "[Ερευνήστε άλλες απεικονίσεις για την ομαδοποίηση](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## ΕΥΧΑΡΙΣΤΟΥΜΕ:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) για τη δημιουργία της αρχικής έκδοσης αυτού του module σε Python ♥️\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) για τη δημιουργία των καταπληκτικών εικονογραφήσεων που κάνουν τις έννοιες της μηχανικής μάθησης πιο κατανοητές και ευκολότερες στην κατανόηση.\n", "\n", "Καλή Μάθηση,\n", "\n", "[Eric](https://twitter.com/ericntay), Χρυσός Πρεσβευτής Microsoft Learn.\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Αποποίηση Ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε κάθε προσπάθεια για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\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:50:55+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "el" } }, "nbformat": 4, "nbformat_minor": 1 }