Введение в k-анонимность

Конфиденциальность данных и анонимизация в Python

Rebeca Gonzalez

Data engineer

Почему k-анонимность важна?

Изображение: слева — губернатор Массачусетса, надпись «Идентификация губернатора Массачусетса», справа — профессор Гарварда Латанья Суини

Конфиденциальность данных и анонимизация в Python

Почему это важно?

  • Шестеро имели ту же дату рождения
  • Из них лишь трое были мужчинами
  • Он единственный жил в своём почтовом индексе

Диаграмма пересечения двух наборов данных: медицинских данных и списка избирателей; в пересечении — почтовый индекс, дата рождения и пол

Конфиденциальность данных и анонимизация в Python

Как защититься от такой атаки?

Только одна запись соответствовала демографическим данным губернатора.

Удалить все демографические атрибуты — значит сделать данные бесполезными для анализа.

Есть ли промежуточное решение, при котором демографические значения перестанут быть уникальными в наборе данных?

Конфиденциальность данных и анонимизация в 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

Атрибуты приватности

Атрибуты приватности:

  • Идентифицирующие: например, номер социального страхования и ID.
  • Квазиидентифицирующие: возраст и отдел из нашего набора данных
  • Чувствительные: диагноз из нашего набора данных
Конфиденциальность данных и анонимизация в 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

Давайте потренируемся!

Конфиденциальность данных и анонимизация в Python

Preparing Video For Download...