Data ja RStudio tutkimuksessa
Jälkitehtävä 2b
#luetaan datasta tarvittavat sarakkeet
rcols <- c('STATE', 'EVTYPE', 'FATALITIES', 'INJURIES', 'PROPDMG', 'PROPDMGEXP', 'CROPDMG', 'CROPDMGEXP')
storm.data = read.csv(bzfile('raakadataa/StormData.csv.bz2'), header=T, stringsAsFactors=F)[, rcols]
Käsittelen ensin kuolemat, joka on omassa sarakkeessaan ja tuntuu siten yksinkertaisimmalta.
Poistan muut sarakkeet ja tehdään taulukko:
#valitaan EVTYPE ja FATALITIES
fatal_data <- storm.data
fatal_data2 <- fatal_data[, c(2, 3)]
#poitetaan nollarivit, että saadaan tiiviimpää tulosta
fatal_einollia <- fatal_data2[- grep("0", fatal_data2$FATALITIES),]
#tehdään table
library(data.table)
fatal_table <- data.table(fatal_einollia)
# Summataan yhteen
numeric_cols <- which(sapply(fatal_table, is.numeric))
falalities <- fatal_table[, lapply(.SD, sum), by = "EVTYPE", .SDcols = numeric_cols]
Taulukko kuolemista
## EVTYPE FATALITIES
## 1: TORNADO 5173
## 2: TSTM WIND 504
## 3: HAIL 15
## 4: WINTER STORM 206
## 5: HURRICANE OPAL/HIGH WINDS 2
## ---
## 163: MARINE STRONG WIND 14
## 164: COASTAL FLOOD 3
## 165: STORM SURGE/TIDE 11
## 166: MARINE HIGH WIND 1
## 167: TSUNAMI 33
Data.tablesta en saanut diagrammia tehtyä, joten palataan data.frameen
#lasketaan kuolemat yhteen
lask_kuol <- aggregate(FATALITIES ~ EVTYPE, data = fatal_data2, sum)
#valitaan yli kahden sadan kuoleman ilmiöt
kuolemat_yli200 <- lask_kuol[ which(lask_kuol$FATALITIES > 200),]
#Tehdään EVTYPE-kentästä faktor
kuolemat_yli200<-transform(kuolemat_yli200, EVTYPE = factor(EVTYPE))
#Tehdään kaavio
library(ggplot2)
#teemasetti
theme_set(theme_minimal())
#ggplot
ggplot_kuolemat<-ggplot(kuolemat_yli200,aes(x=factor(EVTYPE),
y=kuolemat_yli200$FATALITIES, fill = factor(EVTYPE)),
color=factor(EVTYPE)) + geom_bar(stat="identity")
ggplot_kuolemat <- ggplot_kuolemat + xlab("Sääilmiö") +
ylab("Kuolemat") + ggtitle("Sääilmiöiden aiheuttamat kuolemat (yli 200 tapausta)") + guides(fill=FALSE) + theme(axis.text.x = element_text(angle=65, vjust=0.6))
Eniten kuolemia aiheuttaa tornado.
Seuraavaksi tutkitaan kaikkia terveyshaittoja:
#valitaan EVTYPE ja FATALITIES -kentät
terveyshaitat <- storm.data[, c(2, 3, 4)]
#lasketaan yhteen kuolemat ja vammat
lask_terveyshaitat <- aggregate(FATALITIES + INJURIES ~ EVTYPE, data = terveyshaitat, sum)
colnames(lask_terveyshaitat)[colnames(lask_terveyshaitat)=="FATALITIES + INJURIES"] <- "terveysvahingot"
# valitaan yli tuhannen tapauksen ilmiöt
vammat_yli1000 <- lask_terveyshaitat[ which(lask_terveyshaitat$terveysvahingot > 1000),]
## Tehdään taas EVTYPE-kentästä faktor
vammat_yli1000<-transform(vammat_yli1000, EVTYPE = factor(EVTYPE))
#tehdään kaavio
#teemasetti
theme_set(theme_minimal())
#ggplot
ggplot_vammat<-ggplot(vammat_yli1000,aes(x=factor(EVTYPE),
y=vammat_yli1000$terveysvahingot, fill = factor(EVTYPE)),
color=factor(EVTYPE)) + geom_bar(stat="identity")
ggplot_vammat <- ggplot_vammat + xlab("Sääilmiö") +
ylab("Terveysvahingot") + ggtitle("Sääilmiöiden aiheuttamat terveysvahingot (yli 1000 tapausta)") + guides(fill=FALSE) + theme(axis.text.x = element_text(angle=65, vjust=0.6))
Tornadot aiheuttavat eniten terveysvahinkoja.
Seuraavaksi tutkitaan taloudelliset tappiot.
Taulukon lukuja ei voi suoraaan laskea yhteen, koska niissä on erikseen kerroin. Tarvitaan laskukaava, lainattu osoitteesta: https://rstudio-pubs-static.s3.amazonaws.com/51815_5b766efe012646799965da2309ab389a.html
# Muutetaan kertoimet numeeriseen muotoon
unit2num <- function(u) {
u <- switch(u,
'+' = {0}, '-' = {0}, '?' = {0},
'h' = {2}, 'H' = {2},
'k' = {3}, 'K' = {3},
'm' = {6}, 'M' = {6},
'b' = {9}, 'B' = {9},
u)
if(u == '' | u == ' ') 0
else as.integer(u)
}
# Tehdään tyhjistä kentistä nollia
sanitize_nums <- function(x) {
if(x == '' | x == ' ') 0
else as.numeric(x)
}
# PROPDMG * PROPDMGEXP
storm.data$PROPDMG <- apply(data.frame(storm.data$PROPDMG, storm.data$PROPDMGEXP), 1, function(x) { sanitize_nums(x[1])*10^unit2num(x[2]) })
# CROPDMG * CROPDMGEXP
storm.data$CROPDMG <- apply(data.frame(storm.data$CROPDMG, storm.data$CROPDMGEXP), 1, function(x) { sanitize_nums(x[1])*10^unit2num(x[2]) })
Nyt storm.datassa on tuhojen numeroarvot kerrottu oikein. Tehdään tästä oma data.frame ja jatketaan tutkimista sillä.
#valitaan EVTYPE ja PROPDMG ja CROPDMG -kentät
taloushaitat <- storm.data[, c(2, 5, 7)]
#lasketaan yhteen DMG:t
lask_taloushaitat <- aggregate(PROPDMG + CROPDMG ~ EVTYPE, data = taloushaitat, sum)
#nimetään kenttä uudelleen
colnames(lask_taloushaitat)[colnames(lask_taloushaitat)=="PROPDMG + CROPDMG"] <- "talousvahingot"
#valitaan yli 10 miljardin tuhon aiheuttaneet ilmiöt
taloushaitat_yli10mrd <- lask_taloushaitat[ which(lask_taloushaitat$talousvahingot > 10000000000),]
## Tehdään taas EVTYPE-kentästä faktor
taloushaitat_yli10mrd<-transform(taloushaitat_yli10mrd, EVTYPE = factor(EVTYPE))
#tehdään kaavio
#teemasetti
theme_set(theme_minimal())
#ggplot
ggplot_talous<-ggplot(taloushaitat_yli10mrd,aes(x=factor(EVTYPE),
y=taloushaitat_yli10mrd$talousvahingot, fill = factor(EVTYPE)),
color=factor(EVTYPE)) + geom_bar(stat="identity")
ggplot_talous <- ggplot_talous + xlab("Sääilmiö") +
ylab("Taloudelliset vahingot") + ggtitle("Sääilmiöiden aiheuttamat taloudelliset vahingot (yli 10 mrd vahingot)") + guides(fill=FALSE) + theme(axis.text.x = element_text(angle=65, vjust=0.6))
Eniten taloudellisia vahinkoja ovat aiheuttaneet tulvat.
Tehdään vielä USA:n kartta, jossa taloudelliset vahingot näkyvät osavaltioittain.
Ohje osoitteessa: https://rstudio-pubs-static.s3.amazonaws.com/51815_5b766efe012646799965da2309ab389a.html
# osavaltioden nimet
state.data <- data.frame(state.abb, state.name)
#asennetaan paketit ja otetaan kirjastot käyttöön
library(plyr)
library(maps)
##
## Attaching package: 'maps'
## The following object is masked from 'package:plyr':
##
## ozone
library(mapproj) #Warning message: package 'mapproj' was built under R version 3.4.4
## Warning: package 'mapproj' was built under R version 3.4.4
library(RColorBrewer)
library(ggplot2)
#tehdaan data.frame, jossa vahingot, ilmiö ja osavaltio
aggr <- aggregate(CROPDMG + PROPDMG ~ EVTYPE + STATE, data = storm.data, sum)
#nimetään kentät
names(aggr) <- c('EVTYPE', 'STATE', 'ECON_IMPACT')
unique_causes <- unique(storm.data$EVTYPE)
#asetetaan siemenluku
set.seed(7722)
#värit, tein tällä kertaa terrain-väreillä
colors <- sample(colorRampPalette(c(terrain.colors(23)))(n = length(unique_causes)))
# valitaan tuhoisin ilmiö joka osavaltiossa
saggr <- ddply(aggr, 'STATE', function (X) { X$EVTYPE[X$ECON_IMPACT == max(X$ECON_IMPACT)][1] })
unique_causes <- unique(saggr$V1)
# väri liitetään ilmiöön
saggr$color <- sapply(saggr$V1, function(x) { colors[match(x, unique_causes)] })
# karttaa varten tarvitaan osavaltioiden nimet
saggr$STATE_NAME <- state.data$state.name[match(saggr$STATE, state.data$state.abb)]
# käytetään state-mappiä kartan tekemiseen
map("state", col = saggr$color, region = saggr$STATE_NAME, fill = TRUE, lty = 0, resolution = 0, projection="polyconic")
map("state", col = "black", fill = FALSE, add = TRUE, lty = 1, lwd = 1, projection="polyconic")
# selite tulee vasempaan reunaan
legend("left", unique_causes, fill = colors, cex=.60, bty = 'n')
Kartta ei ole kovin havainnollinen, joten tehdään vielä Plotlyllä kartta, jossa on tiedot myös osavaltioista.
#library(plotly)
#saggr$hover <- with(saggr, paste("Tuhoisin ilmiö", V1, "<br>State", STATE))
#plot_ly(saggr, z = saggr$V1, text = saggr$hover, locations = saggr$STATE,
# type = 'choropleth', locationmode = 'USA-states',
# marker = list(line = borders), showscale = FALSE) %>%
# layout(title = 'Osavaltiot ja eniten tuhoja aiheuttaneet ilmiöt', geo = map_options)
Tämä ei nyt enää jostain syystä toiminutkaan, joten tässä linkki lopputulokseen: http://rpubs.com/JennyKo/375773