¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Anonimizar datos con k-anonimato

Después de esta lección: Puedo reducir lo que un conjunto de datos revela de cada persona con el k-anonimato.

Lección de 65 min2 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿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

PalabraQué significaEjemplo
Dato identificadorun dato que señala a una personael nombre
Cuasi-identificadorun dato que, junto a otros, señala a una personaedad y barrio
Reidentificardescubrir de quién es una fila
Grupolas filas que comparten la misma combinación
k-anonimatocada grupo tiene al menos k filas
Generalizardar un dato menos exactoedad 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

EdadBarrioEnfermedad
23Norteasma
27Nortegripe
25Norteasma
34Nortediabetes
38Nortegripe
41Centroasma
45Centrogripe
43Centrodiabetes
47Centroasma
52Surgripe
29Surasma
26Surdiabetes

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Cuenta cuántos pacientes comparten edad y barrio

Código: python
# 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

Comando
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

Comando
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

GrupoFilas¿Cumple k = 3?
20-29 y Norte3Sí
30-39 y Norte2No
40-49 y Centro4Sí
20-29 y Sur2No
50-59 y Sur1No

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.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.