This analysis examines the U.S. National Oceanic and Atmospheric Administration (NOAA) Storm Database to identify severe weather events associated with the greatest impacts on population health and the economy. Population health impacts are assessed using the total number of fatalities and injuries associated with each event type. Economic consequences are assessed using reported property and crop damages after converting the corresponding damage exponents into monetary values. The results show that tornadoes have the greatest overall impact on population health when fatalities and injuries are considered together. Floods have the greatest overall economic consequences when property and crop damages are combined. These findings provide a quantitative overview of the severe weather events associated with the largest historical human and economic impacts in the United States.
library(tidyverse)
storm_data <- read.csv(
"repdata_data_StormData.csv.bz2",
stringsAsFactors = FALSE
)
dim(storm_data)
## [1] 902297 37
names(storm_data)
## [1] "STATE__" "BGN_DATE" "BGN_TIME" "TIME_ZONE" "COUNTY"
## [6] "COUNTYNAME" "STATE" "EVTYPE" "BGN_RANGE" "BGN_AZI"
## [11] "BGN_LOCATI" "END_DATE" "END_TIME" "COUNTY_END" "COUNTYENDN"
## [16] "END_RANGE" "END_AZI" "END_LOCATI" "LENGTH" "WIDTH"
## [21] "F" "MAG" "FATALITIES" "INJURIES" "PROPDMG"
## [26] "PROPDMGEXP" "CROPDMG" "CROPDMGEXP" "WFO" "STATEOFFIC"
## [31] "ZONENAMES" "LATITUDE" "LONGITUDE" "LATITUDE_E" "LONGITUDE_"
## [36] "REMARKS" "REFNUM"
head(storm_data)
## STATE__ BGN_DATE BGN_TIME TIME_ZONE COUNTY COUNTYNAME STATE EVTYPE
## 1 1 4/18/1950 0:00:00 0130 CST 97 MOBILE AL TORNADO
## 2 1 4/18/1950 0:00:00 0145 CST 3 BALDWIN AL TORNADO
## 3 1 2/20/1951 0:00:00 1600 CST 57 FAYETTE AL TORNADO
## 4 1 6/8/1951 0:00:00 0900 CST 89 MADISON AL TORNADO
## 5 1 11/15/1951 0:00:00 1500 CST 43 CULLMAN AL TORNADO
## 6 1 11/15/1951 0:00:00 2000 CST 77 LAUDERDALE AL TORNADO
## BGN_RANGE BGN_AZI BGN_LOCATI END_DATE END_TIME COUNTY_END COUNTYENDN
## 1 0 0 NA
## 2 0 0 NA
## 3 0 0 NA
## 4 0 0 NA
## 5 0 0 NA
## 6 0 0 NA
## END_RANGE END_AZI END_LOCATI LENGTH WIDTH F MAG FATALITIES INJURIES PROPDMG
## 1 0 14.0 100 3 0 0 15 25.0
## 2 0 2.0 150 2 0 0 0 2.5
## 3 0 0.1 123 2 0 0 2 25.0
## 4 0 0.0 100 2 0 0 2 2.5
## 5 0 0.0 150 2 0 0 2 2.5
## 6 0 1.5 177 2 0 0 6 2.5
## PROPDMGEXP CROPDMG CROPDMGEXP WFO STATEOFFIC ZONENAMES LATITUDE LONGITUDE
## 1 K 0 3040 8812
## 2 K 0 3042 8755
## 3 K 0 3340 8742
## 4 K 0 3458 8626
## 5 K 0 3412 8642
## 6 K 0 3450 8748
## LATITUDE_E LONGITUDE_ REMARKS REFNUM
## 1 3051 8806 1
## 2 0 0 2
## 3 0 0 3
## 4 0 0 4
## 5 0 0 5
## 6 0 0 6
The data set contains 902,297 observations and 37 variables
The variables relevant to population health are:
Aggregating fatalities and injuries by event type:
health <- storm_data %>%
group_by(EVTYPE) %>%
summarise(
fatalities = sum(FATALITIES, na.rm = TRUE),
injuries = sum(INJURIES, na.rm = TRUE)
) %>%
mutate(total = fatalities + injuries) %>%
arrange(desc(total))
Displaying top 10:
head(health,10)
## # A tibble: 10 × 4
## EVTYPE fatalities injuries total
## <chr> <dbl> <dbl> <dbl>
## 1 TORNADO 5633 91346 96979
## 2 EXCESSIVE HEAT 1903 6525 8428
## 3 TSTM WIND 504 6957 7461
## 4 FLOOD 470 6789 7259
## 5 LIGHTNING 816 5230 6046
## 6 HEAT 937 2100 3037
## 7 FLASH FLOOD 978 1777 2755
## 8 ICE STORM 89 1975 2064
## 9 THUNDERSTORM WIND 133 1488 1621
## 10 WINTER STORM 206 1321 1527
Creating a variable representing the combined health impact:
health$Total<- health$fatalities+ health$injuries
Sorting the results:
health <- health[order(-health$Total), ]
head(health, 10)
## # A tibble: 10 × 5
## EVTYPE fatalities injuries total Total
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 TORNADO 5633 91346 96979 96979
## 2 EXCESSIVE HEAT 1903 6525 8428 8428
## 3 TSTM WIND 504 6957 7461 7461
## 4 FLOOD 470 6789 7259 7259
## 5 LIGHTNING 816 5230 6046 6046
## 6 HEAT 937 2100 3037 3037
## 7 FLASH FLOOD 978 1777 2755 2755
## 8 ICE STORM 89 1975 2064 2064
## 9 THUNDERSTORM WIND 133 1488 1621 1621
## 10 WINTER STORM 206 1321 1527 1527
For the economic analysis, we need:
The damage values cannot simply be added because PROPDMGEXP and CROPDMGEXP specify their magnitude. For example, K, M, and B represent thousand, million, and billion.
Therefore, we need to create a function to convert the exponents
damage_multiplier <- function(x) {
x <- toupper(as.character(x))
result <- rep(1, length(x))
result[x == "H"] <- 10^2
result[x == "K"] <- 10^3
result[x == "M"] <- 10^6
result[x == "B"] <- 10^9
numeric_exp <- x %in% as.character(0:8)
result[numeric_exp] <- 10^as.numeric(x[numeric_exp])
result
}
calculating actual property and crop damages:
storm_data$property_damage <-
storm_data$PROPDMG *
damage_multiplier(storm_data$PROPDMGEXP)
storm_data$crop_damage <-
storm_data$CROPDMG *
damage_multiplier(storm_data$CROPDMGEXP)
calculating total economic damage:
storm_data$total_damage <-
storm_data$property_damage +
storm_data$crop_damage
Aggregating by event type
economic <- storm_data %>%
mutate(
property_damage = PROPDMG * damage_multiplier(PROPDMGEXP),
crop_damage = CROPDMG * damage_multiplier(CROPDMGEXP),
total_damage = property_damage + crop_damage
) %>%
group_by(EVTYPE) %>%
summarise(
property_damage = sum(property_damage, na.rm = TRUE),
crop_damage = sum(crop_damage, na.rm = TRUE),
total_damage = sum(total_damage, na.rm = TRUE)
) %>%
arrange(desc(total_damage))
Viewing 10 event types with the greatest economic damage:
head(economic, 10)
## # A tibble: 10 × 4
## EVTYPE property_damage crop_damage total_damage
## <chr> <dbl> <dbl> <dbl>
## 1 FLOOD 144657709807 5661968450 150319678257
## 2 HURRICANE/TYPHOON 69305840000 2607872800 71913712800
## 3 TORNADO 56947380676. 414953270 57362333946.
## 4 STORM SURGE 43323536000 5000 43323541000
## 5 HAIL 15735267513. 3025954473 18761221986.
## 6 FLASH FLOOD 16822673978. 1421317100 18243991078.
## 7 DROUGHT 1046106000 13972566000 15018672000
## 8 HURRICANE 11868319010 2741910000 14610229010
## 9 RIVER FLOOD 5118945500 5029459000 10148404500
## 10 ICE STORM 3944927860 5022113500 8967041360
top_health <- head(health, 10)
par(mar = c(5, 11, 4, 2))
barplot(
rev(top_health$Total),
names.arg = rev(top_health$EVTYPE),
horiz = TRUE,
las = 1,
xlab = "Total Fatalities and Injuries",
main = "Weather Events Most Harmful to Population Health"
)
Tornadoes have by far the greatest combined impact on population health, with 96,979 reported fatalities and injuries. Excessive heat ranks second with 8,428 combined casualties, followed by thunderstorm wind (TSTM WIND) with 7,461 and floods with 7,259. The exceptionally large number associated with tornadoes is primarily driven by reported injuries.
top_economic <- head(economic, 10)
top_economic$billions <-
top_economic$total_damage / 10^9
par(mar = c(5, 11, 4, 2))
barplot(
rev(top_economic$billions),
names.arg = rev(top_economic$EVTYPE),
horiz = TRUE,
las = 1,
xlab = "Total Economic Damage (Billions of Dollars)",
main = "Weather Events with Greatest Economic Consequences"
)
Floods have the greatest overall economic impact, producing approximately $150.32 billion in combined property and crop damage. Hurricane/typhoon events rank next at approximately $71.91 billion, followed by tornadoes at approximately $57.36 billion and storm surges at approximately $43.32 billion. Thus, although tornadoes dominate the population-health results, floods account for the largest total economic losses.
The analysis demonstrates that the weather events with the greatest population-health impacts are not necessarily those with the greatest economic consequences. Tornadoes account for the largest combined number of fatalities and injuries, while floods account for the greatest combined property and crop damage. These results highlight different dimensions of the historical impacts of severe weather events across the United States.