Πλοηγηθείτε στις πολυπλοκότητες των ελλειπόντων δεδομένων στα σύνολα δεδομένων σας με αυτόν τον περιεκτικό οδηγό για το Python Pandas. Μάθετε βασικές τεχνικές για την αντικατάσταση και την αφαίρεση, κατάλληλες για ένα παγκόσμιο κοινό.
Εκμάθηση του Καθαρισμού Δεδομένων με Python Pandas: Ένας Παγκόσμιος Οδηγός για τον Χειρισμό Ελλειπουσών Τιμών
Στον τομέα της ανάλυσης δεδομένων και της μηχανικής μάθησης, η ποιότητα των δεδομένων είναι υψίστης σημασίας. Μία από τις πιο διαδεδομένες προκλήσεις που συναντώνται είναι η παρουσία ελλειπουσών τιμών. Αυτές μπορεί να προκύψουν από διάφορες πηγές, συμπεριλαμβανομένων των σφαλμάτων εισαγωγής δεδομένων, των δυσλειτουργιών των αισθητήρων ή των ελλιπών ερευνών. Ο αποτελεσματικός χειρισμός των ελλειπουσών δεδομένων είναι ένα κρίσιμο βήμα στη διαδικασία καθαρισμού δεδομένων, διασφαλίζοντας ότι οι αναλύσεις σας είναι ισχυρές και τα μοντέλα σας είναι ακριβή. Αυτός ο οδηγός θα σας καθοδηγήσει στις βασικές τεχνικές για τη διαχείριση των ελλειπουσών τιμών χρησιμοποιώντας την ισχυρή βιβλιοθήκη Python Pandas, σχεδιασμένη για ένα παγκόσμιο κοινό.
Γιατί ο Χειρισμός των Ελλειπουσών Τιμών είναι Τόσο Κρίσιμος;
Τα ελλείποντα δεδομένα μπορούν να στρεβλώσουν σημαντικά τα αποτελέσματά σας. Πολλοί αναλυτικοί αλγόριθμοι και στατιστικά μοντέλα δεν έχουν σχεδιαστεί για να χειρίζονται ελλείπουσες τιμές, οδηγώντας σε σφάλματα ή μεροληπτικά αποτελέσματα. Για παράδειγμα:
- Μεροληπτικές Μέσοι Όροι: Εάν οι ελλείπουσες τιμές συγκεντρώνονται σε συγκεκριμένες ομάδες, ο υπολογισμός των μέσων όρων μπορεί να παραποιήσει τα πραγματικά χαρακτηριστικά του πληθυσμού.
- Μειωμένο Μέγεθος Δείγματος: Η απλή απόρριψη γραμμών ή στηλών με ελλείπουσες τιμές μπορεί να μειώσει δραστικά το σύνολο δεδομένων σας, οδηγώντας ενδεχομένως σε απώλεια πολύτιμων πληροφοριών και στατιστικής ισχύος.
- Υποβάθμιση της Απόδοσης του Μοντέλου: Τα μοντέλα μηχανικής μάθησης που εκπαιδεύονται σε ελλιπή δεδομένα μπορεί να εμφανίσουν κακή προβλεπτική απόδοση και δυνατότητες γενίκευσης.
- Παραπλανητικές Οπτικοποιήσεις: Τα γραφήματα και οι απεικονίσεις μπορούν να παρουσιάσουν μια ανακριβή εικόνα εάν δεν ληφθούν υπόψη τα ελλείποντα σημεία δεδομένων.
Η κατανόηση και η αντιμετώπιση των ελλειπουσών τιμών είναι μια θεμελιώδης δεξιότητα για κάθε επαγγελματία δεδομένων, ανεξάρτητα από τη γεωγραφική του θέση ή τον κλάδο του.
Εντοπισμός Ελλειπουσών Τιμών στο Pandas
Το Pandas παρέχει διαισθητικές μεθόδους για την ανίχνευση ελλειπουσών δεδομένων. Οι κύριες αναπαραστάσεις για τις ελλείπουσες τιμές είναι NaN (Not a Number) για αριθμητικά δεδομένα και None για τύπους δεδομένων αντικειμένων. Το Pandas αντιμετωπίζει και τα δύο ως ελλείποντα.
Οι Μέθοδοι isnull() και notnull()
Η μέθοδος isnull() επιστρέφει ένα boolean DataFrame του ίδιου σχήματος, υποδεικνύοντας True όπου λείπει μια τιμή και False διαφορετικά. Αντίστροφα, η notnull() επιστρέφει True για μη ελλείπουσες τιμές.
import pandas as pd
import numpy as np
# Sample DataFrame with missing values
data = {'col1': [1, 2, np.nan, 4, 5],
'col2': [np.nan, 'b', 'c', 'd', 'e'],
'col3': [6, 7, 8, np.nan, 10]}
df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)
print("\nChecking for null values:")
print(df.isnull())
print("\nChecking for non-null values:")
print(df.notnull())
Καταμέτρηση Ελλειπουσών Τιμών
Για να λάβετε μια περίληψη των ελλειπουσών τιμών ανά στήλη, μπορείτε να συνδέσετε την isnull() με τη μέθοδο sum():
print("\nNumber of missing values per column:")
print(df.isnull().sum())
Αυτό το αποτέλεσμα θα σας δείξει ακριβώς πόσες ελλείπουσες εγγραφές υπάρχουν σε κάθε στήλη, παρέχοντας μια γρήγορη επισκόπηση της έκτασης του προβλήματος.
Οπτικοποίηση Ελλειπουσών Δεδομένων
Για μεγαλύτερα σύνολα δεδομένων, η οπτικοποίηση των ελλειπουσών δεδομένων μπορεί να είναι πολύ κατατοπιστική. Βιβλιοθήκες όπως η missingno μπορούν να σας βοηθήσουν να εντοπίσετε μοτίβα στην απουσία.
# You might need to install this library:
# pip install missingno
import missingno as msno
import matplotlib.pyplot as plt
print("\nVisualizing missing data:")
msno.matrix(df)
plt.title("Missing Data Matrix")
plt.show()
Το matrix plot δείχνει μια πυκνή γραμμή για κάθε στήλη όπου υπάρχουν δεδομένα και μια αραιή γραμμή όπου λείπουν. Αυτό μπορεί να αποκαλύψει εάν η απουσία είναι τυχαία ή ακολουθεί ένα μοτίβο.
Στρατηγικές για τον Χειρισμό Ελλειπουσών Τιμών
Υπάρχουν αρκετές κοινές στρατηγικές για την αντιμετώπιση των ελλειπουσών δεδομένων. Η επιλογή της στρατηγικής εξαρτάται συχνά από τη φύση των δεδομένων, την αναλογία των ελλειπουσών τιμών και τους στόχους της ανάλυσής σας.
1. Στρατηγικές Διαγραφής
Η διαγραφή περιλαμβάνει την αφαίρεση σημείων δεδομένων που έχουν ελλείπουσες τιμές. Αν και φαινομενικά απλή, είναι σημαντικό να κατανοήσετε τις επιπτώσεις της.
α. Διαγραφή Γραμμών (Διαγραφή Λίστας)
Αυτή είναι η απλούστερη προσέγγιση: αφαιρέστε ολόκληρες γραμμές που περιέχουν τουλάχιστον μία ελλείπουσα τιμή.
print("\nDataFrame after dropping rows with any missing values:")
df_dropped_rows = df.dropna()
print(df_dropped_rows)
Πλεονεκτήματα: Απλή στην εφαρμογή, έχει ως αποτέλεσμα ένα καθαρό σύνολο δεδομένων για αλγόριθμους που δεν μπορούν να χειριστούν ελλείπουσες τιμές.
Μειονεκτήματα: Μπορεί να οδηγήσει σε σημαντική μείωση του μεγέθους του συνόλου δεδομένων, ενδεχομένως να χάσει πολύτιμες πληροφορίες και να εισαγάγει μεροληψία εάν η απουσία δεν είναι εντελώς τυχαία (MCAR - Missing Completely At Random).
β. Διαγραφή Στήλης
Εάν μια συγκεκριμένη στήλη έχει ένα πολύ υψηλό ποσοστό ελλειπουσών τιμών και δεν είναι κρίσιμη για την ανάλυσή σας, μπορείτε να εξετάσετε το ενδεχόμενο να απορρίψετε ολόκληρη τη στήλη.
# Example: Drop 'col1' if it had too many missing values (hypothetically)
# For demonstration, let's create a scenario with more missing data in col1
data_high_missing = {'col1': [1, np.nan, np.nan, np.nan, 5],
'col2': [np.nan, 'b', 'c', 'd', 'e'],
'col3': [6, 7, 8, np.nan, 10]}
df_high_missing = pd.DataFrame(data_high_missing)
print("\nDataFrame with potentially high missingness in col1:")
print(df_high_missing)
print("\nMissing values per column:")
print(df_high_missing.isnull().sum())
# Let's say we decide to drop col1 due to high missingness
df_dropped_col = df_high_missing.drop('col1', axis=1) # axis=1 indicates dropping a column
print("\nDataFrame after dropping col1:")
print(df_dropped_col)
Πλεονεκτήματα: Αποτελεσματική εάν μια στήλη είναι σε μεγάλο βαθμό μη ενημερωτική λόγω ελλειπουσών δεδομένων.
Μειονεκτήματα: Πιθανή απώλεια πολύτιμων χαρακτηριστικών. Το όριο για το "πάρα πολλές ελλείπουσες τιμές" είναι υποκειμενικό.
2. Στρατηγικές Αντικατάστασης
Η αντικατάσταση περιλαμβάνει την αντικατάσταση των ελλειπουσών τιμών με εκτιμώμενες ή υπολογισμένες τιμές. Αυτό προτιμάται συχνά από τη διαγραφή, καθώς διατηρεί το μέγεθος του συνόλου δεδομένων.
α. Αντικατάσταση Μέσου Όρου/Διάμεσου/Επικρατέστερης Τιμής
Αυτή είναι μια κοινή και απλή τεχνική αντικατάστασης. Για αριθμητικές στήλες, μπορείτε να αντικαταστήσετε τις ελλείπουσες τιμές με τον μέσο όρο ή τη διάμεσο των μη ελλειπουσών τιμών σε αυτήν τη στήλη. Για κατηγορικές στήλες, χρησιμοποιείται η επικρατέστερη τιμή (η πιο συχνή τιμή).
- Αντικατάσταση Μέσου Όρου: Κατάλληλη για κανονικά κατανεμημένα δεδομένα. Ευαίσθητη στις ακραίες τιμές.
- Αντικατάσταση Διάμεσου: Πιο ανθεκτική στις ακραίες τιμές από την αντικατάσταση μέσου όρου.
- Αντικατάσταση Επικρατέστερης Τιμής: Χρησιμοποιείται για κατηγορικά χαρακτηριστικά.
# Using the original df with some NaN values
print("\nOriginal DataFrame for imputation:")
print(df)
# Impute missing values in 'col1' with the mean
mean_col1 = df['col1'].mean()
df['col1'].fillna(mean_col1, inplace=True)
# Impute missing values in 'col3' with the median
median_col3 = df['col3'].median()
df['col3'].fillna(median_col3, inplace=True)
# Impute missing values in 'col2' with the mode
mode_col2 = df['col2'].mode()[0] # mode() can return multiple values if there's a tie
df['col2'].fillna(mode_col2, inplace=True)
print("\nDataFrame after mean/median/mode imputation:")
print(df)
Πλεονεκτήματα: Απλή, διατηρεί το μέγεθος του συνόλου δεδομένων.
Μειονεκτήματα: Μπορεί να στρεβλώσει τη διακύμανση και τη συνδιακύμανση των δεδομένων. Υποθέτει ότι ο μέσος όρος/διάμεσος/επικρατέστερη τιμή είναι μια καλή αντιπροσωπευτική τιμή για τα ελλείποντα δεδομένα, κάτι που μπορεί να μην είναι πάντα αλήθεια.
β. Εμπρόσθια και Οπίσθια Συμπλήρωση
Αυτές οι μέθοδοι είναι ιδιαίτερα χρήσιμες για δεδομένα χρονοσειρών ή δεδομένα με φυσική σειρά.
- Εμπρόσθια Συμπλήρωση (
ffill): Συμπληρώνει τις ελλείπουσες τιμές με την τελευταία γνωστή έγκυρη παρατήρηση. - Οπίσθια Συμπλήρωση (
bfill): Συμπληρώνει τις ελλείπουσες τιμές με την επόμενη γνωστή έγκυρη παρατήρηση.
# Recreate a DataFrame with missing values suitable for ffill/bfill
data_time_series = {'value': [10, 12, np.nan, 15, np.nan, np.nan, 20]}
df_ts = pd.DataFrame(data_time_series)
print("\nOriginal DataFrame for time-series imputation:")
print(df_ts)
# Forward fill
df_ts_ffill = df_ts.fillna(method='ffill')
print("\nDataFrame after forward fill:")
print(df_ts_ffill)
# Backward fill
df_ts_bfill = df_ts.fillna(method='bfill')
print("\nDataFrame after backward fill:")
print(df_ts_bfill)
Πλεονεκτήματα: Χρήσιμη για διατεταγμένα δεδομένα, διατηρεί τις χρονικές σχέσεις.
Μειονεκτήματα: Μπορεί να διαδώσει λανθασμένες τιμές εάν υπάρχουν μεγάλα κενά ελλειπουσών δεδομένων. Η ffill δεν λαμβάνει υπόψη τις μελλοντικές πληροφορίες και η bfill δεν λαμβάνει υπόψη τις παρελθούσες πληροφορίες.
γ. Αντικατάσταση χρησιμοποιώντας Groupby
Μια πιο εξελιγμένη προσέγγιση είναι η αντικατάσταση των ελλειπουσών τιμών βάσει στατιστικών στοιχείων ομάδας. Αυτό είναι ιδιαίτερα χρήσιμο όταν υποψιάζεστε ότι η απουσία σχετίζεται με μια συγκεκριμένη κατηγορία ή ομάδα εντός των δεδομένων σας.
data_grouped = {
'category': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'value': [10, 20, np.nan, 25, 15, 30, 12, np.nan]
}
df_grouped = pd.DataFrame(data_grouped)
print("\nOriginal DataFrame for grouped imputation:")
print(df_grouped)
# Impute missing 'value' based on the mean 'value' of each 'category'
df_grouped['value'] = df_grouped.groupby('category')['value'].transform(lambda x: x.fillna(x.mean()))
print("\nDataFrame after grouped mean imputation:")
print(df_grouped)
Πλεονεκτήματα: Λαμβάνει υπόψη τις διακυμάνσεις μεταξύ των ομάδων, οδηγώντας συχνά σε πιο ακριβείς αντικαταστάσεις από τον καθολικό μέσο όρο/διάμεσο/επικρατέστερη τιμή.
Μειονεκτήματα: Απαιτεί μια σχετική μεταβλητή ομαδοποίησης. Μπορεί να είναι υπολογιστικά εντατική για πολύ μεγάλα σύνολα δεδομένων.
δ. Πιο Προηγμένες Τεχνικές Αντικατάστασης
Για πιο σύνθετα σενάρια, ειδικά σε διοχετεύσεις μηχανικής μάθησης, εξετάστε αυτές τις προηγμένες μεθόδους:
- K-Nearest Neighbors (KNN) Imputer: Αντικαθιστά τις ελλείπουσες τιμές χρησιμοποιώντας τις τιμές των K πλησιέστερων γειτόνων τους που βρέθηκαν στο σύνολο εκπαίδευσης.
- Iterative Imputer (π.χ., χρησιμοποιώντας MICE - Multiple Imputation by Chained Equations): Μοντελοποιεί κάθε χαρακτηριστικό με ελλείπουσες τιμές ως συνάρτηση άλλων χαρακτηριστικών και χρησιμοποιεί επαναληπτική Bayesian συμπλήρωση πίνακα για την αντικατάσταση.
- Regression Imputation: Προβλέπει τις ελλείπουσες τιμές χρησιμοποιώντας μοντέλα παλινδρόμησης.
Αυτές οι μέθοδοι είναι γενικά διαθέσιμες σε βιβλιοθήκες όπως το Scikit-learn.
# Example using Scikit-learn's KNNImputer
from sklearn.impute import KNNImputer
# KNNImputer works on numerical data. We'll use a sample numerical DataFrame.
data_knn = {'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 20, 30, 40, 50],
'C': [100, np.nan, 300, 400, 500]}
df_knn = pd.DataFrame(data_knn)
print("\nOriginal DataFrame for KNN imputation:")
print(df_knn)
imputer = KNNImputer(n_neighbors=2) # Use 2 nearest neighbors
df_knn_imputed_arr = imputer.fit_transform(df_knn)
df_knn_imputed = pd.DataFrame(df_knn_imputed_arr, columns=df_knn.columns)
print("\nDataFrame after KNN imputation:")
print(df_knn_imputed)
Πλεονεκτήματα: Μπορεί να παρέχει πιο ακριβείς αντικαταστάσεις λαμβάνοντας υπόψη τις σχέσεις μεταξύ των χαρακτηριστικών.
Μειονεκτήματα: Πιο υπολογιστικά δαπανηρή, απαιτεί προσεκτική εφαρμογή και οι υποθέσεις σχετικά με τις σχέσεις των χαρακτηριστικών πρέπει να ισχύουν.
Χειρισμός Ελλειπουσών Τιμών σε Κατηγορικά Δεδομένα
Τα κατηγορικά δεδομένα παρουσιάζουν το δικό τους σύνολο προκλήσεων. Ενώ η αντικατάσταση επικρατέστερης τιμής είναι συνηθισμένη, άλλες στρατηγικές είναι επίσης αποτελεσματικές:
- Αντικατάσταση Επικρατέστερης Τιμής: Όπως φαίνεται πριν, συμπλήρωση με την πιο συχνή κατηγορία.
- Δημιουργία μιας Νέας Κατηγορίας: Αντιμετωπίστε τις ελλείπουσες τιμές ως ξεχωριστή κατηγορία (π.χ., "Άγνωστο", "Ελλείπον"). Αυτό είναι χρήσιμο εάν το γεγονός ότι λείπουν δεδομένα είναι από μόνο του ενημερωτικό.
- Αντικατάσταση βάσει άλλων χαρακτηριστικών: Εάν υπάρχει μια ισχυρή σχέση μεταξύ ενός κατηγορικού χαρακτηριστικού και άλλων χαρακτηριστικών, θα μπορούσατε να χρησιμοποιήσετε έναν ταξινομητή για να προβλέψετε την ελλείπουσα κατηγορία.
data_cat = {'Product': ['A', 'B', 'A', 'C', 'B', 'A', np.nan],
'Region': ['North', 'South', 'East', 'West', 'North', np.nan, 'East']}
df_cat = pd.DataFrame(data_cat)
print("\nOriginal DataFrame for categorical handling:")
print(df_cat)
# Strategy 1: Mode imputation for 'Region'
mode_region = df_cat['Region'].mode()[0]
df_cat['Region'].fillna(mode_region, inplace=True)
# Strategy 2: Create a new category for 'Product'
df_cat['Product'].fillna('Unknown', inplace=True)
print("\nDataFrame after categorical imputation:")
print(df_cat)
Βέλτιστες Πρακτικές και Σκέψεις για ένα Παγκόσμιο Κοινό
Όταν εργάζεστε με δεδομένα από διάφορες πηγές και για ένα παγκόσμιο κοινό, λάβετε υπόψη τα ακόλουθα:
- Κατανοήστε την Πηγή Δεδομένων: Γιατί λείπουν οι τιμές; Είναι ένα συστημικό ζήτημα με τη συλλογή δεδομένων σε μια συγκεκριμένη περιοχή ή πλατφόρμα; Η γνώση της προέλευσης μπορεί να καθοδηγήσει τη στρατηγική σας. Για παράδειγμα, εάν μια πλατφόρμα ερευνών αποτυγχάνει συνεχώς να καταγράψει ένα συγκεκριμένο δημογραφικό στοιχείο σε μια συγκεκριμένη χώρα, αυτή η απουσία μπορεί να μην είναι τυχαία.
- Το Περιβάλλον είναι το Κλειδί: Ο 'σωστός' τρόπος χειρισμού των ελλειπουσών τιμών εξαρτάται από το περιβάλλον. Ένα οικονομικό μοντέλο μπορεί να απαιτεί σχολαστική αντικατάσταση για να αποφευχθούν ακόμη και μικρές μεροληψίες, ενώ μια γρήγορη διερευνητική ανάλυση μπορεί να αρκεί με απλούστερες μεθόδους.
- Πολιτισμικές Αποχρώσεις στα Δεδομένα: Οι μέθοδοι συλλογής δεδομένων μπορεί να διαφέρουν μεταξύ των πολιτισμών. Για παράδειγμα, ο τρόπος με τον οποίο αναφέρεται το "εισόδημα" ή το αν το "δεν ισχύει" είναι μια κοινή απάντηση μπορεί να διαφέρει. Αυτό μπορεί να επηρεάσει τον τρόπο με τον οποίο ερμηνεύονται και χειρίζονται οι ελλείπουσες τιμές.
- Ζώνες Ώρας και Καθυστέρηση Δεδομένων: Για δεδομένα χρονοσειρών που προέρχονται από διαφορετικές ζώνες ώρας, βεβαιωθείτε ότι τα δεδομένα έχουν τυποποιηθεί (π.χ., σε UTC) πριν από την εφαρμογή μεθόδων αντικατάστασης βάσει χρόνου, όπως ffill/bfill.
- Νόμισμα και Μονάδες: Όταν αντικαθιστάτε αριθμητικές τιμές που περιλαμβάνουν διαφορετικά νομίσματα ή μονάδες, βεβαιωθείτε για τη συνέπεια ή την κατάλληλη μετατροπή πριν από την αντικατάσταση.
- Τεκμηριώστε τις Αποφάσεις σας: Να τεκμηριώνετε πάντα τις μεθόδους που χρησιμοποιήσατε για το χειρισμό των ελλειπουσών δεδομένων. Αυτή η διαφάνεια είναι ζωτικής σημασίας για την αναπαραγωγιμότητα και για να κατανοήσουν οι άλλοι την ανάλυσή σας.
- Επαναληπτική Διαδικασία: Ο καθαρισμός δεδομένων, συμπεριλαμβανομένου του χειρισμού των ελλειπουσών τιμών, είναι συχνά μια επαναληπτική διαδικασία. Μπορεί να δοκιμάσετε μια μέθοδο, να αξιολογήσετε τον αντίκτυπό της και στη συνέχεια να βελτιώσετε την προσέγγισή σας.
- Χρησιμοποιήστε τις Βιβλιοθήκες Σοφά: Το Pandas είναι το κύριο εργαλείο σας, αλλά για πιο σύνθετη αντικατάσταση, το Scikit-learn είναι ανεκτίμητο. Επιλέξτε το σωστό εργαλείο για τη δουλειά.
Συμπέρασμα
Οι ελλείπουσες τιμές είναι ένα αναπόφευκτο μέρος της εργασίας με δεδομένα πραγματικού κόσμου. Το Python Pandas προσφέρει ένα ευέλικτο και ισχυρό σύνολο εργαλείων για τον εντοπισμό, την ανάλυση και το χειρισμό αυτών των ελλειπουσών εγγραφών. Είτε επιλέξετε τη διαγραφή είτε την αντικατάσταση, κάθε μέθοδος έχει τις δικές της ανταλλαγές. Κατανοώντας αυτές τις τεχνικές και λαμβάνοντας υπόψη το παγκόσμιο πλαίσιο των δεδομένων σας, μπορείτε να βελτιώσετε σημαντικά την ποιότητα και την αξιοπιστία της ανάλυσης δεδομένων και των μοντέλων μηχανικής μάθησης. Η εκμάθηση αυτών των δεξιοτήτων καθαρισμού δεδομένων είναι ακρογωνιαίος λίθος για να γίνετε ένας αποτελεσματικός επαγγελματίας δεδομένων σε οποιοδήποτε μέρος του κόσμου.
Βασικά Σημεία:
- Εντοπίστε: Χρησιμοποιήστε
df.isnull().sum()και οπτικοποιήσεις. - Διαγράψτε: Χρησιμοποιήστε
dropna()με φειδώ, γνωρίζοντας την απώλεια δεδομένων. - Αντικαταστήστε: Χρησιμοποιήστε
fillna()με μέσο όρο, διάμεσο, επικρατέστερη τιμή, ffill, bfill ή πιο προηγμένες τεχνικές από το Scikit-learn. - Το Περιβάλλον Έχει Σημασία: Η καλύτερη στρατηγική εξαρτάται από τα δεδομένα και τους στόχους σας.
- Παγκόσμια Ευαισθητοποίηση: Λάβετε υπόψη τις πολιτισμικές αποχρώσεις και την προέλευση των δεδομένων.
Συνεχίστε να εξασκείτε αυτές τις τεχνικές και θα δημιουργήσετε μια ισχυρή βάση για ισχυρές ροές εργασίας επιστήμης δεδομένων.