¿Dónde están los Gamers? GeoBigData + KMedias

En este tutorial usaremos los datos abiertos del Censo de Población 2020 para crear un Mapa con la ubicación de las mayores concentraciones de Gamers en todo México.

Requisitos previos

Este artículo es una continuación natural de de los últimos 3 tutoriales:

Es importante aclarar que es un requisito previo haber realizado alguno de los ejercicios ya sea el de Python o R. En ambos casos se crea un directorio con los datos estadísticos y geográficos integrados a nivel manzana y por estado. Todo lo anterior queda almacenado en archivos con formato GeoPackage.

Debes tener 32 archivos con el resultado de al menos uno de los tutoriales anteriores.

Es importante conservar la estructura es decir:

dentro del directorio /gpkg deberás tener los 32 archivos.

En este tutorial será necesario tener instalado el software llamado Docker en tu equipo existen versiones para los principales sistemas operativos (Windows, macOS y Linux).

No te desanimes :( aunque te parezca un requerimiento algo misterioso te aseguro que vale cada bit ocupado en tu equipo, este software simplificará horas de instalación y configuraciones de todo lo que usaremos aquí y lo convertirá en UNA SOLA LINEA DE CÓDIGO. Por lo cual vale la pena dedicarle tiempo al proceso de instalación el cual sobra decir es muy sencillo.

Ahora bien, si quieres una referencia rápida, en un artículo anterior puse los pasos para instalar Docker en Windows: Geo Big Data con Datos Censales.

Iniciar JupyterLab en una sola linea de código

Como en el artículo de Python usaremos JupyterLab pero en esta ocasión utilizaremos un contenedor de Docker preparado para la ocasión, es decir para simplificar el trabajo de instalación de todas las dependencias usadas aquí, incluido Apache Spark y su extensión geográfica llamada Apache Sedona así como las dependencias de Python correspondientes.

El contenedor se encuentra público en el depósito de contenedores de Docker en : https://hub.docker.com/r/abxda/geobigdata

Pero no te preocupes no es necesario bajar manualmente algo, basta con ejecutar la una linea de código en la terminal de tu sistema operativo.

Antes de iniciar ¡RECUERDA!

Debes estar en el directorio donde tengas los archivos GeoPackage en la siguiente estructura:

Recuerda ubicarte en el directorio correcto usando tu terminal, antes de correr Docker.

Estando en la que principal del tutorial anterior ejecuta la siguiente linea:

  • Para Windows 10 (PowerShell):
  • Para macOS
  • Para linux

¡¡¡Una vez ejecutada la linea anterior la magia comienza!!!!

Por ejemplo si en tu maquina no has ejecutado con anterioridad dicha línea, Docker se encargara de descargar lo que haga falta para su ejecución. ¡¡¡Mira lo esta descargando!!!

La primera vez tardará un poco debido a que descarga todos los archivos, las siguientes veces puedes ejecutar exactamente la misma linea y solo tardará unos segundos :D

Al finalizar veras algo parecido al siguiente código:

Copia la URL que empieza con: http://127.0.0.1:8888… y abre una pestaña de tu navegador web con esa liga y veras a JupyterLab corriendo y ademas configurado para ejecutar todo lo necesario para éste tutorial.

JupyterLab con Super Poderes

Puedes notar que JupyterLab se inició con nuevos componentes, aunque no los usaremos todos en esta ocasión es importante notar que ahora puedes escribir código en R y gracias al componente Spylon-kernel

Scala en JupyterLab

Incluso como lo mencionamos podemos usar R como lenguaje de programación en la instalación de Jupyter Lab que acabamos de ejecutar:

R en JupyterLab

Ubica el directorio correcto

Ya que abriste JupyterLab lo primero que ubicaras es del lado izquierdo se encuentra el directorio llamado [work]. Haz doble clic.

Directorio inicial, recuerda hacer doble clic para entrar a tus archivos

Una vez que entras al directorio [work] te encontraras en tu directorio de trabajo. Es decir Docker vinculó tu directorio de trabajo (por ejemplo: /Users/abxda/Rcenso2020/) con los directorios de trabajo del contenedor que Docker descargo y configuró automáticamente, el directorio se ve como: /work/.

Convertir los archivos GeoPackage a WKT

El primer paso del proceso es convertir los archivos GeoPackage a un archivo de texto separado por comas (CSV) con una columna de texto con la geometría geográfica.

La razón de convertir a CSV es debido a es un formato de intercambio de alcance transversal y fácilmente podemos incorporarlo en herramientas de análisis de Big Data como Apache Spark.

Antes delo cual es necesario crear el directorio CSV en el subdirectorio de información geográfica:

ahora si, para convertir los Geopackages a CSV-WKT es necesario crear un cuaderno de Jupyter y ejecutar el siguiente código en la siguiente celda del cuaderno de Jupyter:

Ya se!!!!! es demasiado pero es la forma mas práctica de aprovechar el contenedor de Docker. la magia es que ahora ya tenemos un directorio con todos los archivos en formato CSV y con un campo WKT:

Archivos CSV generados

El contenido de los archivos ahora contiene un campo llamado WKT:

Puedes observar que el formato WKT es una forma de expresar a través de texto la representación geográfica de cada manzana:

Es posible pintarlo directamente

Y desplegar la geometría usando el estándar WKT (https://es.wikipedia.org/wiki/Well_Known_Text)

Geo Big Data

Es momento de utilizar todas los archivos generado y hacer un poco de análisis espacial con SQL 😮

El siguiente paso es crear un cuaderno de Jupyter Nuevo:

Cuaderno Nuevo llamado: GeoBigData.ipynb

Carguemos todas las librerias necesarias

Pegamos y ejecutamos:

Es relevante notar que toda esa tecnología de manejo de datos y Big Data puede usarse gracias a Docker, instalar cada biblioteca y configurar Apache Spark en una maquina sin Docker puede llevar mucho tiempo, dependiendo del Sistema Operativo y configuración especifica de cada equipo. Por lo que la estrategia de usar Docker como mecanismo de abstracción de la infraestructura es clave en este momento.

Ahora procedemos a iniciar Apache Spark y conectarle las librerias de Apache Sedona, para poder trabajar con los datos recientemente generados.

Así se ve en JupyterLab

Empezaremos a usar Apache Spark en nuestro código, a traves del interprete PySpark. Pues resulta que internamente Apache Spark está escrito en Scala un lenguaje de la Máquina Virtual de Java 😵

Apache Spark esta hecho en Scala y corre dentro de la JVM

Volviendo a nuestro trabajo procederemos a leer (lazy) los datos csv de todo el directorio:

ahora es posible inspeccionar el esquema de de los datos leidos con el comando anterior, puedes ver que se encuentra el campo WKT en formato cadena, vamos a cambiar eso con Apache Sedona.

En este tutorial seguiré el camino panoramico con SQL, es bueno que sepas que existe un dialecto basado en programación fluida que te evitará usar SQL, sin embargo en mi caso usare ese lenguaje consultas para realizar la mayor parte de las tareas, debido a que es fácil de entender y fácil de recordar.

Para eso crearemos una Tabla Virtual conectada a nuestro directorio de archivos CSV a traves de la siguiente instrucción:

Bien ahora vamos a realizar la siguiente instrucción SQL para hacer un poco de limpieza de datos y convertir el texto WKT en una geometría.

Se ve mejor en Jupyter:

Podemos ver el resultado de la siguiente manera:

Bien, seleccionamos solamente los campos:

  • POBTOT: Población Total
  • VPH_INTER: Viviendas con Internet
  • VPH_CVJ: Viviendas con consola de videojuegos
  • VPH_SPMVPI: Viviendas con servicio de películas, música o videos de paga por Internet
  • centroid: este campo lo calculamos dinámicamente, ahora los polígonos se convirtieron en puntos distribuidos a lo largo del México.

Ahora creamos una nueva tabla dentro del entorno virtual de Apache Spark:

Tiempo de descargar datos complementarios. Para este tutorial generé un grid de hexágonos con aproximadamente 5 kilómetros de área cada uno:

395,981 Hexagonos a lo largo de todo México

El archivo se encuentra en:

Descarga el archivo Mex-Hex-5k.zip

https://bit.ly/2ZU9B0J

Por favor descarga el archivo y descomprimelo en la siguiente carpeta:

Nota que es necesario crear la carpeta shp en el subdirectorio mgccpv

Regresamos a nuestro cuaderno de JupyterLab dónde lo dejamos y cargamos el archivo Shapefile con la siguiente instrucción:

La primera instrucción carga el archvio Mex-Hex-5k.shp a la variable hex.

La segunda línea de código convierte la variable hex a un DataFrame de Apache Spark llamado hex_df.

Ahora creamos la tabla virtual con los datos de lso hexagonos:

Así puedes explorar algunos registros ya cargados dentro de Apache Spark

El siguiente paso requiere una explicación, hasta el momento tenemos la tabla censo_geo que tiene los controides de las manzanas a nivel nacional y la tabla hex que tiene los hexagonos de 5 km² de área que cubren todo el pais. En este punto es necesario realizar un cruce geográfico que sume los valores de las variables estadísticas que caen dentro de cada hexagono y guardar el identificador único FID como referencia:

Es necesario realizar el cruce geográfico

Esa tarea se ejecuta con un SQL Geográfico usando Apache Spark como herramienta de análisis:

Apache Spark es una plataforma que no ejecuta todas las instrucciones inmediatamente, crea el plan de ejecución y hasta que se guardan los datos o se visualizan los resultado Spark procede a ejecutar todas las tareas en paralelo. Por lo que seguiremos haciendo el resto de las tareas para guardar el análisis espacial:

La segunda línea de código vincula las geometrias de los hexagonos al resultado del análisis espacial.

Ahora guardaremos el análisis, es aquí donde Spark despierta y empieza a ejecutar todos las tareas que acabamos de ir corriendo en cada celda.

Esto puede tardar varias horas 😢 pero al final tendras el analisis listo para realizar la siguiente etapa:

Al final tenemos un archivo con todos los datos ya procesados, vamos a hacer un poco de limpieza y a leer el archivo:

Se despliegan los datos ahora te puedes dar cuenta que la tabla de variables está lista para la siguiente etapa.

Analisis de KMedias de las 4 variables del Censo

Por último vamos a utilizar las 4 variables para realziar una análisis de KMedias el cual es un método de estratificación multivariada, en escencia el método busca realizar grúpos de héxagonos similares. El número de grupos se establece por parte del usuario y existen técnicas para determinar el número de grupos óptimos. No es el alcance de este tutorial profundizar en dichas técnicas por lo que se tomaran valores por defecto.

El primer paso para realizar el análisis de KMedias es construir un vector de valores con las columnas estadísticas. Usando el ensamblador de vectores de Apache Spark:

Se creó la columna features, YEIII!!!!

Ahora entrenamos el modelo de KMedias:

Ahora asignamos a cada hexágono la categoría determinada por

La columna prediction se creó con los valores de cada estrato. Es decir el análisis ya asigno los 5 estartos solicitados.

¿Qué son estas categorias (0–4) de dicha columna? Para contestar esa pregunta necesitamos crear la tabla virtual con esos resultados:

Listo ahora visualizamos los clusters:

Yeiiii

Esta tabla es muy informativa porque ahora podemos decidir el color que vamos a usar para visualizar los datos, los valores del estrato con numero 0 en la predicción de kmedias claramente corresponden a los mas bajos, es decir son hexagonos con poco precencia de viviendas con consola de videojuego, internet y servicios de streaming.

Usando esa lógica asignamos el resto de los colores. Para poder hacer eso necesitamos guardar los datos a un archivo Shapefile:

Con ese resultado podemos cargar la información en QGIS :D y navegar a cualquier parte de la republica:

Acercamiento a Guadalajara
Todo el pais

¡¡¡Muchas Gracias por Leerme!!!!!

Abel Coronado

Father-Husband-Data Scientist-Philosopher-Entrepreneur-Professor PhD c. in Data Science-MSc Stats #R #Scala #Spark #SatelliteImagery #Python #BigData #Nerd

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store