Как я могу де-и переклассифицировать данные? - PullRequest
7 голосов
/ 21 февраля 2011

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

В идеале я бы хотел работать так:

  1. Считать данные в R (посмотреть, почистить и т. Д.)
  2. Выберите фрейм данных, который я хочу деклассифицировать, запустите его через пакет и получите два «файла»: десекретаризованные данные и файл перевода. Последнее я оставлю себе.
  3. Деклассифицированные данные могут быть переданы, обработаны и обработаны без проблем.
  4. Я переклассифицирую обработанные данные вместе с файлом перевода.

Я полагаю, что это также может быть полезно при загрузке данных для обработки «в облаке» (Amazon и т. Д.).

Вы были в такой ситуации? Сначала я подумал о написании функции «рандомизации», но потом понял, что нет предела тому, насколько это сложно сделать (например, смещать метки времени без потери порядка). Может быть, уже есть определенный метод или инструмент?

Спасибо всем, кто вносит свой вклад в [r] -tag здесь, в Stack Overflow!

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Можете ли вы просто назначить GUID для строки, из которой вы удалили всю конфиденциальную информацию? Пока ваши коллеги, у которых нет разрешения на безопасность, не связываются с GUID, вы сможете включить любые изменения и дополнения, которые они могут внести, просто присоединившись к GUID. Тогда это становится просто вопросом создания фиктивных значений эрзаца для столбцов, данные которых вы удалили. LastName1, LastName2, City1, City2 и т. Д. И т. Д. РЕДАКТИРОВАТЬ: у вас будет таблица для каждого очищенного столбца, например, Город, штат, Zip, FirstName, LastName, каждый из которых содержит отдельный набор действительных классифицированных значений в этом столбце и целочисленное значение. Так что «Джонс» может быть представлен в очищенном наборе данных как, скажем, LastName22, «Schenectady» как City343, «90210» как Zipcode716. Это даст вашим коллегам допустимые значения для работы (например, они будут иметь такое же количество разных городов, что и ваши реальные данные, только с анонимными именами), и взаимосвязи анонимизированных данных будут сохранены. EDIT2: если цель состоит в том, чтобы предоставьте своим коллегам санированные данные, которые все еще имеют статистическую значимость, тогда столбцы даты потребуют специальной обработки Например. если ваши коллеги должны делать статистические вычисления по возрасту человека, вы должны дать им что-то близкое к исходной дате, не настолько близкое, чтобы оно могло показывать, но не настолько, чтобы оно могло исказить анализ.

3 голосов
/ 21 февраля 2011

Похоже, проблема статистического контроля раскрытия.Посмотрите на пакет sdcMicro .

РЕДАКТИРОВАТЬ: Просто понял, что у вас есть немного другая проблема.Смысл статистического контроля раскрытия заключается в том, чтобы «повредить» данные, чтобы снизить риск раскрытия.«Повреждая» данные, вы теряете некоторую информацию - это цена, которую вы платите за уменьшенный риск разглашения.Ваши данные будут содержать меньше информации - поэтому ваш анализ может дать разные или меньшие результаты, чем анализ, выполненный на исходных данных.

Зависит от того, что вы собираетесь делать с вашими данными.

3 голосов
/ 21 февраля 2011

Один из способов сделать это - match.Сначала я создаю небольшой фрейм данных:

foo <- data.frame( person=c("Mickey","Donald","Daisy","Scrooge"), score=rnorm(4))
foo
   person       score
1  Mickey -0.07891709
2  Donald  0.88678481
3   Daisy  0.11697127
4 Scrooge  0.31863009

Затем я создаю ключ:

set.seed(100)
key <- as.character(foo$person[sample(1:nrow(foo))])

Вы должны явно сохранить этот ключ где-нибудь.Теперь я могу закодировать людей:

foo$person <- match(foo$person, key)
foo
  person      score
1      2  0.3186301
2      1 -0.5817907
3      4  0.7145327
4      3 -0.8252594

Если я хочу снова ввести имена людей, я могу индексировать key:

key[foo$person]
[1] "Mickey"  "Donald"  "Daisy"   "Scrooge"

или использовать tranform, это также работает, еслиданные изменяются до тех пор, пока идентификатор человека остается неизменным:

foo <-rbind(foo,foo[sample(1:4),],foo[sample(1:4,2),],foo)
foo
   person      score
1       2  0.3186301
2       1 -0.5817907
3       4  0.7145327
4       3 -0.8252594
21      1 -0.5817907
41      3 -0.8252594
31      4  0.7145327
15      2  0.3186301
32      4  0.7145327
16      2  0.3186301
11      2  0.3186301
12      1 -0.5817907
13      4  0.7145327
14      3 -0.8252594
transform(foo, person=key[person])
    person      score
1   Mickey  0.3186301
2   Donald -0.5817907
3    Daisy  0.7145327
4  Scrooge -0.8252594
21  Donald -0.5817907
41 Scrooge -0.8252594
31   Daisy  0.7145327
15  Mickey  0.3186301
32   Daisy  0.7145327
16  Mickey  0.3186301
11  Mickey  0.3186301
12  Donald -0.5817907
13   Daisy  0.7145327
14 Scrooge -0.8252594
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...