¿Qué es el k-anonimato?
El k-anonimato es una regla para compartir datos de personas: cada combinación de datos debe repetirse en al menos k personas. Importa porque quitar el nombre no basta para que alguien sea irreconocible.
Un centro de salud quiere compartir sus datos con un equipo de investigación. Ha quitado los nombres. Pero solo hay un paciente de 52 años en el barrio Sur, y allí todos saben quién es.
Al final de esta lección
Nota
Puedo reducir lo que un conjunto de datos revela de cada persona con el k-anonimato.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Dato identificador | un dato que señala a una persona | el nombre |
| Cuasi-identificador | un dato que, junto a otros, señala a una persona | edad y barrio |
| Reidentificar | descubrir de quién es una fila | |
| Grupo | las filas que comparten la misma combinación | |
| k-anonimato | cada grupo tiene al menos k filas | |
| Generalizar | dar un dato menos exacto | edad en tramos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Quitar el nombre no basta
Un nombre es un dato identificador. Quitarlo es el primer paso, pero no el último.
La edad, el barrio o el sexo no identifican a nadie por separado. Juntos sí pueden señalar a una sola persona: son cuasi-identificadores. Quien tenga otra lista, como un padrón, puede reidentificar la fila.
Ejemplo resuelto: doce pacientes sin nombre
| Edad | Barrio | Enfermedad |
|---|---|---|
| 23 | Norte | asma |
| 27 | Norte | gripe |
| 25 | Norte | asma |
| 34 | Norte | diabetes |
| 38 | Norte | gripe |
| 41 | Centro | asma |
| 45 | Centro | gripe |
| 43 | Centro | diabetes |
| 47 | Centro | asma |
| 52 | Sur | gripe |
| 29 | Sur | asma |
| 26 | Sur | diabetes |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuenta cuántos pacientes comparten edad y barrio
# Pacientes inventados: edad, barrio y enfermedad.
patients = [
[23, "Norte", "asma"], [27, "Norte", "gripe"], [25, "Norte", "asma"],
[34, "Norte", "diabetes"], [38, "Norte", "gripe"], [41, "Centro", "asma"],
[45, "Centro", "gripe"], [43, "Centro", "diabetes"], [47, "Centro", "asma"],
[52, "Sur", "gripe"], [29, "Sur", "asma"], [26, "Sur", "diabetes"],
]
sizes = {}
for patient in patients:
# Un grupo es una edad y un barrio.
group = str(patient[0]) + " " + patient[1]
if group in sizes:
sizes[group] = sizes[group] + 1
else:
sizes[group] = 1
alone = 0
for group in sizes:
if sizes[group] == 1:
alone = alone + 1
print("grupos:", len(sizes), "grupos con una sola persona:", alone)
# Cambia la edad a tramos: str(patient[0] // 10 * 10) en lugar de str(patient[0]).
# ¿Cuántos grupos quedan con una sola persona?
Cada grupo debe tener al menos k personas
El k-anonimato mira los grupos. Un grupo son las filas que comparten la misma combinación de cuasi-identificadores. Con k = 3, cada persona se confunde con al menos otras dos.
Si un grupo tiene menos de k filas, esa combinación es demasiado rara y señala a alguien.
Cuenta grupos pequeños con dos columnas
docker exec jupyter python3 -c "print(sum(1 for c in __import__('collections').Counter((r['month'], r['weekday']) for r in __import__('csv').DictReader(open('hires.csv'))).values() if c < 3))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Más columnas hacen grupos más pequeños
Cada fila de hires.csv es un día, no una persona. Aun así sirve para ver el efecto. Con el mes y el día de la semana hay 84 grupos y ninguno tiene menos de 3 días: sale 0.
Si añades el tiempo, los grupos se reparten en más trozos. El comando de abajo cuenta cuántos tienen menos de 3 días: 166.
Añade una tercera columna y cuenta de nuevo
docker exec jupyter python3 -c "print(sum(1 for c in __import__('collections').Counter((r['month'], r['weekday'], r['weather']) for r in __import__('csv').DictReader(open('hires.csv'))).values() if c < 3))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: grupos con la edad en tramos
| Grupo | Filas | ¿Cumple k = 3? |
|---|---|---|
| 20-29 y Norte | 3 | Sí |
| 30-39 y Norte | 2 | No |
| 40-49 y Centro | 4 | Sí |
| 20-29 y Sur | 2 | No |
| 50-59 y Sur | 1 | No |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Generalizar y suprimir hacen grupos más grandes
Para llegar a k hay dos herramientas. Generalizar es dar un dato menos exacto: la edad en tramos de diez años. Suprimir es quitar la fila o el dato que no encaja.
Las dos pierden detalle. Cuanto mayor es k, más protegidas están las personas y menos sirven los datos para investigar. Hay que elegir un equilibrio y explicarlo.
Un error muy común
Advertencia
Mucha gente cree que quitar el nombre anonimiza los datos. No es así: la edad, el barrio y otros datos juntos pueden señalar a una persona. Cuenta siempre los grupos antes de compartir.
El k-anonimato no lo protege todo
Un grupo grande puede revelar algo si todos son iguales en un dato. Si las 4 personas de un grupo tienen asma, quien sepa que alguien está en ese grupo sabe que tiene asma.
Por eso se mira también qué varía dentro de cada grupo, y se decide quién recibe los datos.