-¿ 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
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:
personas | personas_duplicadas | indice_probabilidad |
Pepito Grill | Pepe Grillo | 0,854941725 |
Pepe Grillo | Pepito Grillo | 0,854941725 |
Apolonia | Apolo | 0,925 |
Apolo | Apolonia | 0,925 |
Anaximandro | Anaximenes | 0,867272727 |
Anaximenes | Anaximandro | 0,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