1 Introducción

En este proyecto se realiza el raspado de datos de la web (web scraping [WS]) en R. El objetivo principal es obtener los datos del Producto Interno Bruto (PIB) departamental de Bolivia y el ranking de acuerdo a su contribución al PIB nacional.

La información de interés se encuentra almacenada en tablas para cada año desde 1988 hasta 2023 dentro de Wikipedia.

Según el análisis de datos en R, una manera eficiente de obtener esta información es a través del web scraping.

Las librerías empleadas para este proceso son:

  • library(rvest): Para realizar el WS.
  • library(janitor): Limpieza de datos y tablas.
  • library(tidyverse): Colección de funciones de otros paquetes: stringr, dplyr, magrittr, forcats…
  • library(ggplot2): Visualización

2 Extración y Limpieza de los Datos

Para obtener los datos se utiliza la siguiente url: https://es.wikipedia.org/wiki/Anexo:Departamentos_de_Bolivia_por_PIB.

#url
url <- "https://es.wikipedia.org/wiki/Anexo:Departamentos_de_Bolivia_por_PIB"

#Leer url
wiki <- read_html(url)
wiki
## {html_document}
## <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-sticky-header-enabled vector-toc-available" lang="es" dir="ltr">
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
## [2] <body class="skin--responsive skin-vector skin-vector-search-vue mediawik ...
Para extraer los datos de la tabla, se revisa el código HTML de la página y se observa que las tablas son almacenadas dentro de elementos tipo

.

De acuerdo a la literatura, los elementos HTML más comunes son:

Elementos Selecciona
<p> Párrafos
<h1>, <h2>, etc. Encabezados
<a> Enlaces
<li> Lista
<table> Tablas
#Extraer tabla
Datos <- wiki %>% 
  html_nodes("table") %>% 
  html_table()
#Iterar para conocer la dim de cada tabla
length(Datos)
## [1] 36

3 Proceso ETL

En esta etapa se desarrolla el proceso de:

  • Filtro: Dado que solo nos interesa la información de los departamentos.
  • Agregar la columnas : Dado que no se incluyen los años en las tablas de Wiki.
  • Anexo de las tablas: Se anexan todas las tablas que se encuentran anidadas en una lista, para crear una tabla normal.
#Creación de una función que automatice todo el proceso.
Fun_ETL <- function(lista_W){
  for (i in 1:length(lista_W)){
    #Filtro de datos y col de interes
    lista_W[[i]] <- lista_W[[i]][2:10,c(1:3)]
    #Agregar una columna para señalar el año de la Inf
    lista_W[[i]]["Año"] <- str_extract(names(lista_W[[i]][3]),"(\\d{4})")
    #Cambiar los nombres para Anexar las tablas
    names(lista_W[[i]]) <- c("Posicion","Departamento","PIB","Años")
    
  }
  bind_rows(lista_W)
}

#Aplicar la FUN

Dat_Econ <- Fun_ETL(Datos)
head(Dat_Econ, 7)
## # A tibble: 7 × 4
##   Posicion Departamento PIB                 Años 
##   <chr>    <chr>        <chr>               <chr>
## 1 1.º      Santa Cruz   US$ 16 314 millones 2023 
## 2 2.º      La Paz       US$ 12 408 millones 2023 
## 3 3.º      Cochabamba   US$ 8 737 millones  2023 
## 4 4.º      Tarija       US$ 2 888 millones  2023 
## 5 5.º      Potosí       US$ 2 637 millones  2023 
## 6 6.º      Chuquisaca   US$ 2 408 millones  2023 
## 7 7.º      Oruro        US$ 2 269 millones  2023

Por otra parte, la información obtenida se encuentra sucia, dado que los valores de interés (PIB) se encuentran en formato texto, lo que dificulta su análisis.

En este caso vamos a extraer los valores de la columna PIB, en una nueva columna que tenga por nombre PIB_USD y que además esté en formato tipo double.

Dat_Final <- Dat_Econ %>% 
  mutate(PIB_USD=str_replace_all(
    str_extract(PIB, "(\\d+)\\s*(\\d+)"),#Extreamos los Valores
    "\\s",#Eliminar los espacios en blanco
    "")) %>% 
  mutate(PIB_USD=as.double(PIB_USD))
head(Dat_Final)
## # A tibble: 6 × 5
##   Posicion Departamento PIB                 Años  PIB_USD
##   <chr>    <chr>        <chr>               <chr>   <dbl>
## 1 1.º      Santa Cruz   US$ 16 314 millones 2023    16314
## 2 2.º      La Paz       US$ 12 408 millones 2023    12408
## 3 3.º      Cochabamba   US$ 8 737 millones  2023     8737
## 4 4.º      Tarija       US$ 2 888 millones  2023     2888
## 5 5.º      Potosí       US$ 2 637 millones  2023     2637
## 6 6.º      Chuquisaca   US$ 2 408 millones  2023     2408

4 Visulización de la Información

4.1 Ranking de la Participación Departamental en el PIB Nacional para el 2023.

Dat_Final %>% 
  filter(Años=="2023") %>% 
mutate(Posi=str_c(Posicion,Departamento, sep=" "),
       Parti=PIB_USD/sum(PIB_USD)) %>% 
  select(Posi,PIB_USD, Parti) %>% 
  ggplot(aes(x=Posi, y=PIB_USD))+
  geom_col(fill=alpha("yellow3",.7), width = 0.8)+
  geom_text(aes(label =paste0("USD ",format(PIB_USD,big.mark = ",")," Mill")), color="darkgreen", vjust=-0.7,size=12, size.unit = "pt")+
  geom_text(aes(label =scales::percent(Parti)), color="red", vjust=1, size=12, size.unit = "pt")+
  scale_y_continuous(expand = c(0, 0), limits = c(0, 17500))+
  labs(title = "Ranking de la Participación Departamental en el PIB Nacional, 2023",
       subtitle = "(USD/%)",x="",y="")+
  theme(
    panel.background = element_rect(fill = NA),
    text = element_text(face = "bold", size=12,family = "calibri", color="red"),
    axis.ticks = element_blank(),
    axis.text.y = element_blank(),
    plot.subtitle = element_text(size = 10, color="gray30"),
    plot.title.position = "plot"
    
  )

4.2 Evolución del PIB Departamental, 1988-2023.

Dat_Final %>% 
  ggplot(aes(x=Años,y=PIB_USD, color=Departamento,group = Departamento))+
  geom_line(stat = "identity", size=1,show.legend = F)+
  scale_y_continuous(expand = expansion(add = c(0.3,4)) ,limits = c(0,17500))+
  scale_x_discrete(expand = expansion(add = c(0.3,4)))+
  geom_text(aes(label = ifelse(Años=="2023",Departamento,NA ), hjust = -0.3), size=12, 
            size.unit = "pt", show.legend = F)+
  labs(title = "Producto Interno Bruto Departamental, 1988-2023", subtitle = "Mill. USD")+
  scale_color_brewer(palette = "Paired")+
  theme_bw()+
  theme(
    axis.title = element_blank(),
    panel.grid.major.y = element_line(color=alpha("red",.7), size=1,linetype=3),
    panel.grid.major.x = element_blank(),
    text = element_text(face = "bold", color = "black", size=12,family = "calibri"),
    plot.title.position = "plot",
    plot.title = element_text(color="yellow3"),
    plot.subtitle = element_text(size=10, color="grey30"),
    axis.text.x = element_text(angle = 45),
    axis.ticks.length.x = unit(.25, "cm")
  )

4.3 Comparación de la Participación Departamental en el PIB Nacional, 2000 vs 2023.

Dat_Final %>% 
  select(.,Departamento,Años,PIB_USD) %>% 
  filter(Años %in% c("2023","2000")) %>% 
  group_by(Años) %>% 
  pivot_wider(names_from = Años, values_from = PIB_USD) %>% 
  adorn_percentages(denominator = "col") %>% 
  ggplot()+
  geom_segment(aes(x=reorder(Departamento,`2023`), 
                   xend =Departamento, y=`2000`, yend = `2023`), color=alpha("yellow3",.7), size=1.5)+
  geom_point(aes(x=Departamento,y=`2023`, color="2023"),size=3)+
  geom_point(aes(x=Departamento,y=`2000`, color="2000"), size=3)+
  scale_y_continuous(limits = c(0,0.4), n.breaks = 10, labels = scales::percent)+
  labs(title = "Participación del PIB Departamental en el Nacional, 2000 vs 2023",x="",y="Participación",
       colour="Años")+
  coord_flip()+
  scale_color_manual(values = c("2023"="darkgreen",
                                "2000"="red3"))+
  theme_bw()+
  theme(
    plot.title = element_text(color = "darkgreen"),
    text = element_text(face = "bold", size = 12,family = "calibri"),
    plot.title.position = "plot",
    legend.position = "top",
    legend.justification = "left",
    legend.location = "plot"
    )

5 Conclusiones

De acuerdo al reporte, las conclusiones que se pueden obtener son:

  • En 2023, Santa Cruz lidera la contribución en el PIB nacional con aproximadamente 16,314 millones de USD (32.98%), seguido por el departamento de La Paz.

  • Con relación a la evolución del PIB por departamentos, se puede observar que a partir de 2003 departamentos pertenecientes al eje central y Tarija experimentaron un proceso de despegue hasta la actualidad, con excepción de Tarija, que a partir de 2014 experimenta un quiebre dado que la tendencia cambia (decreciente), llegando en 2023 a confundirse entre los demás departamentos en términos de PIB.

  • Por otra parte, cuando se compara la contribución del PIB departamental en el nacional en dos períodos distintos (2000 y 2023), se puede notar una diferencia positiva marcada en el departamento de Santa Cruz con relación al resto. La contribución de Santa Cruz al PIB nacional desde 2000 a 2023, según datos de Wikipedia, se incrementó en aproximadamente 3 pp. Por otra parte, también se puede notar que en este mismo periodo, en 5 de los 9 departamentos, la contribución experimentó un retroceso.