Diagnostiquer la qualité des données

Première leçon du cours Nettoyage et préparation des données, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Mesurer les valeurs manquantes, les doublons et les valeurs distinctes
  • Repérer les types incorrects et les valeurs suspectes
  • Produire un rapport de qualité synthétique avant tout nettoyage

Diagnostic de qualitéDétection des manquantsDétection des doublons

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.

  1. CodeDifficulté 1Python dans le navigateur2 indices

    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’id a 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 = ...
  2. CodeDifficulté 2Python dans le navigateur2 indices

    Fonction de rapport de qualité

    Écrivez rapport_qualite(df) qui renvoie un DataFrame indexé par les noms de colonnes de df, avec les colonnes manquants (nombre), pct_manquants (pourcentage arrondi à 1 décimale, de 0 à 100) et distinctes (nombre de valeurs distinctes non manquantes).

    import pandas as pd
    
    def rapport_qualite(df):
        ...
  3. QCMDifficulté 21 indice

    Manquants déguisés

    Une colonne ville contient des valeurs « inconnu ». Que renvoie df["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

  1. Quelle expression donne la proportion de valeurs manquantes par colonne ?

    • df.isna().sum()
    • df.isna().mean()
    • df.count()
  2. À quoi sert keep=False dans duplicated ?

    • À ne garder aucun doublon
    • À marquer tous les exemplaires d'un doublon, y compris le premier
    • À ignorer les manquants
  3. 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

  1. Traiter les valeurs manquantes20 min
  2. Corriger les types et les formats20 min
  3. Doublons, incohérences et valeurs aberrantes20 min
  4. Restructurer les données et automatiser le nettoyage20 min

Nettoyage et préparation des données · Intermédiaire · 3 h 05