Fakerによるデータマスキングとデータ生成

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

Rebeca Gonzalez

Data engineer

準識別子

非機微な個人識別情報も、準識別子になり得ます。 「欧州の政府の長」という文言と生年月日、アンゲラ・メルケルの顔を指す線

1 アンゲラ・メルケルの写真はWikimedia Commonsより
Pythonで学ぶデータプライバシーと匿名化

準識別子

他の準識別子と組み合わせると、個人を特定可能になります。

  • 年齢
  • 性別
  • 職業
  • 個人の日時: 出生、死亡、医療入院、受診など

人物の周囲に個人情報らしきポップアップが並ぶ男性のイラスト

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

準識別子と再識別攻撃

2つのデータセット(医療データと有権者名簿)の共通部分として郵便番号・生年月日・性別の交差を示す図

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

さらなる匿名化手法

準識別子の匿名化手法で、開示リスクを低減します。 医療・個人データの2つの表。左が元データ、右が氏名属性を抑制した結果データ

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

データマスキング

元のDataFrame

     name                phone
0    Cassandra Nelson    4399406975395
1    Brian Moss          0389407128613
2    Melody Gill         8283308773967
3    Sandra Huber        4366608954250
4    Patricia Webster    4466462475574

名前をマスクしたDataFrame

     name    phone
0    xxxx    4399406975395
1    xxxx    0389407128613
2    xxxx    8283308773967
3    xxxx    4366608954250
4    xxxx    4466462475574

「x」などの文字で機微情報を置換することをデータマスキングと呼びます。

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

データマスキング

# Explore the DataFrame
df.head()
     country         card_number           email
0    Finland         3546746666030419      [email protected]
1    Belarus         4303032415762821      [email protected]
2    Turkmenistan    4536883671157         [email protected]
3    Puerto Rico     3568819286614160      [email protected]
4    Angola          2514167462583016      [email protected]
Pythonで学ぶデータプライバシーと匿名化

データマスキング

# Uniformly mask the card number colum 
df['card_number'] = '****'


# See resulting DataFrame df.head()
     country         card_number     email
0    Finland         ****            [email protected]
1    Belarus         ****            [email protected]
2    Turkmenistan    ****            [email protected]
3    Puerto Rico     ****            [email protected]
4    Angola          ****            [email protected]
Pythonで学ぶデータプライバシーと匿名化

部分的なデータマスキング

Facebookのパスワード再設定ページ。メールが一部マスクされている画面のスクリーンショット

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

部分的なデータマスキング

# Mask username from email
df2['email'] = df2['email'].apply(lambda s: s[0] + '****' + s[s.find('@'):] )


# See the resulting pseudonymized data df2.head()
     country         card_number           email
0    Finland         3546746666030419      f****@gmail.com
1    Belarus         4303032415762821      m****@gmail.com
2    Turkmenistan    4536883671157         a****@gmail.com
3    Puerto Rico     3568819286614160      k****@gmail.com
4    Angola          2514167462583016      d****@gmail.com
Pythonで学ぶデータプライバシーと匿名化

合成データの生成

左に元データ(カード番号を含む)、右に合成生成された新しいクレジットカード番号を示す表。

  • 機微情報を、元データに似た新規生成データに置換する。
Pythonで学ぶデータプライバシーと匿名化

合成データの生成

# Import Faker class
from faker import Faker


# Create fake data generator fake_data = Faker()
# Generate a credit card number fake_data.credit_card_number()
3542216874440804
Pythonで学ぶデータプライバシーと匿名化

合成データの生成

# 生成データでカード番号をマスク(lambda使用)
df['card_number'] = df['card_number'].apply(lambda x: fake_data.credit_card_number())

# See the resulting pseudonymized data df.head()
     country         card_number            email
0    Finland         3596625386355448       [email protected]
1    Belarus         376297265347524        [email protected]
2    Turkmenistan    4377494880888682       [email protected]
3    Puerto Rico     30553931809810         [email protected]
4    Angola          4241735748382          [email protected]
Pythonで学ぶデータプライバシーと匿名化

他のタイプのデータ生成

fake_data.name()
'Kelly Clark'
fake_data.name_male()
'Antonio Henderson'
fake_data.name_female()
'Jennifer Ortega'
Pythonで学ぶデータプライバシーと匿名化

実践してみましょう!

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

Preparing Video For Download...