Supprimer l'identité directe ne suffit pas : la combinaison d'attributs ordinaires (commune, puissance souscrite, tarif, époque de construction, chauffage) forme une signature. Sur 5 000 foyers, 4 attributs en rendent déjà 15,7 % uniques et 88 % appartiennent à un groupe de moins de 5 ; avec 5 attributs, 63 % sont uniques. Le k-anonymat demande que chaque combinaison soit partagée par au moins k foyers.
Dans un immeuble, « la voisine du 3e, retraitée, avec un chien » suffit à désigner une personne, sans prénom. Chaque détail anodin réduit le cercle, jusqu'à une seule personne.
On appelle quasi-identifiants les attributs qui, pris ensemble, désignent un foyer. Avec n foyers répartis uniformément dans C combinaisons possibles, la part des foyers uniques vaut (1 − 1/C)^(n−1) : elle grimpe très vite avec le nombre d'attributs, car C est le produit de leurs nombres de valeurs. Un fichier est k-anonyme si chaque combinaison apparaît au moins k fois. L'hypothèse d'uniformité est favorable : dans la réalité, certaines combinaisons sont rares et les foyers uniques plus nombreux.
Choisissez combien d'attributs sont publiés (dans l'ordre : commune 30 valeurs, puissance 6, tarif 3, époque de construction 5, chauffage 4) et le nombre de foyers. Les barres donnent la part de foyers uniques et la part de foyers dans un groupe de moins de 5 (k = 5), pour 1 à 5 attributs ; la barre du réglage actuel est en couleur vive.
Répartition uniforme des foyers dans les combinaisons : un cas favorable, la réalité est plus risquée.
Plus le fichier contient de foyers, plus chaque combinaison est partagée, donc plus on est noyé dans la foule. À l'inverse, un fichier local ou un sous-ensemble (une seule commune, un seul tarif) expose davantage. La courbe donne la part de foyers uniques selon le nombre de foyers pour 3, 4 et 5 attributs.
Chips : part de foyers uniques avec 5 attributs publiés.
Voici la démarche, puis un exemple.
import numpy as np import pandas as pd qi = ["commune", "puissance", "tarif", "epoque"] taille = df.groupby(qi)["foyer"].transform("size") uniques = (taille == 1).mean() # part de foyers uniques sous_k = (taille < 5).mean() # part non 5-anonyme k_reel = taille.min() # le k du fichier
Quelques observations connues sur une personne suffisent à retrouver sa trace complète dans un fichier anonymisé.
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.