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/el/2-Regression/2-Data/solution/R/lesson_2-R.ipynb

672 lines
34 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.

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_2-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
"translation_date": "2025-09-04T07:17:25+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "el"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Δημιουργία ενός μοντέλου παλινδρόμησης: προετοιμασία και οπτικοποίηση δεδομένων\n",
"\n",
"## **Γραμμική Παλινδρόμηση για Κολοκύθες - Μάθημα 2**\n",
"#### Εισαγωγή\n",
"\n",
"Τώρα που έχετε εξοπλιστεί με τα εργαλεία που χρειάζεστε για να ξεκινήσετε τη δημιουργία μοντέλων μηχανικής μάθησης με τα Tidymodels και το Tidyverse, είστε έτοιμοι να αρχίσετε να θέτετε ερωτήματα στα δεδομένα σας. Καθώς εργάζεστε με δεδομένα και εφαρμόζετε λύσεις μηχανικής μάθησης, είναι πολύ σημαντικό να κατανοήσετε πώς να θέσετε τη σωστή ερώτηση για να αξιοποιήσετε πλήρως τις δυνατότητες του συνόλου δεδομένων σας.\n",
"\n",
"Σε αυτό το μάθημα, θα μάθετε:\n",
"\n",
"- Πώς να προετοιμάσετε τα δεδομένα σας για τη δημιουργία μοντέλων.\n",
"\n",
"- Πώς να χρησιμοποιήσετε το `ggplot2` για την οπτικοποίηση δεδομένων.\n",
"\n",
"Η ερώτηση που θέλετε να απαντήσετε θα καθορίσει τον τύπο των αλγορίθμων μηχανικής μάθησης που θα χρησιμοποιήσετε. Και η ποιότητα της απάντησης που θα λάβετε θα εξαρτηθεί σε μεγάλο βαθμό από τη φύση των δεδομένων σας.\n",
"\n",
"Ας το δούμε αυτό μέσα από μια πρακτική άσκηση.\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>Έργο τέχνης από την @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Έργο τέχνης από την \\@allison_horst](../../../../../../2-Regression/2-Data/images/unruly_data.jpg)<br>Έργο τέχνης από την \\@allison_horst-->\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Εισαγωγή δεδομένων κολοκύθας και ενεργοποίηση του Tidyverse\n",
"\n",
"Θα χρειαστούμε τα παρακάτω πακέτα για να επεξεργαστούμε αυτό το μάθημα:\n",
"\n",
"- `tidyverse`: Το [tidyverse](https://www.tidyverse.org/) είναι μια [συλλογή πακέτων R](https://www.tidyverse.org/packages) σχεδιασμένη για να κάνει την επιστήμη δεδομένων πιο γρήγορη, εύκολη και διασκεδαστική!\n",
"\n",
"Μπορείτε να τα εγκαταστήσετε ως εξής:\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\n",
"\n",
"Το παρακάτω script ελέγχει αν έχετε τα πακέτα που απαιτούνται για την ολοκλήρωση αυτής της ενότητας και τα εγκαθιστά για εσάς σε περίπτωση που λείπουν κάποια.\n"
],
"metadata": {
"id": "dc5WhyVdXAjR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse)"
],
"outputs": [],
"metadata": {
"id": "GqPYUZgfXOBt"
}
},
{
"cell_type": "markdown",
"source": [
"Τώρα, ας ενεργοποιήσουμε μερικά πακέτα και να φορτώσουμε τα [δεδομένα](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) που παρέχονται για αυτό το μάθημα!\n"
],
"metadata": {
"id": "kvjDTPDSXRr2"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\n",
"\n",
"# Import the pumpkins data\n",
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
"\n",
"\n",
"# Get a glimpse and dimensions of the data\n",
"glimpse(pumpkins)\n",
"\n",
"\n",
"# Print the first 50 rows of the data set\n",
"pumpkins %>% \n",
" slice_head(n =50)"
],
"outputs": [],
"metadata": {
"id": "VMri-t2zXqgD"
}
},
{
"cell_type": "markdown",
"source": [
"Μια γρήγορη `glimpse()` δείχνει αμέσως ότι υπάρχουν κενά και ένας συνδυασμός από συμβολοσειρές (`chr`) και αριθμητικά δεδομένα (`dbl`). Η `Date` είναι τύπου χαρακτήρα και υπάρχει επίσης μια περίεργη στήλη που ονομάζεται `Package`, όπου τα δεδομένα είναι ένας συνδυασμός από `sacks`, `bins` και άλλες τιμές. Τα δεδομένα, στην πραγματικότητα, είναι λίγο χαοτικά 😤.\n",
"\n",
"Στην πραγματικότητα, δεν είναι πολύ συνηθισμένο να λαμβάνουμε ένα σύνολο δεδομένων που είναι πλήρως έτοιμο για χρήση ώστε να δημιουργηθεί ένα μοντέλο ML απευθείας. Αλλά μην ανησυχείτε, σε αυτό το μάθημα θα μάθετε πώς να προετοιμάζετε ένα ακατέργαστο σύνολο δεδομένων χρησιμοποιώντας τις τυπικές βιβλιοθήκες της R 🧑‍🔧. Θα μάθετε επίσης διάφορες τεχνικές για να οπτικοποιείτε τα δεδομένα.📈📊\n",
"<br>\n",
"\n",
"> Μια υπενθύμιση: Ο τελεστής pipe (`%>%`) εκτελεί λειτουργίες σε λογική ακολουθία περνώντας ένα αντικείμενο προς τα εμπρός σε μια συνάρτηση ή έκφραση κλήσης. Μπορείτε να σκεφτείτε τον τελεστή pipe σαν να λέει \"και μετά\" στον κώδικά σας.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Έλεγχος για ελλιπή δεδομένα\n",
"\n",
"Ένα από τα πιο συνηθισμένα προβλήματα που αντιμετωπίζουν οι επιστήμονες δεδομένων είναι τα ελλιπή ή τα απούμενα δεδομένα. Η R αναπαριστά τις απούμενες ή άγνωστες τιμές με μια ειδική τιμή: `NA` (Not Available).\n",
"\n",
"Πώς μπορούμε να γνωρίζουμε ότι το πλαίσιο δεδομένων περιέχει απούμενες τιμές;\n",
"<br>\n",
"- Ένας απλός τρόπος θα ήταν να χρησιμοποιήσουμε τη βασική συνάρτηση της R `anyNA`, η οποία επιστρέφει λογικά αντικείμενα `TRUE` ή `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Υπέροχα, φαίνεται να λείπουν κάποια δεδομένα! Αυτό είναι ένα καλό σημείο για να ξεκινήσουμε.\n",
"\n",
"- Ένας άλλος τρόπος θα ήταν να χρησιμοποιήσετε τη συνάρτηση `is.na()`, η οποία υποδεικνύει ποια στοιχεία μιας στήλης λείπουν με μια λογική τιμή `TRUE`.\n"
],
"metadata": {
"id": "mU-7-SB6YokF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "W-DxDOR4YxSW"
}
},
{
"cell_type": "markdown",
"source": [
"Εντάξει, η δουλειά έγινε, αλλά με ένα μεγάλο πλαίσιο δεδομένων όπως αυτό, θα ήταν αναποτελεσματικό και πρακτικά αδύνατο να ελεγχθούν όλες οι γραμμές και οι στήλες ξεχωριστά😴.\n",
"\n",
"- Ένας πιο διαισθητικός τρόπος θα ήταν να υπολογίσουμε το άθροισμα των ελλειπόντων τιμών για κάθε στήλη:\n"
],
"metadata": {
"id": "xUWxipKYY0o7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" colSums()"
],
"outputs": [],
"metadata": {
"id": "ZRBWV6P9ZArL"
}
},
{
"cell_type": "markdown",
"source": [
"Πολύ καλύτερα! Υπάρχουν ελλείποντα δεδομένα, αλλά ίσως να μην έχουν σημασία για την τρέχουσα εργασία. Ας δούμε τι θα φέρει η περαιτέρω ανάλυση.\n",
"\n",
"> Μαζί με τα εξαιρετικά σύνολα πακέτων και συναρτήσεων, η R διαθέτει πολύ καλή τεκμηρίωση. Για παράδειγμα, χρησιμοποιήστε `help(colSums)` ή `?colSums` για να μάθετε περισσότερα σχετικά με τη συνάρτηση.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Μια Γραμματική για τον Χειρισμό Δεδομένων\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>Έργο τέχνης από την @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Έργο τέχνης από την \\@allison_horst](../../../../../../2-Regression/2-Data/images/dplyr_wrangling.png)<br/>Έργο τέχνης από την \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/), ένα πακέτο του Tidyverse, είναι μια γραμματική για τη διαχείριση δεδομένων που παρέχει ένα συνεπές σύνολο ρημάτων για να σας βοηθήσει να λύσετε τις πιο συνηθισμένες προκλήσεις διαχείρισης δεδομένων. Σε αυτή την ενότητα, θα εξερευνήσουμε μερικά από τα ρήματα του dplyr! \n",
"<br>\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"Η `select()` είναι μια συνάρτηση στο πακέτο `dplyr` που σας βοηθά να επιλέξετε στήλες για να διατηρήσετε ή να αποκλείσετε.\n",
"\n",
"Για να κάνετε το πλαίσιο δεδομένων σας πιο εύχρηστο, αφαιρέστε αρκετές από τις στήλες του χρησιμοποιώντας τη `select()`, διατηρώντας μόνο τις στήλες που χρειάζεστε.\n",
"\n",
"Για παράδειγμα, σε αυτή την άσκηση, η ανάλυσή μας θα περιλαμβάνει τις στήλες `Package`, `Low Price`, `High Price` και `Date`. Ας επιλέξουμε αυτές τις στήλες.\n"
],
"metadata": {
"id": "x3VGMAGBZiUr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(Package, `Low Price`, `High Price`, Date)\n",
"\n",
"\n",
"# Print data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "F_FgxQnVZnM0"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::mutate()\n",
"\n",
"Το `mutate()` είναι μια συνάρτηση του πακέτου `dplyr`, η οποία σας βοηθά να δημιουργήσετε ή να τροποποιήσετε στήλες, διατηρώντας παράλληλα τις υπάρχουσες στήλες.\n",
"\n",
"Η γενική δομή του `mutate` είναι:\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"Ας δοκιμάσουμε το `mutate` χρησιμοποιώντας τη στήλη `Date` και εκτελώντας τις παρακάτω ενέργειες:\n",
"\n",
"1. Μετατροπή των ημερομηνιών (που είναι αυτή τη στιγμή τύπου χαρακτήρα) σε μορφή μήνα (οι ημερομηνίες είναι σε μορφή ΗΠΑ, δηλαδή `MM/DD/YYYY`).\n",
"\n",
"2. Εξαγωγή του μήνα από τις ημερομηνίες σε μια νέα στήλη.\n",
"\n",
"Στη γλώσσα R, το πακέτο [lubridate](https://lubridate.tidyverse.org/) διευκολύνει την εργασία με δεδομένα τύπου Ημερομηνία-Ώρα. Έτσι, ας χρησιμοποιήσουμε τις `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` για να πετύχουμε τους παραπάνω στόχους. Μπορούμε να αφαιρέσουμε τη στήλη `Date`, καθώς δεν θα τη χρειαστούμε ξανά στις επόμενες ενέργειες.\n"
],
"metadata": {
"id": "2KKo0Ed9Z1VB"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load lubridate\n",
"library(lubridate)\n",
"\n",
"pumpkins <- pumpkins %>% \n",
" # Convert the Date column to a date object\n",
" mutate(Date = mdy(Date)) %>% \n",
" # Extract month from Date\n",
" mutate(Month = month(Date)) %>% \n",
" # Drop Date column\n",
" select(-Date)\n",
"\n",
"# View the first few rows\n",
"pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "5joszIVSZ6xe"
}
},
{
"cell_type": "markdown",
"source": [
"Ουάου! 🤩\n",
"\n",
"Στη συνέχεια, ας δημιουργήσουμε μια νέα στήλη `Price`, η οποία αντιπροσωπεύει τη μέση τιμή μιας κολοκύθας. Τώρα, ας πάρουμε τον μέσο όρο των στηλών `Low Price` και `High Price` για να γεμίσουμε τη νέα στήλη Price.\n",
"<br>\n"
],
"metadata": {
"id": "nIgLjNMCZ-6Y"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new column Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
"\n",
"# View the first few rows of the data\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "Zo0BsqqtaJw2"
}
},
{
"cell_type": "markdown",
"source": [
"Ναι!💪\n",
"\n",
"\"Αλλά περίμενε!\", θα πεις αφού ρίξεις μια ματιά σε όλο το σύνολο δεδομένων με `View(pumpkins)`, \"Κάτι φαίνεται περίεργο εδώ!\"🤔\n",
"\n",
"Αν κοιτάξεις τη στήλη `Package`, οι κολοκύθες πωλούνται σε πολλές διαφορετικές διαμορφώσεις. Κάποιες πωλούνται σε μέτρα `1 1/9 bushel`, κάποιες σε μέτρα `1/2 bushel`, κάποιες ανά κολοκύθα, κάποιες ανά λίβρα, και κάποιες σε μεγάλες κουτιά με διαφορετικά πλάτη.\n",
"\n",
"Ας το επαληθεύσουμε αυτό:\n"
],
"metadata": {
"id": "p77WZr-9aQAR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Verify the distinct observations in Package column\n",
"pumpkins %>% \n",
" distinct(Package)"
],
"outputs": [],
"metadata": {
"id": "XISGfh0IaUy6"
}
},
{
"cell_type": "markdown",
"source": [
"Καταπληκτικό!👏\n",
"\n",
"Τα κολοκύθια φαίνεται να είναι πολύ δύσκολο να ζυγιστούν με συνέπεια, οπότε ας τα φιλτράρουμε επιλέγοντας μόνο τα κολοκύθια που περιέχουν τη λέξη *bushel* στη στήλη `Package` και ας τα τοποθετήσουμε σε ένα νέο πλαίσιο δεδομένων `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() και stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): δημιουργεί ένα υποσύνολο των δεδομένων που περιέχει μόνο τις **γραμμές** που ικανοποιούν τις συνθήκες σας, σε αυτή την περίπτωση, κολοκύθες με τη λέξη *bushel* στη στήλη `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): ανιχνεύει την παρουσία ή την απουσία ενός μοτίβου μέσα σε μια συμβολοσειρά.\n",
"\n",
"Το πακέτο [`stringr`](https://github.com/tidyverse/stringr) παρέχει απλές συναρτήσεις για κοινές λειτουργίες με συμβολοσειρές.\n"
],
"metadata": {
"id": "L8Qfcs92ageF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Retain only pumpkins with \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(Package, \"bushel\"))\n",
"\n",
"# Get the dimensions of the new data\n",
"dim(new_pumpkins)\n",
"\n",
"# View a few rows of the new data\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "hy_SGYREampd"
}
},
{
"cell_type": "markdown",
"source": [
"Μπορείτε να δείτε ότι έχουμε περιορίσει τα δεδομένα σε περίπου 415 σειρές που περιέχουν κολοκύθες ανά καλάθι.🤩 \n",
"<br>\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Αλλά περίμενε! Υπάρχει κάτι ακόμα που πρέπει να κάνεις**\n",
"\n",
"Παρατήρησες ότι η ποσότητα ανά bushel διαφέρει ανά γραμμή; Πρέπει να κανονικοποιήσεις την τιμολόγηση ώστε να δείχνεις την τιμή ανά bushel, όχι ανά 1 1/9 ή 1/2 bushel. Ώρα να κάνεις λίγα μαθηματικά για να την τυποποιήσεις.\n",
"\n",
"Θα χρησιμοποιήσουμε τη συνάρτηση [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) για να *μετασχηματίσουμε* τη στήλη Price ανάλογα με ορισμένες συνθήκες. Το `case_when` σου επιτρέπει να διαχειριστείς πολλαπλές δηλώσεις `if_else()` με τρόπο που να είναι πιο ευέλικτος.\n"
],
"metadata": {
"id": "mLpw2jH4a0tx"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Convert the price if the Package contains fractional bushel values\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(Price = case_when(\n",
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
" TRUE ~ Price))\n",
"\n",
"# View the first few rows of the data\n",
"new_pumpkins %>% \n",
" slice_head(n = 30)"
],
"outputs": [],
"metadata": {
"id": "P68kLVQmbM6I"
}
},
{
"cell_type": "markdown",
"source": [
"Τώρα, μπορούμε να αναλύσουμε την τιμή ανά μονάδα με βάση τη μέτρηση σε bushel. Όλη αυτή η μελέτη των bushel κολοκύθας, ωστόσο, δείχνει πόσο `σημαντικό` είναι να `κατανοήσετε τη φύση των δεδομένων σας`!\n",
"\n",
"> ✅ Σύμφωνα με [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), το βάρος ενός bushel εξαρτάται από τον τύπο του προϊόντος, καθώς είναι μέτρηση όγκου. \"Ένα bushel ντομάτας, για παράδειγμα, υποτίθεται ότι ζυγίζει 56 λίβρες... Φύλλα και χόρτα καταλαμβάνουν περισσότερο χώρο με λιγότερο βάρος, οπότε ένα bushel σπανάκι ζυγίζει μόνο 20 λίβρες.\" Είναι αρκετά περίπλοκο! Ας μην ασχοληθούμε με τη μετατροπή από bushel σε λίβρες και ας καθορίσουμε την τιμή ανά bushel. Όλη αυτή η μελέτη των bushel κολοκύθας, ωστόσο, δείχνει πόσο σημαντικό είναι να κατανοήσετε τη φύση των δεδομένων σας!\n",
">\n",
"> ✅ Παρατηρήσατε ότι οι κολοκύθες που πωλούνται ανά μισό bushel είναι πολύ ακριβές; Μπορείτε να καταλάβετε γιατί; Υπόδειξη: οι μικρές κολοκύθες είναι πολύ πιο ακριβές από τις μεγάλες, πιθανότατα επειδή υπάρχουν πολύ περισσότερες ανά bushel, δεδομένου του ανεκμετάλλευτου χώρου που καταλαμβάνει μία μεγάλη, κούφια κολοκύθα για πίτα.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Τώρα, τέλος, για χάρη της περιπέτειας 💁‍♀️, ας μετακινήσουμε τη στήλη Month στην πρώτη θέση, δηλαδή `πριν` από τη στήλη `Package`.\n",
"\n",
"Η `dplyr::relocate()` χρησιμοποιείται για να αλλάξουμε τις θέσεις των στηλών.\n"
],
"metadata": {
"id": "qql1SowfbdnP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new data frame new_pumpkins\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(Month, .before = Package)\n",
"\n",
"new_pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "JJ1x6kw8bixF"
}
},
{
"cell_type": "markdown",
"source": [
"Μπράβο!👌 Τώρα έχεις ένα καθαρό, τακτοποιημένο σύνολο δεδομένων πάνω στο οποίο μπορείς να χτίσεις το νέο σου μοντέλο παλινδρόμησης! \n",
"<br>\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Οπτικοποίηση δεδομένων με ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Γραφικό από τον Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Γραφικό από τον Dasani Madipalli](../../../../../../2-Regression/2-Data/images/data-visualization.png){width=\"600\"}-->\n",
"\n",
"Υπάρχει μια *σοφή* ρήση που λέει:\n",
"\n",
"> \"Το απλό γράφημα έχει φέρει περισσότερες πληροφορίες στο μυαλό του αναλυτή δεδομένων από οποιαδήποτε άλλη μέθοδο.\" --- John Tukey\n",
"\n",
"Μέρος του ρόλου του επιστήμονα δεδομένων είναι να δείξει την ποιότητα και τη φύση των δεδομένων με τα οποία εργάζεται. Για να το πετύχει αυτό, συχνά δημιουργεί ενδιαφέρουσες οπτικοποιήσεις, ή διαγράμματα, γραφήματα και πίνακες, που παρουσιάζουν διαφορετικές πτυχές των δεδομένων. Με αυτόν τον τρόπο, μπορεί να δείξει οπτικά σχέσεις και κενά που διαφορετικά είναι δύσκολο να εντοπιστούν.\n",
"\n",
"Οι οπτικοποιήσεις μπορούν επίσης να βοηθήσουν στον καθορισμό της τεχνικής μηχανικής μάθησης που είναι πιο κατάλληλη για τα δεδομένα. Ένα διάγραμμα διασποράς που φαίνεται να ακολουθεί μια γραμμή, για παράδειγμα, υποδεικνύει ότι τα δεδομένα είναι καλός υποψήφιος για μια άσκηση γραμμικής παλινδρόμησης.\n",
"\n",
"Η R προσφέρει αρκετά συστήματα για τη δημιουργία γραφημάτων, αλλά το [`ggplot2`](https://ggplot2.tidyverse.org/index.html) είναι ένα από τα πιο κομψά και ευέλικτα. Το `ggplot2` σας επιτρέπει να συνθέσετε γραφήματα **συνδυάζοντας ανεξάρτητα στοιχεία**.\n",
"\n",
"Ας ξεκινήσουμε με ένα απλό διάγραμμα διασποράς για τις στήλες Price και Month.\n",
"\n",
"Σε αυτή την περίπτωση, θα ξεκινήσουμε με το [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), θα παρέχουμε ένα σύνολο δεδομένων και μια αισθητική αντιστοίχιση (με το [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) και στη συνέχεια θα προσθέσουμε επίπεδα (όπως το [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) για διαγράμματα διασποράς.\n"
],
"metadata": {
"id": "mYSH6-EtbvNa"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plots\n",
"theme_set(theme_light())\n",
"\n",
"# Create a scatter plot\n",
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
"p + geom_point()"
],
"outputs": [],
"metadata": {
"id": "g2YjnGeOcLo4"
}
},
{
"cell_type": "markdown",
"source": [
"Είναι αυτή μια χρήσιμη γραφική παράσταση 🤷; Σας εκπλήσσει κάτι σε αυτήν;\n",
"\n",
"Δεν είναι ιδιαίτερα χρήσιμη, καθώς το μόνο που κάνει είναι να εμφανίζει τα δεδομένα σας ως μια διασπορά σημείων σε έναν συγκεκριμένο μήνα.\n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Πώς το κάνουμε χρήσιμο;**\n",
"\n",
"Για να εμφανίζονται χρήσιμα δεδομένα στα γραφήματα, συνήθως χρειάζεται να ομαδοποιήσετε τα δεδομένα με κάποιον τρόπο. Για παράδειγμα, στην περίπτωσή μας, η εύρεση της μέσης τιμής των κολοκυθών για κάθε μήνα θα παρείχε περισσότερες πληροφορίες για τα υποκείμενα μοτίβα στα δεδομένα μας. Αυτό μας οδηγεί σε μία ακόμη σύντομη αναφορά στη **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Η ομαδοποιημένη συναθροιστική επεξεργασία στην R μπορεί να υπολογιστεί εύκολα χρησιμοποιώντας\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- Το `dplyr::group_by()` αλλάζει τη μονάδα ανάλυσης από ολόκληρο το σύνολο δεδομένων σε μεμονωμένες ομάδες, όπως ανά μήνα.\n",
"\n",
"- Το `dplyr::summarize()` δημιουργεί ένα νέο πλαίσιο δεδομένων με μία στήλη για κάθε μεταβλητή ομαδοποίησης και μία στήλη για κάθε στατιστικό σύνοψης που έχετε καθορίσει.\n",
"\n",
"Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε το `dplyr::group_by() %>% summarize()` για να ομαδοποιήσουμε τις κολοκύθες σε ομάδες βάσει της στήλης **Month** και στη συνέχεια να βρούμε τη **μέση τιμή** για κάθε μήνα.\n"
],
"metadata": {
"id": "jMakvJZIcVkh"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price))"
],
"outputs": [],
"metadata": {
"id": "6kVSUa2Bcilf"
}
},
{
"cell_type": "markdown",
"source": [
"Συνοπτικά!✨\n",
"\n",
"Κατηγοριοποιημένα χαρακτηριστικά, όπως οι μήνες, αποδίδονται καλύτερα χρησιμοποιώντας ένα γράφημα με μπάρες 📊. Τα layers που είναι υπεύθυνα για τα γραφήματα με μπάρες είναι `geom_bar()` και `geom_col()`. Συμβουλευτείτε το `?geom_bar` για να μάθετε περισσότερα.\n",
"\n",
"Ας φτιάξουμε ένα!\n"
],
"metadata": {
"id": "Kds48GUBcj3W"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price)) %>% \r\n",
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"Pumpkin Price\")"
],
"outputs": [],
"metadata": {
"id": "VNbU1S3BcrxO"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩Αυτή είναι μια πιο χρήσιμη απεικόνιση δεδομένων! Φαίνεται να δείχνει ότι η υψηλότερη τιμή για τις κολοκύθες εμφανίζεται τον Σεπτέμβριο και τον Οκτώβριο. Συμφωνεί αυτό με τις προσδοκίες σας; Γιατί ή γιατί όχι;\n",
"\n",
"Συγχαρητήρια για την ολοκλήρωση του δεύτερου μαθήματος 👏! Προετοιμάσατε τα δεδομένα σας για τη δημιουργία μοντέλου και στη συνέχεια ανακαλύψατε περισσότερες πληροφορίες χρησιμοποιώντας απεικονίσεις!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n"
]
}
]
}