Esperanza de vida por provincias España 1975-2022

MORTALIDAD
GPKG
DEMOGRAFÍA
ESPAÑA
PROVINCIAS
Autor/a
Afiliación

Universitat de València

Fecha de publicación

10 de mayo de 2024

Input

En España, el INE se refiere al Instituto Nacional de Estadística. Este organismo público tiene como objetivo principal la producción y difusión de estadísticas oficiales de España. Dispone de miles de bases de datos abiertas de temática muy variada a nivel nacional.

El conjunto de datos a analizar corresponde a la Esperanza de Vida al Nacimiento a nivel provincial. Este dataframe contiene la esperanza de vida al nacer, sin distinción de sexos, de cada provincia desde 1975 hasta 2022.

URL directa a la web de descarga aquí.

Descripcion

Cargamos las librerías necesarias:

Importamos la base de datos, dado que el archivo es XLSx y hay comentarios en celdas que no pertenecen al dataset, seleccionamos la matriz de celdas que nos interesan.

datos <- readxl::read_xlsx("data/espvida_prov_75_22.xlsx", range = "A7:AW60", col_names = F)
head(datos)
# A tibble: 6 × 49
  ...1   ...2  ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10 ...11 ...12 ...13
  <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 <NA>   2022  2021  2020  2019  2018  2017  2016  2015  2014  2013  2012  2011 
2 Ambos… <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
3 02 Al… 82.99 83.21 81.36 83.31 83.36 83.47 83.14 82.87 82.66 82.84 82.65 82.43
4 03 Al… 82.62 82.21 82.42 83.09 82.69 82.68 82.85 82.51 82.66 82.57 81.99 82.17
5 04 Al… 81.31 80.61 81.2  81.93 81.14 81.75 81.7  81.11 81.82 81.58 81.03 80.79
6 01 Ar… 84.13 84.31 83.59 84.76 84.32 83.89 84.18 83.49 84.38 83.36 83.53 83.04
# ℹ 36 more variables: ...14 <chr>, ...15 <chr>, ...16 <chr>, ...17 <chr>,
#   ...18 <chr>, ...19 <chr>, ...20 <chr>, ...21 <chr>, ...22 <chr>,
#   ...23 <chr>, ...24 <chr>, ...25 <chr>, ...26 <chr>, ...27 <chr>,
#   ...28 <chr>, ...29 <chr>, ...30 <chr>, ...31 <chr>, ...32 <chr>,
#   ...33 <chr>, ...34 <chr>, ...35 <chr>, ...36 <chr>, ...37 <chr>,
#   ...38 <chr>, ...39 <chr>, ...40 <chr>, ...41 <chr>, ...42 <chr>,
#   ...43 <chr>, ...44 <chr>, ...45 <chr>, ...46 <chr>, ...47 <chr>, …

Como podemos observar, a pesar de haber importado las celdas de interés, el conjunto de datos no está preparado para trabajar.

Tratamiento

Empezamos eliminando la segunda fila, cuya aportación es que los datos son de ambos sexos.

datos <- datos[-2, ]
head(datos)
# A tibble: 6 × 49
  ...1   ...2  ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10 ...11 ...12 ...13
  <chr>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 <NA>   2022  2021  2020  2019  2018  2017  2016  2015  2014  2013  2012  2011 
2 02 Al… 82.99 83.21 81.36 83.31 83.36 83.47 83.14 82.87 82.66 82.84 82.65 82.43
3 03 Al… 82.62 82.21 82.42 83.09 82.69 82.68 82.85 82.51 82.66 82.57 81.99 82.17
4 04 Al… 81.31 80.61 81.2  81.93 81.14 81.75 81.7  81.11 81.82 81.58 81.03 80.79
5 01 Ar… 84.13 84.31 83.59 84.76 84.32 83.89 84.18 83.49 84.38 83.36 83.53 83.04
6 33 As… 82.46 82.75 82.1  82.84 82.64 82.59 82.38 82.21 82.11 82.19 81.52 81.3 
# ℹ 36 more variables: ...14 <chr>, ...15 <chr>, ...16 <chr>, ...17 <chr>,
#   ...18 <chr>, ...19 <chr>, ...20 <chr>, ...21 <chr>, ...22 <chr>,
#   ...23 <chr>, ...24 <chr>, ...25 <chr>, ...26 <chr>, ...27 <chr>,
#   ...28 <chr>, ...29 <chr>, ...30 <chr>, ...31 <chr>, ...32 <chr>,
#   ...33 <chr>, ...34 <chr>, ...35 <chr>, ...36 <chr>, ...37 <chr>,
#   ...38 <chr>, ...39 <chr>, ...40 <chr>, ...41 <chr>, ...42 <chr>,
#   ...43 <chr>, ...44 <chr>, ...45 <chr>, ...46 <chr>, ...47 <chr>, …

Lo siguiente es fijar las variables con las que trabajaremos.

# Extraemos la primera fila como nombres de las variables
nombres_columnas <- as.character(datos[1, ])

# Eliminamos la primera fila del data frame
datos <- datos[-1, ]

# Asignamos los nombres de las variables al data frame
names(datos) <- nombres_columnas

head(datos)
# A tibble: 6 × 49
  ``       `2022` `2021` `2020` `2019` `2018` `2017` `2016` `2015` `2014` `2013`
  <chr>    <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
1 02 Alba… 82.99  83.21  81.36  83.31  83.36  83.47  83.14  82.87  82.66  82.84 
2 03 Alic… 82.62  82.21  82.42  83.09  82.69  82.68  82.85  82.51  82.66  82.57 
3 04 Alme… 81.31  80.61  81.2   81.93  81.14  81.75  81.7   81.11  81.82  81.58 
4 01 Arab… 84.13  84.31  83.59  84.76  84.32  83.89  84.18  83.49  84.38  83.36 
5 33 Astu… 82.46  82.75  82.1   82.84  82.64  82.59  82.38  82.21  82.11  82.19 
6 05 Ávila 83.41  83.57  82.24  83.95  83.44  83.32  83.28  82.57  83.15  82.88 
# ℹ 38 more variables: `2012` <chr>, `2011` <chr>, `2010` <chr>, `2009` <chr>,
#   `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>, `2004` <chr>,
#   `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>, `1999` <chr>,
#   `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>, `1994` <chr>,
#   `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>, `1989` <chr>,
#   `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>, `1984` <chr>,
#   `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>, `1979` <chr>, …

La columna de las provincias sigue sin titulo, además contiene dos valores, el código y el nombre de prvincia, que dividiremos en dos variables.

# Ponemos nombre provisional a la columna de las provincias
names(datos)[1] <- "PROV"

# Dividimos la variable PROV en cpro (codigo provincia) y nombrepro (nombre de provincia)
datos$CPRO <- substr(datos$PROV, 1, 2) # Extraemos los dos primeros caracteres como cpro
datos$NOMBREPRO <- substr(datos$PROV, 4, nchar(datos$PROV)) # Extraemos el resto como nombrepro

# Eliminamos la variable PROV
datos <- datos[,-1]

# Reordenamos las variables colocando las recientemente creadas al principio
datos <- datos %>% 
  select(CPRO, NOMBREPRO, everything())

head(datos)
# A tibble: 6 × 50
  CPRO  NOMBREPRO `2022` `2021` `2020` `2019` `2018` `2017` `2016` `2015` `2014`
  <chr> <chr>     <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
1 02    Albacete  82.99  83.21  81.36  83.31  83.36  83.47  83.14  82.87  82.66 
2 03    Alicante… 82.62  82.21  82.42  83.09  82.69  82.68  82.85  82.51  82.66 
3 04    Almería   81.31  80.61  81.2   81.93  81.14  81.75  81.7   81.11  81.82 
4 01    Araba/Ál… 84.13  84.31  83.59  84.76  84.32  83.89  84.18  83.49  84.38 
5 33    Asturias  82.46  82.75  82.1   82.84  82.64  82.59  82.38  82.21  82.11 
6 05    Ávila     83.41  83.57  82.24  83.95  83.44  83.32  83.28  82.57  83.15 
# ℹ 39 more variables: `2013` <chr>, `2012` <chr>, `2011` <chr>, `2010` <chr>,
#   `2009` <chr>, `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>,
#   `2004` <chr>, `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>,
#   `1999` <chr>, `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>,
#   `1994` <chr>, `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>,
#   `1989` <chr>, `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>,
#   `1984` <chr>, `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>, …

El dataframe está preparado para trabajar con él. No obstante, sigue sin poder ser representado. Para ello:

# Importamos el sf de las provincias españolas
spain <- mapSpain::esp_get_prov()
spain <- spain %>%
  dplyr::select(codauto, cpro, geometry)

# Juntamos el df de la esperanza de vida y el df de españa
datos <- inner_join(datos, spain, by=c("CPRO"="cpro"))
datos <- datos %>% 
  select(codauto, CPRO, NOMBREPRO, geometry,everything())

# Convertimos el df a sf para que pueda ser representado
datos_sf <- st_as_sf(datos, crs = 4258) 

head(datos)
# A tibble: 6 × 52
  codauto CPRO  NOMBREPRO                   geometry `2022` `2021` `2020` `2019`
  <chr>   <chr> <chr>             <MULTIPOLYGON [°]> <chr>  <chr>  <chr>  <chr> 
1 08      02    Albacete   (((-0.92896 38.78681, -0… 82.99  83.21  81.36  83.31 
2 10      03    Alicante/… (((-0.036857 38.88119, -… 82.62  82.21  82.42  83.09 
3 01      04    Almería    (((-1.640825 37.38238, -… 81.31  80.61  81.2   81.93 
4 16      01    Araba/Ála… (((-2.547264 43.08767, -… 84.13  84.31  83.59  84.76 
5 03      33    Asturias   (((-4.536122 43.40053, -… 82.46  82.75  82.1   82.84 
6 07      05    Ávila      (((-4.729031 41.15078, -… 83.41  83.57  82.24  83.95 
# ℹ 44 more variables: `2018` <chr>, `2017` <chr>, `2016` <chr>, `2015` <chr>,
#   `2014` <chr>, `2013` <chr>, `2012` <chr>, `2011` <chr>, `2010` <chr>,
#   `2009` <chr>, `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>,
#   `2004` <chr>, `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>,
#   `1999` <chr>, `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>,
#   `1994` <chr>, `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>,
#   `1989` <chr>, `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>, …

Output

Hemos obtenido un nuevo objeto sf, con 52 observaciones y 52 variables

# Convertimos el df a sf para que pueda ser representado
datos_sf <- st_as_sf(datos, crs = 4258) 

class(datos_sf)
[1] "sf"         "tbl_df"     "tbl"        "data.frame"
dim(datos_sf)
[1] 52 52

Representamos el conjunto de datos obtenido.

# Representaremos la esperanza de vida en 2021
espvida2021 <- as.numeric(datos$'2021')

# Mapa de calor
ggplot() +
  geom_sf(data = datos_sf, aes(fill = espvida2021)) +  
  scale_fill_gradient(low = "darkblue", high = "yellow", name = "Esperanza de vida") +  
  labs(title = "Esperanza de vida por provincias en España") +
  theme_minimal()

sf::st_write(datos_sf, "esp_vida_prov.gpkg")

El dataset resultante queda disponible para su descarga aquí.



Proyecto de Innovación Educativa Emergente (PIEE-2737007)