Introduzione alla k-anonymity

Riservatezza dei dati e anonimizzazione in Python

Rebeca Gonzalez

Data engineer

Perché la k-anonymity è importante?

A sinistra il governatore del Massachusetts con testo "Identifying the governor of Massachusetts" e a destra la prof.ssa di Harvard Latanya Sweeney

Riservatezza dei dati e anonimizzazione in Python

Perché è importante?

  • Sei persone avevano la sua data di nascita
  • Solo tre erano uomini
  • Era l'unico nel suo ZIP code

Diagramma che mostra l'intersezione di due dataset: dati medici e lista elettorale; l'intersezione è ZIP code, data di nascita e genere

Riservatezza dei dati e anonimizzazione in Python

Come prevenire questo attacco?

Un solo record aveva i valori demografici del governatore.

Eliminare tutte le info demografiche renderebbe i dati inutili per l'analisi.

Esiste una via di mezzo per rendere non unici i valori demografici nel dataset?

Riservatezza dei dati e anonimizzazione in Python

Definizione di k-anonymity

$$ $$ $$ $$ $$ $$ Almeno k individui nel dataset condividono l'insieme di attributi che potrebbe identificare ciascuno.

Riservatezza dei dati e anonimizzazione in Python

Definizione di k-anonymity

Un grande gruppo di persone che attraversa una strada

Riservatezza dei dati e anonimizzazione in Python

Dataset k-anonimo

Anonimo a 2:

     ZIP code    Età
0    4217        34
1    4217        34
2    1742        77
3    1742        77

Ogni combinazione di valori delle colonne identificanti compare in almeno k record diversi.

Non anonimo a 2:

     ZIP code    Età
0    4217        34
1    4217        34
2    1742        77
3    1743        77
Riservatezza dei dati e anonimizzazione in Python

K-anonymity: terminologia

Diagramma con identificatori diretti, quasi-identificatori e attributi sensibili

Riservatezza dei dati e anonimizzazione in Python

Dataset medico

# Explore DataFrame 
medical_df.head()
    Età    Reparto     Condizione
0    34    Marketing    Disturbi d'ansia
1    46    Finanza      Influenza
2    41    Finanza      Influenza
3    62    Marketing    Disturbi d'ansia
4    44    Marketing    Disturbi d'ansia
Riservatezza dei dati e anonimizzazione in Python

Attributi di privacy

Attributi di privacy:

  • Identificanti: ad es. SSN e numeri ID.
  • Quasi-identificanti: età e reparto nel nostro dataset
  • Sensibili: condizione medica nel nostro dataset
Riservatezza dei dati e anonimizzazione in Python

Combinazioni uniche di quasi-identificatori

# Calcola quante combinazioni uniche ci sono per Età e Reparto
medical_df.groupby(['Age','Department']).size().reset_index(name='Count')
    Età    Reparto        Conteggio
0    30    Produzione    2
1    31    Marketing     1
2    32    Marketing     1
3    32    Produzione    1
4    33    Produzione    1
5    34    Finanza       1
6    34    Marketing     1
7    34    Produzione    1
8    35    Marketing     1
9    36    Finanza       2
10    38    Finanza      1
11    38    Produzione   1
Riservatezza dei dati e anonimizzazione in Python

Approccio: generalizzazione

# Generalizza Età creando 4 gruppi di intervalli
medical_df['Age_group'] = pd.cut(medical_df['Age'], bins=4)


# Esplora il dataset con intervalli medical_df.head()
    Età    Reparto    Condizione            Age_group
0    34    Marketing     Disturbi d'ansia    (29.964, 39.0]
1    46    Finanza       Influenza            (39.0, 48.0]
2    41    Finanza       Influenza            (39.0, 48.0]
3    62    Marketing     Disturbi d'ansia    (57.0, 66.0]
4    44    Marketing     Disturbi d'ansia    (39.0, 48.0]
Riservatezza dei dati e anonimizzazione in Python

Approccio: generalizzazione

# Calcola quante combinazioni uniche ci sono per Età e Reparto
medical_df.groupby(['Age_group','Department']).size().reset_index(name='Count')
     Age_group         Reparto    Conteggio
0    (29.964, 39.0]    Finanza       4
1    (29.964, 39.0]    Marketing     4
2    (29.964, 39.0]    Produzione    6
3    (39.0, 48.0]      Finanza       8
4    (39.0, 48.0]      Marketing     5
5    (39.0, 48.0]      Produzione    4
6    (48.0, 57.0]      Finanza       3
7    (48.0, 57.0]      Marketing     2
8    (48.0, 57.0]      Produzione    4
Riservatezza dei dati e anonimizzazione in Python

Approccio: generalizzazione

# Imposta k=2, per un dataset anonimo a 2
k = 2


# Calcola quante combinazioni uniche ci sono per Età e Reparto df_count = medical_df.groupby(['Age_group','Department']).size().reset_index(name='Count')
# Filtra le righe con conteggio inferiore a k df_count[df_count['Count'] < k]
    Age_group    Reparto    Conteggio
Riservatezza dei dati e anonimizzazione in Python

Applichiamo la k-anonymity!

Riservatezza dei dati e anonimizzazione in Python

Preparing Video For Download...