Diagnostiquer la qualité des données
On estime souvent que le nettoyage occupe une grande partie du temps d’un projet data. La tentation est de corriger tout de suite ce qui saute aux yeux. Mauvaise idée : on commence par un diagnostic complet, pour savoir quoi corriger, combien de lignes sont concernées et pouvoir le justifier.
Prenons un export clients typique :
import io
import pandas as pd
CSV = """id,nom,ville,age,ca
1,Ana Martin,Lyon,34,1250.5
2,Bob Leroy,lyon ,,980
3,Chloé Petit,Paris,29,N/A
3,Chloé Petit,Paris,29,N/A
4,Dina Roux,PARIS,-5,640
5,Eli Faure,,41,0
"""
clients = pd.read_csv(io.StringIO(CSV))
1. Les valeurs manquantes
clients.isna().sum() # nombre de manquants par colonne
clients.isna().mean().round(2) # proportion de manquants
clients[clients["age"].isna()] # voir les lignes concernées
À la lecture, pandas reconnaît par défaut une liste de marqueurs courants comme manquants (champ vide, "NA", "N/A", "NaN", "null"…) : ici, le "N/A" de la colonne ca devient bien NaN. En revanche, des codes maison comme "-", "inconnu" ou 999 restent des valeurs « normales » : il faut les repérer avec value_counts() et les déclarer (leçon suivante).
2. Les doublons
clients.duplicated().sum() # lignes entièrement identiques : 1
clients.duplicated(subset=["id"]).sum() # identifiants répétés
clients[clients.duplicated(subset=["id"], keep=False)] # afficher tous les exemplaires
Une ligne entièrement dupliquée est souvent un artefact d’export ; un identifiant répété avec des valeurs différentes est plus grave : il faut décider quelle version est la bonne.
3. Les types et les valeurs impossibles
clients.dtypes # ca est-il bien numérique ?
clients.describe() # min, max : un âge de -5 saute aux yeux
(clients["age"] < 0).sum()
Une colonne numérique lue comme texte signale une valeur parasite (« 12 € », virgule décimale). Un minimum ou un maximum absurde signale une erreur de saisie ou un code spécial.
4. Les variantes d’écriture
clients["ville"].value_counts(dropna=False)
# Lyon, lyon (avec espace), Paris, PARIS, NaN : 3 villes réelles écrites de 5 façons
dropna=False affiche aussi le nombre de manquants. C’est souvent ici qu’on découvre les problèmes de casse, d’espaces et d’accents.
5. Un rapport de qualité
Rassemblez ces mesures dans un tableau, une ligne par colonne :
rapport = pd.DataFrame({
"type": clients.dtypes.astype(str),
"manquants": clients.isna().sum(),
"pct_manquants": clients.isna().mean().round(3),
"distinctes": clients.nunique(),
})
print(rapport)
Conservez ce rapport : il sert de point de départ au nettoyage, et à comparer avant / après pour prouver l’effet de vos corrections.
À retenir
- Diagnostic d’abord : manquants, doublons, types, valeurs impossibles, variantes d’écriture.
isna().sum(),duplicated().sum(),describe(),value_counts(dropna=False).- Documentez les constats pour justifier chaque correction.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Mesurer manquants et doublons
À partir de
clients, calculez :manquants: un dictionnaire colonne → nombre de valeurs manquantes ;nb_doublons: le nombre de lignes entièrement dupliquées ;nb_id_repetes: le nombre de lignes dont l’ida déjà été vu (duplicated(subset=...)) ;nb_age_negatif: le nombre d’âges strictement négatifs.
import pandas as pd clients = pd.DataFrame({ "id": [1, 2, 3, 3, 4, 5, 5], "ville": ["Lyon", "lyon ", "Paris", "Paris", "PARIS", None, "Nice"], "age": [34, None, 29, 29, -5, 41, 41], "ca": [1250.5, 980.0, None, None, 640.0, 0.0, 15.0], }) manquants = ... nb_doublons = ... nb_id_repetes = ... nb_age_negatif = ...Fonction de rapport de qualité
Écrivez
rapport_qualite(df)qui renvoie un DataFrame indexé par les noms de colonnes dedf, avec les colonnesmanquants(nombre),pct_manquants(pourcentage arrondi à 1 décimale, de 0 à 100) etdistinctes(nombre de valeurs distinctes non manquantes).import pandas as pd def rapport_qualite(df): ...Manquants déguisés
Une colonne
villecontient des valeurs « inconnu ». Que renvoiedf["ville"].isna().sum()pour ces lignes ?- Elles sont comptées comme manquantes
- Elles ne sont pas comptées : pour pandas, « inconnu » est une chaîne ordinaire
- Une erreur
Quiz de fin de leçon
Quelle expression donne la proportion de valeurs manquantes par colonne ?
- df.isna().sum()
- df.isna().mean()
- df.count()
À quoi sert
keep=Falsedansduplicated?- À ne garder aucun doublon
- À marquer tous les exemplaires d'un doublon, y compris le premier
- À ignorer les manquants
Pourquoi faire un diagnostic avant de nettoyer ?
- C'est obligatoire pour pandas
- Pour savoir quoi corriger, mesurer l'ampleur et justifier les choix
- Pour accélérer le code
La suite du cours
- Traiter les valeurs manquantes20 min
- Corriger les types et les formats20 min
- Doublons, incohérences et valeurs aberrantes20 min
- Restructurer les données et automatiser le nettoyage20 min