Время прочтения: 4 мин.

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

Каким же образом можно свободно передавать, в некоторых случаях даже хранить данные, не переживая о потенциальных утечках? Именно здесь в игру вступает анонимизация данных путём маскирования.

Проще говоря, анонимизация данных – это процесс перестановки данных таким образом, после которого будет невозможно понять, кому принадлежат данные. В зависимости от цели может так же возникнуть потребность в том, чтобы сохранить смысл и такие свойства как однородность, целостность, взаимозависимость и вариативность исходных данных. Чтобы решить возможную проблему, необходимо понять, как и какие данные необходимо маскировать, а какие нужно сохранить.

Anonympy – простая, но богатая своим функционалом библиотека, обладающая набором инструментов и функций для анонимизации и маскировки данных. На текущий момент проходит бета-тестирование функционала по анонимизации изображений и цензурированию текста в PDF-документах, но об этом в другой раз.

Anonympy использует эффективность Pandas и инкапсулирует другие существующие библиотеки, например, Faker. Идея создания библиотеки проста: сделать анонимизацию и маскировку данных интуитивно понятными.

В качестве примера буду использовать подготовленный набор данных. Импортирую библиотеки и создаю DataFrame.

import pandas as pd
import numpy as np

df = pd.read_excel('/Users/tg/Downloads/data.xlsx')

df.head()

На первый взгляд становится понятно, что все столбцы содержат некоторую конфиденциальную информацию. Это означает, что придётся замаскировать все столбцы и тем самым продемонстрировать часть функций библиотеки.

Предлагаю начать со стандартной установки:

pip install anonympy 
pip install cape-privacy — no-deps 

Важно знать тип столбца, прежде чем применять какие-либо преобразования. Советую проверить типы данных и посмотреть, какие методы доступны.

Сначала подключаю две дополнительные библиотеки для проверки типов столбцов, далее вывожу результат:

from anonympy.pandas import dfAnonymizer
from anonympy.pandas.utils_pandas import available_methods

anonym = dfAnonymizer(df) # вызов универсальной функции

print('Numeric columns', anonym.numeric_columns)
print('Categorical columns', anonym.categorical_columns)
print('Date columns', anonym.datetime_columns)

Справка по методам:

available_methods()

Получив список доступных методов маскировки, можно начинать применять преобразования. К примеру, я могу добавить шум в столбец возраста, округлить значения ЗП и частично замаскировать адрес электронной почты.

anonym.numeric_noise('age')  
anonym.numeric_rounding('salary')
anonym.categorical_email_masking('email')

Для проверки состояния маскировки можно воспользоваться простым обращением или же вызовом функции:

anonym или anonym.info()

Чтобы увидеть изменения можно сделать так:

df_new = anonym.to_df()
df_new.head()

Как можно заметить, столбцы, содержащие возраст, зарплату и адрес электронной почты, успешно претерпели изменения.

Также для преобразования данных можно воспользоваться словарём:

anonym.anonymize({'first_name': 'categorical_fake',  # {'column_name': 'method_name'}
                  'last_name': 'categorical_fake_auto',
                  'age': 'numeric_noise',
                  'salary': 'numeric_rounding',
                  'email':'categorical_email_masking',
                  'postal': 'categorical_resampling'})

В случае повторной маскировки столбца, система выдаст соответствующий комментарий:

Чтобы замаскировать оставшиеся столбцы можно воспользоваться встроенными в Faker методами:

anonym.categorical_fake_auto()
anonym.categorical_fake({'web': 'url', 'phone': 'phone_number'})

Вот и всё. Предлагаю наглядно посмотреть на новый полностью анонимный набор данных! Для сравнения покажу два датафрейма сразу:

К сожалению, библиотека на данный момент не адаптирована под русскоговорящую аудиторию. В основном библиотека «заточена» под западных пользователей, это можно заметить по замене данных в столбцах с номерами телефонов, адресами, именами и городами.

В завершение публикации хочу напомнить, что конфиденциальность и защита любых данных являются важным этапом их обработки, и им следует уделять должное внимание.