Parte II · Preparación

6 · PII y anonimización

Aunque estos datos son sintéticos, se tratan como si fueran reales. El nombre, el correo y el teléfono identifican directamente a una persona. La fecha, la provincia y el producto no lo hacen por separado, pero combinados pueden identificarla. Por eso se generan dos ficheros con usos distintos y la privacidad se mide sobre el que se publica.

Cómo se generan los dos ficheros

Los genera el script 04_anonimizacion.py. Su entrada es el fichero limpio que deja la limpieza, con las 20.000 ventas y todos los datos personales en claro. Ese fichero limpio se queda en la máquina de quien hace el análisis. El script lo lee una vez y escribe los dos ficheros de salida en la misma ejecución.

  1. Fichero interno. Copia las ventas, retira el nombre y sustituye cada persona por un código del tipo CLI-00001. Del correo deja solo la primera letra y el dominio, y del teléfono las dos primeras cifras y las dos últimas. El resto de columnas se conserva tal cual.
  2. Fichero público. De las mismas ventas se queda solo con año, provincia, satisfacción y marca de anomalía. Después cuenta cuántas ventas comparten cada combinación de año y provincia y quita las que estén en un grupo de menos de 5. Aquí no hubo que quitar ninguna, así que el fichero conserva las 20.000 filas.
  3. Medida de la privacidad. El script vuelve a leer de disco el fichero público recién escrito y calcula sobre él la k-anonimidad y la l-diversidad de la tabla de abajo. Se mide lo que se ha escrito, para que un fallo al guardar no quede oculto.

Como el pseudónimo se baraja con una semilla fija, ejecutar el script otra vez produce los mismos códigos y los mismos dos ficheros.

Interno · techsoluciones_ventas_anon.csv

Sirve para el análisis. No lleva el nombre, el correo y el teléfono van enmascarados y cada persona tiene un pseudónimo aleatorio. Hay 20.000 personas distintas para 20.000 ventas, porque ninguna combinación de nombre y teléfono se repite. Conserva la fecha, el producto y el importe. Por eso no se publica.

Público · techsoluciones_ventas_publico.csv

Sirve para compartir y contiene año, provincia, satisfacción y marca de anomalía. Las cifras de venta se publican agregadas en el cuadro de mando y nunca venta a venta.

Ver el código de anonimización
# Pseudónimo aleatorio por PERSONA: nombre + teléfono
# (el email lo comparten varias personas y el nombre tiene homónimos)
clave = df["nombre_completo"] + "|" + df["telefono"]
personas = list(dict.fromkeys(clave))
numeros = np.random.default_rng(42).permutation(len(personas))
df["cliente_id"] = clave.map({p: f"CLI-{numeros[i]:05d}" for i, p in enumerate(personas)})

# Fichero público: solo año, provincia, satisfacción y la marca de anomalía
qi = ["anio", "reg"]
tam = df.groupby(qi)["id_venta"].transform("size")
publico = df.loc[tam >= 5, qi + ["satisfaccion", "anomalia"]]   # suprime grupos pequeños
k = pd.read_csv("..._publico.csv").groupby(qi).size().min()      # medido sobre lo publicado
Por qué el pseudónimo va por nombre y teléfono y es aleatorio
Varias personas comparten correo (se mide aquí) y los nombres que aparecen dos veces llevan teléfonos distintos, así que son personas distintas con el mismo nombre. Un pseudónimo por correo o por nombre juntaría a varias personas bajo el mismo código. Además, numerar por orden de aparición permitiría a quien tenga el fichero original deducir quién es quién. Barajar los números con una semilla fija lo impide y mantiene el resultado reproducible.

Cuánto protege el fichero público

La k-anonimidad es el tamaño del grupo más pequeño que comparte los mismos cuasi-identificadores: con k = 1 hay una persona que no se confunde con nadie. La l-diversidad es cuántos valores distintos del dato sensible, aquí la satisfacción, hay en el grupo que menos tiene. Con l = 1, saber a qué grupo pertenece alguien revela su dato sensible. La tabla mide el fichero publicado y lo que pasaría si llevara más columnas.

k-anonimidad y l-diversidad según las columnas publicadas
Columnas que identifican k mínima l mínima Ventas únicas Ventas en grupos < 5
año + provincia (lo publicado) 10 5 0 0 %
+ categoría (no se publica) 4 2 0 0,06 %
+ categoría + producto (no se publica) 1 · 169 17,75 %
+ categoría + producto + cantidad (no se publica) 1 · 5.522 90,89 %
Qué protege el fichero público y qué cuesta

El fichero público cumple k = 10 y l = 5 con año y provincia, sin suprimir ninguna venta. Para llegar ahí se retiró más de lo que parece necesario: la categoría baja k a 4 y el producto la baja a 1, con 169 ventas solas en su grupo.

El producto no se puede esconder dejando el precio o el importe, porque cada producto tiene un único precio de catálogo y cualquiera de esas columnas lo revela. Por eso el fichero público no lleva ninguna. Cada columna que se quita aumenta la privacidad y reduce la utilidad del fichero. La tabla mide ese intercambio.

Con el dato limpio y protegido empieza el análisis. Siguiente: la estadística descriptiva →