Skip to content

Commit

Permalink
actualizar tutorial
Browse files Browse the repository at this point in the history
  • Loading branch information
danielredondo authored Jun 17, 2021
1 parent cf44596 commit 9b07e0e
Show file tree
Hide file tree
Showing 6 changed files with 488 additions and 3,026 deletions.
34 changes: 19 additions & 15 deletions 01_introduccion.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: "INE con R: descargando datos del Instituto Nacional de Estadística desde R"
subtitle: "Primera parte: Introducción"
author: "Daniel Redondo-Sánchez - daniel.redondo.easp@juntadeandalucia.es"
date: "11-02-2019"
date: "13-06-2021"
output:
html_document:
highlight: tango
Expand Down Expand Up @@ -35,7 +35,7 @@ Dos enlaces nos serán muy útiles para comprender este generador, e incluso no

* [Obtención de identificadores de objetos usando INEbase](https://www.ine.es/dyngs/DataLab/es/manual.html?cid=1259945947403). Permite reconocer el identificador de la operación estadística que se incluye en la URL.

### 1.2. Generar URL sabiendo número de tabla
### 1.2. Generar URL sabiendo el número de tabla

Si queremos descargar información de una URL del tipo

Expand Down Expand Up @@ -81,7 +81,7 @@ http://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/t15/p417/a2017/l0/01007.px?ti
### 2.1. Primeros pasos

Cargamos los paquetes necesarios:
```{r message=FALSE}
```{r message=FALSE, warning = FALSE}
library(httr)
library(rlist)
library(dplyr)
Expand Down Expand Up @@ -177,19 +177,23 @@ head(defunciones)

### 2.3. Ejemplo de uso

Con el data.frame obtenido, podemos trabajar. Por ejemplo:
Podemos hacer un gráfico con los datos descargados:

```{r}
```{r, warning = FALSE}
library(ggplot2)
datos <- subset(defunciones, defunciones$codigo == "01-93 I-XXII.Todas las causas" &
defunciones$sexo != "Ambos sexos" &
! defunciones$s_gest %in% c("Total", "No consta"))
ggplot(datos, aes(x = s_gest, y = Valor, fill = sexo)) +
scale_fill_manual(values=c("darkblue", "deepskyblue")) +
geom_bar(stat = "identity", position = "dodge") +
ylab("Defunciones") + xlab("Semanas de gestación") +
ggtitle("Defunciones según semanas de gestación, por sexos") +
theme(legend.position="top")
defunciones %>%
filter(
codigo == "01-93 I-XXII.Todas las causas",
sexo != "Ambos sexos",
! s_gest %in% c("Total", "No consta")
) %>%
ggplot(aes(x = s_gest, y = Valor, fill = sexo)) +
scale_fill_manual(values = c("darkblue", "deepskyblue")) +
geom_bar(stat = "identity", position = "dodge") +
ylab("Defunciones") +
xlab("Semanas de gestación") +
ggtitle("Defunciones por sexos según semanas de gestación") +
theme_classic() +
theme(legend.position = "top")
```
1,517 changes: 130 additions & 1,387 deletions 01_introduccion.html

Large diffs are not rendered by default.

67 changes: 25 additions & 42 deletions 02_descarga_avanzada.Rmd
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@

---
title: "INE con R: descargando datos del Instituto Nacional de Estadística desde R"
subtitle: "Segunda parte: Descarga avanzada. Población por provincias, por edad simple"
author: "Daniel Redondo-Sánchez"
date: "11-02-2019"
date: "13-06-2021"
output:
html_document:
highlight: tango
Expand All @@ -15,58 +14,36 @@ output:
pdf_document:
toc: yes
editor_options:
chunk_output_type: console
chunk_output_type: inline
---

# 1. Descarga de información

```{r message=FALSE}
```{r message=FALSE, warning = FALSE}
# Carga de paquetes
library(httr)
library(dplyr)
library(rlist)
library(data.table)
```

Se va a realizar una descarga de la población por provincias por edad simple de los últimos 6 periodos disponibles. La descarga puede ser lenta.

```{r}
# Como la URL es:
# http://ine.es/jaxiT3/Tabla.htm?t=9687&L=0,
# ponemos el identificador 9678
# Descargamos sin metadatos para que sea más rápido
url <- "http://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/9687?nult=5&tip=A"
url <- "http://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/9687?nult=6&tip=A"
poblacion_json <- GET(url)
```

Parece que la descarga ha sido exitosa:
La descarga ha sido exitosa:

```{r}
poblacion_json$status_code
```

pero

```{r}
content(poblacion_json)$status
```

así que solicitamos la información hasta que es descargada con éxito:

```{r descarga}
i <- 0
while(is.null(content(poblacion_json)$status) == FALSE){
i <- i + 1
cat("Durmiendo...")
Sys.sleep(5)
cat(" Obteniendo información, puede tardar unos minutos... \n")
poblacion_json <- GET(url)
ifelse(is.null(content(poblacion_json)$status) == TRUE,
print(paste0("Intento nº", i, ": Archivo descargado.")),
print(paste0("Intento nº", i, ": ", content(poblacion_json)$status)))
}
```

# 2. Procesamiento

Extraemos la información necesaria (sexo, edad, provincia) que se encuentran dentro de un mismo campo. Usamos `strsplit` para dividir la información y seleccionar la componente necesaria.
Expand All @@ -76,21 +53,19 @@ poblacion_contenido <- content(poblacion_json)
n <- length(poblacion_contenido)
for(i in 1:n){
# Medidor de proceso
# if(i %% 1000 == 0) print(paste0(i, "/", n))
dato.i <- poblacion_contenido[[i]]$Data
division <- strsplit(paste(poblacion_contenido[[i]]$Nombre), split = ". ", fixed = T)[[1]]
poblacion.i <- dato.i %>% list.select(T3_Periodo, Anyo, Valor) %>% list.stack %>%
cbind(edad = division[1]) %>%
cbind(sexo = division[3]) %>%
cbind(prov = division[2])
cbind(prov = division[2]) %>%
cbind(sexo = division[3])
ifelse(i == 1, poblacion <- poblacion.i, poblacion <- rbindlist(list(poblacion, poblacion.i)))
}
```

Podemos ver las tablas de frecuencias de los datos:

```{r}
# Tabla de frecuencias de los datos
table(poblacion$edad)
table(poblacion$sexo)
table(poblacion$prov)
Expand All @@ -105,24 +80,29 @@ poblacion$edad <- as.character(poblacion$edad)
# m = n * número de periodos añadidos, se desdobla la lista
m <- nrow(poblacion)
m
for(i in 1:m){
if(poblacion$edad[[i]] == "Total Nacional"){
poblacion$edad[[i]] = poblacion$prov[[i]]
poblacion$prov[[i]] = "Total Nacional"
}
}
```

Preprocesamos también la edad.

# Trabajamos con la edad (500 será nuestro código para el total)
```{r}
for(i in 1:m){
# Quitamos la palabra "años"
poblacion$edad[[i]] <- strsplit(poblacion$edad[[i]], " ")[[1]][1]
# El código 500 será el total de las edades
if(poblacion$edad[[i]] == "Todas") poblacion$edad[[i]] <- "500"
}
poblacion$edad <- as.numeric(poblacion$edad)
```

Los datos están listos para usarse.
```{r}
# Tabla de frecuencias de los datos
table(poblacion$edad)
Expand All @@ -133,10 +113,13 @@ table(poblacion$Anyo, poblacion$T3_Periodo)

# 3. Ejemplo de uso

```{r grafico final}
datos <- subset(poblacion, poblacion$edad != 500 & poblacion$prov == "Granada" & poblacion$sexo != "Total")
```{r grafico final, warning = FALSE}
library(ggplot2)
qplot(edad, Valor, col = sexo, data = datos, main = "Población por edad simple, por sexos. Varios periodos, Granada.",
facets = Anyo~T3_Periodo, ylim = c(0, max(datos$Valor)))
datos <- poblacion %>%
filter(edad != 500 & prov == "Granada" & sexo != "Total")
qplot(edad, Valor, col = sexo, data = datos,
main = "Población por edad simple, por sexos. Varios periodos, Granada.",
facets = Anyo ~ T3_Periodo, ylim = c(0, max(datos$Valor)))
```
1,894 changes: 312 additions & 1,582 deletions 02_descarga_avanzada.html

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Tutorial para descargar datos del Instituto Nacional de Estadística (INE) con R usando el servicio API JSON
### *Daniel Redondo Sánchez*

*Trabajo presentado en las XI Jornadas de Usuarios de R, celebradas en Madrid (2019)*

En este trabajo se describe un método de descarga de información del **Instituto Nacional de Estadística** (INE) usando R. El código es totalmente reproducible.

Se utiliza el servicio **API** (Application Programming Interface) del INE. En primer lugar, se obtiene una URL válida para la descarga, en función del tipo de información a descargar (si es una tabla con número definido, o si es un fichero PCAxis).
Expand Down
Binary file modified logos/logo_easp.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 9b07e0e

Please sign in to comment.