Synopsis

This report analyses the impact of severe weather events on public health and the economy across the United States from 1950 to 2011. The data were obtained from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database, which tracks major storms and weather events, including estimates of fatalities, injuries, property damage, and crop damage. The analysis identifies tornadoes as the most harmful event type to population health, causing the highest number of fatalities (5633) and injuries (91,346). Excessive heat and flash floods follow tornadoes in terms of fatalities, while thunderstorm winds and floods rank second and third for injuries.

In terms of economic impact, floods cause the greatest property damage, amounting to 134.5 billion USD, followed by hurricanes/typhoons and storm surges. For crop damage, droughts are the most impactful, causing 13.2 billion USD in losses, with ice storms and river floods each resulting in 5 billion USD in crop damage. The report focuses on the top ten events for each damage type to highlight the most significant threats. These findings highlilghts the need for targeted preparedness and mitigation efforts to address the substantial impacts of tornadoes, floods, and droughts. The comprehensive analysis provides crucial insights for prioritising resources and enhancing resilience against the most damaging severe weather events.

Data Processing

The data were loaded into R and processed for analysis using the following steps:

Importing necessary libraries

# Import necessary packages
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(cowplot)
## Warning: package 'cowplot' was built under R version 4.3.3

Reading in the data

The data were obtained from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database. This database tracks characteristics of major storms and weather events in the United States, including when and where they occur, as well as estimates of any fatalities, injuries, property and crop damage.

The data were read into a data frame, taking care to handle the compressed file format and ensuring that missing values were correctly identified.

# Download the zip file and read in the data
temp <- tempfile()
download.file("https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2", temp)
data <- read.csv(bzfile(temp), header = TRUE, sep = ",", quote = "\"", na.strings = "")
unlink(temp)

Examining the data

After loading the data, I examined the first few rows of the dataset. The dataset contains 902,297 rows and 37 columns:

# Examine the dimension of the table
dim(data)
## [1] 902297     37
Population health and economic consequences from severe weather events:

Next, I examined the columns of interest, which include severe weather events, their start dates, fatalities count, injuries count, and estimates of property and crop damage:

# Looking at the first 6 rows of columns of interest
head(data[,c(2, 8, 23:28)])
##             BGN_DATE  EVTYPE FATALITIES INJURIES PROPDMG PROPDMGEXP CROPDMG
## 1  4/18/1950 0:00:00 TORNADO          0       15    25.0          K       0
## 2  4/18/1950 0:00:00 TORNADO          0        0     2.5          K       0
## 3  2/20/1951 0:00:00 TORNADO          0        2    25.0          K       0
## 4   6/8/1951 0:00:00 TORNADO          0        2     2.5          K       0
## 5 11/15/1951 0:00:00 TORNADO          0        2     2.5          K       0
## 6 11/15/1951 0:00:00 TORNADO          0        6     2.5          K       0
##   CROPDMGEXP
## 1       <NA>
## 2       <NA>
## 3       <NA>
## 4       <NA>
## 5       <NA>
## 6       <NA>
# Looking at the last 6 rows of columns of interest
tail(data[,c(2, 8, 23:28)])
##                  BGN_DATE         EVTYPE FATALITIES INJURIES PROPDMG PROPDMGEXP
## 902292 11/28/2011 0:00:00 WINTER WEATHER          0        0       0          K
## 902293 11/30/2011 0:00:00      HIGH WIND          0        0       0          K
## 902294 11/10/2011 0:00:00      HIGH WIND          0        0       0          K
## 902295  11/8/2011 0:00:00      HIGH WIND          0        0       0          K
## 902296  11/9/2011 0:00:00       BLIZZARD          0        0       0          K
## 902297 11/28/2011 0:00:00     HEAVY SNOW          0        0       0          K
##        CROPDMG CROPDMGEXP
## 902292       0          K
## 902293       0          K
## 902294       0          K
## 902295       0          K
## 902296       0          K
## 902297       0          K

There are two variables of interest representing population health damages caused by severe weather events: fatalities and injuries. Here, I extract those columns and provide brief summaries for them.

# Producing summary statistics
fatalities <- data$FATALITIES
summary(fatalities)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##   0.0000   0.0000   0.0000   0.0168   0.0000 583.0000
# Producing summary statistics
injuries <- data$INJURIES
summary(injuries)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##    0.0000    0.0000    0.0000    0.1557    0.0000 1700.0000

There are two variables of interest representing economic consequences from severe weather events: property damage and crop damage estimates in dollars. However, as suggested in the National Weather Service Storm Data Documentation, “[the] … estimates should be rounded to three significant digits, followed by an alphabetical character signifying the magnitude of the number, i.e., 1.55B for $1,550,000,000. Alphabetical characters used to signify magnitude include “K” for thousands, “M” for millions, and “B” for billions. (see p.12)“. Therefore, to interpret the cohesive values of property damage (PROPDMG) and crop damage (CROPDMG), I need to combine the significant digits with the magnitude character, i.e., multiply PROPDMG by PROPDMGEXP and CROPDMG by CROPDMGEXP, respectively. These calculations are performed in the Data Transformation section below.

Data transformation

  1. Property damage estimates (in dollar): Here I calculate the estimated property damage (a new variable “adjusted_PROGDMG”) using PROPDMG and PROPDMGEXP variables and print brief summaries for it (in Bln USD):
# Convert the estimates into cohesive dollar unit
data <- data %>%
  mutate(adjusted_PROPDMG = case_when(
    PROPDMGEXP == "K" ~ PROPDMG * 1000,
    PROPDMGEXP == "M" ~ PROPDMG * 1000000,
    PROPDMGEXP == "B" ~ PROPDMG * 1000000000,
    TRUE ~ PROPDMG  # Default case if none of the above conditions are met
  ))

# Convert the total_damage values to billions unit
data$adjusted_PROPDMG <- data$adjusted_PROPDMG / 1000000000

# Round to the nearest one decimal place
data$adjusted_PROPDMG <- round(data$adjusted_PROPDMG, digits = 1)

# Print summary statistics
summary(data$adjusted_PROPDMG)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.00e+00 0.00e+00 0.00e+00 3.90e-04 0.00e+00 1.15e+02
  1. Crop damage estimates (in dollar): Here I calculate the estimated crop damage (a new variable “adjusted_CROPDMG”) using CROPDMG and CROPDMGEXP variables and print brief summaries for it (in Bln USD):
# Convert the estimates into cohesive dollar unit
data <- data %>%
  mutate(adjusted_CROPDMG = case_when(
    CROPDMGEXP == "K" ~ CROPDMG * 1000,
    CROPDMGEXP == "M" ~ CROPDMG * 1000000,
    CROPDMGEXP == "B" ~ CROPDMG * 1000000000,
    TRUE ~ CROPDMG  # Default case if none of the above conditions are met
  ))

# Convert the total_damage values to billions unit
data$adjusted_CROPDMG <- data$adjusted_CROPDMG / 1000000000

# Round to the nearest one decimal place
data$adjusted_CROPDMG <- round(data$adjusted_CROPDMG, digits = 1)

# Print summary statistics
summary(data$adjusted_CROPDMG)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.0e+00 0.0e+00 0.0e+00 4.1e-05 0.0e+00 5.0e+00
  1. Calculating total number of health damages by each weather event and filtering the top ten contributing events by each health damage type: Below, I calculate total number of population health damages caused by severe weather events and filter for the top 10 events that contribute to each of the damages:
# Calculate top ten severe weather events in terms of total number of fatalities
top_ten_fatalities <- data %>%
  group_by(EVTYPE) %>%
  summarise(damage_number = sum(FATALITIES)) %>%
  arrange(desc(damage_number)) %>%
  slice_head(n=10)

# Calculate top ten severe weather events in terms of total number of injuries
top_ten_injuries <- data %>%
  group_by(EVTYPE) %>%
  summarise(damage_number = sum(INJURIES)) %>%
  arrange(desc(damage_number)) %>%
  slice_head(n=10)
  1. Calculating total monetary estimates of property and crop damages by each weather event and filtering the top ten contributing events by each health damage type: Here, I calculate total economic consequences (measures in monetary terms) caused by severe weather events and filter for the top 10 events that contribute to each of the damages:
# Calculate top ten severe weather events in terms of property damage estimates
top_ten_propdmg_events <- data %>%
  group_by(EVTYPE) %>%
  summarise(damage_estimates = sum(adjusted_PROPDMG)) %>%
  arrange(desc(damage_estimates)) %>%
  slice_head(n=10)

# Calculate top ten severe weather events in terms of crop damage estimates
top_ten_cropdmg_events <- data %>%
  group_by(EVTYPE) %>%
  summarise(damage_estimates = sum(adjusted_CROPDMG)) %>%
  arrange(desc(damage_estimates)) %>%
  slice_head(n=10)

Results

Unique severe weather events

There are 985 unique severe weather events in the data:

# count unique types of event types:
length(unique(data$EVTYPE))
## [1] 985

Fatalities

Summary statistics

summary(data$FATALITIES)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##   0.0000   0.0000   0.0000   0.0168   0.0000 583.0000

Top ten severe weather events contributing to total number of fatalities

print(top_ten_fatalities)
## # A tibble: 10 × 2
##    EVTYPE         damage_number
##    <chr>                  <dbl>
##  1 TORNADO                 5633
##  2 EXCESSIVE HEAT          1903
##  3 FLASH FLOOD              978
##  4 HEAT                     937
##  5 LIGHTNING                816
##  6 TSTM WIND                504
##  7 FLOOD                    470
##  8 RIP CURRENT              368
##  9 HIGH WIND                248
## 10 AVALANCHE                224

Injuries

Summary statistics

summary(data$INJURIES)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##    0.0000    0.0000    0.0000    0.1557    0.0000 1700.0000

Top ten severe weather events contributing to total number injuries

print(top_ten_injuries)
## # A tibble: 10 × 2
##    EVTYPE            damage_number
##    <chr>                     <dbl>
##  1 TORNADO                   91346
##  2 TSTM WIND                  6957
##  3 FLOOD                      6789
##  4 EXCESSIVE HEAT             6525
##  5 LIGHTNING                  5230
##  6 HEAT                       2100
##  7 ICE STORM                  1975
##  8 FLASH FLOOD                1777
##  9 THUNDERSTORM WIND          1488
## 10 HAIL                       1361

Property damage

Summary statistics

summary(data$adjusted_PROPDMG)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.00e+00 0.00e+00 0.00e+00 3.90e-04 0.00e+00 1.15e+02

Top ten severe weather events contributing to property damage in terms of estimated monetary value (in bln USD unit)

print(top_ten_propdmg_events)
## # A tibble: 10 × 2
##    EVTYPE            damage_estimates
##    <chr>                        <dbl>
##  1 FLOOD                        134. 
##  2 HURRICANE/TYPHOON             68.9
##  3 STORM SURGE                   43  
##  4 TORNADO                       24  
##  5 HURRICANE                     11.5
##  6 HAIL                          10.2
##  7 TROPICAL STORM                 6.9
##  8 FLASH FLOOD                    6.8
##  9 WINTER STORM                   5.9
## 10 RIVER FLOOD                    5

Crop damage

Summary statistics

summary(data$adjusted_CROPDMG)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.0e+00 0.0e+00 0.0e+00 4.1e-05 0.0e+00 5.0e+00

Top ten severe weather events contributing to crop damage in terms of estimated monetary value (in bln USD unit)

print(top_ten_cropdmg_events)
## # A tibble: 10 × 2
##    EVTYPE            damage_estimates
##    <chr>                        <dbl>
##  1 DROUGHT                       13.2
##  2 ICE STORM                      5  
##  3 RIVER FLOOD                    5  
##  4 FLOOD                          2.4
##  5 HURRICANE/TYPHOON              2.4
##  6 HURRICANE                      2.3
##  7 EXTREME COLD                   1.3
##  8 FROST/FREEZE                   0.8
##  9 FLASH FLOOD                    0.7
## 10 EXCESSIVE HEAT                 0.5

Answer to questions

Question 1: Across the United States, which types of events (as indicated in the EVTYPE variable) are most harmful with respect to population health?

Answer:

In order to answer to the question, I below investigate the top 10 severe weather events in terms of total number of fatalities and total number of injuries caused to population health. This would help understand what are the most harmful severe weather events with respect to population health:

# Create the bar chart for property damage by events
p1 <- ggplot(top_ten_fatalities, aes(x = reorder(EVTYPE, -damage_number), y = damage_number)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = damage_number), vjust = -0.5, size = 2.5) +
  labs(title = "Fatalities (1950-2011)",
       x = "Top 10 events",
       y = "Total Fatalities") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8)) +
  ylim(0, 100000)

# Create the bar chart for crop damage by events
p2 <- ggplot(top_ten_injuries, aes(x = reorder(EVTYPE, -damage_number), y = damage_number)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = damage_number), vjust = -0.5, size = 2.5) +
  labs(title = "Injuries (1950-2011)",
       x = "Top 10 events",
       y = "Total Injuries") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8)) +
  ylim(0, 100000)

# Combine the two plots into one layout using cowplot
combined_plot <- plot_grid(p1, p2, ncol = 2, align = "h", axis = "tb")

# Display the combined plot
print(combined_plot)

Based on the analysis of severe weather events from 1950 to 2011 as shown in the above panel plot, it is evident that tornadoes are the most harmful with respect to population health across the United States. Tornadoes account for the highest number of both fatalities and injuries, with 5633 recorded deaths and 91,346 injuries. Excessive heat and flash floods follow in causing fatalities, with 1903 and 978 deaths, respectively. In terms of injuries, thunderstorm winds and floods are the next most harmful events, resulting in 6957 and 6789 injuries, respectively.

These findings indicate that tornadoes pose the greatest threat to population health, causing both the highest fatalities and injuries among severe weather events. This analysis, focusing on the top ten events for each damage type, highlights the significant impact of tornadoes on public health, necessitating targeted preparedness and mitigation efforts.

Question 2: Across the United States, which types of events have the greatest economic consequences?

Answer:

In order to answer to the question, I create below a panel bar plot exhibiting total property and crop damage estimates contributed by top ten severe weather events:

# Create the bar chart for property damage by events
p3 <- ggplot(top_ten_propdmg_events, aes(x = reorder(EVTYPE, -damage_estimates), y = damage_estimates)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = damage_estimates), vjust = -0.5, size = 3) +
  labs(title = "Property damage estimates (1950-2011)",
       x = "Top 10 events",
       y = "Total Damage (Bln USD)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8)) +
  ylim(0, 140)

# Create the bar chart for crop damage by events
p4 <- ggplot(top_ten_cropdmg_events, aes(x = reorder(EVTYPE, -damage_estimates), y = damage_estimates)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = damage_estimates), vjust = -0.5, size = 3) +
  labs(title = "Crop damage estimates (1950-2011)",
       x = "Top 10 events",
       y = "Total Damage (Bln USD)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8)) +
  ylim(0, 140)

# Combine the two plots into one layout using plot_grid
combined_plot2 <- plot_grid(p3, p4, ncol = 2, align = "h", axis = "tb")

# Display the combined plot
print(combined_plot2)

Based on the analysis of severe weather events from 1950 to 2011 and the plot shown above, it is evident that floods have the greatest economic consequences across the United States. Floods account for the highest property damage, amounting to 134.5 billion USD. Hurricanes/typhoons and storm surges follow, causing 68.9 billion USD and 43 billion USD in property damage, respectively. Tornadoes also contribute significantly with 24 billion USD in property damage.

For crop damage, droughts are the most impactful, causing 13.2 billion USD in losses. Ice storms and river floods each result in 5 billion USD in crop damage, while floods also contribute notably with 2.4 billion USD in crop damage.

These findings indicate that floods and droughts are the most economically damaging severe weather events, with floods affecting both property and crops significantly, and droughts primarily impacting agriculture. This analysis, focusing on the top ten events for each damage type, highlights the critical need for resource prioritisation and preparedness for these events to mitigate their substantial economic impacts.