021 - Privacidad diferencial 1: el caso BigQuery
Cómo aplicar algoritmos de privacidad avanzados en una base de datos SQL con las herramientas de Google Cloud Platform
Vaya por delante que escribo estas líneas como ejercicio absoluto de laboratorio. Creo que la verdadera forma de aprender algo no es sólo practicándola, sino intentando enseñarla y ese es mi objetivo con este y con el resto de artículos que voy a dedicar a la saga de Privacidad Diferencial.
Ya sé que muchos os estaréis preguntando qué es esto de la privacidad diferencial y, sobre todo, para qué se puede utilizar. Empecemos por el valor de este sistema: el valor de esto, y de otras técnicas que iremos viendo durante el año, lo veo crecer de forma exponencial tal y como está la situación actual de privacidad: todos sabemos que las regulaciones son cada vez más estrictas, más amplias y permiten menos cosas. La respuesta del mercado hasta ahora ha sido siempre reactiva y, para mi gusto, poco funcional. Los banners de cookies ahora mismo son necesarios pero estoy convencido de que es algo con fecha de caducidad porque no gusta a ninguna de las partes implicadas. La gestión de todos esos consentimientos se hace cada vez más complicada y los recursos que las empresas quieren dedicar a esto son limitados (con razón), lo cual choca con el propio proceso que hay que seguir.
Podría seguir, pero creo que la idea queda clara: la ruta que debemos tomar a nivel privacidad de datos va por otro lado. Al menos así lo veo yo. Y aquí es donde entran técnicas como la mencionada.
Porque la privacidad diferencial se basa en la adición de "ruido" a los resultados de una consulta de datos, de modo que no se pueda identificar a un individuo específico, ni siquiera con información externa. El objetivo es asegurar que la presencia o ausencia de un individuo en el conjunto de datos no afecte significativamente los resultados de la consulta. Por ponerlo simple: es como si pintara los datos cual joker para que no se reconozca la cara. Para entender mejor lo que protege y no protege la privacidad diferencial cojo prestado este ejemplo de un paper que lo explica todo maravillosamente:
Alice y Bob son profesores de la Universidad Estatal. Ambos tienen acceso a una base de datos que contiene información personal sobre los estudiantes de la universidad, incluida información relacionada con la ayuda financiera que recibe cada estudiante. Como contiene información personal, el acceso a la base de datos está restringido. Para obtener acceso, Alice y Bob tuvieron que demostrar que planeaban seguir los protocolos de la universidad para el manejo de datos personales, recibiendo formación sobre confidencialidad y firmando acuerdos de uso de datos que prohibían su uso y divulgación de la información personal obtenida de la base de datos.
En marzo, Alice publica un artículo basado en la información de esta base de datos y escribe que «la actual clase de primer año de la Universidad Estatal está formada por 3.005 estudiantes, 202 de los cuales proceden de familias que ganan más de 1.000.000 de dólares al año». Alice razona que, como la cifra de su artículo es una media tomada sobre 3.005 personas, no quedará expuesta la información personal de ningún individuo. Al mes siguiente, Bob publica otro artículo con estas cifras: «201 familias de 3.004 estudiantes de primer año de la Universidad Estatal tienen ingresos superiores a 1.000.000 de dólares anuales». Ni Alice ni Bob son conscientes de que ambos han publicado información similar.
Eve, una estudiante inteligente, lee ambos artículos y se da cuenta de la discrepancia. De la información publicada, Eve deduce que entre marzo y abril un estudiante de primer año se dio de baja de la Universidad Estatal y que los padres del estudiante ganan más de 1.000.000 de dólares al año. Eve pregunta y averigua que un estudiante llamado John se dio de baja a finales de marzo. Eve informa a sus compañeros de que los padres de John ganan más de un millón de dólares al año.
John se entera y se enfada porque sus antiguos compañeros se han enterado de que sus padres ganan más de 1.000.000 de dólares al año. Se queja a la universidad y piden explicaciones a Alice y Bob. En su defensa, Alice y Bob argumentan que sólo publicaron información agregada sobre una gran población y que, por tanto, no identifican a ningún individuo.
Supongamos que, en el ejemplo anterior, Alice y Bob deciden añadir ruido aleatorio a las cifras que publican en sus artículos. Para el número de estudiantes de primer año que proceden de familias con una renta familiar superior a 1.000.000 de dólares, Alice publica un recuento de 204 para el mes de marzo, y Bob publica un recuento de 199 para el mes de abril. La publicación de estas cifras ruidosas habría evitado que Eve concluyera que un estudiante se dio de baja de la universidad en marzo y que este estudiante procedía de una familia con unos ingresos familiares superiores a 1.000.000 de dólares, reduciendo así el riesgo de que la información personal de John pudiera ser descubierta basándose en estas publicaciones.
Lo que vamos a ver hoy es cómo utilizar algoritmos muy potentes que realizan este tipo de tarea (smartNoise) con datos que ya tenemos en una base de datos relacional (bigQuery) y qué ocurre con esos datos cuando les pasamos la privacidad diferencial por encima.
¿Qué es SmartNoise y cómo funciona?
Ahora que hemos entendido el concepto general de la privacidad diferencial, es hora de conocer una de las herramientas más poderosas para implementarla: SmartNoise. Esta es una librería desarrollada por el proyecto OpenDP que facilita la integración de la privacidad diferencial en bases de datos SQL como BigQuery.
¿Qué hace SmartNoise?
SmartNoise permite aplicar privacidad diferencial en las consultas de bases de datos mediante la adición de ruido controlado. Este ruido se ajusta según los parámetros de privacidad establecidos (principalmente epsilon (ε) y delta (δ)). El resultado es una protección robusta de los datos individuales sin comprometer la capacidad de realizar análisis útiles. SmartNoise se puede integrar en plataformas como BigQuery, PostgreSQL, y más.
Flujo de trabajo
Ejecutar consulta SQL: Primero, realizas una consulta SQL normal sobre tu base de datos.
Definir privacidad: Después, defines los parámetros de privacidad como epsilon (ε) y delta (δ) que controlarán el ruido que se añade a los datos.
Aplicar ruido: SmartNoise aplica el ruido a los resultados de la consulta para garantizar la privacidad diferencial.
Obtener resultados privados: Finalmente, obtienes los resultados, que han sido alterados de manera que preservan la utilidad de los datos mientras protegen la privacidad de los individuos.
Es importante aclarar que SmartNoise no elimina datos ni los anonimiza por completo, sino que los distorsiona de manera controlada. Esta distorsión asegura que los análisis y patrones a nivel agregado se mantengan intactos mientras que los datos de un individuo específico permanecen protegidos.
Epsilon y Delta: pintando con brocha fina
Uno de los aspectos más técnicos de la privacidad diferencial es la configuración de los parámetros epsilon (ε) y delta (δ). Estos parámetros permiten ajustar el nivel de privacidad y la precisión de los resultados.
Epsilon (ε):
El valor de epsilon es el que más directamente influye en el nivel de privacidad. A medida que epsilon disminuye, el nivel de ruido aplicado a los resultados aumenta, lo que mejora la privacidad pero reduce la precisión de los resultados.
Un valor pequeño de epsilon (por ejemplo, 0.01) implica una mayor privacidad, pero los resultados agregados pueden perder algo de precisión.
Un valor mayor de epsilon (por ejemplo, 10) reduce el ruido y mejora la precisión, pero con una menor protección de la privacidad.
Delta (δ):
El valor de delta es más técnico y está relacionado con la probabilidad de que un caso individual no cumpla con la privacidad esperada. Generalmente, delta se ajusta a valores muy bajos (como 10^-5 o 10^-6) para garantizar que la privacidad no se vea comprometida en casi ningún caso.
En resumen:
epsilon controla la precisión frente a la privacidad.
delta es el margen que permite pequeños compromisos de privacidad en situaciones excepcionales.
¿Por qué utilizar privacidad diferencial en BigQuery?
BigQuery es una plataforma de análisis de grandes volúmenes de datos, ampliamente utilizada por su capacidad para procesar datos a gran escala con rapidez y eficiencia. No obstante, cuando los datos contienen información sensible, como registros de comportamiento de usuarios o datos financieros, una buena práctica sería aplicar medidas adicional de privacidad para proteger este tipo de datos.
Ventajas de usar privacidad diferencial en BigQuery
Escalabilidad: BigQuery está diseñado para manejar grandes cantidades de datos y ejecutar consultas rápidamente. Implementar privacidad diferencial en este entorno permite que las organizaciones analicen grandes volúmenes de datos sin exponer la identidad de los individuos.
Compatibilidad con SQL: BigQuery utiliza SQL como su lenguaje de consulta principal, lo que facilita la integración de herramientas como SmartNoise. Los usuarios pueden seguir utilizando las consultas SQL tradicionales mientras que se garantiza que los resultados se ajusten a los requisitos de privacidad diferencial.
Cumplimiento de regulaciones: A medida que las leyes de privacidad de datos como el GDPR se hacen más estrictas, las empresas deben encontrar formas de analizar datos sin comprometer la privacidad. La privacidad diferencial ofrece una solución viable al permitir el análisis de grandes volúmenes de datos sin revelar información sensible sobre individuos.
Casos de uso potenciales para privacidad diferencial en BigQuery
Análisis de comportamiento de usuario: Plataformas de e-commerce o redes sociales pueden utilizar BigQuery para analizar las interacciones de los usuarios, como productos comprados o páginas visitadas, sin revelar la identidad de los individuos.
Análisis financiero: Instituciones bancarias pueden analizar transacciones y patrones de compra sin revelar información sensible de sus clientes, protegiendo así la privacidad conforme a las regulaciones locales e internacionales.
Estudios de mercado y encuestas: Al realizar encuestas o análisis de mercados, las organizaciones pueden utilizar BigQuery con privacidad diferencial para obtener insights sobre tendencias generales, sin comprometer los datos de los participantes.
Análisis de datos médicos: En el ámbito de la salud, BigQuery puede utilizarse para analizar grandes volúmenes de datos de pacientes sin comprometer su privacidad, asegurando que la identidad de los pacientes no sea expuesta.
Implementación de privacidad diferencial en BigQuery con Google Cloud Functions
Para llevar a cabo la implementación de privacidad diferencial en BigQuery, utilizaremos Google Cloud Functions, una plataforma serverless que permite ejecutar código sin necesidad de gestionar la infraestructura. En este caso, usaremos Cloud Functions para crear un endpoint API que reciba una consulta, aplique privacidad diferencial usando SmartNoise, y devuelva los resultados privados.
Preparación del entorno
Primero, debemos configurar la Cloud Function de forma adecuada para que pueda recoger las llamadas que vamos a realizar, para ello usaremos una configuración como esta:
Por otro lado, cuando ya tengamos esto configurado, elegimos python como idioma de la function y pasamos al archivo requirements. Debemos asegurar que nuestra GCF tiene todo lo necesario para trabajar con el resto del script. Por tanto, añadiremos un archivo requirements.txt con los siguientes paquetes:
functions-framework==3.*
google-cloud-bigquery
smartnoise-sql
flask==2.3.3
pandas
db-dtypes
Código de la Cloud Function
A continuación, te presento un ejemplo de código que puedes usar en la Google Cloud Function para aplicar privacidad diferencial a una consulta de BigQuery:
import json
import logging
import snsql
from google.cloud import bigquery
from snsql.metadata import Metadata
from snsql import Privacy
from flask import Request
def apply_privacy(request: Request):
try:
# Parse request
request_json = request.get_json(silent=True)
query = request_json.get("query")
if not query:
return "Query is required", 400
# Initialize BigQuery client
client = bigquery.Client()
# Define metadata
metadata = {
"datasets": {
"NOMBRE DE TU DATASET EN BIGQUERY": {
"NOMBRE DE TU TABLA EN BIGQUERY": {
"row_privacy": True,
"COLUMNA A CONSULTAR": {"type": "string"},
"COLUMNA A CONSULTAR": {"type": "string"},
"COLUMNA A CONSULTAR": {"type": "string"},
"COLUMNA A CONSULTAR": {"type": "int", "lower": 0, "upper": 100}
}
}
}
}
# Privacy parameters
privacy = Privacy(epsilon=1.0, delta=0.01)
# SmartNoise connection
meta = Metadata.from_dict(metadata)
reader = snsql.from_connection(client, privacy=privacy, metadata=meta)
# Execute query
private_result = reader.execute(query)
# Log private result to see its structure
print("Private Result:", private_result)
# Convert to dictionary (private_result is a list of lists)
# The first list contains the column names
columns = private_result[0] # First row is the header
rows_to_insert = [
dict(zip(columns, row)) # Create a dictionary for each subsequent row
for row in private_result[1:] # Skip the first row (header)
]
# Define destination table
table_id = "TU ID DE TABLA DESTINO, TODO EL PATH DE TU PROYECTO"
# Write results to BigQuery
errors = client.insert_rows_json(table_id, rows_to_insert)
if errors:
raise RuntimeError(f"BigQuery Insert Errors: {errors}")
# Return success with private data
return json.dumps({
"status": "success",
"result": rows_to_insert
}), 200
except Exception as e:
logging.exception("Error during query execution")
return json.dumps({
"status": "error",
"message": str(e)
}), 500
En este código, el flujo es el siguiente:
Se recibe una solicitud POST con una consulta SQL.
Se configura el cliente BigQuery y se define la metadata del dataset.
Se aplican los parámetros de privacidad epsilon y delta para garantizar la privacidad diferencial.
Se ejecuta la consulta en BigQuery, pero los resultados se alteran utilizando SmartNoise para aplicar privacidad diferencial.
Finalmente, la función devuelve los resultados privados en una tabla nueva de BigQuery, previamente generada
La solicitud POST para que se ejecute la función, se aplique la privacidad diferencial y se genera una nueva tabla en BigQuery con los resultados sería algo parecido a esto:
curl -X POST URL DE TU GOOGLE CLOUD FUNCTION \
-H "Content-Type: application/json" \
-d '{
"query": "SELECT artist_name, song_name, album_name, AVG(popularity) AS avg_popularity FROM spotify.top50_countries GROUP BY artist_name, song_name, album_name ORDER BY artist_name LIMIT 10000"
}'
Es importante que la query que lancemos en este POST tenga los mismos campos que hemos definido en Metadata o no funcionara la consulta, ni el algoritmo de smartNoise. Aquí estoy utilizando una tabla con datos de Spotify que tengo en BigQuery, de ahí los campos que veis en la llamada.
Comparación de datos: originales vs privados
Después de ejecutar la función de privacidad diferencial, es necesario comparar los resultados originales con los resultados privados generados. Para hacer esto, utilizamos una consulta SQL que une ambos conjuntos de datos (el original y el privado) y calcula la diferencia entre los valores.
Consulta SQL para comparar los datos
Aquí os dejo mi consulta SQL (vosotros tendréis que adaptarla a vuestras propias tablas y conjuntos de datos) que permite comparar los resultados originales con los datos procesados con privacidad diferencial. La consulta compara las medias de la popularidad (avg_popularity) entre los dos conjuntos de datos y calcula la diferencia:
SELECT
original.artist_name,
original.song_name,
original.album_name,
original.avg_popularity AS original_popularity,
private.avg_popularity AS private_popularity,
(original.avg_popularity - private.avg_popularity) AS difference
FROM
(
SELECT artist_name, song_name, album_name, AVG(popularity) AS avg_popularity
FROM `gtm-p226djk-mjjiy.spotify.top50_countries`
GROUP BY artist_name, song_name, album_name
ORDER BY artist_name
LIMIT 10000 -- Mismo límite que usaste para los datos privados
) AS original
LEFT JOIN
`gtm-p226djk-mjjiy.spotify.top_private` AS private
ON
original.artist_name = private.artist_name
AND original.song_name = private.song_name
AND original.album_name = private.album_name
WHERE
private.avg_popularity IS NOT NULL
ORDER BY original.artist_name;
Esta consulta realiza las siguientes operaciones:
Selecciona los resultados de la tabla original top50_countries.
Compara estos resultados con la tabla top_private donde se encuentran los resultados de la consulta procesada con privacidad diferencial.
Calcula la diferencia entre los valores originales y los privados (es decir, la diferencia entre las medias de popularidad).
Análisis de resultados
La consulta anterior te dará dos conjuntos de datos:
original_popularity: La popularidad promedio de cada canción en la tabla original.
private_popularity: La popularidad promedio después de aplicar privacidad diferencial.
De esta forma, podrás ver cómo varía la información debido a la privacidad diferencial. La diferencia calculada te dará una métrica sobre cuánto cambia la popularidad al aplicar privacidad diferencial. Esta diferencia debería ser pequeña si la privacidad está correctamente balanceada, pero suficientemente grande como para proteger la identidad de los individuos en los datos.
Conclusión
La combinación de privacidad diferencial y herramientas como BigQuery y Google Cloud Functions ofrece un enfoque innovador para manejar datos sensibles de manera eficiente y que creo que va a ser el futuro para cumplir con las regulaciones de privacidad. Gracias a SmartNoise, podemos asegurar la privacidad de los individuos sin perder la utilidad de los datos a nivel de análisis. Este proceso es fundamental en entornos donde el análisis de grandes volúmenes de datos es crucial, pero la privacidad no puede ser comprometida.
En este post, hemos cubierto la implementación de la privacidad diferencial con SmartNoise, el ajuste de parámetros como epsilon y delta, y cómo utilizar Cloud Functions para integrar todo el proceso con BigQuery. Además, te hemos mostrado cómo realizar una comparativa de datos antes y después de aplicar la privacidad diferencial.
En los próximos posts, exploraremos otros entornos y cómo aplicar la privacidad diferencial de manera similar, como en Firestore y Cloud Storage, para proteger datos sensibles sin comprometer su valor analítico.