Mapa Coropleta Con Datos Públicos Colombianos

El gobierno Colombiano ha hecho datos disponibles, progresando su clasificación entre los países dando pasos a ser más transparentes con el mundo. Con acceso a datos sociológicos, económicos, y ambientales, entre otros, podemos analizar y modelar como ha cambiado el país. Los datos abiertos nos dan materia prima para practicar y amaestrar nuestro conocimiento de análisis y ciencia de datos.

Veamos cómo estos datos nos ayudan a desarrollar un mapa coropleta sobre la condición actual del coronavirus. En este ejemplo las bibliotecas de python: pandas y plotly. Nos dan poderes mágicos.

Los datos

Datos disponibles con los últimos casos y populación de cada municipio se encuentran aquí. Estos son los mismo datos que probeé el gobierno Colombiano, aunque mejor preparados para este ejemplo. Con estos datos comparemos la tasa de muertes por cada mil habitantes en cada municipio.

Con los siguientes códigos obtenemos dicha información y la almacenamos en un marco de datos identificado por el objeto “co”. Después calculamos cuántas muertes han ocurrido por cada mil personas en cada municipio.

import pandas as pd

def get_latest_cases():
    co = pd.read_csv(
        'https://opendata.arcgis.com/datasets/53beb24d21f146c38a42db63c92e3460_0.csv')

    co = co.rename(columns={'Total_Existentes': 'Existentes',
                            'Total_Muertos': 'Muertos',
                            'Total_Recuperados': 'Recuperados'})

    for col in ['Existentes', 'Muertos', 'Recuperados']:
        co[f'porcentage_{col}'] = round(
            co[col]/co.TOTAL_UNIDADES_PERSONAS_PROY_2020, 4)
    co['porcentage_Affectado'] = co[['Existentes', 'Muertos', 'Recuperados']].agg(
        sum, axis=1)/co.TOTAL_UNIDADES_PERSONAS_PROY_2020

    co['Muertos_en_cada_mil'] = co['porcentage_Muertos'] * 1000

    co.MPIO_CCNCT = co.MPIO_CCNCT.astype('str')
    # add leading zero to match id of geojson
    co.MPIO_CCNCT = co.MPIO_CCNCT.str.zfill(5)

    return co

Teniendo esta información estamos un paso más cerca de crear un mapa interactivo. Nuestro próximo paso es obtener las divisiones políticas de los municipios en Colombia geocodficadas en un archivo.

Geocodificación

Para crear un mapa coropleta con la biblioteca plotly necesitamos las divisiones políticas municipales en formato geojson. Los formatos de geocodificación han evolucionado a formatos como topojson, que ocupan menos memoria y contienen la misma información que un geojson. Pero plotly todavía no acepta formatos topojson, me imagino que esto cambiara. Pero por ahora tenemos que dar paso para crear el archivo geojson que necesitamos.

En el geoportal de la DANE Colombiana encontramos las divisiones políticas en formato shape .shp en esta carpeta comprimida. Al convertir de .shp a .geojson creamos un archivo mas grande que ilustre los mismos detalles geográficos. Para nuestro propósito podemos crear un archivo geojson mas liviano de la manera siguiente. En mapshaper.org de Matt Bloch simplificamos los detalles geográficos y exportamos un archivo topojson mas liviano. Después convertimos el topojson a geojson con topo2geo. Sí no quieren procesar y crear su propio archivo geojson, pueden utilizar el que creé. Si es posible convertir de .shp directamente a geojson pero este archivo no dio resultado en ploty.

Nuestro geojson contiene un código municipal (MPIO_CCNCT), aquí lo vemos entre la estructura de el archivo:

{
    "type": "FeatureCollection",
    "features": [
        {
            "id": 0,
            "type": "Feature",
            "properties": {
                "DPTO_CCDGO": "18",
                "MPIO_CCDGO": "001",
                "MPIO_CNMBR": "FLORENCIA",
                "MPIO_CRSLC": "Decreto 642 de Junio 17 de 1912",
                "MPIO_NAREA": 2547.63753226,
                "MPIO_CCNCT": "18001",
                "MPIO_NANO": 2018,
                "DPTO_CNMBR": "CAQUET\u00c1",
                "Shape_Leng": 2.94250780494,
                "Shape_Area": 0.206927769124
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            -75.40430955108471,
                            1.7695121792219881
                        ],

Para codificar los municipios con colores, es importante entender la ubicación de la clave en común que se encuentra en el marco de datos y el geojson. Porque son valores que entraremos al método de plotly para crear el mapa coropleta.

Crear el Mapa Coropleta en plotly

Estamos listos para crear nuestro coropleta con plotly:

import plotly.expreses as px
import requests

mpios_json = requests.get('https://raw.githubusercontent.com/caticoa3/colombia_mapa/master/co_2018_MGN_MPIO_POLITICO.geojson')

fig = px.choropleth(
        co,
        locations='MPIO_CCNCT',
        geojson=municipios,
        featureidkey="properties.MPIO_CCNCT",
        projection='mercator',
        color='Muertos_en_cada_mil',
        color_continuous_scale=px.colors.sequential.OrRd,
        hover_data=['DPTO_CNMBR', 'NOMBRE_MPIO'],
        height=500
        )

fig.update_geos(fitbounds="locations", visible=False)
fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0})
fig.show()

Inmediatamente nos damos cuenta que el municipio de Leticia tiene la tasa mas alta de muertes por habitantes.

Para mejor entender como otros municipios se comparan creamos un gráfico de barras:

co_show = co[['NOMBRE_MPIO', 'Muertos_en_cada_mil', 'TOTAL_UNIDADES_PERSONAS_PROY_2020']]

co_show = co_show.sort_values(['Muertos_en_cada_mil', 'TOTAL_UNIDADES_PERSONAS_PROY_2020'], ascending=True).tail(20)

px.bar(co_show, x='Muertos_en_cada_mil', y='NOMBRE_MPIO', orientation='h')

Conclusión

Como vemos tenemos bibliotecas gratuitas que nos facilitan crear visualizaciones para contrastar y comparar la información de cada municipio. También vemos que con solo python podemos hacer estos análisis. Es mas puedes seguir estos pasos para crear otros mapas coropletas con otra información geográfica en el Geoportal de el DANE de Colombia.
Aprovechemos datos “abiertos” públicos cuando podamos, esta iniciativa hacia la transparencia es importante para entender la realidad del país.
Eso es todo por ahora damas y caballeros, espero que les haya gustado, cuídesen y sigamos aprendiendo.