JlA 9×72 HyperLogLog para contar únicos con poca memoria

Contar visitantes únicos sin cargar el servidor es posible gracias a técnicas probabilísticas. En pocas líneas veremos cómo la estimación de cardinalidad nos permite medir audiencias con memoria mínima.

El conteo exacto necesita guardar cada identificador, como IP o cookie. Eso ocupa mucha memoria y se vuelve caro cuando el tráfico crece. En vez de almacenar listas, guardamos huellas comprimidas que conservan la señal necesaria para deduplicar. Aceptamos un error controlado a cambio de eficiencia, ideal para analítica web, bases de datos y sistemas de registro en tiempo real.

La idea base es sencilla y un poco mágica. Pasamos cada visita por una función hash que convierte la entrada en una cadena binaria impredecible. Miramos cuántos ceros consecutivos hay al principio. Cuantos más ceros de salida, más raro fue el evento. Ese nivel de rareza se relaciona con la cantidad de distintos que hemos visto. Por eso almacenamos, para cada vista, el mayor número de ceros iniciales observado. Aunque algunas variantes guardan el mínimo hash, la versión moderna se queda con el máximo número de ceros por registro.

Una sola vista es ruidosa. Para bajar la varianza, combinamos muchas vistas en paralelo. Podemos hacerlo con varias funciones hash o, más habitual, con una sola función y dividiendo las entradas en muchos registros usando los primeros bits como índice. HyperLogLog aplica esta idea a gran escala, incluye correcciones de sesgo y ofrece memoria que crece con el logaritmo del logaritmo de ene. Traducido a nuestro día a día, podemos medir millones de usuarios consumiendo unos pocos kilobytes.

Qué ganamos y qué perdemos. Ganamos velocidad, espacio pequeño y facilidad para combinar conteos de varios servidores haciendo una unión por registros. Perdemos exactitud puntual. El error relativo típico es bajo y predecible, y mejora al usar más registros. Aun así, para cardinalidades muy pequeñas conviene un contador exacto, y para datos sesgados debemos usar una buena función hash y activar las correcciones de baja y alta cardinalidad.

Cómo lo pondríamos en marcha. Uno, elegimos una función hash rápida y uniforme. Dos, reservamos un conjunto de registros y los inicializamos a cero. Tres, por cada visita calculamos el índice y actualizamos en su registro el máximo de ceros iniciales. Cuatro, al cerrar el periodo aplicamos la media armónica de los registros y las correcciones recomendadas, y obtenemos la estimación. Cinco, registramos métricas de salud como colisiones inusuales y distribución de índices para detectar problemas.

Propuesta lúdica rápida. Durante una semana, repartimos un juego de tarjetas con números binarios falsos y retos de contar ceros a la izquierda. Cada día, quien acierte más rarezas actualiza un tablero y comparamos nuestra predicción con el valor del sketch real. Premio simbólico para la mejor mejora de error.

Si nos apetece seguir aprendiendo con ideas prácticas y divertidas sobre datos, visitemos JeiJoLand.