Executive summary

Which types of terrorist attacks are the most deadly and how do their lethality patterns vary over time and across regions?

Terrorism is a global issue that shapes public policy and civilian safety. A deeper understanding of terrorism is required beyond simply counting incidents or casualties.The type of attack reflects strategic choices made by perpetrators, determines the mechanism of violence, and strongly shapes the scale of resulting fatalities. Identifying which methods are the most lethal enables governments and international organizations to allocate resources more effectively and prioritize prevention strategies. Lethality also varies widely across regions and over time, as terrorist groups adapt to political conditions, technological developments, and security responses. Comparing fatalities geographically and temporally reveals how tactics evolve and how local conditions such as conflict intensity, state capacity, or infrastructure influence outcomes. By focusing on lethality rather than frequency alone, this study highlights the real human cost of terrorism and supports evidence-based policy decisions aimed at reducing casualties and improving public safety. The final graph will answer our research question by showing the signigicant changes in global terrorism patterns between 1970 and 2016.

Data background

The dataset used in this project is the Global Terrorism Database (GTD), a comprehensive open-source database compiled by the National Consortium for the Study of Terrorism and Responses to Terrorism (START) at the University of Maryland. It contains records of more than 180,000 terrorist attacks worldwide from 1970 to 2017. The dataset includes detailed information such as the date and location of incidents, attack type, target type, weapon type, number of fatalities and injuries, and the group responsible.

We analyze this dataset because its richness allows us to compare the lethality of different attack types across time and regions, which is essential for addressing our research question. GTD is one of the most comprehensive public datasets of terrorist incidents around the world, it includes electronic news archives, existing data sets, secondary source materials such as books and journals, and legal documents, applying consistent coding protocols across years.The Global Terrorism Database (GTD) is already partially processed by the START research team at the University of Maryland. Key variables, such as attack type, target type, weapon type, number of fatalities, and geographic information, are standardized and coded, meaning the data is not raw text but a structured, partially cleaned dataset.

Data cleaning

For this project, we downloaded the dataset (CSV) at website Kaggle. We focused on preparing data more suitable to our research. To make data more intuitive, we selected only the variables which is relevant - iyear, region_txt, attacktype1_txt, nkill. Missing values in fatalities are replaced with zero to avoid bias in lethality calculation and missing attack type information are removed. Variable formats were standardized to ensure compatibility with temporal and categorical analyses.

gtd <- read.csv("globalterrorism.csv")
# selecting variables directly related to research
gtd_clean <- gtd %>% 
  select(iyear, region_txt, attacktype1_txt, nkill)
# missing values and information processing 
gtd_clean <- gtd_clean %>%
  mutate(nkill = ifelse(is.na(nkill), 0, nkill)) %>%
  filter(attacktype1_txt != "Unknown") %>%
  filter(!is.na(attacktype1_txt))
# Standardizng Variable formats 
gtd_clean <- gtd_clean %>%
  mutate (iyear = as.numeric(iyear),
    region_txt = as.factor(region_txt),
    attacktype1_txt = as.factor(attacktype1_txt)) %>% 
  filter(nkill >= 0)
#making clean data to csv file
write.csv(gtd_clean, "gtd_clean_data.csv")

Individual figures

Figure 1

#mean fatalities ver. 
attack_lethality <- gtd_clean %>%
  group_by(region_txt, attacktype1_txt) %>%
  summarise(mean_fatalities = mean(nkill, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'region_txt'. You can override using the
## `.groups` argument.
figure1 <- ggplot(attack_lethality,
       aes(x = attacktype1_txt,
           y = mean_fatalities,
           fill = attacktype1_txt))+ 
  geom_col() +
  facet_wrap(~ region_txt, scales = "free_y", ncol = 3) +
  scale_fill_brewer(palette = "Set3") +
  labs(title = "Deadliest Attack Types by Region",
       x = "",
       y = "Average Fatalities",
       fill = "Attack Type") +
  theme_minimal() +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

figure1

ggsave(figure1, filename = "images/figure1.png", 
       width = 10, height = 5, units = "in", bg = "transparent")

Figure 2

#total fatalities ver. 
figure2 <- ggplot(gtd_clean, aes(x = attacktype1_txt, y = nkill, fill = attacktype1_txt)) +
  geom_col() +
  facet_wrap(~ region_txt, scales = "free_y", ncol = 3) +
   scale_fill_brewer(palette = "Set3") +
  labs(title = "Deadliest Attack Types by Region",
       x = " ",
       y = "Total Fatalities",
       fill = "Attack Type") +
  theme_minimal() + 
  theme(axis.text.x = element_blank(),
      axis.ticks.x = element_blank())

figure2

ggsave(figure2, filename = "images/figure2.png", 
       width = 10, height = 5, units = "in", bg = "transparent")

For the first two graphs, we chose grouped bar charts. They allow us to clearly compare how deadly each attack type is across different regions, instead of assuming that there is one global pattern. One important thing to notice is that the scales change between regions, so we need to keep that in mind when interpreting the results. We used the Set3 color palette because it works well with categorical data and keeps the graph easy to read.

In this project, we compare the mean and the total number of fatalities. Indeed, high total fatalities do not necessarily indicate that an attack type is highly lethal per incident. The striking difference is the level of bombing/explosion, they are frequent but their average lethality. In contrast, attack types such as barricade hostage-taking and hijacking occur less often but result in far higher fatalities per incident, indicating that they are inherently more lethal. This reflects different conflict contexts, strategies of armed groups, and the impact of several large-scale incidents.

Comparing mean and total values together helps us understand not only the scale of terrorism but also how it evolves over time. Total fatalities show the overall scale of the impact, it identify politically unstable periods with widespread violence. Whereas mean fatalities reveal the severity of each attack on average. High total values may simply reflect high frequency, while high mean values indicate attacks that are extremely deadly even if it’s rare.

Our results also show that the deadliest attack types vary significantly by region. In South Asia, the Middle East, and North Africa, average fatalities are much higher. Indeed violent events like bombings, armed assaults and hostage situations tend to result in more deaths compared to other regions. In contrast, regions like North America, Western Europe and Australasia/Oceania show much lower average fatality levels across all attack types. Even when they experience attacks such as armed assaults or bombings, the average number of deaths per incident tends to remain comparatively low. which might reflect stronger emergency response systems and fewer conflict zones. However, in the total fatalities graph we can see the true scale of violence across regions. Regions such as South Asia, Middle East, North Africa and Sub-Saharan Africa have extremely high total fatalities. Regions like Western Europe, North America and Oceania have very low totals.

If we take a closer look we can see that North America has the highest lethality of hijacking on average. This is due to 9.11 attacks (2001), which result in more than two thousand fatalities. This single event is disproportionately large compared to all other incidents in the dataset, so it significantly increases the regional average. Indeed, when we look at the total graph, it is clear that hijacking fatalities are very small compared with regions where attacks are both frequent and deadly. Furthermore, we can see the same prominent pattern with hostage taking (barricade incident). High averages for rare attack types in low incident regions reflects outliers not a general pattern, which the total graph makes obvious.

Figure 3

#mean fatalities ver. 
change_lethality_time <- gtd_clean %>%
  group_by(iyear, attacktype1_txt) %>%
  summarise(mean_kill = mean(nkill, na.rm = TRUE)) 
## `summarise()` has grouped output by 'iyear'. You can override using the
## `.groups` argument.
figure3 <- ggplot(data = change_lethality_time,
            mapping = aes(x = iyear,
                          y = mean_kill)) + 
  geom_line(aes(group = attacktype1_txt),) +
  facet_wrap(~ attacktype1_txt) +
  labs(
    title = "Changes in Lethality Over Time by Attack Type",
    x = "Year",
    y = "Average Fatalities"
  ) +
  theme_minimal()

figure3 

ggsave(figure3, filename = "images/figure3.png", 
       width = 9, height = 5, units = "in", bg = "transparent")

Figure 4

#total fatalities ver. 
change_lethality_time <- gtd_clean %>%
  group_by(iyear, attacktype1_txt) %>%
  summarise(total_kill = sum(nkill, na.rm = TRUE)) 
## `summarise()` has grouped output by 'iyear'. You can override using the
## `.groups` argument.
figure4 <- ggplot(data = change_lethality_time,
            mapping = aes(x = iyear,
                          y = total_kill))+ 
  geom_line(aes(group = attacktype1_txt),) +
  facet_wrap(~ attacktype1_txt) +
  labs(
    title = "Changes in Lethality Over Time by Attack Type",
    x = "Year",
    y = "Total of Fatalities"
  ) +
  theme_minimal()

figure4

ggsave(figure4, filename = "images/figure4.png", 
       width = 9, height = 5, units = "in", bg = "transparent")

Firstly, we chose faceted line charts to allow each attack type to be viewed separately without overlapping lines or confusing colors. It highlights trends in lethality over time, making increases or decreases visible. These graphs reveals that, although most attack types maintain consistently low lethality(average 0-5) across the decades, a few extreme events in the early 2000s sharply increase the overall averages. In particular, Facility/Infrastructure Attacks, Hijackings, and Barricade-type Hostage Taking show dramatic spikes around 2001–2004. This reflects large-scale incidents such as the 9/11 attacks, the 2002 Moscow theater siege, and the 2004 Beslan school siege. These events significantly distort the mean fatalities for these attack types, while the majority of incidents in other years remain far less deadly. In fact, the total graph emphasizes rare but catastrophic events such as Bombing/Explosion. Once again, outlier events disort the overall lethality landscape. Nonetheless, most attack types rarely kill many people as it is shown in the average graph. This show that a single large-scale incident —often linked to specific political circumstances— can become extremely deadly. This pattern highlights the potential for one terrorist event to cause disproportionately high harm. The graph illustrates how isolated but severe attacks significantly shape overall lethality trends. After the mid-2000s, overall lethality appears to stabilize or decline, suggesting that although the frequency of attacks may remain high, the average number of deaths per incident has generally decreased.

Figure 5

#mean fatalities ver. 
lethality_region_year <- gtd_clean %>%
  group_by(iyear, region_txt) %>%
  summarise(mean_kill = mean(nkill, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'iyear'. You can override using the
## `.groups` argument.
figure5 <- ggplot(lethality_region_year,
       aes(x = iyear, y = mean_kill, color = region_txt,)) +
  geom_line(linewidth = 1) +
  labs(
    title = "Evolution of the Average Lethalities by Region (1970–2016)",
    x = "Year",
    y = "Average Lethalities",
    color = "Region"
  ) +
  theme_minimal()

figure5

ggsave(figure5, filename = "images/figure5.png", 
       width = 9, height = 6, units = "in", bg = "transparent")

Figure 6

#total fatalities ver. 
lethality_region_year <- gtd_clean %>%
  group_by(iyear, region_txt) %>%
  summarise(total_kill = sum(nkill, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'iyear'. You can override using the
## `.groups` argument.
figure6 <- ggplot(lethality_region_year,
       aes(x = iyear, y = total_kill, color = region_txt,)) +
  geom_line(linewidth = 1) +
  labs(
    title = "Evolution of Total Lethalities by Region (1970–2016)",
    x = "Year",
    y = "Total Lethalities",
    color = "Region"
  ) +
  theme_minimal()

figure6

ggsave(figure6, filename = "images/figure6.png", 
       width = 9, height = 6, units = "in", bg = "transparent")

In those graphs, multi-line charts were used because it compares regions directly to show which areas experience peaks or declines in lethality. Colors differentiate regions, and the continuous timeline reveals historical or political shifts.

As it is represented here and in all the graphs, some regions experience frequent but less deadly attack types, whereas others face fewer incidents that are significantly more lethal. As shown in the figure 3 and 4 : Bombings and explosions occur frequently but tend to cause relatively low average fatalities, while rare attack types such as hijackings and barricade-type hostage situations are far more lethal per incident. Over time, the lethality of attacks also fluctuates, reflecting shifts in tactical preferences, local political dynamics, etc. Different attack methods translate into harm under varying contexts. Identifying which attack types are the most lethal in specific regions and time provides valuable insight for policymakers and security agencies to prioritize resources and create counterterrorism strategies. For example, regions such as Sub-Saharan Africa requires efforts addressing weak state structures and economic vulnerability. In Eastern Europe, where hostage-taking attacks show unusually high lethality, improving rapid-response and negotiation systems is essential. Meanwhile, in North America, a reinforcement in aviation security is needed. In the average graph, we observe several sharp, isolated peaks around the early 2000s in North America specially, most regions remain close to 0 most of the time. In the total graph, an overall impact of terrorism is shown, combining both attack frequency and severity. A high value indicates either many attacks or several deadly attacks or both. It shows more stable trend because totals accumulate. There are clear upward trends specially in Middle East, North Africa, South Asia and Sub-Saharan Africa after 2000. We can interpret it as increases due to the Iraq war (2003-2011), the Afghanistan conflict and the ISIS period (Islamic State of Iraq and Syria) during the 2013 and the 2017. North America and Western Europe remain low overall. Temporally, lethality spikes sharply in the early 2000s due to a few extreme events, before stabilizing in later years.

Finally, those two graphs reveal signigicant changes in global terrorism patterns between 1970 and 2016. These trends suggest that terrorism has become more frequent and concentrated in specific regions, rather than universally more deadly per attack. Overall, the comparison shows that the global burden of terrorism has increased primarily due to a higher volume of attacks and regional instability, not because each individual attack has become more lethal. There are strong regional differences, as shown in figure 1 and 2. Beyond statistical patterns, studying lethality has important ethical implications. Each terrorist attack represents human lives lost, and interpreting data responsibly is essential to avoid normalizing violence or even reducing victims to numbers.