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