Introduction à la k-anonymat

Confidentialité des données et anonymisation en Python

Rebeca Gonzalez

Data engineer

Pourquoi la k-anonymat est-elle importante ?

Image présentant le gouverneur du Massachusetts à gauche, le texte « Identifier le gouverneur du Massachusetts » et, à droite, la professeure de Harvard Latanya Sweeney

Confidentialité des données et anonymisation en Python

Pourquoi est-ce important ?

  • Six personnes avaient sa date de naissance
  • Seulement trois étaient des hommes
  • Il était le seul dans son code postal

Schéma montrant l'intersection de deux ensembles de données : données médicales et liste électorale, dont l'intersection est code postal, date de naissance et genre

Confidentialité des données et anonymisation en Python

Comment prévenir cette attaque ?

Un seul enregistrement avait les valeurs démographiques du gouverneur.

Supprimer toutes les données démographiques rendrait l'analyse inutile.

Et s'il existait un compromis pour que ces valeurs ne soient plus uniques dans l'ensemble de données ?

Confidentialité des données et anonymisation en Python

Définition de la k-anonymat

$$ $$ $$ $$ $$ $$ Au moins k personnes de l'ensemble de données partagent l'ensemble d'attributs pouvant devenir identifiants pour chaque personne.

Confidentialité des données et anonymisation en Python

Définition de la k-anonymat

Un grand groupe de personnes traversant une rue

Confidentialité des données et anonymisation en Python

Ensemble de données k-anonyme

2-anonyme :

     Code postal    Âge
0    4217        34
1    4217        34
2    1742        77
3    1742        77

Chaque combinaison de valeurs pour les colonnes identifiantes apparaît au moins k fois dans l'ensemble de données.

Non 2-anonyme :

     Code postal    Âge
0    4217        34
1    4217        34
2    1742        77
3    1743        77
Confidentialité des données et anonymisation en Python

K-anonymat : terminologie

Schéma montrant les termes identifiants directs, quasi-identifiants et attributs sensibles

Confidentialité des données et anonymisation en Python

Ensemble de données médicales

# Explorer le DataFrame 
medical_df.head()
    Âge    Service        Diagnostic
0    34    Marketing    Troubles anxieux
1    46    Finance       Grippe
2    41    Finance       Grippe
3    62    Marketing    Troubles anxieux
4    44    Marketing    Troubles anxieux
Confidentialité des données et anonymisation en Python

Attributs de confidentialité

Attributs liés à la confidentialité :

  • Identifiants : p. ex. NAS et numéros d'identification.
  • Quasi-identifiants : Âge et service dans notre ensemble de données
  • Sensibles : Diagnostic médical dans notre ensemble de données
Confidentialité des données et anonymisation en Python

Explorer les combinaisons uniques de quasi-identifiants

# Calculer le nombre de combinaisons uniques pour Âge et Service
medical_df.groupby(['Age','Department']).size().reset_index(name='Count')
    Âge    Service        Compte
0    30    Production    2
1    31    Marketing     1
2    32    Marketing     1
3    32    Production    1
4    33    Production    1
5    34    Finance       1
6    34    Marketing     1
7    34    Production    1
8    35    Marketing     1
9    36    Finance       2
10    38    Finance      1
11    38    Production   1
Confidentialité des données et anonymisation en Python

Approche : généralisation

# Généraliser l'âge en créant 4 groupes d'intervalles
medical_df['Age_group'] = pd.cut(medical_df['Age'], bins=4)


# Explorer l'ensemble de données avec intervalles medical_df.head()
    Âge    Service        Diagnostic            Groupe_d_âge
0    34    Marketing     Troubles anxieux    (29.964, 39.0]
1    46    Finance       Grippe            (39.0, 48.0]
2    41    Finance       Grippe            (39.0, 48.0]
3    62    Marketing     Troubles anxieux    (57.0, 66.0]
4    44    Marketing     Troubles anxieux    (39.0, 48.0]
Confidentialité des données et anonymisation en Python

Approche : généralisation

# Calculer le nombre de combinaisons uniques pour Groupe_d_âge et Service
medical_df.groupby(['Age_group','Department']).size().reset_index(name='Count')
     Groupe_d_âge         Service    Compte
0    (29.964, 39.0]    Finance       4
1    (29.964, 39.0]    Marketing     4
2    (29.964, 39.0]    Production    6
3    (39.0, 48.0]      Finance       8
4    (39.0, 48.0]      Marketing     5
5    (39.0, 48.0]      Production    4
6    (48.0, 57.0]      Finance       3
7    (48.0, 57.0]      Marketing     2
8    (48.0, 57.0]      Production    4
Confidentialité des données et anonymisation en Python

Approche : généralisation

# Définir k = 2, pour un ensemble de données 2-anonyme
k = 2


# Calculer le nombre de combinaisons uniques pour Groupe_d_âge et Service df_count = medical_df.groupby(['Age_group','Department']).size().reset_index(name='Count')
# Filtrer les lignes dont le compte est inférieur à k df_count[df_count['Count'] < k]
    Groupe_d_âge    Service    Compte
Confidentialité des données et anonymisation en Python

K-anonymisons !

Confidentialité des données et anonymisation en Python

Preparing Video For Download...