¿Por qué vivimos tantos españoles a tanta altitud?

Perdóneseme haber usado lenguaje causal en el título de esta entrada siendo así que no encontrará el lector indicios sólidos de respuesta en lo que sigue. Y, sobre todo, que no se confunda y me tome por un sociólogo a la violeta o un economista posmo: no, soy matemático.

Quiero simplemente hacer constar un pequeño ejercicio de análisis espacial usando los paquetes sf y terra de R motivado, eso sí, por una pregunta que se planteó en cierto foro a raíz de esta captura de la Wikipedia:

Le llamaba la atención al preguntador por qué aparecían tantos municipios españoles en dicha lista.

Las razones que aventuro sin mayor prueba y sin el sostén del análisis de los datos que sigue son dos:

  • Que España tiene grandes extensiones de terreno llano a gran altura, las mesetas.De hecho, siempre había oído hablar —spoiler: como se verá, es información o incierta o desfasada— que España es el segundo país de Europa en altitud media.
  • Que estamos lo suficientemente cerca del ecuador como para que el clima a esa altitud no sea particularmente extremoso. En eso no somos tampoco excepción: piénsese, p.e., en Ecuador o Colombia.

Quise —sin éxito, como se verá; o muy parcial e inconclusivo, a lo sumo— tratar de apoyar el primer punto en datos. En particular, estudiar la distribución de alturas del territorio nacional con el de los demás países de cierta entidad de Europa más allá de la consabida media.

[Ir más allá de la media —o el efecto medio— y estudiar la distribución completa —o el efecto en subgrupos— va a ser, me temo, el leitmotiv de muchas entradas que tengo planeadas este año.]

Así que, por un lado, he bajado las fronteras administrativas de los países europeos (de aquí) en formato vectorial y, por el otro, datos de altitud media en celdas de, aproximadamente, 1 km de lado (de aquí) para toda Europa.

[En realidad, lo de 1 km es simplemente indicativo y depende de la latitud. De hecho, el tamaño de las celdas está definido en fracciones de grado y, por eso, en particular, hay muchas más celdillas en Suecia que en España, a pesar de ser este último un país más extenso.]

El resultado, con los países ordenados por altitud mediana, es este:

[¡Diríase que Italia cumple la ley de Benford!]

Y el código, por referencia,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
library(terra)
library(giscoR)
library(sf)
library(ggplot2)

# source of data:
# https://topotools.cr.usgs.gov/gmted_viewer/viewer.htm
# https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units/countries

alt <- rast("/tmp/elevation1x1_new.tif")

a1 <- rast("/tmp/gmted2010/30N000E_20101117_gmted_mea300.tif")
a2 <- rast("/tmp/gmted2010/30N030W_20101117_gmted_mea300.tif")
a3 <- rast("/tmp/gmted2010/50N000E_20101117_gmted_mea300.tif")
a4 <- rast("/tmp/gmted2010/50N030W_20101117_gmted_mea300.tif")

tmp <- gisco_countrycode[gisco_countrycode$continent == "Europe",]
tmp <- tmp[!is.na(tmp$ISO3_CODE),]

countries <- tmp$ISO3_CODE
countries <- countries[countries != "ALA"]
countries <- countries[countries != "RUS"]
countries <- countries[countries != "VAT"]
countries <- countries[countries != "UKR"]
countries <- countries[countries != "GIB"]
countries <- countries[countries != "MCO"]
countries <- countries[countries != "JEY"]
countries <- countries[countries != "GGY"]
countries <- countries[countries != "SMR"]
countries <- countries[countries != "LIE"]
countries <- countries[countries != "AND"]

foo <- function(altitudes, borders){
  tmp <- terra::extract(altitudes, borders)
  colnames(tmp) <- c("id", "altitude")
  tmp
}

res <- lapply(countries, function(country){
  print(country)
  borders <- gisco_get_countries(
      country = country)
  borders <- st_transform(borders,
    terra::crs(a1))
  borders <- vect(borders)
  alt1 <- foo(a1, borders)
  alt2 <- foo(a2, borders)
  alt3 <- foo(a3, borders)
  alt4 <- foo(a4, borders)
  alt <- do.call(rbind, list(alt1, alt2,
    alt3, alt3))
  alt$country <- country
  alt
})

kk <- do.call(rbind, res)
kk <- na.omit(kk)
kk$altitude[kk$altitude > 2000] <- 2000

kk$country <- factor(kk$country)
kk$country <- reorder(kk$country,
    -kk$altitude, median)

ggplot(kk, aes(x = altitude)) +
  geom_histogram(
      aes(y=..density..), bins = 20) +
  facet_wrap(~ country, ncol = 4,
    scales = "free_y") +
  xlab("") + ylab("") +
  theme_classic() +
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank())

ggsave("/tmp/distribucion_altitudes_europa.png",
       height = 21, width = 12, units = "cm")