Synopsis

This analysis uses the NOAA Storm Data database to identify the event types that have caused the greatest harm to population health and the largest economic losses in the United States. Population-health impact is summarized by reported fatalities and injuries. Economic impact is summarized by inflation-unadjusted property and crop damage. Under the reproducible cleaning rules described below, tornadoes have the largest combined health impact, while floods have the largest combined property and crop damage.

Data processing

options(scipen = 999)

data_file <- "repdata_data_StormData.csv"

storm <- read.csv(
  data_file,
  stringsAsFactors = FALSE,
  fileEncoding = "latin1"
)

needed <- c(
  "EVTYPE", "FATALITIES", "INJURIES",
  "PROPDMG", "PROPDMGEXP", "CROPDMG", "CROPDMGEXP"
)

storm <- storm[, needed]
storm$event_type <- toupper(trimws(storm$EVTYPE))

The raw EVTYPE labels are converted to uppercase and stripped of surrounding spaces. They are otherwise retained exactly, avoiding subjective combinations of different NOAA labels. Damage exponents are decoded as H = hundreds, K = thousands, M = millions, and B = billions. Numeric exponents are interpreted as powers of ten; blank or unrecognized symbols use a multiplier of one.

damage_multiplier <- function(x) {
  x <- toupper(trimws(as.character(x)))
  out <- rep(1, length(x))
  out[x == "H"] <- 1e2
  out[x == "K"] <- 1e3
  out[x == "M"] <- 1e6
  out[x == "B"] <- 1e9

  numeric_code <- grepl("^[0-9]+$", x)
  out[numeric_code] <- 10 ^ as.numeric(x[numeric_code])
  out
}

storm$property_damage <- storm$PROPDMG * damage_multiplier(storm$PROPDMGEXP)
storm$crop_damage <- storm$CROPDMG * damage_multiplier(storm$CROPDMGEXP)

Events most harmful to population health

fatalities <- aggregate(FATALITIES ~ event_type, storm, sum, na.rm = TRUE)
injuries <- aggregate(INJURIES ~ event_type, storm, sum, na.rm = TRUE)
health <- merge(fatalities, injuries, by = "event_type", all = TRUE)
health[is.na(health)] <- 0
health$total_casualties <- health$FATALITIES + health$INJURIES
health <- health[order(-health$total_casualties), ]
health_top10 <- head(health, 10)
health_top10
##            event_type FATALITIES INJURIES total_casualties
## 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
health_plot <- health_top10[order(health_top10$total_casualties), ]
health_matrix <- rbind(health_plot$FATALITIES, health_plot$INJURIES)

par(mar = c(5, 13, 4, 2) + 0.1)
barplot(
  health_matrix,
  names.arg = health_plot$event_type,
  horiz = TRUE,
  las = 1,
  col = c("#C44E52", "#4C72B0"),
  xlab = "Reported fatalities and injuries",
  main = "Event types with the largest population-health impact"
)
legend(
  "bottomright",
  legend = c("Fatalities", "Injuries"),
  fill = c("#C44E52", "#4C72B0"),
  bty = "n"
)

Tornadoes rank first by a wide margin, with 5,633 reported fatalities and 91,346 injuries (96,979 combined). Excessive heat ranks second by combined casualties, followed by thunderstorm wind (TSTM WIND) and floods. Because fatalities and injuries measure different severity levels, both components are displayed rather than assigning an arbitrary monetary value to health outcomes.

Events with the greatest economic consequences

property <- aggregate(property_damage ~ event_type, storm, sum, na.rm = TRUE)
crop <- aggregate(crop_damage ~ event_type, storm, sum, na.rm = TRUE)
economic <- merge(property, crop, by = "event_type", all = TRUE)
economic[is.na(economic)] <- 0
economic$total_damage <- economic$property_damage + economic$crop_damage
economic <- economic[order(-economic$total_damage), ]
economic_top10 <- head(economic, 10)
economic_top10
##            event_type property_damage crop_damage total_damage
## 146             FLOOD    144657709807  5661968450 150319678257
## 364 HURRICANE/TYPHOON     69305840000  2607872800  71913712800
## 750           TORNADO     56947380677   414953270  57362333947
## 591       STORM SURGE     43323536000        5000  43323541000
## 204              HAIL     15735267513  3025954473  18761221986
## 130       FLASH FLOOD     16822723979  1421317100  18244041079
## 76            DROUGHT      1046106000 13972566000  15018672000
## 355         HURRICANE     11868319010  2741910000  14610229010
## 521       RIVER FLOOD      5118945500  5029459000  10148404500
## 379         ICE STORM      3944927860  5022113500   8967041360
economic_plot <- economic_top10[order(economic_top10$total_damage), ]
economic_matrix <- rbind(
  economic_plot$property_damage / 1e9,
  economic_plot$crop_damage / 1e9
)

par(mar = c(5, 13, 4, 2) + 0.1)
barplot(
  economic_matrix,
  names.arg = economic_plot$event_type,
  horiz = TRUE,
  las = 1,
  col = c("#55A868", "#DD8452"),
  xlab = "Reported damage (billions of U.S. dollars)",
  main = "Event types with the greatest economic consequences"
)
legend(
  "bottomright",
  legend = c("Property damage", "Crop damage"),
  fill = c("#55A868", "#DD8452"),
  bty = "n"
)

Floods rank first, with approximately $144.66 billion in reported property damage and $5.66 billion in crop damage, or $150.32 billion combined. Hurricane/typhoon events rank second, followed by tornadoes and storm surge. These dollar amounts are nominal values from the source data and are not adjusted for inflation.

Conclusion and limitations

The analysis indicates that tornado preparedness is especially important for population health, while flood preparedness is especially important for limiting economic losses. The NOAA database spans a long historical period, and reporting practices, event-label conventions, coverage, and dollar values vary over time. Consequently, the results describe the recorded database rather than a perfectly standardized risk estimate. Exact event labels were retained so the analysis is transparent and reproducible.