Proyecto realizado para el Hackathon organizado por Cajamar con motivo de la PyConEs 2016 en Almería, en Octubre de 2016.
Hemos desarrollado un dashboard interactivo para analizar los datos proporcionados por Cajamar, corresponientes a las transacciones con tarjeta de crédito realizadas en los comercios de Almería capital durante 2015.
Hemos enriquecido los datos proporcionados por la organización del hackathon con datos meteorológicos y sociodemográficos (ver más abajo)
El dashboard muestra gráficos enlazados en los que se visualiza el importe total de gasto en función de las distintas dimensiones presentes en el dataset. Además cada gráfico permite filtrar los datos para profundizar en el análisis de forma exploratoria.
Este proyecto es una prueba de concepto para una herramienta interactiva que permite:
- a los comerciantes de Almería entender mejor su negocio: ¿de donde vienen mis clientes? ¿es el mismo patrón entre semana que en fin de semana? ¿y si llueve? ¿cuantos clientes espero atender la semana que viene?
- a las autoridades de Almería comprender mejor los patrones de comportamiento y consumo de los habitantes de la provincia: ¿que implicaciones tendría permitir la apertura de Domingos? ¿hay zonas comerciales que están decayendo? ¿como planificar el transporte público? ¿se puede invertir en infraestructuras como aparcamientos?
Se puede acceder al dashboard AQUI:
Se puede acceder al código fuente AQUI
client
: html, css, js... conbower
ygrunt
(para compilar los ficherosless
y pasarjshint
)server
: aplicación python/flask para servir el cliente y filtrar los datos: el servidor carga los datos al inicio en un dataframe de pandas y lo sirve en CSV cuando el cliente lo vaya pidiendodata
: directorio donde copiar los ficheros de datos (no incluidos)
El proyecto combina un gran número de tecnologías punteras (python, flask, pandas, AngularJS, d3.js, crossfilter, leaflet) haciendo que todas ellas trabajen para conseguir una experiencia de usuario amena e interactiva.
Se ha añadido un componente de "storytelling" desarrollado expresamente para este hackathon.
Este componente permite capturar el estado actual de la aplicación (filtros seleccionados) y crear una historia con distintos estados que se reproduce automáticamente, añadiendo una explicación sobre el mismo.
El servidor es una aplicación python/flask muy sencilla. Simplemente carga los datos en un dataframe de pandas al inicio y lo sirve cuando el cliente pide datos. Se usa pandas
para filtrar datos por sector o por més y para muestrear el dataset extrayendo un número razonable de registros para devolver al cliente
La aplicación cliente es una SPA desarrollada en Angular.js usando principalmente la librería dc.js.
dc.js utiliza crossfilter.js y d3.js para crear gráficas enlazadas a partir de datasets multidimensionales
Además, incluimos un mapa usando la librería leaflet.js que carga los códigos postales en topoJson haciendo uso del plugin leaflet-omnivore. Las capas sociodemográficas del INE están alojadas en carto.com y se incluyen usando la API de carto.
Finalmente hemos incluido un componente de storytelling que permite capturar y presentar distintos estados del dashboard de forma secuencial automáticamente
Además de los datos proporcionados por la organización, aportamos varias fuentes de datos adicionales:
- meteorología, descargada offline usando la API de Dark Sky, nos da las condiciones meteorológicas de Almería para cada día de 2015.
- códigos postales, descargados del IGN / CartoCiudad en formato ESRI Shapefile y convertidos a topoJson para cargarlos en el mapa
- datos sociodemográficos, descargados de la Junta de Andalucía en formato ESRI Shapefile. En concreto se ha usado la rejilla demográfica, que contiene datos de población absoluta y segmentación por edades, nacionalidad y afiliación a la Seguridad Social. Esta información está organizada en cuadrículas y sólo se encuentran en los núcleos de población, por lo que para poder utilizarla se han realizado las siguientes operaciones:
- Unión espacial con la capa de códigos postales del IGN / Cartociudad por intersección, realizando una agregación de suma en los campos demográficos
- Cálculo del porcentaje de los campos demográficos en función del total de población
$ git clone https://github.com/jabadia/cajamar
$ cd cajamar
$ cd client
$ bower install
$ cd ..
$ mkvirtualenv cajamar
$ cd server
$ pip install -r requirements
$ cd ..
$ cd data
$ (copiar los datos en cards.txt)
$ cd ..
(no están incluidos para no incumplir las condiciones de privacidad de datos del hackathon)
$ cd server
$ python server.py
Happy data day!