Overpass Turbo en divisiones políticas concretas con el operador IN

Cuando queremos buscar una etiqueta en concreto en OpenStreetMap, podemos emplear sin muchos problemas la web Overpass Turbo.  Ahora bien, si queremos ejecutar código de Overpass Turbo en divisiones políticas concretas, tendremos que dar un paso extra. Y ese paso incluye el empleo del operador IN.

Las etiquetas, para los novatos, son cada una de las categorías con su valor que adquieren los nodos, líneas, áreas o relaciones presenten en este magnífico mapa libre del mundo. Un punto (o nodo) no es nada sin las etiquetas que le indican qué es. Un banco, una carnicería, un árbol, un yacimiento, un paso de cebra, una carretera principal… son solo unas pocas de las miles de etiquetas disponibles, y que pueden verse en su wiki.

Podemos localizar una etiqueta en concreto y localizar todos los nodos (líneas, áreas o relaciones) en cualquier zona del mapa. Aunque también podemos emplear para tal fin QGIS, un fantástico software que nos permite importar datos de OSM a través de consultas de Overpass Turbo.

Consulta en Overpass: ejemplo con los yacimientos extremeños

Pongamos por un casual que estamos interesados en buscar los yacimientos arqueológicos que están en Extremadura (España). Lo primero que hacemos a es buscar la etiqueta en la wiki de OSM. Y observamos que la etiqueta para yacimientos arqueológicos es historic=archaeological_site. Si en esa página accedemos a Overpass Turbo, podremos ejecutar los códigos de ejecución.

Overpass Turbo en la wiki de OSM

Automáticamente nos aparece ya el código preparado para ejecutar y adaptado a la etiqueta en cuestión. El código que aparece ya personalizado es el siguiente:

/*
This query looks for nodes, ways and relations 
with the given key/value combination.
Choose your region and hit the Run button above!
*/
[out:json][timeout:25];
// gather results
(
  // query part for: “historic=archaeological_site”
  node["historic"="archaeological_site"]({{bbox}});
  way["historic"="archaeological_site"]({{bbox}});
  relation["historic"="archaeological_site"]({{bbox}});
);
// print results
out body;
>;
out skel qt;

Mediante la ejecución del código anterior en el área del mapa que esté visible, aparecerán los diferentes elementos que tengan esa etiqueta. Por lo tanto, nos mostrará todo lo que tenga historic=archaeological_site. Tened en cuenta que dependiendo de la cantidad de información a desplegar, pueden producirse errores. Esto podría solucionarse haciendo un poco más de zoom sobre el mapa y ejecutando nuevamente el código.

Overpass Turbo en divisiones políticas más específicas

Ejecutar códigos de Overpass Turbo en divisiones políticas concretas

Si lo que realmente queremos es delimitar la consulta a una división política tendremos que añadir el operador IN al final de la búsqueda del asistente. Como nuestra región es Extremadura, tendremos que añadirIN Extremadura. Presionamos sobre el botón superior que se llama Asistente, y escribimos la siguiente línea:

historic=archaeological_site IN Extremadura

Esta línea, como podéis ver, tiene dos partes. La primera es la etiqueta y su valor seguida de la restricción del área en concreto.

Al construir la consulta, nos personaliza el código de ejecución:

/*
This has been generated by the overpass-turbo wizard.
The original search was:
“historic=archaeological_site IN Extremadura”
*/
[out:json][timeout:25];
// fetch area “Extremadura” to search in
{{geocodeArea:Extremadura}}->.searchArea;
// gather results
(
  // query part for: “historic=archaeological_site”
  node["historic"="archaeological_site"](area.searchArea);
  way["historic"="archaeological_site"](area.searchArea);
  relation["historic"="archaeological_site"](area.searchArea);
);
// print results
out body;
>;
out skel qt;

Al ejecutar la consulta anterior, nos aparecerían solo los yacimientos arqueológicos situados dentro de la división territorial de Extremadura.

Overpass Turbo en divisiones políticas concretas con el operador IN

Intervalos de confianza de una proporción con el test binomial exacto en R

Calcular los intervalos de confianza para una proporción o un índice es muy sencillo. En R existen diferentes métodos para poder realizarlo, aunque en esta entrada vamos a emplear el test binomial exacto con la función binom.test() del paquete stats.

Los intervalos de confianza son básicos para estimar dónde puede encontrarse el parámetro de estudio con cierta precisión estadística. Es por ello que hemos tratado en algunas entradas estos puntos más en detalle, tanto aplicado a una regresión como a diferentes parámetros estadísticos. Aquí calcularemos este intervalo aplicado específicamente a proporciones de dos categorías.

Intervalos de confianza de una proporción con el test binomial en R

Calcular los intervalos de confianza de una proporción

Imaginémonos que estamos estudiando un yacimiento arqueológico donde hemos descubierto 18 esqueletos humanos. Mediante el uso de métodos antropológicos, hemos descubierto que 12 de ellos pertenecen a mujeres y 6 a hombres. Por lo tanto, la proporción sería 2:1 en favor de las mujeres.

Con estos datos, podríamos estar tentados de escribir en un artículo que en ese yacimiento existían más mujeres que hombres. Es decir, que no existía un balance equilibrado entre hombres y mujeres al esperado 1:1.

Sin embargo, para poder afirmar con rotundidad que la población no está equilibrada, tenemos que calcular los intervalos de confianza de una proporción. Como en una población normal la probabilidad de que salga hombre o mujer es 0.5 cada uno (proporción 1:1), este valor va a ser el punto de partida. Si los intervalos de confianza de la proporción incluyen este valor de 0.5, no podríamos decir que la proporción observada estuviese fuera de una proporción 1:1.

Intervalos de confianza para una proporción en R

Para poder resolver esta cuestión en R, empleamos la función binom.test() del paquete stats. La documentación detallada de este paquete se encuentra aquí., así como algún ejemplo detallado. Esta función ejecuta un test binomial exacto. Prácticamente seguro que este paquete ya lo tenéis instalado, por por si acaso lo instalamos y cargamos.

install.packages("stats", dependencies = TRUE)
library(stats)

En esta función hay que poner principalmente 5 argumentos:

  1. El número de mujeres (12).
  2. El número total de esqueletos (18).
  3. La proporción esperada, que es 1:1 (0.5).
  4. El contraste a realizar, en nuestro caso bilateral (alternative = "two.sided").
  5. El nivel de confianza (conf.level = 0.95).

Con todos los argumentos de la función de la prueba binomial escritos, la función quedaría del siguiente modo:

binom.test(12, 18,                    # número de mujeres y total
           0.5,                       # proporción ideal  
           alternative = "two.sided", # contraste
           conf.level = 0.95)         # nivel de confianza

El resultado de la ejecución del código anterior es:

 Exact binomial test

data:  12 and 18
number of successes = 12, number of trials = 18, p-value = 0.2379
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
 0.4099252 0.8665726
sample estimates:
probability of success 
             0.6666667

Las hipótesis a testear han sido:

  • H0: la proporción observada encaja con una proporción ideal 1:1 (0.5), donde machos y hembras están igualmente representados.
  • H1: la proporción observada no encaja con una proporción ideal 1:1 (0.5), por lo tanto, habría un sesgo en favor de las mujeres respecto a hombres.

El resultado indica que su p-valor es mayor de 0.05 (p-value = 0.2379), por lo que aceptamos la hipótesis nula (H0). Esto nos indica que a pesar de que se observe una proporción 2:1 en nuestro yacimento, no existe suficiente evidencia estadística para indicar que no provengan de una proporción ideal 1:1, donde ambos sexos estuvieran igualmente representados. Si atendemos al intervalo de confianza al 95% de la proporción, observamos que se sitúa entre 0.41 y 0.87. Como la proporción ideal sería 0.5, y este valor se sitúa en ese intervalo`, no existe suficiente evidencia para indicar que realmente existiera un sesgo en favor de las mujeres Obviamente este intervalo guarda una relación estrecha con el p-valor.

La prueba a la inversa da el mismo resultado

Si ejecutamos el test binomial exacto para los hombres, observamos que el p-valor es idéntico al obtenido para las mujeres. Su intervalo de confianza cambia, lógicamente, aunque el valor de 0.5 ideal también se encuentra incluido en el mismo. Esto indica nuevamente que la proporción observada podría haberse obtenido de una población sexualmente equitativa.

binom.test(6, 18,
           0.5,
           alternative = "two.sided",
           conf.level = 0.95)
 Exact binomial test

data:  6 and 18
number of successes = 6, number of trials = 18, p-value = 0.2379
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
 0.1334274 0.5900748
sample estimates:
probability of success 
             0.3333333

Seguimiento de Google Analytics en bookdown (gitbook)

Si estamos empleando RStudio para crear un libro que deseamos publicar en nuestra página web, podemos estar interesados en que tenga el código de seguimiento de Google Analytics en bookdown. Este paquete permite generar libros a partir de Markdown y exportarlos en diferentes formatos. En este caso, si exportamos nuestro libro en formato gitbook generaremos tantos archivos .html como archivos Markdown o R Markdown tengamos.  Realizar el seguimiento de Google Analytics en bookdown es más sencillo de lo que pudiera parecer. De este modo podremos controlar las estadísticas de acceso a cada una de nuestras páginas. De hecho, no es la primera vez que hablamos de Google Analytics, ya que también hemos tratado anteriormente sobre la combinación de R y Google Analytics.

Los archivos no tendrán el código de seguimiento de Google Analytics implementado. Por lo tanto, una vez publicado en nuestra web, Google Analytics no podrá hacer el seguimiento de visitas a nuestro libro. En esta entrada os voy a explicar cómo poder implementar e introducir nuestro código de seguimiento de Google Analytics en bookdown. Esto afectará a cada una de nuestras páginas del libro generados a partir de la conversión usando la función gitbook() del paquete bookdown.

Seguimiento de Google Analytics en bookdown

Seguimiento de Google Analytics en bookdown

El proceso es sencillo, y lo hemos dividido en 3 puntos principales: primero, obtener el código de seguimiento; segundo, crear un archivo HTML; y tercero, editamos el archivo _output.yml.

Obtener el código de seguimiento de Google Analytics

Obviamente, si queremos obtener el código de seguimiento, tenemos que tener una cuenta en Google Analytics. Una vez con nuestra cuenta, podemos obtener el código correspondiente. En mi caso el código es el siguiente:

<!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-73804952-1"></script>
    <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    
    gtag('config', 'UA-73804952-1');
    </script>

Creamos un archivo HTML

A continuación, en la carpeta raíz de nuestro proyecto bookdown, creamos un archivo HTML donde copiamos el código anterior de Google Analytics. En nuestro caso lo hemos llamado google_analytics.html.

Editamos el archivo _output.yml

Por último, solo nos queda editar el archivo _output.yml que se encuentra en la carpeta raíz de nuestro proyecto de libro. Añadimos dos líneas debajo de la sección bookdown::gitbook: y guardamos los cambios:

bookdown::gitbook:
  includes:
     in_header: google_analytics.html

Con esas dos líneas situadas por debajo le indicamos que nos introduzca en todas las páginas HTML creadas el código situado en el archivo google_analytics.html. Como en este caso ese archivo contiene el código de seguimiento de Google Analytics, ese será el código incluido en la cabecera de todas las páginas (<head> </head>).

De este modo, ya podremos hacer un seguimiento de las visitas a todas nuestras páginas del libro utilizando Google Analytics.

Copiar objetos de R con la función dput()

Tenéis una duda sobre programación en R y recurrís a StackOverflow para preguntar y esperar una respuesta. Como se recomienda en ese foro, la experiencia del que pregunta y del que responde mejora si se ponen ejemplos reales y fácilmente replicables y reproducibles. Sin embargo, con los datos que tenemos, hay que facilitarlos de algún modo para que nos respondan. Esto lo podemos hacer guardando los datos en algún formato (.csv por ejemplo), subiéndolos a internet y poniendo un enlace a los mismos que copiamos en el foro. Pero esto hace que los que vayan a responder se lo descarguen y carguen en sus ordenadores. En esta entrada os voy a mostrar cómo copiar objetos de R con la función dput().

Copiar objetos de R con la función dput()

Hay un paso mucho más rápido y sencillo de poder facilitarles el acceso a tus datos. Vamos a emplear un conjunto de datos contenido en R que tiene por nombre iris. Lo podemos cargar empleando la función data().

data(iris)

Imaginemos ahora que estos datos son nuestros, producidos por nosotros mismos, y que nadie más tiene acceso. Cuando nos da el error de programación, tenemos que facilitar su reproducibilidad a las posibles personas que puedan respondernos.

Como iris es un objeto grande, vamos a trabajar con sus primeras filas. Si vemos sus primeras 6 líneas con la función head(), podríamos copiar el objeto íntegro en el foro.

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Función dput() para copiar rápidamente objetos en R

Con la función dput() podemos copiar rápidamente objetos de R. De este modo, podemos copiar y pegar todo el conjunto de datos manteniendo todos los metadatos del objeto en cuestión.

dput(head(iris))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4), 
    Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9), Petal.Length = c(1.4, 
    1.4, 1.3, 1.5, 1.4, 1.7), Petal.Width = c(0.2, 0.2, 0.2, 
    0.2, 0.2, 0.4), Species = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("setosa", "versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
6L), class = "data.frame")

La ejecución de dput() nos da como resultado una función structure() con el contenido de toda información relacionada con el objeto en cuestión, incluyendo todos sus metadatos, el tipo de variables que son, etc.

Reproducibilidad del resultado de dput()

Copiando y pegando el resultado de dput(), así como añadiéndole un nombre nuevo al objeto (por ejemplo nuevo_iris), podemos replicar rápidamente el conjunto íntegro de los datos en otro ordenador.

nuevo_iris <- structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4), 
    Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9), Petal.Length = c(1.4, 
    1.4, 1.3, 1.5, 1.4, 1.7), Petal.Width = c(0.2, 0.2, 0.2, 
    0.2, 0.2, 0.4), Species = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("setosa", "versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
6L), class = "data.frame")

print(nuevo_iris) # vemos el conjunto de datos recién creado

Consultas de Overpass Turbo en QGIS: importar datos de OSM

Los que me conocéis sabréis de mi pasión por los datos geográficos libres. Dicho de otro modo, por el fabuloso proyecto OpenStreetMap (OSM), que tiene variantes como HOT y el ciclismo, entre muchos miles. En mi afán por descubrir más sobre OSM y hacer búsquedas mucho más precisas, descubrí hace tiempo Overpass Turbo. Esta plataforma permite buscar etiquetas específicas en regiones concretas del mapa, incluidas en divisiones políticas concretas. ¿Cuántas fuentes de agua potable hay en el área de Burgos? ¿Cuántos dólmenes hay en Extremadura? Son dos de las infinitas preguntas geográficas que podemos hacernos. Ahora bien, ¿y si podemos conectar Overpass Turbo con QGIS? De este modo tendríamos todo el potencial de QGIS aplicado directamente a datos descargados de OSM. Pues es posible y es de lo que voy a hablaros, de cómo realizar consultas de Overpass Turbo en QGIS.

Pero antes de seguir, vamos a contestar a la primera pregunta que nos hemos hechos: ¿cuántas fuentes de agua potable hay en Burgos? Para ello vamos a cargar esos datos exclusivamente en QGIS mediante el uso de las consultas de Overpass Turbo. Comenzamos.

Para poder tener éxito y disfrutar al máximo de QGIS con OSM tenemos que seguir tres pasos básicos:

  1. Instalar el plugin QuickOSM en QGIS.
  2. Exportar la consulta de Overpass Turbo.
  3. Importar la consulta en QGIS usando QuickOSM.

QuickOSM: plugin para realizar consultas de Overpass Turbo en QGIS

Lo primero que tenemos que hacer para poder ejecutar consultas de Overpass Turbo en QGIS es instalar un pequeño plugin de QGIS llamado QuickOSM. Para ello vamos al menú de Plugins y pinchamos sobre Manage and Install Plugins. Allí buscamos el plugin y lo instalamos. Hasta aquí facilísimo, ¿verdad?

Exportamos la consulta de Overpass Turbo

Lo segundo que tenemos que hacer es irnos a la etiqueta de las fuentes de agua potable en OSM, que se llama amenity = drinking_water. A la derecha de la página aparece en cuadro con el resumen de la etiqueta. Situado en la parte más inferior aparece un enlace que pone overpass-turbo. Al pinchar en él os vais directamente a la página de Overpass Turbo. En dicha página a la izquierda, aparece el código ya adaptado para la etiqueta que estamos buscando. Seleccionamos el área geográfica sobre la cuál queremos obtener los datos y presionamos en Ejecutar, situado en la esquina superior izquierda.

Consultas de Overpass Turbo en QGIS

Es cierto. Lo que acabamos de hacer ahora es simplemente ejecutar el código de Overpass Turbo en su página oficial. De momento no hemos nada en QGIS. Y de hecho, lo que queremos es que las consultas de Overpass Turbo se realicen desde dentro de QGIS, para poder trabajar con esos datos en ese potente software.

¿Cómo exportamos esta consulta a un lenguaje que sea entendido por QGIS y QuickOSM? Presionamos sobre el botón Exportar en la parte superior, vamos a la pestaña Consulta y presionamos sobre convertir a Overpass-XML.

Al presionar sobre convertir a Overpass-XML nos aparece otra pestaña del navegador con el código de la consulta en cuestión. En nuestro caso, sería la adaptada a las fuentes de agua potable en Burgos. Este es el código que debéis copiar y pegar en QuickOSM dentro de QGIS.

<osm-script output="json" output-config="" timeout="25">
  <union into="_">
    <query into="_" type="node">
      <has-kv k="amenity" modv="" v="drinking_water"/>
      <bbox-query s="42.291913442648" w="-3.8077926635742" n="42.409516113651" e="-3.5595703125"/>
    </query>
    <query into="_" type="way">
      <has-kv k="amenity" modv="" v="drinking_water"/>
      <bbox-query s="42.291913442648" w="-3.8077926635742" n="42.409516113651" e="-3.5595703125"/>
    </query>
    <query into="_" type="relation">
      <has-kv k="amenity" modv="" v="drinking_water"/>
      <bbox-query s="42.291913442648" w="-3.8077926635742" n="42.409516113651" e="-3.5595703125"/>
    </query>
  </union>
  <print e="" from="_" geometry="skeleton" ids="yes" limit="" mode="body" n="" order="id" s="" w=""/>
  <recurse from="_" into="_" type="down"/>
  <print e="" from="_" geometry="skeleton" ids="yes" limit="" mode="skeleton" n="" order="quadtile" s="" w=""/>
</osm-script>

Consultas de Overpass Turbo en QGIS

Una vez tengamos ya el código de la consulta exportada de Overpass Turbo-XML y el plugin QuickOSM instalado en QGIS, podemos comenzar a disfrutar. Abrimos la ventana de QuickOSM siguiendo la ruta Vector – QuickOSM – QuickOSM. En las pestañas de la izquierda vamos a Query y ahí copiamos el código XML y lo pegamos en la ventana de Overpass query.

Ya simplemente nos queda un último paso. Ejecutar este código de Overpass Turbo en QuickOSM presionando sobre Run query. Y ya está: QGIS empieza a descargar los datos de esa consulta específica y los carga automáticamente en QGIS. Vamos, una auténtica maravilla.

Las consultas de Overpass Turbo en QGIS se hacen muy fácilmente mediante el uso del plugin QuickOSM de QGIS