La base de tout projet réussi en science des données est des données propres et cohérentes. Pourtant, dans le rythme effréné de l'analyse, même les utilisateurs expérimentés de Python tombent parfois dans des pièges de pré-traitement des données qui pourraient être évités. Que vous prépariez des données pour un modèle d'apprentissage automatique ou pour une visualisation, savoir quelles erreurs surveiller peut vous faire gagner d'innombrables heures de frustration et conduire à des résultats bien plus robustes.
Décrivons cinq des erreurs de nettoyage des données les plus courantes (et souvent mortelles) en Python, complètes de conseils pratiques et d'exemples illustratifs pour que vos flux de travail restent solides comme le roc et efficaces.
L'un des premiers problèmes que vous rencontrerez dans tout ensemble de données du monde réel est l'absence de données. En Python, en particulier avec des outils comme pandas, remplacer ou supprimer les NaN est facile : df.dropna() ou df.fillna(0) le font en une ligne. Mais facile ne signifie pas correct.
Supprimer automatiquement les lignes comportant des valeurs manquantes peut réduire drastiquement votre ensemble de données ou — comme dans les cas où l'absence est corrélée — introduire un biais. Remplir les valeurs par la moyenne ou zéro peut déformer les distributions, en particulier dans les colonnes non numériques ou celles présentant des valeurs aberrantes.
Considérez cet extrait :
# Too hasty with missing value treatment
import pandas as pd
df = pd.read_csv('survey.csv')
df = df.dropna() # Danger: goodbye valuable data!
Si 30% des lignes manquent une seule colonne optionnelle — par exemple l'âge — vous perdriez 30 % de vos données. Si les âges manquants se trouvent principalement dans une démographie spécifique, le résultat est un ensemble de données qui ne reflète plus fidèlement la population.
df.isnull().sum() ou df.info() pour repérer les motifs de valeurs manquantes.sklearn.impute.SimpleImputer pour un remplissage éclairé, ou une logique spécifique au domaine.
Les données collectées à partir de plusieurs sources s'intègrent rarement parfaitement dans un seul format. Dates, catégories et encodages de chaînes sont particulièrement sujets à des erreurs subtiles et difficiles à retracer.
dtype: object), désactivant les opérations numériques.Problème Python classique :
# Date times imported as strings, causing issues
import pandas as pd
df = pd.read_csv('sales.csv')
df['created_at'].min() # Only finds the minimum string, not chronological min
df.dtypes révèle rapidement les colonnes qui devraient être numériques mais ne le sont pas.pd.to_datetime(), pd.to_numeric(), et les conversions en catégories dès l'importation des données..str.lower().str.strip() pour les colonnes catégorielles ; remplacez les synonymes ou les fautes de frappe par une valeur cohérente.encoding (encoding='utf-8' ou encoding='cp1252').df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df = df.dropna(subset=['created_at']) # Remove rows where dates couldn't parse
Un peu d'attention ici évite des heures de débogage d'analyses bizarres par la suite.
Les valeurs aberrantes sont les jokers du nettoyage des données — parfois elles signalent des erreurs de saisie ; d'autres fois, elles représentent précisément les événements qu'il faut étudier !
Des scripts automatisés qui éliminent les valeurs en dehors d'une plage donnée sans prendre en compte le contexte peuvent dépouiller les données à la fois d'erreurs et de signaux importants.
# Don't just drop anything >200 without context
bp_outliers = df[df['blood_pressure'] > 200]
print(bp_outliers) # Investigate: are these errors or medically relevant cases?
df.describe() et des visualisations telles que des boîtes à moustaches (box plots) ou des histogrammes pour découvrir les détails de distribution et repérer les valeurs aberrantes.Lorsque des valeurs aberrantes se révèlent être valides, elles peuvent remodeler vos insights métier fondés sur les données.
Les données en double sont omniprésentes — les erreurs de saisie, le scraping web ou les défaillances système les introduisent toutes. Bien que Python vous permette de df.drop_duplicates() en un instant, le vrai danger réside dans la mauvaise compréhension de l'origine des doublons ou dans la meilleure façon de les résoudre.
Une base de données de vente au détail peut contenir plusieurs lignes pour la même commande client en raison d'une soumission répétée par le système. Supprimer toutes les lignes sauf une ne fonctionne que si chaque colonne correspond ; sinon, des informations peuvent être perdues.
# Problematic: Dropping all duplicates based only on 'order_id'
df = df.drop_duplicates(subset=['order_id']) # Could lose different addresses or notes attached to split-row orders
Si des colonnes comme 'delivery_notes' diffèrent entre les lignes, supprimer aveuglément les doublons entraîne soit une perte de données, soit une incapacité à concilier des informations contradictoires.
df.duplicated(subset=key_cols, keep=False) pour repérer les vrais doublons.is_duplicate pour l'analyse en aval plutôt que de le supprimer purement et simplement.Voici comment vous pourriez agréger des champs potentiellement utiles avant la déduplication :
def collapse_order_notes(notes):
return '; '.join(sorted(set(x for x in notes if pd.notnull(x))))
rollup = df.groupby('order_id').agg({
'customer_id': 'first',
'total_amount': 'sum',
'delivery_notes': collapse_order_notes
}).reset_index()
Cela protège des données auxiliaires importantes.
De nombreux algorithmes puissants nécessitent des entrées numériques, et non des étiquettes ou catégories sous forme de chaînes. L'encodage des colonnes catégorielles est une étape cruciale, mais se précipiter ou choisir la mauvaise méthode peut dégrader les performances du modèle et introduire des bogues.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label encoding ignores category meaning
le = LabelEncoder()
df['city_code'] = le.fit_transform(df['city']) # Problem: Model interprets numbers mathematically
0,1,2) que si les étiquettes ont un ordre naturel (par exemple, taille : S < M < L). Sinon, choisissez le one-hot ou d'autres encodages.pd.get_dummies(df, drop_first=True, dummy_na=False), ou pour les caractéristiques à grande cardinalité, pensez au hashing ou à l'encodage par cible.fit/transform de sklearn) afin que le déploiement du modèle obtienne des mappings identiques — un piège classique lorsque de nouvelles catégories, inconnues, apparaissent dans les entrées réelles.city_counts = df['city'].value_counts()
# Only encode cities appearing at least 10 times
common_cities = city_counts[city_counts > 10].index
df['city'] = df['city'].apply(lambda x: x if x in common_cities else 'Other')
df = pd.get_dummies(df, columns=['city'], drop_first=True)
Cela garde la taille des caractéristiques pratique et les modèles robustes.
Le nettoyage des données en Python exige à la fois le souci du détail et la rapidité. En évitant un nettoyage mécanique ou dénué de contexte, vous élevez votre travail en science des données et en analytique bien au-delà de la moyenne. Examinez les valeurs manquantes avec intention, apportez de la cohérence aux formats, traitez les valeurs aberrantes comme des signaux et pas seulement du bruit, scrutez les doublons et réfléchissez de manière tactique à l'encodage des catégories.
Équipé de ces enseignements et d'un œil critique sur vos données, vous passerez moins de temps à revenir en arrière, réduirez les erreurs embarrassantes en production et bâtirez une réputation d'ingénierie de pipelines de données sur lesquels les analystes peuvent compter. Et dans le domaine en pleine expansion de la science des données, devenir la personne dont les données sont vraiment prêtes à en tirer des insights est un véritable super-pouvoir.