K-익명성 소개

Python으로 배우는 데이터 프라이버시와 익명화

Rebeca Gonzalez

Data engineer

k-익명성이 중요한 이유

왼쪽에 매사추세츠 주지사, "매사추세츠 주지사 식별" 문구, 오른쪽에 하버드의 라탄야 스위니 교수 이미지

Python으로 배우는 데이터 프라이버시와 익명화

왜 중요한가요?

  • 같은 생일을 가진 사람은 6명뿐이었음
  • 남성은 3명뿐이었음
  • 해당 ZIP code에선 그가 유일했음

두 데이터셋(의료 데이터, 유권자 명부)의 교집합이 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...