This report analyzes the U.S. National Oceanic and Atmospheric
Administration (NOAA) Storm Database to identify which types of severe
weather events are most harmful to population health and which have the
greatest economic consequences, across the United States from 1950 to
2011. Event types (EVTYPE) are standardized (case and
whitespace only) and property/crop damage figures are converted from
their raw magnitude-code format (K/M/B) into dollar amounts. We find
that tornadoes are by far the most harmful event type
to population health, responsible for roughly 96,979 combined fatalities
and injuries — more than ten times the next-highest event type
(excessive heat). For economic consequences, floods
cause the greatest total damage (about $150 billion in combined property
and crop damage), followed by hurricanes/typhoons and
tornadoes. These results can help government and
municipal managers prioritize resources: life-safety planning should
weight tornado preparedness heavily, while economic/infrastructure
resilience investment should weight flood and hurricane mitigation
heavily.
The raw data is a bzip2-compressed CSV file. If it is not already present in the working directory, it is downloaded from the course source before being read in. Reading and parsing the ~900,000-row file is slow, so this chunk is cached.
url <- "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2"
if (!file.exists("StormData.csv.bz2")) {
download.file(url, destfile = "StormData.csv.bz2", method = "curl")
}
storm <- read.csv(bzfile("StormData.csv.bz2"), stringsAsFactors = FALSE)
dim(storm)
## [1] 902297 37
Only the columns needed for this analysis are kept: the event type and the four harm/damage measures.
storm <- storm[, c("EVTYPE", "FATALITIES", "INJURIES",
"PROPDMG", "PROPDMGEXP", "CROPDMG", "CROPDMGEXP")]
Cleaning EVTYPE: the raw
EVTYPE field has 985 distinct values, many of which are the
same event type written with different capitalization or
leading/trailing whitespace (e.g. "TSTM Wind" vs
"TSTM WIND "). We standardize by trimming whitespace and
converting to upper case, which reduces the number of distinct
categories without changing their meaning.
storm$EVTYPE <- trimws(toupper(storm$EVTYPE))
length(unique(storm$EVTYPE))
## [1] 890
Converting damage magnitude codes to dollar amounts:
PROPDMG/CROPDMG give a numeric magnitude, and
PROPDMGEXP/CROPDMGEXP give a code for its
units (K = thousands, M = millions,
B = billions, H = hundreds, a digit
0-8 = a power of ten, and blank/other symbols
are treated as no additional multiplier). We write a helper function to
convert these codes to a numeric multiplier and use it to compute an
actual dollar figure for property and crop damage for every row.
expToMultiplier <- function(x) {
x <- toupper(trimws(x))
m <- rep(0, length(x))
m[x == "H"] <- 1e2
m[x == "K"] <- 1e3
m[x == "M"] <- 1e6
m[x == "B"] <- 1e9
digit_idx <- grepl("^[0-8]$", x)
m[digit_idx] <- 10^as.numeric(x[digit_idx])
m
}
storm$propDamage <- storm$PROPDMG * expToMultiplier(storm$PROPDMGEXP)
storm$cropDamage <- storm$CROPDMG * expToMultiplier(storm$CROPDMGEXP)
storm$totalDamage <- storm$propDamage + storm$cropDamage
Finally, we compute two aggregated summaries used in the Results section: total fatalities/injuries per event type (population health), and total property/crop damage per event type (economic consequences).
healthByEvent <- aggregate(cbind(FATALITIES, INJURIES) ~ EVTYPE, data = storm, FUN = sum)
healthByEvent$totalHarm <- healthByEvent$FATALITIES + healthByEvent$INJURIES
healthByEvent <- healthByEvent[order(-healthByEvent$totalHarm), ]
econByEvent <- aggregate(cbind(propDamage, cropDamage, totalDamage) ~ EVTYPE,
data = storm, FUN = sum)
econByEvent <- econByEvent[order(-econByEvent$totalDamage), ]
The table below shows the 10 event types responsible for the most combined fatalities and injuries since 1950.
top10Health <- head(healthByEvent, 10)
top10Health
## EVTYPE FATALITIES INJURIES totalHarm
## 750 TORNADO 5633 91346 96979
## 108 EXCESSIVE HEAT 1903 6525 8428
## 771 TSTM WIND 504 6957 7461
## 146 FLOOD 470 6789 7259
## 410 LIGHTNING 816 5230 6046
## 235 HEAT 937 2100 3037
## 130 FLASH FLOOD 978 1777 2755
## 379 ICE STORM 89 1975 2064
## 677 THUNDERSTORM WIND 133 1488 1621
## 880 WINTER STORM 206 1321 1527
par(mfrow = c(1, 2), mar = c(8, 4, 3, 1))
barplot(top10Health$FATALITIES, names.arg = top10Health$EVTYPE, las = 2,
col = "firebrick", main = "Total Fatalities", ylab = "Fatalities",
cex.names = 0.8)
barplot(top10Health$INJURIES, names.arg = top10Health$EVTYPE, las = 2,
col = "darkorange", main = "Total Injuries", ylab = "Injuries",
cex.names = 0.8)
Figure 1. Total fatalities (left) and injuries (right) for the 10 event types with the greatest combined health impact, United States, 1950-2011. Tornadoes are the dominant cause of both fatalities (5633) and injuries (9.1346^{4}), together accounting for 9.6979^{4} casualties — over ten times more than the second-ranked event type, excessive heat (8428 casualties).
The table below shows the 10 event types responsible for the greatest total economic damage (property damage plus crop damage combined), in dollars.
top10Econ <- head(econByEvent, 10)
top10Econ
## EVTYPE propDamage cropDamage totalDamage
## 146 FLOOD 144657709800 5661968450 150319678250
## 364 HURRICANE/TYPHOON 69305840000 2607872800 71913712800
## 750 TORNADO 56947380614 414953270 57362333884
## 591 STORM SURGE 43323536000 5000 43323541000
## 204 HAIL 15735267456 3025954470 18761221926
## 130 FLASH FLOOD 16822723772 1421317100 18244040872
## 76 DROUGHT 1046106000 13972566000 15018672000
## 355 HURRICANE 11868319010 2741910000 14610229010
## 521 RIVER FLOOD 5118945500 5029459000 10148404500
## 379 ICE STORM 3944927860 5022113500 8967041360
damageMatrix <- t(as.matrix(top10Econ[, c("propDamage", "cropDamage")])) / 1e9
par(mar = c(8, 4, 3, 1))
bp <- barplot(damageMatrix, names.arg = rep("", ncol(damageMatrix)),
col = c("steelblue", "forestgreen"),
legend.text = c("Property damage", "Crop damage"),
args.legend = list(x = "topright"),
main = "Total Economic Damage by Event Type",
ylab = "Damage (billions of USD)")
text(x = bp, y = -max(colSums(damageMatrix)) * 0.03, labels = top10Econ$EVTYPE,
srt = 45, adj = c(1, 1), xpd = TRUE, cex = 0.8)
Figure 2. Total property and crop damage (stacked, in billions of USD) for the 10 event types with the greatest combined economic impact, United States, 1950-2011. Floods cause the most total economic damage ($150.3 billion), driven mostly by property damage, followed by hurricanes/typhoons ($71.9 billion) and tornadoes ($57.4 billion). Notably, droughts are the leading cause of crop damage specifically, even though their total economic impact ranks lower overall because property damage from drought is comparatively small.
Across all event types in the database, total combined economic damage from severe weather is approximately $477.3 billion. Tornadoes are the single greatest threat to population health by a wide margin, while floods and hurricanes/typhoons pose the greatest threat to economic resources. A municipal manager balancing life-safety and economic resilience priorities would want tornado warning/shelter infrastructure at the top of the list for protecting people, and flood/hurricane mitigation (e.g., drainage, levees, coastal defenses) at the top of the list for protecting property.