Hagamos un breve ejercicio: con un lápiz y papel escribamos todas las variantes de, por ejemplo, una provincia de nuestra elección. Esta es mi lista:
- Buenos Aires
- Prov. de Bs. As.
- PBA
- Bs. As.
- B. Aires
Para el ojo humano todas las variantes hacen referencia a la Provincia de Buenos Aires. Sin embargo, para los sistemas informáticos, son todas provincias diferentes. La falta de normalización de los nombres de calles, localidades, departamentos y provincias produce un serio problema.
Esto genera un nuevo desafío: ¿cómo hacemos para que nuestro sistema informático las reconozcan como una misma? Para solucionar este problema, la Dirección Nacional de Datos Abiertos creó una herramienta que permite normalizar y codificar los nombres de unidades territoriales de la Argentina (provincias, departamentos, municipios y localidades) y geolocalizar direcciones.
El Servicio de Normalización de Datos Geográficos es una API REST. Una API es una interfaz de programación de aplicaciones1, un conjunto de rutinas que provee acceso a funciones de un determinado software. Por ejemplo, cuando buscamos una dirección en el mapa de nuestros celulares, por detrás se está realizando una consulta a una API.
Supongamos que queremos consultar los departamentos de la provincia de Córdoba. A través de una consulta web, la API de GeoRef nos devuelve determinada información. Veamos, por ejemplo, la siguiente consulta.
https://apis.datos.gob.ar/georef/api/departamentos?formato=csv&provincia=cordoba&max=10
El resultado es el siguiente:
¿Qué significa cada uno de los términos que estamos utilizando? Es necesario hacer la siguiente aclaración: los parámetros empiezan después del ? y se separan por &. Entonces, ¿qué estamos consultando?
https://apis.datos.gob.ar/georef/api/
: dirección básicadepartamentos
: unidad geográfica que nos interesa?formato=csv
: formato en qué queremos que nos brinde los dato&provincia=cordoba
: provincia de la que estamos interesados consultar&max=10
: cantidad máxima de registro que nos interesa (esto se puede cambiar)
¿Te estás preguntando cómo funciona la API? Recibe un texto y lo divide según nombre y número. Luego compara el texto con el listado de textos que están en la base de datos y busca mejor aproximación2
El Servicio de Normalización de Datos Geográficos, o la API de GeoRef, tiene varios servicios. Nosotros vamos a revisar los siguientes: normalizar nombres de unidades territoriales y normalizar direcciones. Te invito a revisar la documentación sobre la API para conocer más en detalle todas las opciones y variantes.
GeoRef en R
Para trabajar con la API de GeoRef, vamos a utilizar el paquete georefar
3, desarrollado por Patricio Del Boca. Dado que este paquete no se encuentra disponible en CRAN, para instalarlo hay que utlizar un paquete intermedio llamado devtools
4.
# Instalacion del paquete "georefar"
# install.packages("devtools")
# devtools::install_github("pdelboca/georefar")
# Cargamos el paqute "georefar"
library(georefar)
library(tidyverse)
georefar
hace que las consultas a la API sean más sencillas. Por ejemplo, utilizando la función get_departamentos()
, obtendremos la misma información que anteriormente:
get_departamentos(provincia = "cordoba",
max = 10) %>%
knitr::kable()
centroide_lat | centroide_lon | id | nombre | provincia_id | provincia_nombre |
---|---|---|---|---|---|
-31.71120 | -64.30706 | 14147 | Santa María | 14 | Córdoba |
-31.70779 | -65.15641 | 14126 | San Alberto | 14 | Córdoba |
-31.73303 | -63.47692 | 14119 | Río Segundo | 14 | Córdoba |
-31.23940 | -62.52603 | 14140 | San Justo | 14 | Córdoba |
-32.87845 | -62.79143 | 14182 | Unión | 14 | Córdoba |
-32.28771 | -63.77925 | 14161 | Tercero Arriba | 14 | Córdoba |
-33.33080 | -64.49418 | 14098 | Río Cuarto | 14 | Córdoba |
-34.61707 | -64.37876 | 14035 | General Roca | 14 | Córdoba |
-31.41707 | -64.18322 | 14014 | Capital | 14 | Córdoba |
-33.32945 | -63.60634 | 14056 | Juárez Celman | 14 | Córdoba |
GeoRef para normalizar nombres
Para normalizar nombres de unidades territoriales, vamos a crear un dataset muy sencillo que tendrá únicamente dos columnas: provincia
y departamento
. En ambas columnas vamos a escribir mal los nombres de forma intencional.
# Armo dos categorias: Provincia y Departamento
provincia <- c("buenos aires", "Buenos Aires", "bsas", "bs as", "PBA", "Provincia de Buenos Aires")
departamento <- c("olavarria", "Olavarria", "olaBariaa", "la plata", "LA PLATA", "La PPlata")
# Armo un dataframe con ambas categorias
PBA <- data.frame(provincia, departamento)
PBA %>% knitr::kable()
provincia | departamento |
---|---|
buenos aires | olavarria |
Buenos Aires | Olavarria |
bsas | olaBariaa |
bs as | la plata |
PBA | LA PLATA |
Provincia de Buenos Aires | La PPlata |
Primero arranquemos normalizando los nombres de las provincias. Para eso hacemos un loop que recorra cada una de las observaciones, realice una consulta y nos devuelva el nombre normalizado de la provincia en una columna nueva a la que llamaremos provincia_normalizada
.
# Normalizando Provincia
for (i in 1:nrow(PBA)) {
prov <- PBA$provincia[i]
provincia.normalizada <- as.character(get_provincias(nombre = prov, max = 1)[4])
PBA$provincia_normalizada[i] <- provincia.normalizada
}
Hagamos lo mismo con la columna departamento
.
# Normalizando Departamento
for (i in 1:nrow(PBA)) {
dpto <- PBA$departamento[i]
dpto.normalizada <- as.character(get_departamentos(nombre = dpto, max = 1)[4])
PBA$departamento_normalizada[i] <- dpto.normalizada
}
Veamos cómo queda finalmente nuestro dataset con nuestras nuevas columnas provincia_normalizada
y departamento_normalizada
.
PBA %>% knitr::kable()
provincia | departamento | provincia_normalizada | departamento_normalizada |
---|---|---|---|
buenos aires | olavarria | Buenos Aires | Olavarría |
Buenos Aires | Olavarria | Buenos Aires | Olavarría |
bsas | olaBariaa | Buenos Aires | NULL |
bs as | la plata | Buenos Aires | La Plata |
PBA | LA PLATA | NULL | La Plata |
Provincia de Buenos Aires | La PPlata | NULL | La Plata |
Como podemos ver, la API no pudo normalizar las últimas dos observaciones de provincia
ni olaBariaa
debido a que se alejan mucho de la versión que existe en la base de datos de nombres de provincias. Sin embargo, vemos que no tiene ningún problema en discriminar mayúsculas, minúsculas y palabras mal escritas.
GeoRef para normalizar direcciones
La API de GeoRef también se puede utilizar para normalizar direcciones. Por ejemplo, aquí vamos a tratar de normalizar la dirección “Boedo 202, Lomas de Zamora”.
boedo <- normalizar_direccion("BOEDO 00202, LOMAS DE ZAMORA", departamento = "06490")
## No encoding supplied: defaulting to UTF-8.
boedo %>% knitr::kable()
altura_unidad | altura_valor | calle_categoria | calle_cruce_1_categoria | calle_cruce_1_id | calle_cruce_1_nombre | calle_cruce_2_categoria | calle_cruce_2_id | calle_cruce_2_nombre | calle_id | calle_nombre | departamento_id | departamento_nombre | localidad_censal_id | localidad_censal_nombre | nomenclatura | piso | provincia_id | provincia_nombre | ubicacion_lat | ubicacion_lon |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NA | 202 | CALLE | NA | NA | NA | NA | NA | NA | 0649001004335 | MARIANO BOEDO | 06490 | Lomas de Zamora | 06490010 | Lomas de Zamora | MARIANO BOEDO 202, Lomas de Zamora, Buenos Aires | NA | 06 | Buenos Aires | -34.75940 | -58.40087 |
NA | 202 | CALLE | NA | NA | NA | NA | NA | NA | 0649001002855 | FELIPE BOERO | 06490 | Lomas de Zamora | 06490010 | Lomas de Zamora | FELIPE BOERO 202, Lomas de Zamora, Buenos Aires | NA | 06 | Buenos Aires | -34.75396 | -58.42918 |
En este caso, las mejores aproximaciones son BOEDO y BOERO. Luego, busca el número y asigna el segmento de las cuadras. Si tiene Latitud y Longitud, también lo provee.
La sigla API proviene del inglés Application Programming Interface↩
Si la palabra tiene 3 o menos caracteres, la API busca la el nombre exacto, si la palabra tiene entre 4 y 7 caracteres, la API permite una transformación y si tiene más de 8, permite 2 transformaciones.↩
Copyright (c) 2018 Patricio Del Boca↩
Es probable que tengas que instalarlo en tu computadora↩