Synopsis

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.

Data Processing

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), ]

Results

Which types of events are most harmful to population health?

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).

Which types of events have the greatest economic consequences?

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.

Summary

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.