Pandas propose deux réflexes face aux trous : <code>dropna()</code> et <code>fillna(df.mean())</code>. Le premier garde les statistiques honnêtes si les trous sont dus au hasard, mais perd des lignes. Le second garde toutes les lignes mais écrase la variabilité et affaiblit les relations entre variables. Et si les trous ne sont pas dus au hasard, aucun des deux ne vous sauve.
Un compteur qui ne relève pas les jours de forte consommation : si vous ne regardez que les relevés présents, votre moyenne est trop basse, même avec des milliers de lignes.
Si la donnée manque au hasard (panne aléatoire), supprimer les lignes ne biaise pas la moyenne. Si elle manque justement parce que la valeur est élevée (compteur saturé), les lignes restantes ne représentent plus la population.
dropna ou fillna, demandez-vous pourquoi la donnée manque. Aucune méthode ne corrige un mécanisme que vous n'avez pas compris.Mille consommations journalières (moyenne 100 kWh, écart-type 30) et une seconde variable corrélée à 0,59. On efface une part des valeurs, au hasard ou de préférence les plus élevées, puis on compare les deux méthodes à la vérité.
Graine fixe. Remplacer par la médiane donne les mêmes résultats ici, car la distribution est symétrique. La probabilité de manquer vaut la part choisie × (1 + biais × écart réduit de la valeur).
Imputer par la moyenne revient à ajouter des points sans variabilité : l'écart-type chute d'un facteur proche de √(1 − part manquante). Le graphique compare l'écart-type mesuré à la vérité (30), pour des trous au hasard.
Les courbes utilisent des trous au hasard. Le point est le réglage de pourcentage du simulateur du dessus, imputation par la moyenne.
Voici la démarche, puis un exemple Pandas.
import pandas as pd df = pd.read_csv("releves.csv") # 1. compter et localiser les trous print(df.isna().mean()) print(df.groupby("site")["kwh"].apply(lambda s: s.isna().mean())) # 2. garder l'information avant d'agir df["kwh_manquant"] = df["kwh"].isna() # 3. imputer par groupe (jamais avant le découpage train/test) df["kwh"] = df["kwh"].fillna(df.groupby("site")["kwh"].transform("median"))
Supprimer les doublons exacts en laisse passer, et supprimer sur un seul champ en détruit de vrais. Comparez trois façons de dédoublonner.
Statistiques, finance quantitative, machine learning, deep learning, LLM, agents IA, MLOps : 321 épisodes avec des simulateurs à manipuler, pas des vidéos.
Statistics, quantitative finance, machine learning, deep learning, LLMs, AI agents, MLOps: 321 interactive episodes with simulators to play with, not videos.