讀取資料

data1 <- read.csv("C:/Users/Lenovo/Desktop/titanic.csv", header=T)
head(data1)
##                                  name gender age class fare group
## 1        ALLEN, Miss Elisabeth Walton      1  29     1  211      
## 2 ALLISON, Mr Hudson Joshua Creighton      0  30     1  151      
## 3           ALLISON, Mrs Bessie Waldo      1  25     1  151      
## 4         ALLISON, Miss Helen Loraine      1   2     1  151      
## 5       ALLISON, Master Hudson Trevor      0   1     1  151      
## 6                  ANDERSON, Mr Harry      0  47     1   26      
##        joined         job boat survival
## 1 Southampton                2        1
## 2 Southampton Businessman             0
## 3 Southampton                         0
## 4 Southampton                         0
## 5 Southampton               11        1
## 6 Southampton Stockbroker    3        1

整理資料

將乘客及員工分開之資料分開,並將資料中為9999的值視為遺失值而剃除

cus <- data1[data1$class %in% c(1,2,3),]
boa <- data1[!data1$class %in% c(1,2,3),]

cus <- cus[!cus$fare == 9999,]
cus <- cus[!cus$age == 9999,]
boa <- boa[!boa$age == 9999,]

船員及乘客的基本敘述統計

由於原始資料沒有說明性別中0和1代表的性別,由船員的性別分布結果來看,我推論0為男性,1為女性

#乘客年齡分布
summary(cus$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   21.00   27.00   29.35   37.00   74.00
#船員年齡分布
summary(boa$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   14.00   24.00   30.00   30.65   36.00   62.00
#乘客性別分布
table(cus$gender)
## 
##   0   1 
## 826 459
#船員性別分布
table(boa$gender)
## 
##   0   1 
## 864  23

問題ㄧ 是否獨自乘船的死亡率

此處僅使用乘客資料,要探討的問題為「是否以單獨身分在船上」的乘客死亡率。

使用的方式為將姓名字串以逗號分隔後,將同樣姓氏的人設為ㄧ家人,並創造一個新變數後,1表示單獨在船上,0則表示船上有家人。

此方法或許嚴謹性不足因只要同姓氏就會被算成ㄧ家人,若有更齊全的船員背景資料則能做更嚴謹的分析,但這裡做出的結果事有差異的:有家庭在船上的死亡率低於單獨在船上的,估計是因為家庭會幫助自己家中的老弱婦孺先行上船,單身的人則也較是在災難時幫助別人上船的。

nam <- strsplit(as.character(cus$name),",",fixed = T)
a1 <- unlist(nam)
a2 <- a1[seq(1,length(a1)-2,2)]
fam <- names(table(a2)[table(a2)>1])
cus$lastname <- a2
cus$singal <- rep(1,1285)
cus$singal[cus$lastname %in% fam] = 0
af <- table(cus$survival,cus$singal)
#家庭搭船死亡率
af[1,1] / (af[1,1]+af[2,1]) 
## [1] 0.5770548
#單獨搭船死亡率
af[1,2] / (af[1,2]+af[2,2]) 
## [1] 0.6590585

問題二 高消費者的上救生艇率

由summary函數得到票價的第三四分位距為31元,故把大於31元的票價定義為高消費族群後,再與是否上救生艇做出列聯表,從結果可以發現票價高能上救生艇的比率顯著的較ㄧ般的乘客來的高,直接拿是否為高價位票價乘客的死亡率做比較後,更能得出票價高有較高存活率的結論。

library(dplyr)
## Warning: package 'dplyr' was built under R version 3.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
rich <- select(cus,fare,boat,survival) %>%
  filter(fare > summary(cus$fare)[5])
table(rich$boat)
## 
##       1  10  11  12  13  14  15  16   2   3   4   5   6   7   8   9   A 
## 123   4  12  11   0   3  12   0   0   6  21  23  22  16  13  20   7   3 
##   B   C   D 
##   1   5   8
#票價貴的上救生艇率
a1 <- sum(table(rich$boat)[-1]) / sum(table(rich$boat))
#不分票價乘客的上救生艇率
a2 <- sum(table(cus$boat)[-1]) / sum(table(cus$boat))
aa <- as.data.frame(cbind(a1,a2))
names(aa) <- c('票價貴的上救生艇率','不分票價乘客的上救生艇率')
print(aa)
##   票價貴的上救生艇率 不分票價乘客的上救生艇率
## 1          0.6032258                0.3782101
#票價貴的死亡率
a3 <- table(rich$survival)[1] / sum(table(rich$survival))
#不分票價的死亡率
a4 <- table(cus$survival)[1] / sum(table(cus$survival))
aa2 <- as.data.frame(cbind(a3,a4))
names(aa2) <- c('票價貴的死亡率','不分票價的死亡率')
print(aa2)
##   票價貴的死亡率 不分票價的死亡率
## 0      0.3967742        0.6217899

問題三 老弱婦孺的死亡率

從資料的年齡分布來看,我取小於20歲及大於50歲做為小孩及老人的年齡,在比較死亡率後,可以看出老人及小孩的死亡率是顯著低於所有人的比例的。

接著因為是想查看老弱婦孺,因此把性別也納入考量,真正的「老弱婦孺」跟所有人的死亡率做比較的話差異極大,但把女性的死亡率單獨抓出來才發現,女性的死亡率本來就偏低,因此把整個老弱婦孺的死亡率都拉低了。

cus <- data1[data1$class %in% c(1,2,3),]
boa <- data1[!data1$class %in% c(1,2,3),]
cus <- cus[!cus$fare == 9999,]
cus <- cus[!cus$age == 9999,]
boa <- boa[!boa$age == 9999,]
allb <- rbind(cus,boa)
barplot(table(cut(allb$age,seq(1,71,10))))

weak <- select(allb,gender,age,survival) %>%
  filter(age > 50|age < 20)
table(weak$survival)
## 
##   0   1 
## 283 148
#老少的死亡率
b1 <- table(weak$survival)[1] / sum(table(weak$survival))
#所有人的死亡率
b2 <- table(allb$survival)[1] / sum(table(allb$survival))
bb <- as.data.frame(cbind(b1,b2))
names(bb) <- c('老少的死亡率','所有人的死亡率')
print(bb)
##   老少的死亡率 所有人的死亡率
## 0    0.6566125       0.735267
#老弱婦孺的死亡率
weakg <- select(allb,gender,age,survival) %>%
  filter(age > 50|age < 20 , gender==1)
b3 <- table(weakg$survival)[1] / sum(table(weakg$survival))
#所有女性死亡率
fem <- select(allb,gender,age,survival) %>%
  filter(gender==1)
b4 <- table(fem$survival)[1] / sum(table(fem$survival))
bb2 <- as.data.frame(cbind(b3,b4))
names(bb2) <- c('老弱婦孺的死亡率','所有女性的死亡率')
print(bb2)
##   老弱婦孺的死亡率 所有女性的死亡率
## 0        0.3377483        0.3381743