Un tableau sans nom peut désigner quelqu’un
Une donnée personnelle est une information qui peut conduire à une personne précise. Même sans nom, un tableau peut désigner quelqu’un quand une combinaison de colonnes est rare.
Vous mesurerez ce risque avec le k-anonymat, puis vous le réduirez en rendant les données moins précises.
À la fin de cette leçon
Remarque
Je peux réduire ce qu’un jeu de données révèle sur une personne.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Identifiant direct | une colonne qui désigne une personne à elle seule, comme un nom |
| Quasi-identifiant | une colonne qui désigne une personne en combinaison avec d’autres |
| k-anonymat | chaque combinaison est partagée par au moins k personnes |
| Généralisation | rendre une valeur moins précise |
| Suppression | retirer les lignes trop rares |
| Colonne sensible | l’information qu’on veut garder secrète |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Retirer le nom ne suffit pas
Supprimer la colonne du nom retire l’identifiant direct. Mais l’âge, le code postal et la filière restent : ce sont des quasi-identifiants.
Si une seule personne de 23 ans habite un code postal et suit une filière, un lecteur qui connaît ces faits la retrouve. Elle perd alors son secret sur la colonne sensible, ici l’aide au logement.
Exemple travaillé : huit étudiants
| Âge | Code postal | Filière | Aide au logement |
|---|---|---|---|
| 19 | 69007 | Informatique | oui |
| 19 | 69007 | Informatique | non |
| 20 | 69007 | Informatique | oui |
| 20 | 69003 | Droit | non |
| 20 | 69003 | Droit | non |
| 21 | 69003 | Droit | oui |
| 21 | 69003 | Droit | oui |
| 23 | 69008 | Chimie | non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les groupes du même tableau et leur taille
| Âge, code postal et filière | Nombre de lignes |
|---|---|
| 19, 69007, Informatique | 2 |
| 20, 69007, Informatique | 1 |
| 20, 69003, Droit | 2 |
| 21, 69003, Droit | 2 |
| 23, 69008, Chimie | 1 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Compter la taille de chaque groupe
# Quatre étudiants : l’âge et le code postal.
etudiants = ["19|69007", "19|69007", "20|69007", "23|69008"]
tailles = {}
for cle in etudiants:
if cle in tailles:
tailles[cle] = tailles[cle] + 1
else:
tailles[cle] = 1
print(tailles)
# La plus petite taille est k. Que vaut k ici ?
# Remplacez "23|69008" par "20|69007", puis relancez.
k est la taille du plus petit groupe
Le k-anonymat demande que chaque combinaison de quasi-identifiants soit partagée par au moins k personnes. Plus k est grand, plus chacun se cache dans la foule.
On calcule k en comptant la taille de chaque groupe, puis en prenant la plus petite.
Voyons le geste sur le fichier du labo. Chaque ligne est un jour, mais comptez comme si elle était une personne.
Compter par date exacte
docker exec jupyter python3 -c "print(__import__('pandas').read_csv('hires.csv').groupby('date').size().min())"Affiché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.
Compter par mois
docker exec jupyter python3 -c "print(__import__('pandas').read_csv('hires.csv').groupby('month').size().min())"Affiché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.
Compter par mois et jour de la semaine
docker exec jupyter python3 -c "print(__import__('pandas').read_csv('hires.csv').groupby(['month','weekday']).size().min())"Affiché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.
Rendre les données moins précises protège plus
La généralisation remplace une valeur précise par une valeur plus large : l’âge 19 devient « 18-20 », le code postal 69007 devient « 69 ». Les groupes grossissent, donc k monte.
Si une ligne reste seule, la suppression la retire. Mais ces gestes ont un prix : des données moins précises apprennent moins de choses au modèle. Il faut équilibrer vie privée et utilité.
Exemple travaillé : k avant et après
| Étape | Plus petit groupe (k) | Lignes gardées |
|---|---|---|
| Départ : âge, code postal et filière | 1 | 8 |
| Âge en tranches de 3 ans et code postal sur 2 chiffres | 1 | 8 |
| Suppression de la ligne Chimie, restée seule | 2 | 7 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent qu’un k grand protège tout. Un groupe de trois étudiants qui ont tous « oui » à l’aide au logement révèle quand même la réponse de chacun. Le k-anonymat compte les personnes, pas la variété de la colonne sensible. Regardez aussi cette colonne dans chaque groupe.
Dans votre carnet : mois et météo
import pandas as pd
locations = pd.read_csv("hires.csv")
# La taille de chaque groupe mois et météo, puis la plus petite.
tailles = locations.groupby(["month", "weather"]).size()
tailles.min()
# Ajoutez "weekday" à la liste et relancez. Que devient k ?
Pour aller plus loin
Dans votre carnet, groupez locations par ["month", "weekday", "weather"] et lisez la plus petite taille.
Ajouter des colonnes fait baisser k. Expliquez en deux phrases pourquoi, et ce que cela veut dire pour une base qui garde dix colonnes sur chaque personne.