Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Protéger les données personnelles (k-anonymat)

Après cette leçon: Je peux réduire ce qu’un jeu de données révèle sur une personne.

Leçon de 60 min3 commandesLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

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

MotCe que ça veut dire
Identifiant directune colonne qui désigne une personne à elle seule, comme un nom
Quasi-identifiantune colonne qui désigne une personne en combinaison avec d’autres
k-anonymatchaque combinaison est partagée par au moins k personnes
Généralisationrendre une valeur moins précise
Suppressionretirer les lignes trop rares
Colonne sensiblel’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

ÂgeCode postalFilièreAide au logement
1969007Informatiqueoui
1969007Informatiquenon
2069007Informatiqueoui
2069003Droitnon
2069003Droitnon
2169003Droitoui
2169003Droitoui
2369008Chimienon

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èreNombre de lignes
19, 69007, Informatique2
20, 69007, Informatique1
20, 69003, Droit2
21, 69003, Droit2
23, 69008, Chimie1

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Compter la taille de chaque groupe

Code: python
# 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

Commande
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

Commande
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

Commande
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

ÉtapePlus petit groupe (k)Lignes gardées
Départ : âge, code postal et filière18
Âge en tranches de 3 ans et code postal sur 2 chiffres18
Suppression de la ligne Chimie, restée seule27

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

Code: python
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.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.