Context
Venezuela has been through almost two decades of on-going riots, they were particularly intense during 2014 to 2019 and recently in 2024-2025.1 This intensity was fueled by rigged elections (multiple times), basic products scarcity, hyperinflation, governmental sabotage in public universities, lack of basic services (electricity, water), corruption and the list goes on. In this tab we will focus on Venezuela, specially during these time period, and I will provide more details on the reasons and the people.
This dataframe is from ACLED, but it has more information (like event type and subtype), so it will allows us to make a more detailed overview of Venezuela’s situation.
El Pueblo
Before we look at the data, I want you to look at the names. These numbers are people, that should be on top of your head as you read the rest of this. 2
These are the registered victims of the Venezuelan riots of 2014, 2017 and 2024.
Código
library(rvest)
library(dplyr)
library(janitor)
library(stringr)
library(htmltools)
# Function to scrape and clean
scrape_victims <- function(url) {
read_html(url) |>
html_node("table") |>
html_table(fill = TRUE) |>
clean_names() |>
select(Name = nombre, Age = edad) |>
mutate(
Age = as.numeric(Age),
Name = str_remove_all(Name, "\\[.*?\\]|\\(.*?\\)")
)
}
# URLs to scrape
urls <- c(
"https://es.wikipedia.org/wiki/Anexo:Fallecidos_durante_las_protestas_en_Venezuela_de_2014",
"https://es.wikipedia.org/wiki/Anexo:Fallecidos_durante_las_protestas_en_Venezuela_de_2017",
"https://es.wikipedia.org/wiki/Anexo:Fallecidos_durante_las_protestas_en_Venezuela_de_2024"
)
# Scrape all pages
victims_list <- lapply(urls, scrape_victims)
victims_all <- bind_rows(victims_list)
# Create horizontal scroll cards with black-and-white theme
cards <- lapply(1:nrow(victims_all), function(i) {
htmltools::tags$div(
style = paste(
"flex: 0 0 200px;",
"border:1px solid #000;", # black
"border-radius:8px;",
"padding:20px;",
"margin:2px;",
"height:150px;",
"text-align:center;",
"background-color:#fff;", # white
"color:#000;", # black
"box-shadow: 2px 2px 5px rgba(0,0,0,0.2);" # shadow
),
htmltools::tags$strong(victims_all$Name[i]),
htmltools::tags$br(),
paste("Age:", victims_all$Age[i])
)
})
# Carousel container with horizontal scroll
carousel <- htmltools::tags$div(
style = paste(
"display: flex;",
"overflow-x: auto;",
"scroll-snap-type: x mandatory;",
"padding: 10px;",
"background-color:#000;" # black background
),
cards
)
htmltools::browsable(carousel)Age: 23
Age: 50
Age: 31
Age: 17
Age: 22
Age: 70
Age: 25
Age: 37
Age: 58
Age: 29
Age: 43
Age: 23
Age: 43
Age: 34
Age: 32
Age: 33
Age: 29
Age: 89
Age: 29
Age: 31
Age: 26
Age: 25
Age: 22
Age: 47
Age: 24
Age: 23
Age: 36
Age: 42
Age: NA
Age: 31
Age: 18
Age: 23
Age: 31
Age: 26
Age: 40
Age: 28
Age: 42
Age: 44
Age: 30
Age: 32
Age: 34
Age: 26
Age: 19
Age: 19
Age: 19
Age: 36
Age: 14
Age: 32
Age: 17
Age: 23
Age: 26
Age: 25
Age: 16
Age: 28
Age: 34
Age: 19
Age: 45
Age: 33
Age: 29
Age: 27
Age: 20
Age: 29
Age: 15
Age: 20
Age: 19
Age: NA
Age: NA
Age: NA
Age: NA
Age: 48
Age: 54
Age: 41
Age: 52
Age: 22
Age: 22
Age: 16
Age: 20
Age: 20
Age: 21
Age: 30
Age: 28
Age: 43
Age: 38
Age: 15
Age: 18
Age: NA
Age: 40
Age: 26
Age: 22
Age: 20
Age: 38
Age: 20
Age: 20
Age: 31
Age: 27
Age: 18
Age: 32
Age: 17
Age: 31
Age: 15
Age: 48
Age: 36
Age: 19
Age: 17
Age: 24
Age: 18
Age: 37
Age: 22
Age: 18
Age: 21
Age: 25
Age: 25
Age: 20
Age: 66
Age: 21
Age: 21
Age: 35
Age: 22
Age: 23
Age: 33
Age: 34
Age: 20
Age: 37
Age: 45
Age: 20
Age: 28
Age: 22
Age: 17
Age: 49
Age: 41
Age: 50
Age: 26
Age: 20
Age: 20
Age: 21
Age: 17
Age: 22
Age: 27
Age: 27
Age: 25
Age: 34
Age: 18
Age: 20
Age: 26
Age: 36
Age: 18
Age: 18
Age: 20
Age: 33
Age: 33
Age: 49
Age: 44
Age: 20
Age: 25
Age: 29
Age: 17
Age: 22
Age: 17
Age: 56
Age: 60
Age: 35
Age: 24
Age: 34
Age: 23
Age: 15
Age: 34
Age: 51
Age: 30
Age: 30
Age: 23
Age: 16
Age: 29
Age: 16
Age: 48
Age: 23
Age: 18
Age: 30
Age: 53
Age: 19
Age: 38
Age: 52
Age: 18
Age: 42
Age: NA
Age: 17
Age: 13
Age: 30
Age: 43
Age: 28
Age: 39
Age: 24
Age: 19
Age: 37
Age: 15
Age: 23
Age: 25
Age: 52
Age: 20
Age: 19
Age: 15
Age: 29
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Age: NA
Trends & Look Up
After a tough start, I know, we will see the evolution of Venezuela protests’ fatalities, as we did in the global case, just that this time by event type:
Código
p.vnzl <- df_vnzl |>
ggplot(aes(
x = WEEK,
y = EVENTS,
group = EVENT_TYPE,
data_id = EVENT_TYPE,
color = EVENT_TYPE
)) +
geom_line_interactive(
linewidth = 0.5,
hover_nearest = TRUE,
aes(tooltip = EVENT_TYPE)
) +
scale_color_brewer() +
labs(
x = "Weeks",
y = "Number of events",
title = "Eventful Trend",
)
p.vnzl <- girafe(ggobj = p.vnzl)
p.vnzlGiven that the frequency is by weeks, the evolution doesn’t tell much information. Therefore I provide the same look-up table as for the global case:
Código
Most Fatal Events
Coming from the previous graphs and table, I became interested in which type of sub- event (to get more specific) caused the most fatalities in total. We calculate and showcase as follows:
Código
bar.vnzl <- df_vnzl |>
group_by(SUB_EVENT_TYPE) |>
summarise(
total_fatal = sum(FATALITIES, na.rm = TRUE)
) |>
arrange(desc(total_fatal)) |>
slice_head(n = 10) |>
ggplot( aes(
x = reorder(SUB_EVENT_TYPE, total_fatal),
y = total_fatal,
tooltip = paste(
"Sub-event type:", SUB_EVENT_TYPE,
"<br>Total fatalities:", total_fatal
),
data_id = SUB_EVENT_TYPE
)
) +
geom_bar_interactive(
fill = "#003B5D",
stat = "identity",
width = 0.7
) +
coord_flip() +
theme_classic() +
labs(
x = "Sub-event type",
y = "Number of fatalities",
title = "Top 10 sub-event types by fatalities"
)
girafe(
ggobj = bar.vnzl,
options = list(
opts_hover(css = "fill:orange;"),
opts_selection(type = "none")
)
)Closure
Our national anthem is “Gloria al Bravo Pueblo”, and sadly, that is exactly what we’ve had to be. Venezuela lives in scarcity and extreme poverty, from which you can take a break from in Las Mercedes 3. Limited access to water, national ‘apagones’ that last weeks, food scarcity and hideous prices due to hyperinflation and speculation… Students who can’t study, full-time workers getting paid 3$ a month; this is the Venezuela that still fights, that goes out and riots after years of an ilegitimate government. Knowing there is no institutional back-up, that their institutions are the ones shooting at them.
Resilience should not be required to live a worthy life.
