28 KiB
Εργασία με Δεδομένα: Προετοιμασία Δεδομένων
![]() |
---|
Προετοιμασία Δεδομένων - Σκίτσο από @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()
παράγουν παρόμοια αποτελέσματα όταν τις χρησιμοποιείτε σεDataFrame
s: δείχνουν τα αποτελέσματα και τον δείκτη αυτών των αποτελεσμάτων, κάτι που θα σας βοηθήσει σημαντικά καθώς παλεύετε με τα δεδομένα σας.
- Αφαίρεση κενών τιμών: Πέρα από την αναγνώριση ελλιπών τιμών, οι pandas παρέχουν έναν βολικό τρόπο για να αφαιρέσετε κενές τιμές από
Series
καιDataFrame
s. (Ιδιαίτερα σε μεγάλα σύνολα δεδομένων, είναι συχνά πιο συνετό να αφαιρέσετε απλώς τις ελλιπείς [NA] τιμές από την ανάλυσή σας παρά να τις αντιμετωπίσετε με άλλους τρόπους.) Για να το δείτε αυτό στην πράξη, ας επιστρέψουμε στοexample1
:
example1 = example1.dropna()
example1
0 0
2
dtype: object
Παρατηρήστε ότι αυτό θα πρέπει να μοιάζει με την έξοδό σας από το example3[example3.notnull()]
. Η διαφορά εδώ είναι ότι, αντί να κάνετε απλώς ευρετηρίαση στις τιμές της μάσκας, το dropna
έχει αφαιρέσει αυτές τις ελλιπείς τιμές από το Series
example1
.
Επειδή τα DataFrame
s έχουν δύο διαστάσεις, προσφέρουν περισσότερες επιλογές για την αφαίρεση δεδομένων.
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. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.