This report provides preliminary answers to the questions (1) which severe weather events are the most harmful to population health and (2) which severe weather events result in the greatest economic loss. Data loading and manipulation prior to analysis is presented for reproducibility. Using rough and potentially biased values, tornadoes were found to cause the most injuries and fatalities, and droughts were found to result in the highest economic losses.
The data for this analysis is originally from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database. The National Weather Service Storm Data Documentation and the National Climactic Data Center Storm Events FAQ are available for reference.
Place the data file into the working directory.
storm <- read.csv("repdata-data-StormData.csv.bz2")
R (version 3.1.1) is able to read some compressed file formats seamlessly, so there is no need to write adapter code or decompress data in preprocessing to read it.
The data set has a number of columns storing location and time data. In the interest of keeping this report brief, only the subest of data for the Event type, injury/fatality counts, and property/crop damages will be reviewed.
col.subset <- c("EVTYPE",
"FATALITIES", "INJURIES",
"PROPDMG", "PROPDMGEXP",
"CROPDMG", "CROPDMGEXP")
storm <- storm[, col.subset]
Property and crop damage numbers are reported using a number (like 4) and an associated unit (like k/B/etc). It is more useful to have simple numbers for manipulation. For this analysis, k/K indicates multiplying by a thousand, m/M indicates multiplying by one million, B indicates multiplying by one billion, h/H indicates multiplying by one hundred. Numerals should be taken as ten raised to the specified power. Characters or punctuation shall be treated as zeros; checking with the data steward is prudent to further clarify the significance of these labels.
normalize_exp <- function(x) {
if (x == "1") return(1)
if (x == "2" | x %in% c("h", "H")) return(2)
if (x == "3" | x %in% c("k", "K")) return(3)
if (x == "4") return(4)
if (x == "5") return(5)
if (x == "6" | x %in% c("m", "M")) return(6)
if (x == "7") return(7)
if (x == "8") return(8)
if (x %in% c("B")) return(9)
return(0)
}
CROPDMGEXP <- numeric(nrow(storm))
for (x in levels(storm$CROPDMGEXP)) {
mask = storm$CROPDMGEXP == x
CROPDMGEXP[mask] = rep(normalize_exp(x), sum(mask))
}
PROPDMGEXP <- numeric(nrow(storm))
for (x in levels(PROPDMGEXP)) {
mask = PROPDMGEXP == x
PROPDMGEXP[mask] = rep(normalize_exp(x), sum(mask))
}
For a rough barometer, take the sum of the fatality and injury counts to be the impact of the severe weather event on population health. Then, aggregate by the storm type and sort to assess the event types that have the highest recorded combined fatality and injury counts.
storm$FAT.INJ <- storm$FATALITIES + storm$INJURIES
a <- aggregate(FAT.INJ ~ EVTYPE, data = storm, FUN = sum)
a10 <- a[order(-a$FAT.INJ)[1:10], c("EVTYPE", "FAT.INJ")]
pie(a10$FAT.INJ, labels = a10$EVTYPE)
The pie chart above shows the relative importance of the combined fatality and injury counts for the top ten important severe weather events.
a10
## EVTYPE FAT.INJ
## 834 TORNADO 96979
## 130 EXCESSIVE HEAT 8428
## 856 TSTM WIND 7461
## 170 FLOOD 7259
## 464 LIGHTNING 6046
## 275 HEAT 3037
## 153 FLASH FLOOD 2755
## 427 ICE STORM 2064
## 760 THUNDERSTORM WIND 1621
## 972 WINTER STORM 1527
We see that tornadoes result in the highest count of fatalities and injuries. It would be interesting for further analysis to look at the cross-section of this data across time, since it could be that a couple of especially disastrous events contribute to the especially high tornado value.
For the second to the tenth most impactful weather type, we see events from different seasons, both hot and cold as well as windy.
What about the impact of events that did not make it to the top ten?
aggregate(a$FAT.INJ, list(a$EVTYPE %in% a10$EVTYPE), sum)
## Group.1 x
## 1 FALSE 18496
## 2 TRUE 137177
TRUE indicates in the top 10, and FALSE indicates it is not. Less than 12% of total fatalities and injuries are attributable to event types that were not identified as the top ten most dangerous severe weather types. This could still be significant in the context of extreme weather planning, so a wide net will be needed to adequately prepare for the different types of weather that can happen.
To gauge the economic impact of severe weather events, use the rough barometer of the sum of the property and crop damage numbers. Remember, total property damange is stored as a scientific number across two columns for each damage type.
storm$TOTALDAMAGE <- (storm$PROPDMG * 10 ^ PROPDMGEXP +
storm$CROPDMG * 10 ^ CROPDMGEXP)
a <- aggregate(TOTALDAMAGE ~ EVTYPE, data = storm, FUN = sum)
a10 <- a[order(-a$TOTALDAMAGE)[1:10], c("EVTYPE", "TOTALDAMAGE")]
pie(a10$TOTALDAMAGE, labels = a10$EVTYPE)
The pie chart above shows the relative importance of the total property and crop damage totals for the top ten important severe weather events.
a10
## EVTYPE TOTALDAMAGE
## 95 DROUGHT 13972570099
## 170 FLOOD 5662868388
## 590 RIVER FLOOD 5029472856
## 427 ICE STORM 5022179501
## 244 HAIL 3026643166
## 402 HURRICANE 2741925514
## 411 HURRICANE/TYPHOON 2607878639
## 153 FLASH FLOOD 1422737225
## 140 EXTREME COLD 1292980658
## 212 FROST/FREEZE 1094086969
It seems that droughts cause the greatest financial damage, presumably due to the crop damage. Further analysis should be conducted into the breakdown of crop vs. property damage for each high impact weather event.
In terms of total economic damage, how important are the top ten vs the rest?
aggregate(a$TOTALDAMAGE, list(a$EVTYPE %in% a10$EVTYPE), sum)
## Group.1 x
## 1 FALSE 7241733667
## 2 TRUE 41873343014
It seems that the top ten severe weather events ranked by total economic damage account for 85% of the recorded economic damages.
It should be noted that nominal values for the damage numbers have been analyzed here unadjusted for inflation. Using unadjusted numbers may bias more recent data since earlier nominal numbers will be lower but represent the same economic loss. Further analysis should investigate if the biases affect the conclusions drawn here.