Taller de cartografía de datos

Creado por
Sergio Sorín / @pollatos
Sebastián Scarano / @opensas

Primer encuentro


Introducción a Datos Abiertos y CartoDB



Agenda:

  • Gobierno Abierto y Datos Abiertos
  • Diferencia entre dato e información
  • Datasets, metadatos, portales de datos
  • APIs - Application programming interface
  • Sistemas de Información Geográficas (GIS)
  • Sistemas de coordenadas
  • Formatos más comunes
  • Visualizaciones de ejemplos
  • Primeros pasos con CartoDB

¿Qué es una política de
gobierno abierto?

Doctrina política que sostiene que los temas de gobierno y administración pública deben ser abiertos a todos los niveles posibles.


Se basa en tres ejes:

  • Transparencia
  • Colaboración
  • Participación

¿Qué es una política de datos abiertos?

Es una parte de una estrategia de Gobierno Abierto.


Definición: el conocimiento es abierto si cualquiera es libre de:

  • acceder a él
  • usarlo
  • modificarlo
  • y compartirlo
  • sujeto, a lo sumo, a las medidas que preserven su autoría y apertura.


Esta definición está basada en el concepto de software libre.

Diferencia entre
dato e información

El dato debe estar preparado para ser procesado.


  • Sin procesar, en estado "crudo"
  • No son reportes ni listados
  • Libremente disponible
  • Usando formatos estándares, documentados y libres
  • Lo más próximo al dato original
  • Para ser combinado con otras fuentes de datos

Portales de datos


  • Son plataformas digitales que sirven para almacenar, compartir, conectar y visualizar bases de datos.
  • El estándar de facto: CKAN
  • Es software libre y cuenta con una gran comunidad de usuarios en todo el mundo
  • Desarrollado originalmente para el portal de datos del Reino Unido
  • Implementado luego en todo el mundo
  • Como la Ciudad de Buenos Aires, el Gobierno Nacional, el PAMI, la provincia de Misiones, Brasil y demás lugares
  • Existen otras opciones comerciales, como las utilizadas por el gobierno de Chile, el portal de LNData el gobierno de EEUU entre otros.

Datasets


Los datasets, o conjuntos de datos, agrupan uno o más recursos de datos así como la documentación que les da contexto.


Los recursos son archivos que contienen:

  • Información tabular (csv, ods, excel)
  • Información con otro tipo de estructura (json, xml)
  • Información geográfica (shape files, geojson, csv + geo, kml)
  • Documentos no estructurados, que ayuden a comprender y utilizar los demás recursos. (pdf, txt, md)

Metadatos


Los datasets, también tienen asociados un conjunto de metadatos que agregan información acerca del dataset.

Algunos ejemplos de metadatos más habituales:

  • Título
  • Tags o etiquetas
  • Organización
  • Autor
  • Responsable
  • Frecuencia de actualización
  • Granularidad
  • Última actualización

APIs - Application programming interface


  • Las interfaces para programación de aplicaciones están pensadas para que las aplicaciones se comuniquen entre sí.
  • En vez de descargar un dataset para luego procesarlo, la aplicación utiliza la API para consultar o modificar la información.
  • Se utiliza para acceder en tiempo real a información dinámica, por ejemplo el estado del tráfico, el timeline de twitter, el saldo de mi cuenta bancaria.
  • O cuando no tiene sentido, o resulta imposible, descargar toda la información, por ejemplo: Wikipedia, OpenStreetMap, YouTube.

Ejemplos de aplicaciones y visualizaciones


Sistemas de Información geográfica (GIS)

Sistemas de información que permiten crear, almacenar, editar, analizar y visualizar información geográficamente referenciada.

En un sentido más genérico se trata de herramientas que permiten crear consultas interactivas, analizar información espacial, editar datos y mapas, y visualizar los resultados de estas operaciones.

Un ejemplo famoso

En 1854 el pionero de la epidemiología, el Dr. John Snow cartografió la incidencia de los casos de cólera en el distrito de Soho en Londres. Utilizando métodos cartográficos, no solo representaba la realidad, sino que por primera vez analizaba conjuntos de fenómenos geográficos dependientes.

El mapa de John Snow

¿Cómo se representa la información geográfica?


Coordenadas geográficas: sistema de referencia que utiliza dos coordenadas angulares, latitud (Norte y Sur) y longitud (Este y Oeste) medidas desde el centro de la Tierra. Forman parte de un sistema de coordenadas geográficas que incluye un datum, meridiano principal y unidad angular.


Coordenadas proyectadas: sistema de representación que establece una relación entre los puntos de la superficie curva de la tierra (coordenadas geográficas) y los de una superficie plana (mapa). Los puntos se identifican por coordenadas cartesianas (x e y) que se obtienen matemáticamente a partir de las coordenadas geográficas (latitud y longitud).


El sistema de coordenadas más común es el WGS 84

Formatos de archivos
con información geográfica




Tip: Para jugar interactivamente con estos formatos: geojson.io

Ejemplos: Mapas electorales

Ejemplos: Aplicaciones

Ejemplos: la dimensión temporal

Otros ejemplos

Ejercicio 1

  1. Ir al sitio de CartoDB y crear una nueva cuenta de usuario (Sign up).
  2. Descargar el datasets de Cajeros automáticos (csv) del portal de datos de la Ciudad de Buenos Aires
  3. Importarlos a CartoDB
  4. Crear un mapa de tipo Cluster
  5. Crear un mapa de tipo Bubble según la cantidad de terminales
  6. Crear un mapa de tipo Category según el campo banco
  7. Probar los mapas de tipo Heatmap, Intensity y Density

Ejercicio 2

  1. Descargar los datasets de Barrios (csv) y Comunas (csv) del portal de datos de la Ciudad de Buenos Aires
  2. Importarlos a CartoDB
  3. Crear un mapa de tipo Choropleth de barrios por cantidad de cajeros automáticos y otro serǵun las comunas.
  4. La siguiente consulta será útil para calcular la cantidad de cajeros por cada barrio / comuna (ajustar según corresponda):
    
      SELECT
        *,
        ( select count(*) from cajeros as c
          where st_within(c.the_geom, b.the_geom)
        ) as cajeros
      FROM
        barrios as b
                

Ejercicio 3

  1. Descargar el dataset con Información del censo 2010 de las comunas de Capital Federal
  2. Importarlo a CartoDB
  3. Explorar la información
  4. Crear diversos mapas

Próximo encuentro: Acondicionando tus datos con OpenRefine

Sergio Sorín / @pollatos
Sebastián Scarano / @opensas

Segundo encuentro


Acondicionando tus datos con OpenRefine



Agenda:

  • Data cleanse o "masajeo de datos"
  • Character encoding (Codificación de caracteres)
  • Primeros pasos con OpenRefine - Ejercicios
  • Servicios Web, REST, JSON
  • UI versus API
  • Jugando con JSON - Ejercicios
  • Geocodificando direcciones con OpenRefine

Data cleanse
o
"masajeo de datos"


  • Consiste en descubrir, corregir o eliminar datos erróneos de un conjunto de datos
  • Permite identificar datos incompletos, inconsistentes, no pertinentes, inexactos, etc. para luego sustituir, modificar o eliminar esos datos sucios ("dirty data")
  • Se puede hacer de manera manual o utilizando diversas herramientas (planilas de cálculo, editores de texto, bases de datos, aplicativos ad-hoc)
  • OpenRefine es una herramienta libre para trabajar con "datos sucios", explorarlos, detectar inconsistencias, masajearlos, acondicionarlos, convertirlos de un formato a otro, enriquecerlo con web services, scrapear datos y varias cosas más

Codificación de caracteres (Character encoding)

  • Las máquinas sólo pueden procesar números, más precisamente bits.
  • Mediante la codificación de caracteres se puede convertir cada caracter a un número y viceversa. Es una tabla de conversión
  • Lamentablemente hay múltiples character encodings, y para poder procesar un archivo debemos saber cuál se ha utilizado para codificar los caracteres.
  • El encoding más utilizado actualmente es UTF-8, es MUY recomendable grabar todos nuestros archivos utilizando ese encoding.
  • OpenRefine permite fácilmente reconocer el encoding que se está utilizando.

Funciones básicas de OpenRefine

  • Múltiples opciones para importar datos (CSV, TSV, xls, xlsx, json, xml, urls, google data)
  • Vista previa de encodings
  • Facetas, Clusters
  • Transformaciones comunes: eliminar y colapsar espacios, mayúsculas y minúsculas
  • Filtros de texto, soporte de expresiones regulares
  • Fórmulas (soporte para GREL, Jython, Clojure)
  • Undo-Redo ilimitado
  • Exportar transformaciones como scripts
  • Múltiples opciones para exportar datos (CSV, TSV, xls, xlsx, json, xml, urls, google data, templates)

OpenRefine: algunos ejercicios

Funciones a utilizar

  • Eliminar espacios - trim leading and trailing whitespaces
  • Eliminar espacios consecutivos - collapse consecutive whitespace
  • Pasar todo a titlecase - to titlecase
  • Crear columna a partir de otras columnas
  • Renombrar columnas
  • Eliminar columnas
  • Reordenar columnas
  • Transformar celdas masivamente - value.replace(...)
  • Filtros de texto
  • value.split()
  • value.partition()

Ejercicio 1

Tomar el archivo 01_juntas_discapacidad.csv y normalizar el campo provincia y localidad. Luego generar un archivo separado por comas (CSV) con la siguiente estructura:

  • provincia
  • localidad
  • nombre
  • direccion
  • horario
  • telefono

Consejos: Usar facetas y la opción cluster para arreglar el campo provincia.

El campo localidad tiene varias inconsistencias e información que está de más. Utiliza una faceta por este campo para localizar esos registros y ver qué fórmula aplicar para dejar solamente el nombre de la localidad.

Nota: la solución del ejercicio está aquí

Ejercicio 2

Tomar el archivo 02_personas.csv, normalizar todos los campos y generar un archivo separado por comas (CSV) con la siguiente estructura:

  • titulo: doctor, ingeniero, etc
  • nombres
  • apellido
  • edad
  • nacionalidad

Usar facetas y la opción cluster para arreglar la nacionalidad. Las nacionalidades que deberían quedar son: Argentina, Brasileña, Chilena, Uruguaya, Otra y en blanco.

Los únicos títulos que deberían quedar son: Dr.,Ing.,Lic.,Prof. (Señor y Sr. los eliminamos)

Para ver cuáles son los títulos actualmente cargados resultará útil hacer una faceta por la primera palabra del campo nombre (Custom text facet)

Para separar el nombre del apellido, hay que tener en cuenta que algunos registros vienen en la forma "apellido, nombre" y otros como "nombre apellido". Utilizar el filtro de texto para tratar estos dos casos por separado. En el primer caso podremos usar split separando por el caracter coma y en el segundo separando por el caracter espacio.

Nota: la solución del ejercicio está aquí

Geocodificando direcciones
con OpenRefine

Vamos a consumir un servicio web de tipo REST que nos retornará un JSON para geocodificar nuestras direcciones.


¿¿¿Lo qué???

Servicio Web

Es un sistema que corre en la web y que permite intercambiar datos entre aplicaciones.


REST

Es un estilo de servicio web que busca aprovechar la infraestructura de internet y permitir intercambiar información de una manera simple


JSON - JavaScript Object Notation

Es un formato liviano para el intercambio de datos. Todo objeto JSON es a su vez un objeto válido en JavaScript, lo que hace que trabajar con él sea muy fácil.

UI versus API: Un ejemplo

UI: User Interface

  • Interface pensada para seres humanos
  • Es la manera en que un usuario puede interactuar con un sistema
  • Las aplicaciones web tienen una UI
  • Recibe información por botones, cajas de texto
  • ...y retorna un mapa en pantalla

API: Application Programming Interface

  • Interface pensada para programas
  • Es la manera en que las aplicaciones se pueden comunicar entre sí
  • Un servicio web es una API
  • Recibe información a través de la URL
  • ...y retorna JSON

Un ejemplo de JSON

DuckDuckGo es un buscador web que pretende competir con Google respetando nuestra privacidad.

Provee una API REST que nos brinda su funcionalidad como un web service. Por ejemplo, para ver el resultado de buscar "Buenos Aires" a través de la API ingresamos:
http://api.duckduckgo.com/?q=buenos aires&format=json&pretty=1


{
   "Heading" : "Buenos Aires",
   "RelatedTopics" : [
      {
         "Icon" : {
            "URL" : "https://duckduckgo.com/i/c8804af5.png",
         },
         "FirstURL" : "https://duckduckgo.com/Buenos_Aires",
         "Text" : "Buenos Aires The capital and largest city of Argentina..."
      },
      {
         "Icon" : {
            "URL" : "https://duckduckgo.com/i/2826ecf7.png",
         },
         "FirstURL" : "https://duckduckgo.com/Buenos_Aires_Province",
         "Text" : "Province of Buenos AiresThe largest and most populous Argentinian province."
      },
      [...]
   ]
};
            

Otro ejemplo: la API de CKAN

CKAN provee una API para poder consultar los datasets y demás recursos publicados en el portal.

Ej: consultar los datasets disponibles: http://demo.ckan.org/api/3/action/package_list


{
  "help": "http://demo.ckan.org/api/3/action/help_show?name=package_list", "success": true,
  "result": [
    "afghanistan-election-data",
    "community-maps",
    "comparativo-anos-anteriores-accidentalidad-sector-minas-y-canteras-de-colombia",
    [...]
  ]
}
            

Ej: buscar datasets por palabras claves: http://demo.ckan.org/api/3/action/package_search?q=spending


{
  "help": "http://demo.ckan.org/api/3/action/help_show?name=package_search", "success": true,
  "result": {
    "count": 3,
    "results": [
      {
        "id": "34315559-2b08-44eb-a2e6-ebe9ce1a266b",
        "license_title": "Creative Commons Attribution",
        "author": "",
        "resources": [
          {
            "id": "0c2bd47a-6ac5-412e-a337-1b45a952e07e",
            "name": "December 2011",
            "mimetype": "text/csv",
            "format": "CSV",
            "url": "http://www.newcastle.gov.uk/sites/drupalncc.newcastle.gov.uk/files/wwwfileroot/your-council/local_transparency/december_2011.csv",
            "last_modified": "2012-03-13T22:04:31.993982",
            "resource_type": "file",
            "size": "1081957"
          }, [...]
        ]
      }, [...]
    ]
  }
}
            

Un ejercicio con JSON

Tomando el ejemplo del resultado de consultar la API de DuckDuckGo, recorrereremos el JSON devuelto utilizando JavaScript.

Abrir un explorador web (Firefox o Chrome), apretar F12 para abrir la consola JavaScript, y pegar el siguiente texto:


var resultados = {
  "Heading" : "Buenos Aires",
  "RelatedTopics" : [
     {
        "Icon" : {
           "URL" : "https://duckduckgo.com/i/c8804af5.png",
        },
        "FirstURL" : "https://duckduckgo.com/Buenos_Aires",
        "Text" : "Buenos Aires The capital and largest city of Argentina..."
     },
     {
        "Icon" : {
           "URL" : "https://duckduckgo.com/i/2826ecf7.png",
        },
        "FirstURL" : "https://duckduckgo.com/Buenos_Aires_Province",
        "Text" : "Province of Buenos AiresThe largest and most populous Argentinian province."
     },
     {
        "Icon" : {
           "URL" : "https://duckduckgo.com/i/35bb000c.jpg",
        },
        "FirstURL" : "https://duckduckgo.com/Greater_Buenos_Aires",
        "Text" : "Greater Buenos Aires, the urban agglomeration comprising..."
     }
  ]
};
            

Utilizando JavaScript consultar el Heading, el url del ícono del primer resultado, el url del ícono del último resultado y la cantidad de resultados retornados por la consulta.

Nota: la solución del ejercicio está aquí

Servicios para geocodificar

Nominatim

Servicios para geocodificar

Google Maps API

Ahora sí...

Geocodificando
con OpenRefine

  • Construimos una columna con la dirección a geocodificar
  • Creamos una columna con el resultado de llamar al web service para cada fila (Add column by fetching URLs...)
  • Parseamos el resultado de la llamada al web service con value.parseJson()
  • Atendemos los casos en los que no retornó ningún valor
  • Extraemos las columnas lat y long del resultado
  • Comparamos los diversos resultados
  • Exportamos el resultado

Volver arriba

Sergio Sorín / @pollatos
Sebastián Scarano / @opensas

Tercer encuentro


Usos avanzados de CartoDB



Agenda:

  • Una cuestión de estilo: CartoCSS
  • Etiquetas
  • Métodos de cuantificación
  • Filtros
  • Creando datasets
  • Divisiones políticas ad-hoc
  • Múltiples capas
  • Ejercicio: volviendo a Snow (dataset1 y dataset2)
  • Ejercicio: el mapa del cancer (la nota y el dataset2)
  • Ejercicio: terremotos (dataset1)