データの一般化による匿名化

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

Rebeca Gonzalez

Data engineer

データ一般化

値をより粗い値に置き換える手法です。

識別子の一部を除去しつつ、分析に必要な有用性を保ちます。

例:値をより粗い分類に置換 — "Dancer" -> "Artist"

     name               location
0    Amanda Hooper      146 Rodgers Field\nGregoryview, MS 71630
1    Sarah Smith        817 Garcia Shoal\nJonesville, AR 30299
2    Sean Boyd III      1938 90th St\nDallas, TX 59715
     name               location
0    Amanda Hooper      998 Boone Estate\nReedborough, MS 71630
1    Sarah Smith        7255 Shelby Rapids Apt. 455\nKarenland, AK 30299
2    Sean Boyd III      791 Crist Parks\nGreenton, TX 59715
Pythonで学ぶデータプライバシーと匿名化

データ一般化

# 元データ
df_employees.head()
     first name   last name    age   ssn
0    Amber        Brown        91    798-29-4785
1    William      Gibson       34    431-66-8381
2    Daniel       Lee          92    825-91-5550
3    Andrea       Stevenson    64    188-59-3544
4    Julie        Horn         35    020-60-6388
# 一般化後データ:年齢は区間、SSN はマスク
generalized_df.head()
    First name    Last name    Age        SSN
0    Amber        Brown        (80, 99]    798-**-****
1    William      Gibson       (30, 50]    431-**-****
2    Daniel       Lee          (80, 99]    825-**-****
3    Andrea       Stevenson    (60, 80]    188-**-****
4    Julie        Horn         (30, 50]    020-**-****

34歳は30〜50の範囲に入ります。これはビニングとも呼ばれます。

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

データ集約

左に職業の一覧、右に上位の総称カテゴリを示す画像

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

医療データセット

# データセットを確認
df_medical.head()
    age    gender    department    condition
0    30    F         Finance       Anxiety disorders
1    42    M         Production    Bronchitis
2    35    F         Marketing     Dysthymia
3    39    F         Production    Dysthymia
4    40    M         Marketing     Flu
Pythonで学ぶデータプライバシーと匿名化

医療データセット

# age 変数のヒストグラムを確認
df_medical['age'].hist(bins=15)

データセットの年齢属性のヒストグラム(hist メソッドで作成)

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

一般化

# 2 値化して一般化を適用
df_medical['age'] = df_medical['age'].apply(lambda x:">=40" if x>=40 else "<40" )


# 結果を確認 df_medical.head()
    age    gender    department    condition
0    <40   F         Finance       Bronchitis
1    >=40  M         Production    Bronquitis
2    <40   F         Finance       Dysthymia
3    <40   F         Production    Dysthymia
4    >=40  M         Marketing     Flu
Pythonで学ぶデータプライバシーと匿名化

トップ/ボトムコーディング

# age 変数のヒストグラムを確認
df_medical['age'].hist(bins=15)

データセットの年齢属性のヒストグラム(hist メソッドで作成)

  • 25歳未満と55歳超は少数
  • 外れ値の再識別リスク低減のために上下限を設定
  • 分布の端など、カテゴリ内の観測がごく少ないときに有効
Pythonで学ぶデータプライバシーと匿名化

トップコーディング

# 影響行を抽出して確認
df_medical[df_medical['age'] >= 55]
      age   gender   department     condition
26    56    F        Production     Flu
65    55    M        Finance        Dysthymia
126   59    F        Production     Anxiety disorders
139   58    F        Finance        Dysthymia
142   59    M        Marketing      Flu
145   57    M        Marketing      Anxiety disorders
Pythonで学ぶデータプライバシーと匿名化

トップコード

# age を 55 にトップコード
df_medical.loc[df_medical['age'] > 55, 'age'] = 55


# 影響行を抽出して確認 df_medical[df_medical['age'] >= 55]
      age   gender   department     condition
26    55    F        Production     Flu
65    55    M        Finance        Dysthymia
126   55    F        Production     Anxiety disorders
139   55    F        Finance        Dysthymia
142   55    M        Marketing      Flu
145   55    M        Marketing      Anxiety disorders
Pythonで学ぶデータプライバシーと匿名化

ボトムコーディング

# age 変数のヒストグラムを確認
df_medical['age'].hist(bins=15)

トップコーディング後の年齢属性のヒストグラム(右側の高値外れ値が消えている)

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

ボトムコード

# age を 25 にボトムコード
df_medical.loc[df['age'] < 25, 'age'] = 25


# age 変数のヒストグラムを確認 df_medical['age'].hist(bins=15)

トップ/ボトムコーディング後の年齢属性のヒストグラム(外れ値がない)

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

データ一般化とプライバシーモデル

K-匿名化などの「プライバシーモデル」に基づき、抑制やマスキングと併用すると効果的です。

開示リスクを抑えるため、データセットが満たす条件を定義します。

このプライバシーモデルの実装は次章で学びます。

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

練習の時間です!

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

Preparing Video For Download...