La geocodificación es fundamental en el análisis de datos geoespaciales, aplicándose en campos como el marketing y la planificación urbana. En este artículo, explicaremos su importancia y su aplicación en la data science.
- Explicación
- Tipos De Geocodificación
- Geocodificación En Servicios
- Geocodificación y Data Science
- Posibles Problemas
- Conclusión
Explicación
La geocodificación consiste en transformar direcciones, nombres de lugares y otra información de ubicación en coordenadas geográficas (latitud y longitud) para fines de mapeo y análisis. Este proceso permite combinar datos geográficos con otros conjuntos de datos, facilitando el análisis y la visualización de patrones y relaciones entre ellos.
Tipos De Geocodificación
Hay varios tipos de geocodificación, cada uno con su propio conjunto ventajas y limitaciones:
- Basada en direcciones: convierte direcciones de calles, como “Calle Pio IX, Valencia, ES” en coordenadas geográficas. Útil para analiizar patrones de delincuencia y fenómenos a pie de calle.
- Basada en nombres de lugares: convierte los nombres de lugares, como “Plaza del Sol, Madrid” en coordenadas geográficas. Conveniente para mapear lugares históricos y fenómenos en zonas específicas.
- Inversa: convierte las coordenadas en la correspondiente dirección. Eficaz a la hora de analizar datos de sistemas antiguos.
- Por lotes: convierte multiples direcciones o nombres de lugares en las coordenadas pertinentes, usado con grandes conjuntos de datos cuyas coordenadas comprendan un área extensa.
Geocodificación En Servicios
El uso de la geocodificación es básico en los servicios que funcionan mediante la ubicación del usuario (aplicaciones móviles, mayoritariamente). Pudiendo utilizarse para, por ejemplo, llegar a una ubicación específica, detectar radares o congestiones de tráfico a tiempo real u obtener información sobre lugares de interés cercanos:
Software De Geocodificación y SIG
El software GIS (ArcGIS, QGIS…) hace uso de la geocodificación para crear mapas y realizar análisis espaciales. Estos análisis espaciales pueden involucrar el uso de técnicas estadísticas y algoritmos que incorporan datos de ubicación y otras variables para identificar patrones geográficos significativos. Esta capacidad resulta útil para una amplia gama de aplicaciones; incluyendo el planeamiento urbanístico, la gestión de recursos naturales y la respuesta a cualquier tipo de emergencias.
Calidad De Los Servicios De Geocodificación
La precisión de los resultados de la geocodificación depende de varios factores, como la cantidad y calidad de los datos, el algoritmo utilizado y el servicio de geocodificación seleccionado. No todos los servicios ofrecen el mismo nivel de calidad y precisión. Un buen servicio de geocodificación proporciona datos de alta calidad y utiliza algoritmos eficaces para garantizar resultados precisos.
Por ejemplo, Google Maps es una opción popular para la geocodificación, pero hay muchas otras disponibles, como Bing Maps, OpenStreetMap, y MapQuest. A la hora de comparar estos servicios, se deben tener en cuenta factores como la facilidad de uso, la rapidez en proporcionar resultados, la cobertura global y la precisión en localizaciones rurales o en áreas con direcciones más complejas.
Geocodificación y Data Science
La geocodificación se integra ampliamente en la ciencia de datos. Su uso en campos como la epidemiología, donde puede ayudar a rastrear y predecir la propagación de enfermedades, y la logística, donde puede optimizar las rutas de entrega, son solo dos ejemplos de su utilidad.
La geocodificación también se aplica en el marketing, permitiendo a las empresas orientar su publicidad en base a las ubicaciones de sus clientes y a análisis de datos geográficos. El análisis de datos geográficos proporciona información detallada sobre tendencias de consumo, áreas de alta demanda y patrones de comportamiento, lo que ayuda a las empresas a diseñar estrategias de marketing más efectivas y personalizadas.
Ejemplo De Geocodificación Con Python
Un ejemplo sencillo de geocodificación con Python, usando SPARQL & Folium, sería obtener un mapa con la ubicación de todos los futbolistas registrados en Wikidata:
I) Instalamos rdf-lib y sparqlwrapper
# En caso de no usar notebooks, eliminar '!'
!pip install -q rdflib
!pip install -q rdflib-jsonld
!pip install -q sparqlwrapper
II) Incluimos las librerías y funciones necesarias:
# Importamos las librerías necesarias para trabajar con SPARQL y procesar los datos
import io
import urllib.request
import rdflib
import rdflib_jsonld
from rdflib import Graph, plugin
from SPARQLWrapper import SPARQLWrapper, JSON, XML, N3, RDF , POST, GET, POSTDIRECTLY, CSV
import warnings
warnings.filterwarnings ("ignore")
# Importamos las librerías necesarias para visualizar los datos en un mapa
from IPython.display import HTML
import matplotlib.pyplot as plt
import math
import json
import requests
import pandas as pd
import numpy as np
import unittest
from datetime import datetime
# Función para crear el cliente SPARQL
def create_sparql_client ( endpoint , result_format=JSON , query_method=POST , token=None ):
''' Crea un cliente SPARQL '''
sparql = SPARQLWrapper(endpoint)
if token:
sparql.addCustomHttpHeader ("Authorization","Bearer {}".format(token))
sparql.setMethod ( query_method )
sparql.setReturnFormat ( result_format )
if query_method == POST:
sparql.setRequestMethod(POSTDIRECTLY)
return sparql
# Función para ejecutar la consulta SPARQL
def query_sparql ( sparql , prefix, query ):
''' Ejecuta una consulta SPARQL '''
sparql.setQuery ( prefix + query )
results = sparql.query()
if sparql.returnFormat == JSON:
return results._convertJSON()
return results.convert()
# Función para mostrar los resultados de la consulta SPARQL
def print_results ( results, limit =''):
''' Imprime los resultados de una consulta SPARQL '''
resdata = results["results"]["bindings"]
if limit != '':
resdata = results["results"]["bindings"][:limit]
for result in resdata:
for ans in result:
print('{0}: {1}'.format(ans, result[ans]['value']))
print()
# Función para convertir los resultados de la consulta SPARQL en un dataframe:
def json2dataframe (results):
''' Genera un dataframe con los resultados de una consulta SPARQL.
Cada una de las filas es un resultado y en columnas cada uno de los atributos'''
data = []
for result in results['results']['bindings']:
row = {}
for var in results['head']['vars']:
row[var] = result[var]['value']
data.append(row)
df = pd.DataFrame(data)
return df
# Función para ejecutar la consulta y generar el dataframe
def dataframe_results(sparql, prefix, query ):
''' Ejecuta consulta y genera el dataframe '''
sparql.setQuery(prefix + query)
results = sparql.query().convert()
df = json2dataframe(results)
return df
III) Ejecutamos la consulta y creamos el mapa con los datos geográficos de cada futbolista:
# Creamos la consulta SPARQL para obtener los datos de los futbolistas
q = '''
SELECT DISTINCT ?person ?personLabel (COALESCE(?image, "") as ?image) ?lat ?lon
WHERE {
?person wdt:P106 wd:Q937857 .
?person rdfs:label ?personLabel .
?person wdt:P166 ?work .
?work rdfs:label ?workLabel .
OPTIONAL {?person wdt:P18 ?image}
OPTIONAL {?person wdt:P19 ?country .
?country rdfs:label ?countryLabel .
?country wdt:P625 ?coords .
?country p:P625/psv:P625 ?node.
?node wikibase:geoLatitude ?lat.
?node wikibase:geoLongitude ?lon.
}
FILTER ( LANG ( ?personLabel ) = "en" )
FILTER ( LANG ( ?workLabel ) = "en" )
FILTER ( LANGMATCHES ( LANG ( ?countryLabel ), "en" ) )
}
GROUP BY ?person ?personLabel ?image ?lat ?lon
'''
# Creamos el cliente SPARQL con el endpoint
wikidata_endpoint = "https://query.wikidata.org/sparql"
wd_sparql = SPARQLWrapper(wikidata_endpoint)
wd_sparql.setQuery(q)
wd_sparql.setReturnFormat(JSON)
results = wd_sparql.query().convert()
df_wiki = pd.json_normalize(results['results']['bindings'])
df_wiki = dataframe_results (wd_sparql, '', q)
df_wiki.drop_duplicates(inplace = True)
import folium
world_map = folium.Map(prefer_canvas=True)
# Recorremos el dataframe, agregando -en forma de círculo- las coordenadas de donde proceden los deportistas
for p in range ( df_wiki.shape[0]):
lat = df_wiki.iloc[p]['lat']
lon = df_wiki.iloc[p]['lon']
name = df_wiki.iloc[p]['personLabel']
folium.CircleMarker ( [lat , lon ],
radius=1.5,
line_color='#3186cc',
fill_color='#3186cc',
fill=True,
tooltip = name
).add_to(world_map)
# Obtenemos el mapa
world_map
-------------------------------------------------------------
Ejecutando el código se debería obtener una imagen como la de arriba, habiendo entonces completado un ejemplo de geocodificación – es decir, el acto de obtener los datos geográficos de latitud y longitud de los futbolistas sacados de Wikidata mediante una consulta SPARQL para posteriormente visualizarlos en un mapa.
Posibles Problemas
A pesar de su utilidad, la geocodificación presenta problemas que siempre debemos recordar:
- Datos faltantes: pese a que la geocodificación se base en datos precisos y complejos, puede darse el caso de que algunas direcciones falten o estén incompletas; complicando el proceso de ubicación. Esto suele ser consecuencia de áreas geográficas menos desarrolladas o menos mapeadas, nuevas construcciones o cambios recientes en la infraestructura de una zona.
- Datos inconsistentes: si utilizamos datos de múltiples fuentes, puede que utilicen una nomenclatura u orden diferente a la hora de por ejemplo escribir el nombre de las calles, incrementando la dificultad del mapeo. Por ejemplo, una fuente puede listar una dirección como “Calle 50 #10-34”, mientras que otra puede referirse a la misma ubicación como “50 Calle, 10-34”.
- Datos obsoletos: algunos datos pueden estar basados en lugares con el nombre cambiado, mapas antiguos o imágenes satelitales antiguas y poco exactas, haciendo confusa -y poco precisa- la geocodificación.
Conclusión
La geocodificación es un proceso importante dentro de la ciencia de datos que permite vincular la información de ubicación geográfica con otros datos para su posterior mapeo y análisis. Permitiendo identificar patrones y establecer relaciones entre los datos. Además de ser importante en una gran variedad de áreas y servicios de los cuales todos hacemos uso; aún así, es importante tener en cuenta que la precisión de los resultados obtenidos depende en gran medida de la calidad de los datos de entrada, los algoritmos utilizados, y la calidad del servicio de geocodificación.