k-匿名性の導入

Pythonで学ぶデータプライバシーと匿名化

Rebeca Gonzalez

Data engineer

なぜ k-匿名性が重要か

左にマサチューセッツ州知事、中央に「マサチューセッツ州知事を特定」とのテキスト、右にハーバード大学のラタンヤ・スウィーニー教授を示す画像

Pythonで学ぶデータプライバシーと匿名化

なぜ重要か

  • 誕生日が同じ人は6人いた
  • そのうち男性は3人だけ
  • 彼のZIP codeは一意だった

2つのデータセット(医療データと有権者名簿)の共通項がZIP code・誕生日・性別であることを示す図

Pythonで学ぶデータプライバシーと匿名化

この攻撃をどう防ぐか

知事の属性に一致するレコードは1件のみでした。

属性をすべて削除すると分析に使えません。

属性がデータ内で一意でなくなる中庸はあるでしょうか。

Pythonで学ぶデータプライバシーと匿名化

k-匿名性の定義

$$ $$ $$ $$ $$ $$ データ内の各個人について、識別になり得る属性の組合せを少なくとも k 人が共有していること。

Pythonで学ぶデータプライバシーと匿名化

k-匿名性の定義

大勢の人が横断歩道を渡っている

Pythonで学ぶデータプライバシーと匿名化

k-匿名なデータセット

2-匿名:

     ZIP code    Age
0    4217        34
1    4217        34
2    1742        77
3    1742        77

データ内の識別列のあらゆる値の組合せが、少なくとも k 件のレコードで共有される。

2-匿名ではない:

     ZIP code    Age
0    4217        34
1    4217        34
2    1742        77
3    1743        77
Pythonで学ぶデータプライバシーと匿名化

k-匿名性: 用語

直接識別子、準識別子、機微属性の用語を示す図

Pythonで学ぶデータプライバシーと匿名化

医療データのデータセット

# Explore DataFrame 
medical_df.head()
    Age    Department   Condition
0    34    Marketing    Anxiety disorders
1    46    Finance      Flu
2    41    Finance      Flu
3    62    Marketing    Anxiety disorders
4    44    Marketing    Anxiety disorders
Pythonで学ぶデータプライバシーと匿名化

プライバシー属性

プライバシー属性:

  • 識別子: SSN や ID 番号など
  • 準識別子: 本データの Age と Department
  • 機微情報: 本データの Medical condition
Pythonで学ぶデータプライバシーと匿名化

準識別子のユニーク組合せの探索

# Calculate how many unique combinations are for Age and Department
medical_df.groupby(['Age','Department']).size().reset_index(name='Count')
    Age    Department    Count
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
Pythonで学ぶデータプライバシーと匿名化

手法: 一般化

# Generalize Age by creating 4 groups of intervals
medical_df['Age_group'] = pd.cut(medical_df['Age'], bins=4)


# Explore the dataset with intervals medical_df.head()
    Age    Department    Condition            Age_group
0    34    Marketing     Anxiety disorders    (29.964, 39.0]
1    46    Finance       Flu                  (39.0, 48.0]
2    41    Finance       Flu                  (39.0, 48.0]
3    62    Marketing     Anxiety disorders    (57.0, 66.0]
4    44    Marketing     Anxiety disorders    (39.0, 48.0]
Pythonで学ぶデータプライバシーと匿名化

手法: 一般化

# Calculate how many unique combinations are for Age and Department
medical_df.groupby(['Age_group','Department']).size().reset_index(name='Count')
     Age_group         Department    Count
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
Pythonで学ぶデータプライバシーと匿名化

手法: 一般化

# Set k to be 2, for a 2-anonymous dataset
k = 2


# Calculate how many unique combinations are for Age and Department df_count = medical_df.groupby(['Age_group','Department']).size().reset_index(name='Count')
# Filter the rows that have count less than k df_count[df_count['Count'] < k]
    Age_group    Department    Count
Pythonで学ぶデータプライバシーと匿名化

k-匿名化してみよう

Pythonで学ぶデータプライバシーと匿名化

Preparing Video For Download...