Un export plein de trous
Le logiciel de réservation du loueur exporte l’année pour une étude. Certaines températures sont vides. Un jour affiche 99,9 degrés. Un nombre de locations vaut « unknown ».
Un modèle nourri avec ce fichier apprendrait les erreurs autant que les faits. Le nettoyage passe d’abord, et c’est souvent l’essentiel du travail.
À la fin de cette leçon
Remarque
Je peux trouver et corriger les valeurs manquantes ou fausses d’un jeu de données.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Valeur manquante | une case vide | NaN |
| Type de données | la sorte de valeur que tient une colonne | float64 |
| Doublon | une ligne qui en répète une autre à l’identique | |
| Valeur aberrante | une valeur très éloignée des autres | |
| Imputer | remplir une case vide par une estimation raisonnable |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Quatre défauts à chercher
La plupart des données sales ont l’un de ces défauts. Une valeur manque. Une colonne a le mauvais type de données : des nombres rangés comme du texte. Une ligne est un doublon. Ou une valeur ne peut pas être vraie.
Chaque défaut a son test rapide dans pandas. Regardez avant de changer quoi que ce soit.
Exemple travaillé : chaque défaut et son test
| Défaut | Ce qu’on voit | Le test |
|---|---|---|
| Valeur manquante | NaN dans une case | messy.isna().sum() |
| Mauvais type | object là où l’on attend des nombres | messy.dtypes |
| Doublon | plus de lignes que de jours | messy.duplicated().sum() |
| Valeur impossible | un maximum qui ne peut pas arriver | messy["temp_c"].max() |
| Mots écrits autrement | Sunny et sunny comptés à part | messy["weather"].value_counts() |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Fabriquer la copie sale et l’examiner
docker exec jupyter python3 steps/messy.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
À taper dans votre carnet : les cases vides
import pandas as pd
messy = pd.read_csv("messy.csv")
# Seulement les jours dont la température manque.
messy[messy["temp_c"].isna()][["date", "temp_c"]]
Une colonne de texte cache des nombres
Un seul mot dans une colonne de nombres suffit : pandas range toute la colonne comme du texte. Son type devient object, et une moyenne ne marche plus.
pd.to_numeric(colonne, errors="coerce") convertit tout ce qui peut l’être. Le reste devient NaN, et vous pouvez alors le trouver.
Les mots ont le même piège. Pour un ordinateur, « Sunny » suivi d’une espace et « SUNNY » sont deux valeurs différentes.
À taper dans votre carnet : les comptes faux
# Les comptes en nombres ; ce qui ne se lit pas devient NaN.
comptes = pd.to_numeric(messy["hires"], errors="coerce")
messy[comptes.isna() | (comptes < 0)][["date", "hires"]]
Ranger des mots, vérifier des comptes
# Trois façons d'écrire la même météo dans un export.
mots = ["cloudy", " Cloudy", "CLOUDY "]
for mot in mots:
print(repr(mot), "devient", repr(mot.strip().lower()))
# Un nombre de locations est-il bien un entier positif ?
for texte in ["318", "-12", "n/a"]:
print(texte, texte.isdigit())
# Ajoutez "4.5" à la seconde liste. Que répond isdigit ?
Une erreur fréquente
Attention
Beaucoup pensent qu’il faut supprimer toute valeur aberrante. Une valeur rare peut être vraie : le jour record, 487 locations, a bien eu lieu. Ne retirez ou ne remplacez une valeur que si elle est impossible, comme 99,9 degrés ou un compte négatif.
Supprimer, corriger ou imputer, et le noter
Pour chaque défaut, choisissez une des trois actions. Supprimez la ligne quand rien ne la sauve, comme un compte « unknown ». Corrigez quand la bonne valeur est évidente, comme « Sunny » en « sunny ». Imputez quand une estimation suffit, comme la température médiane.
Gardez le fichier brut intact et nettoyez une copie. Chaque étape peut alors être vérifiée et rejouée.
Exemple travaillé : les étapes dans l’ordre
| Étape | Lignes restantes | Pourquoi |
|---|---|---|
| Lire messy.csv | 367 | L’export tel qu’il est arrivé |
| drop_duplicates | 365 | Deux lignes étaient des répétitions |
| Garder les comptes de 0 ou plus | 363 | « unknown » et -5 ne sont pas des comptes |
| Passer en manquant les températures au-dessus de 45 | 363 | Le 99,9 rejoint les cases vides |
| Remplir les températures par la médiane | 363 | Une estimation vaut mieux qu’un trou ici |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Lancer les étapes du nettoyage
docker exec jupyter python3 steps/clean.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
À taper dans votre carnet : les doublons
# keep=False montre les deux exemplaires de chaque ligne répétée.
messy[messy.duplicated(keep=False)][["date", "hires"]]
Pour aller plus loin
Dans votre carnet, nettoyez messy.csv autrement. Au lieu de la médiane de toute l’année, remplissez chaque température manquante par la médiane de son mois.
Indice : groupby("month")["temp_c"].transform("median") donne à chaque ligne la médiane de son mois. Comparez la valeur remplie du 22 janvier avec la médiane de l’année. Laquelle est la plus crédible, et pourquoi ?