sábado, 20 de agosto de 2016

Dibujando conexiones geolocalizadas con R

Para plasmar de forma gráfica geolocalizaciones de cualquier tipo de referencia, R puede ser una herramienta muy conveniente. Si a la geolocalización en un espacio reconocible le añadimos relaciones entre objetos (desplazamientos, comunicaciones, redes,...) las representaciones pueden llegar a ser realmente vistosas.

He dado con un dataset donde es aplicable esta filosofía de visualización, pues consiste en una lista de pares de coordenadas que relacionan lugares de residencia y de trabajo en el Reino Unido. Con él nos haremos una idea de los desplazamientos diarios al trabajo que se producen en aquel país. Puede encontrarse en el artículo original 'Mapping Flows in R' de James Cheshire quien obtuvo el siguiente mapa:



Como es costumbre en R (y aún estoy decidiendo si me parece una buena o una mala costumbre), para llegar a un mismo sitio no es que haya más de un camino, es que hay un montón de caminos!. En lugar de emplear algún paquete que facilite hacer grafos de conexiones, opté por calcular el mapa a lo machote con una rutina que acumula sobre una matriz los trazos rectilíneos a dibujar.



Esta acumulación es imprescindible para no perder el dato de densidad o concentración relativa de desplazamientos en cada zona del mapa, dado el número de solapes entre trazos que se van a producir. Es una funcionalidad que en soluciones paquetizadas seguramente se implemente con algún parámetro de transparencia. La matriz acumuladora finalmente se normalizará y guardará como imagen.

Con estas sugerencias de Carlos Gil Bellosta para optimizar el código:
  • Uso de datatables en lugar de dataframes para leer y preprocesar los datasets de entrada.
  • Uso de una matriz en lugar del datatable para recorrer el conjunto de filas a trazar.
  • La vectorización de la operación de acumulación descrita evitando usar un bucle.

Se ha obtenido un gráfico de 2.000x2.276 píxeles con cerca de 1,8 millones de líneas en 50s, de los cuales 45s corresponden al bucle de trazado. Esto supone calcular 40.000 trazos/s, lo que no está nada mal para un lenguaje interpretado (CPU de 2,6GHz con SO Windows de 32 bits).

Para dar mayor claridad al resultado se han descartado del conjunto original los desplazamientos de largo recorrido, no siendo descabellado además considerarlos outliers. El mapa obtenido se ha coloreado con curvas en Photoshop para resaltar mejor las diferentes densidades, añadiéndole un fondo con la silueta de la isla (hacer clic sobre la imagen para verla a mayor tamaño):



Al preservar la densidad relativa de desplazamientos en cada zona quedan pobremente descritas las áreas menos pobladas, pero a cambio se tiene una visión más real de la localización del movimiento humano que en el mapa de Cheshire. Quedan resaltadas todas las aglomeraciones urbanas, destacando como era de esperar el área de Londres sobre las demás: Birmingham, Manchester, Leeds,...

Con los mismos datos he generado un GIF animado comparando la distribución espacial de la población en sus hogares con la resultante cuando se desplazan a los lugares de trabajo para la región londinense:



La fuerte concentración en el centro y en puntuales focos periféricos durante el horario de oficina, da paso a un reparto disperso y relativamente uniforme de la población residencial en el área suburbana; un Big Bang que se repite cíclicamente cada 24h de lunes a viernes. Se llega a distinguir la parte vacía por la que serpentea el Támesis, así como los principales parques de Londres, zonas donde obviamente no hay viviendas ni centros de trabajo.

~~~

Para acabar, y aprovechando que en el trabajo tengo acceso a información geolocalizada de llamadas de telefonía, he aplicado la misma filosofía a un enorme conjunto de datos consistente en comunicaciones móviles entre clientes de Vodafone (~150 millones de conexiones), obteniendo el siguiente gráfico:



Resulta curioso ver cómo gracias a la capilaridad de la red, surge un mapa bastante definido del país sin dibujar más que conexiones geolocalizadas. Haciendo clic sobre la imagen puede verse el mapa en Full HD (1.920x1.080 píxeles), por pequeña que sea tu ciudad seguro que no te costará encontrarla.

~~~

Repositorio con el código R y archivos auxiliares: GitHub.

No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.