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.
Data-Science-For-Beginners/translations/el/2-Working-With-Data/08-data-preparation/README.md

28 KiB

Εργασία με Δεδομένα: Προετοιμασία Δεδομένων

 Σκίτσο από (@sketchthedocs)
Προετοιμασία Δεδομένων - Σκίτσο από @nitya

Προ-Διάλεξη Κουίζ

Ανάλογα με την πηγή τους, τα ακατέργαστα δεδομένα μπορεί να περιέχουν ασυνέπειες που θα προκαλέσουν προκλήσεις στην ανάλυση και τη μοντελοποίηση. Με άλλα λόγια, αυτά τα δεδομένα μπορούν να χαρακτηριστούν ως "βρώμικα" και θα χρειαστεί να καθαριστούν. Αυτό το μάθημα επικεντρώνεται σε τεχνικές καθαρισμού και μετασχηματισμού δεδομένων για την αντιμετώπιση προβλημάτων όπως ελλιπή, ανακριβή ή ατελή δεδομένα. Τα θέματα που καλύπτονται σε αυτό το μάθημα χρησιμοποιούν Python και τη βιβλιοθήκη Pandas και θα παρουσιαστούν στο notebook αυτού του φακέλου.

Η σημασία του καθαρισμού δεδομένων

  • Ευκολία χρήσης και επαναχρησιμοποίησης: Όταν τα δεδομένα είναι σωστά οργανωμένα και κανονικοποιημένα, είναι πιο εύκολο να αναζητηθούν, να χρησιμοποιηθούν και να μοιραστούν με άλλους.

  • Συνέπεια: Η επιστήμη δεδομένων συχνά απαιτεί εργασία με περισσότερα από ένα σύνολα δεδομένων, όπου σύνολα δεδομένων από διαφορετικές πηγές πρέπει να συνδυαστούν. Η διασφάλιση ότι κάθε μεμονωμένο σύνολο δεδομένων έχει κοινή τυποποίηση θα εξασφαλίσει ότι τα δεδομένα παραμένουν χρήσιμα όταν συγχωνεύονται σε ένα ενιαίο σύνολο δεδομένων.

  • Ακρίβεια μοντέλου: Τα καθαρισμένα δεδομένα βελτιώνουν την ακρίβεια των μοντέλων που βασίζονται σε αυτά.

Κοινά καθήκοντα και στρατηγικές καθαρισμού

  • Εξερεύνηση ενός συνόλου δεδομένων: Η εξερεύνηση δεδομένων, η οποία καλύπτεται σε ένα μεταγενέστερο μάθημα, μπορεί να σας βοηθήσει να ανακαλύψετε δεδομένα που χρειάζονται καθαρισμό. Η οπτική παρατήρηση τιμών μέσα σε ένα σύνολο δεδομένων μπορεί να δημιουργήσει προσδοκίες για το πώς θα μοιάζει το υπόλοιπο ή να δώσει μια ιδέα για τα προβλήματα που μπορούν να επιλυθούν. Η εξερεύνηση μπορεί να περιλαμβάνει βασικές ερωτήσεις, οπτικοποιήσεις και δειγματοληψία.

  • Μορφοποίηση: Ανάλογα με την πηγή, τα δεδομένα μπορεί να έχουν ασυνέπειες στον τρόπο παρουσίασής τους. Αυτό μπορεί να προκαλέσει προβλήματα στην αναζήτηση και την αναπαράσταση της τιμής, όπου αυτή εμφανίζεται στο σύνολο δεδομένων αλλά δεν αναπαρίσταται σωστά σε οπτικοποιήσεις ή αποτελέσματα ερωτημάτων. Κοινά προβλήματα μορφοποίησης περιλαμβάνουν την επίλυση κενών, ημερομηνιών και τύπων δεδομένων. Η επίλυση ζητημάτων μορφοποίησης συνήθως επαφίεται στους χρήστες των δεδομένων. Για παράδειγμα, τα πρότυπα για το πώς παρουσιάζονται οι ημερομηνίες και οι αριθμοί μπορεί να διαφέρουν ανά χώρα.

  • Διπλοεγγραφές: Τα δεδομένα που εμφανίζονται περισσότερες από μία φορές μπορούν να παράγουν ανακριβή αποτελέσματα και συνήθως πρέπει να αφαιρούνται. Αυτό μπορεί να είναι συνηθισμένο όταν συνδυάζονται δύο ή περισσότερα σύνολα δεδομένων. Ωστόσο, υπάρχουν περιπτώσεις όπου οι διπλοεγγραφές σε συνδυασμένα σύνολα δεδομένων περιέχουν στοιχεία που μπορούν να παρέχουν πρόσθετες πληροφορίες και μπορεί να χρειαστεί να διατηρηθούν.

  • Ελλιπή δεδομένα: Τα ελλιπή δεδομένα μπορούν να προκαλέσουν ανακρίβειες καθώς και αδύναμα ή μεροληπτικά αποτελέσματα. Μερικές φορές αυτά μπορούν να επιλυθούν με "επανφόρτωση" των δεδομένων, συμπλήρωση των ελλιπών τιμών με υπολογισμούς και κώδικα όπως η Python ή απλά με την αφαίρεση της τιμής και των αντίστοιχων δεδομένων. Υπάρχουν πολλοί λόγοι για τους οποίους τα δεδομένα μπορεί να λείπουν και οι ενέργειες που λαμβάνονται για την επίλυση αυτών των ελλείψεων εξαρτώνται από το πώς και γιατί χάθηκαν.

Εξερεύνηση πληροφοριών DataFrame

Στόχος μάθησης: Μέχρι το τέλος αυτής της υποενότητας, θα πρέπει να είστε άνετοι με την εύρεση γενικών πληροφοριών για τα δεδομένα που αποθηκεύονται σε pandas DataFrames.

Αφού φορτώσετε τα δεδομένα σας στις pandas, πιθανότατα θα βρίσκονται σε ένα DataFrame (ανατρέξτε στο προηγούμενο μάθημα για λεπτομερή επισκόπηση). Ωστόσο, αν το σύνολο δεδομένων στο DataFrame σας έχει 60.000 γραμμές και 400 στήλες, πώς ξεκινάτε να κατανοείτε τι έχετε να δουλέψετε; Ευτυχώς, οι pandas παρέχουν μερικά χρήσιμα εργαλεία για να δείτε γρήγορα γενικές πληροφορίες για ένα DataFrame, καθώς και τις πρώτες και τελευταίες γραμμές.

Για να εξερευνήσουμε αυτή τη λειτουργικότητα, θα εισάγουμε τη βιβλιοθήκη scikit-learn της Python και θα χρησιμοποιήσουμε ένα εμβληματικό σύνολο δεδομένων: το Iris dataset.

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
  • DataFrame.info: Για αρχή, η μέθοδος info() χρησιμοποιείται για να εκτυπώσει μια σύνοψη του περιεχομένου που υπάρχει σε ένα DataFrame. Ας δούμε αυτό το σύνολο δεδομένων για να δούμε τι έχουμε:
iris_df.info()
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
dtypes: float64(4)
memory usage: 4.8 KB

Από αυτό, γνωρίζουμε ότι το σύνολο δεδομένων Iris έχει 150 εγγραφές σε τέσσερις στήλες χωρίς κενές εγγραφές. Όλα τα δεδομένα αποθηκεύονται ως αριθμοί κινητής υποδιαστολής 64-bit.

  • DataFrame.head(): Στη συνέχεια, για να ελέγξουμε το πραγματικό περιεχόμενο του DataFrame, χρησιμοποιούμε τη μέθοδο head(). Ας δούμε πώς φαίνονται οι πρώτες γραμμές του iris_df:
iris_df.head()
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                5.1               3.5                1.4               0.2
1                4.9               3.0                1.4               0.2
2                4.7               3.2                1.3               0.2
3                4.6               3.1                1.5               0.2
4                5.0               3.6                1.4               0.2
  • DataFrame.tail(): Αντίστροφα, για να ελέγξουμε τις τελευταίες γραμμές του DataFrame, χρησιμοποιούμε τη μέθοδο tail():
iris_df.tail()
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
145                6.7               3.0                5.2               2.3
146                6.3               2.5                5.0               1.9
147                6.5               3.0                5.2               2.0
148                6.2               3.4                5.4               2.3
149                5.9               3.0                5.1               1.8

Συμπέρασμα: Ακόμα και μόνο κοιτάζοντας τα μεταδεδομένα για τις πληροφορίες σε ένα DataFrame ή τις πρώτες και τελευταίες τιμές σε αυτό, μπορείτε να αποκτήσετε μια άμεση ιδέα για το μέγεθος, το σχήμα και το περιεχόμενο των δεδομένων που διαχειρίζεστε.

Αντιμετώπιση Ελλιπών Δεδομένων

Στόχος μάθησης: Μέχρι το τέλος αυτής της υποενότητας, θα πρέπει να γνωρίζετε πώς να αντικαθιστάτε ή να αφαιρείτε κενές τιμές από τα DataFrames.

Στις περισσότερες περιπτώσεις, τα σύνολα δεδομένων που θέλετε (ή πρέπει) να χρησιμοποιήσετε περιέχουν ελλιπείς τιμές. Ο τρόπος με τον οποίο αντιμετωπίζονται τα ελλιπή δεδομένα φέρει λεπτές συμβιβαστικές αποφάσεις που μπορούν να επηρεάσουν την τελική ανάλυση και τα πραγματικά αποτελέσματα.

Οι pandas χειρίζονται τις ελλιπείς τιμές με δύο τρόπους. Ο πρώτος, που έχετε δει σε προηγούμενες ενότητες, είναι το NaN (Not a Number). Αυτό είναι μια ειδική τιμή που αποτελεί μέρος της προδιαγραφής κινητής υποδιαστολής IEEE και χρησιμοποιείται μόνο για να υποδηλώσει ελλιπείς τιμές κινητής υποδιαστολής.

Για ελλιπείς τιμές εκτός από κινητές υποδιαστολές, οι pandas χρησιμοποιούν το αντικείμενο None της Python. Ενώ μπορεί να φαίνεται μπερδεμένο ότι θα συναντήσετε δύο διαφορετικά είδη τιμών που λένε ουσιαστικά το ίδιο πράγμα, υπάρχουν βάσιμοι προγραμματιστικοί λόγοι για αυτήν την επιλογή σχεδίασης και, στην πράξη, αυτή η προσέγγιση επιτρέπει στις pandas να προσφέρουν έναν καλό συμβιβασμό για τη συντριπτική πλειονότητα των περιπτώσεων. Παρ' όλα αυτά, τόσο το None όσο και το NaN φέρουν περιορισμούς που πρέπει να έχετε υπόψη σας σχετικά με το πώς μπορούν να χρησιμοποιηθούν.

Δείτε περισσότερα για το NaN και το None από το notebook!

  • Ανίχνευση κενών τιμών: Στις pandas, οι μέθοδοι isnull() και notnull() είναι οι κύριες μέθοδοι για την ανίχνευση κενών δεδομένων. Και οι δύο επιστρέφουν Boolean μάσκες πάνω από τα δεδομένα σας. Θα χρησιμοποιήσουμε το numpy για τιμές NaN:
import numpy as np

example1 = pd.Series([0, np.nan, '', None])
example1.isnull()
0    False
1     True
2    False
3     True
dtype: bool

Παρατηρήστε προσεκτικά την έξοδο. Σας εκπλήσσει κάτι; Ενώ το 0 είναι αριθμητικά μηδενικό, είναι παρ' όλα αυτά ένας αποδεκτός ακέραιος αριθμός και οι pandas το αντιμετωπίζουν ως τέτοιο. Το '' είναι λίγο πιο λεπτό. Ενώ το χρησιμοποιήσαμε στην Ενότητα 1 για να αναπαραστήσουμε μια κενή συμβολοσειρά, είναι παρ' όλα αυτά ένα αντικείμενο συμβολοσειράς και όχι μια αναπαράσταση του κενού σύμφωνα με τις pandas.

Τώρα, ας αντιστρέψουμε αυτό και ας χρησιμοποιήσουμε αυτές τις μεθόδους με τρόπο πιο κοντά σε αυτόν που θα τις χρησιμοποιήσετε στην πράξη. Μπορείτε να χρησιμοποιήσετε Boolean μάσκες απευθείας ως δείκτη Series ή DataFrame, κάτι που μπορεί να είναι χρήσιμο όταν προσπαθείτε να εργαστείτε με απομονωμένες ελλιπείς (ή παρούσες) τιμές.

Συμπέρασμα: Οι μέθοδοι isnull() και notnull() παράγουν παρόμοια αποτελέσματα όταν τις χρησιμοποιείτε σε DataFrames: δείχνουν τα αποτελέσματα και τον δείκτη αυτών των αποτελεσμάτων, κάτι που θα σας βοηθήσει σημαντικά καθώς παλεύετε με τα δεδομένα σας.

  • Αφαίρεση κενών τιμών: Πέρα από την αναγνώριση ελλιπών τιμών, οι pandas παρέχουν έναν βολικό τρόπο για να αφαιρέσετε κενές τιμές από Series και DataFrames. (Ιδιαίτερα σε μεγάλα σύνολα δεδομένων, είναι συχνά πιο συνετό να αφαιρέσετε απλώς τις ελλιπείς [NA] τιμές από την ανάλυσή σας παρά να τις αντιμετωπίσετε με άλλους τρόπους.) Για να το δείτε αυτό στην πράξη, ας επιστρέψουμε στο example1:
example1 = example1.dropna()
example1
0    0
2     
dtype: object

Παρατηρήστε ότι αυτό θα πρέπει να μοιάζει με την έξοδό σας από το example3[example3.notnull()]. Η διαφορά εδώ είναι ότι, αντί να κάνετε απλώς ευρετηρίαση στις τιμές της μάσκας, το dropna έχει αφαιρέσει αυτές τις ελλιπείς τιμές από το Series example1.

Επειδή τα DataFrames έχουν δύο διαστάσεις, προσφέρουν περισσότερες επιλογές για την αφαίρεση δεδομένων.

example2 = pd.DataFrame([[1,      np.nan, 7], 
                         [2,      5,      8], 
                         [np.nan, 6,      9]])
example2
0 1 2
0 1.0 NaN 7
1 2.0 5.0 8
2 NaN 6.0 9

(Παρατηρήσατε ότι οι pandas μετέτρεψαν δύο από τις στήλες σε κινητές υποδιαστολές για να φιλοξενήσουν τα NaN;)

Δεν μπορείτε να αφαιρέσετε μία μόνο τιμή από ένα DataFrame, οπότε πρέπει να αφαιρέσετε πλήρεις γραμμές ή στήλες. Ανάλογα με το τι κάνετε, μπορεί να θέλετε να κάνετε το ένα ή το άλλο, και έτσι οι pandas σας δίνουν επιλογές και για τα δύο. Επειδή στην επιστήμη δεδομένων οι στήλες γενικά αντιπροσωπεύουν μεταβλητές και οι γραμμές παρατηρήσεις, είναι πιο πιθανό να αφαιρέσετε γραμμές δεδομένων. Η προεπιλεγμένη ρύθμιση για το dropna() είναι να αφαιρεί όλες τις γραμμές που περιέχουν οποιεσδήποτε κενές τιμές:

example2.dropna()
	0	1	2
1	2.0	5.0	8

Εάν είναι απαραίτητο, μπορείτε να αφαιρέσετε τιμές NA από στήλες. Χρησιμοποιήστε axis=1 για να το κάνετε:

example2.dropna(axis='columns')
	2
0	7
1	8
2	9

Παρατηρήστε ότι αυτό μπορεί να αφαιρέσει πολλά δεδομένα που μπορεί να θέλετε να διατηρήσετε, ιδιαίτερα σε μικρότερα σύνολα δεδομένων. Τι γίνεται αν θέλετε απλώς να αφαιρέσετε γραμμές ή στήλες που περιέχουν αρκετές ή ακόμα και όλες τις κενές τιμές; Μπορείτε να καθορίσετε αυτές τις ρυθμίσεις στο dropna με τις παραμέτρους how και thresh.

Από προεπιλογή, how='any' (αν θέλετε να το ελέγξετε μόνοι σας ή να δείτε ποιες άλλες παραμέτρους έχει η μέθοδος, εκτελέστε example4.dropna? σε ένα κελί κώδικα). Θα μπορούσατε εναλλακτικά να καθορίσετε how='all' ώστε να αφαιρέσετε μόνο γραμμές ή στήλες που περιέχουν όλες τις κενές τιμές. Ας επεκτείνουμε το παράδειγμα DataFrame για να δούμε αυτό στην πράξη.

example2[3] = np.nan
example2
0 1 2 3
0 1.0 NaN 7 NaN
1 2.0 5.0 8 NaN
2 NaN 6.0 9 NaN

Η παράμετρος thresh σας δίνει πιο λεπτομερή έλεγχο: καθορίζετε τον αριθμό των μη κενών τιμών που χρειάζεται να έχει μια γραμμή ή στήλη για να διατηρηθεί:

example2.dropna(axis='rows', thresh=3)
	0	1	2	3
1	2.0	5.0	8	NaN

Εδώ, η πρώτη και η τελευταία γραμμή έχουν αφαιρεθεί, επειδή περιέχουν μόνο δύο μη κενές τιμές.

  • Συμπλήρωση κενών τιμών: Ανάλογα με το σύνολο δεδομένων σας, μπορεί μερικές φορές να έχει περισσότερο νόημα να συμπληρώσετε τις κενές τιμές με έγκυρες παρά να τις αφαιρέσετε. Θα μπορούσατε να χρησιμοποιήσετε το isnull για να το κάνετε αυτό επί

Σημαντικό: Υπάρχουν πολλοί τρόποι για να αντιμετωπίσετε τις ελλείπουσες τιμές στα σύνολα δεδομένων σας. Η συγκεκριμένη στρατηγική που θα χρησιμοποιήσετε (αφαίρεση, αντικατάσταση ή ακόμα και ο τρόπος αντικατάστασης) θα πρέπει να καθορίζεται από τις ιδιαιτερότητες των δεδομένων. Θα αναπτύξετε καλύτερη αίσθηση για το πώς να χειρίζεστε τις ελλείπουσες τιμές όσο περισσότερο ασχολείστε και αλληλεπιδράτε με σύνολα δεδομένων.

Αφαίρεση διπλότυπων δεδομένων

Στόχος μάθησης: Μέχρι το τέλος αυτής της υποενότητας, θα πρέπει να είστε άνετοι με την αναγνώριση και την αφαίρεση διπλότυπων τιμών από DataFrames.

Εκτός από τα ελλείποντα δεδομένα, συχνά θα συναντήσετε διπλότυπα δεδομένα σε σύνολα δεδομένων του πραγματικού κόσμου. Ευτυχώς, το pandas παρέχει έναν εύκολο τρόπο για την ανίχνευση και την αφαίρεση διπλότυπων εγγραφών.

  • Αναγνώριση διπλότυπων: duplicated: Μπορείτε εύκολα να εντοπίσετε διπλότυπες τιμές χρησιμοποιώντας τη μέθοδο duplicated στο pandas, η οποία επιστρέφει μια μάσκα Boolean που δείχνει αν μια εγγραφή σε ένα DataFrame είναι διπλότυπη μιας προηγούμενης. Ας δημιουργήσουμε ένα άλλο παράδειγμα DataFrame για να δούμε πώς λειτουργεί αυτό.
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
                         'numbers': [1, 2, 1, 3, 3]})
example4
letters numbers
0 A 1
1 B 2
2 A 1
3 B 3
4 B 3
example4.duplicated()
0    False
1    False
2     True
3    False
4     True
dtype: bool
  • Αφαίρεση διπλότυπων: drop_duplicates: απλά επιστρέφει ένα αντίγραφο των δεδομένων για τα οποία όλες οι τιμές duplicated είναι False:
example4.drop_duplicates()
	letters	numbers
0	A	1
1	B	2
3	B	3

Τόσο το duplicated όσο και το drop_duplicates από προεπιλογή εξετάζουν όλες τις στήλες, αλλά μπορείτε να καθορίσετε ότι εξετάζουν μόνο ένα υποσύνολο στηλών στο DataFrame σας:

example4.drop_duplicates(['letters'])
letters	numbers
0	A	1
1	B	2

Σημαντικό: Η αφαίρεση διπλότυπων δεδομένων είναι ένα απαραίτητο μέρος σχεδόν κάθε έργου επιστήμης δεδομένων. Τα διπλότυπα δεδομένα μπορούν να αλλάξουν τα αποτελέσματα των αναλύσεών σας και να σας δώσουν ανακριβή αποτελέσματα!

🚀 Πρόκληση

Όλα τα υλικά που συζητήθηκαν παρέχονται ως Jupyter Notebook. Επιπλέον, υπάρχουν ασκήσεις μετά από κάθε ενότητα, δοκιμάστε τις!

Κουίζ μετά τη διάλεξη

Ανασκόπηση & Αυτομελέτη

Υπάρχουν πολλοί τρόποι για να ανακαλύψετε και να προσεγγίσετε την προετοιμασία των δεδομένων σας για ανάλυση και μοντελοποίηση, και ο καθαρισμός των δεδομένων είναι ένα σημαντικό βήμα που απαιτεί "πρακτική" εμπειρία. Δοκιμάστε αυτές τις προκλήσεις από το Kaggle για να εξερευνήσετε τεχνικές που δεν καλύφθηκαν σε αυτό το μάθημα.

Εργασία

Αξιολόγηση Δεδομένων από μια Φόρμα


Αποποίηση Ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.