jueves, 8 de diciembre de 2011

Limpieza de Datos: El desafío constante

Seguro que esta situación os suena familiar (Si trabajáis con datos, claro) :
-¿ Y cuando encuentre un dato incorrecto, que hago?
-No, tranquilo, tenemos los datos súper controlados y en nuestro sistema los datos son consistentes.
-Ah! Que bien! Igualmente, en el caso improbable de que encuentre datos incorrectos... ¿Que hago?
-No... eso es imposible.
-Vale, entonces lanzo un error y paro el proceso de carga de datos porque algo grave está ocurriendo.
Corriendo grave riesgo de llegar a esta situación:


Lo cierto es que en todo proceso E.T.L., al ser un proceso donde se manipulan y analizan los datos de la organización,  salen a relucir todos los datos disonantes, inconexos, duplicados, etc.  Por lo que una de las partes de vital importancia en los procesos ETL es la que atañe a la limpieza de los datos. Y para ello nada mejor que llamar a un súper-héroe con un arsenal de armas de limpieza masiva: 





Bueno... no... aunque sólo por la pinta dan ganas.

Existe una serie de buenas practicas a tener en cuenta a la hora de mantener nuestro almacén limpio y ordenado:
  • Controlar, siempre que sea posible, los valores admitidos.
  • Validar los tipos de datos.
  • Al establecer las referencias, controlar le número de valores que van al "valor por defecto".
  • Cuando tratamos con datos personales o introducidos manualmente (Siempre que hay una intervención humana hay un riesgo de error del 99'9%) establecer políticas de búsquedas con el objetivo de eliminar duplicados. 
  • Validar los formatos de emails, direcciones, códigos postales, etc.

Aunque Kettle no es una herramienta de Data Cleansing  nos proporciona dos pasos para poder hacer esto.
  • Data Validator: Un paso que nos permitirá establecer reglas de validación sobre los campos tales como:
    • El tipo de dato
    • El tamaño del valor
    • Valores permitidos / excluidos
    • Rango de valores permitidos
    • La cadena debe empezar / terminar por ...
  • Calculadora :  Ese gran cajón desastre  que hace multitud de cosas y esa gran desconocida. Nos permite comparar cadenas mediante algoritmos de lógica difusa entre otras cosas.
  • Fuzzy match: Es un lookcup mediante algoritmos de lógica difusa también.

¿Que son y para qué sirven los algoritmos de lógica difusa?

Básicamente son algoritmos que nos permiten comparar cadenas en búsqueda de similitides. Quiero decir, imaginemos que tengo un listado de nombres y quiero determinar cuales de ellos probablemente sean la misma persona.

Por Ejemplo:
  • Pepito Grillo
  • Pepe Grillo
  • Menganito de tal
  • Eustaquio
  • Apolonia
  • Apolo
  • Anaximandro
  • Anaximenes
  • Ataulfo
En esta lista, Pepito Grillo y Pepe Grillo, si no son la misma persona cuanto menos habría que comprobarlo.  Apolonia y Apolo son personas distintas pero hay que reconocer que se parecen.
Los algoritmos de lógica difuta permiten hacer esas búsquedas en cadenas pera reducir la lista a los "parecidos razonables".


En kettle están implementados y disponibles:

  • Levenshtein y Damerau-Levenshtein: Calcula la distancia entre dos cadenas buscando el número de modificaciones que son necesarios para pasar de una cadena a la otra mediante inserciones, borrados y reemplazamiento de letras (Levenshtein) y cambios de posiciones (Damerau-Levenshtein). Por ejemplo la distancia entre Apolonia y Apolo es de 3 (1 borrar a, 2 borrar i, 3 borrar n).  La distancia entre Anaximandro y Anaximenes es de 4 (1 reemplazar a por una e, 2 reemplazar la d por una e, 3 reemplzar  la r por una s, 4 borrar la o final )
  • Needleman-Wunsch: Se basa en buscar similitudes entre cadenas. Se suele utilizar en el ámbito de la bioinformática para alinear secuencias de proteínas o de ácidos nucleico. Su medición es la penalización de diferencia y en el caso del ejemplo anterior de Apolonia y Apolo sería de -3.
  • Jaro y Jaro-Winkler: Sirve para calcular un índice de similitud entre dos cadenas. Ampliamente utilizado en el ámbito de la limpieza de datos ( deduplicación ). El índice de similitud se estipula entre 0 = No se parecen en nada y 1 = son iguales. Este algoritmo es especialmente útil y eficaz comparando cadenas cortas como nombres o direcciones. (Para los perezosos: Nuestro algoritmo por defecto.)
  • Similitud de pares de letras: Este está sólo disponible en el paso "Fuzzy Match". Este algoritmo corta las cadenas en pares de letras  y las compara.  En nuestro ejemplo {ap, po, ol, lo, on, ni, ia } y {ap, po, ol, lo}. Ahora la similitud se calcula dividiendo el numero de pares comunes {ap, po, ol, lo} mulitplicado por dos  entre  la suma de pares de ambas cadenas {ap, po, ol, lo, on, ni, ia } + {ap, po, ol, lo}. Por lo que nuestro ejemplo nos da:  (4*2) / 11 =  0.72
  • Metaphone, Double Metaphone.... se basan en como se lee... en ingles.


Buscamos duplicados en el ejemplo anterior?


Para ello lo que voy a hacer es comparar el listado consigo mismo....



El resultado de esto es tal que así:
 Ahora tan sólo debo poner un paso calculadora y  escoger el algoritmo que considere mas apropiado. En este caso Jaro-Winkler.



 Como puedes observar en la vista previa, ya tenemos todo lo que necesitamos. Como era de esperar los valores iguales tiene un valor de 1 y el resto van bajando. A partir de cuando se consideran parecidos razonables? Sospechosos de ser la misma persona? Pues es una cuestión de purismo, pero por encima de 0,8 empieza a haber muchas posibilidades.

Su añadimos unos cuantos filtros para quitar los que no nos interesan y los duplicados nos queda un proceso tal que así:



Como puedes ver en el resultado final, el algoritmo detecta que:

personaspersonas_duplicadasindice_probabilidad
Pepito Grill Pepe Grillo0,854941725
Pepe GrilloPepito Grillo0,854941725
ApoloniaApolo0,925
ApoloApolonia0,925
AnaximandroAnaximenes0,867272727
AnaximenesAnaximandro0,867272727


Y aquí es donde entra ya la inteligencia natural. Es decir, lo revisa un ser humano con bagaje cultural para saber que Pepito Grillo y Pepe Grillo son la misma persona. Que Apolonia y Apolo son una mujer y un hombre respectivamente ( o dioses.. pero distintos ) y que Anaximandro aunque amigo de  Anaximenes no son la misma persona.



Si quieres bajarte el ejemplo para probarlo tu mismo  puedes hacerlo.

Nota: El ejemplo y la base de este articulo está basado en el libro Pentaho Kettle Solutions que recomiendo leer por contenidos como el presente.

No hay comentarios:

Publicar un comentario