Duplicados en Openrefine

Seek and destroy duplicates

Publicado por Nicolas Bohorquez en - Actualizado / Categoría : Tools

Serie: openrefine 
Etiquetas: data science openrefine  

Un asunto importante en la limpieza de datos es poder encontrar los registros duplicados, muchas veces al sumar fuentes de datos heterogeneas es posible que se encuentren los mismos datos y eso desvie el análisis de manera inconveniente, en OpenRefine es muy sencillo encontrar y eliminarlos.

Normalizar los datos

Con una simple inspección de la primer página de registros notamos que las columnas contienen datos en mayúsculas/minúsculas para normalizarlas usamos las transformaciones comunes de celdas (clic en la columna->Edit cells->Common transforms->To uppercase) en todas las columnas de tipo texto.

Ahora bien, es posible que haya datos muy similares por columna pero no iguales, para encontrarlos usamos las funciones integradas de OpenRefine para hacer clusters a partir de funciones de comparación de cadenas de texto[ref]Para conocer más se puede consultar el proyecto Simmetrics en Github[/ref] como keycollision o Levenshtein:

La idea es que se usa un algoritmo para encontrar valores que posiblemente sean iguales pero por alguna razón no aparecen asi en los datos, en nuestro caso con Keycollision / fingerprint encontramos más de 14000 posibles clusters, sin embargo no siempre son acertadas las propuestas asi que vamos a refinar la busqueda usando el panel derecho en la segunda fila para mostrar únicamente los clusters encontrados con más de 100 registros, para obtener 71 posibles clusters, revisamos cada uno y seleccionamos para normalizar los que tengan más sentido (S.N. transformarlo en N/A, '-' transformarlo en 'N/A', etc):

Este procedimiento podemos efectuarlo de forma iterativa hasta lograr una normalización aceptable de los datos en la columna, del mismo modo podemos hacerlo sobre las otras columnas para dejar los clusters mas apropiados y luego encontrar los duplicados. (Aquí es donde la mayor parte del tiempo se invierte).

Otra forma de filtrar los datos es buscar las agrupaciones que no corresponden con su tipo de datos, por ejemplo, en la columna valorcontrato podemos aplicar un Facet de tipo numerico para arreglar los registros que no se encuentran con el formato apropiado. También podemos convertir la columna fechafirmacontrato en un tipo de datos Date (clic en columna->Edit cells->Common transforms->To date) para luego aplicar un facet de tipo timeline para detectar los que debemos modificar.

Para acelerar nuestro ejemplo optamos por eliminar dichos registros ( no es la práctica recomendada ), con lo cual obtenemos un dataset de 625947 registros a los cuales vamos a quitarles los duplicados.

Encontrar los duplicados

Los duplicados pueden referirse a valores únicos de una columna, por ejemplo buscar los id únicos de un dataset, estamos tentados a aplicar la solución que se describe en la wiki de OpenRefine para eliminar los duplicados:

  • Order de manera permanente los datos de la columna por la cual queremos eliminar los duplicados
  • Hacer un blank down (clic en la columna->Edit cells->Blank down) para dejar como nulos los valores repetidos en la columna
  • Agrupar con un Facet nulo (clic en la columna->Facet-Customized facets->Facet by blank) y seleccionar los nulos en el panel izquierdo
  • Eliminar las filas

Sin embargo, al conocer el dominio del problema, sabemos que pueden hacerse múltiples contratos para varios proveedores en el mismo proceso de contratación, así que para nuestro ejemplo vamos a buscar los registros que comparten:

  • numerodecontrato
  • numerodeproceso
  • detalleobjeto
  • razonsocialcontratista

Para ello seleccionamos en cada columna un Facet de tipo duplicate (clic en la columna->Facet-Customized facets->Duplicates facet) y en la panel izquierdo hacemos clic en true para cada uno de los grupos. De esa manera podemos borrar los registros de los contratos completamente duplicados, después de lo cual tenemos 589866 registros para responder algunas preguntas.

Entre otras, ¿Como se distribuye en el tiempo la firma de los contratos?, ¿Cómo se distribuyen geográficamente los contratos? para responder estas preguntas debemos separar la columna deptomunicejecucion y fechafirmacontrato, lo cual veremos en la próxima entrega de la serie.

Este articulo es el número 3 en la serie "openrefine", otros artículos:

  1. Openrefine
  2. Filtros y grupos en Openrefine
  3. Duplicados en Openrefine
  4. Separar datos en Openrefine
Nube de Etiquetas

Me siento con suerte

Suscribase a las actualizaciones