下記サイトでRのチュートリアルがあったので、Exploratryでもできるか試してみた。
https://www.kaggle.com/jasonm/large-families-not-good-for-survival
下記ページからデータをダウンロードし、Exploratryでインポートする。
https://www.kaggle.com/c/titanic/data
まずはデータの特徴を把握するために可視化した。
下記の設定で散布図を作成した。
X軸:年齢
Y軸:階級
繰り返し:性別
色:生存(1が生存、0が死亡)
階級の低い男性の生存率が高い。
対して階級の高い男女の生存確率が低くなっている。
筋力とかが関係してるのかな。
このチュートリアルは家族の多さが生存確率に関係するのでは?という仮設のもと構成されているのでデータとして把握することから始める。
SibSp(兄弟、配偶者の数) + Parch(両親、子供の数) + 1(自分)でその人の家族の合計数データを作成する。
mutate(famillySize = SibSp + Parch +1)
この処理が何を意味しているのかわからず、、、
sharedInd <- data$FamilySizeAdj == 1 & data$Cabin %in% sharedCabins
data$FamilySizeAdj[sharedInd] <- 2
rowCount <- sum(sharedInd)
print(c("adjusted rows", rowCount)) # 27 rows
Sex(性別)はそのままだと何かと不便なので1/0のデータに変換する。
また、変換する前に欠損値は無いことは確認済みなので、バリエーションは1と0だけで良さそう。
mutate(Sex = recode(Sex, female = "0", male = "1", .missing = "-1"), Sex = extract_numeric(Sex))
こんな感じで変換できた。
何がどうなっているのかわからない、、
modelaccuracy <- function(test, rpred) {
result_1 <- test$Survived == rpred
sum(result_1) / length(rpred)
}
checkaccuracy <- function(accuracy) {
if (accuracy > bestaccuracy) {
bestaccuracy <- accuracy
assign("bestaccuracy", accuracy, envir = .GlobalEnv)
label <- 'better'
} else if (accuracy < bestaccuracy) {
label <- 'worse'
} else {
label <- 'no change'
}
label
}
library(rpart)
# starting with Age and Sex as indicators
fol <- formula(Survived ~ Age + Sex) # 0.845
rmodel <- rpart(fol, method="class", data=train)
rpred <- predict(rmodel, newdata=test, type="class")
accuracy <- modelaccuracy(test, rpred)
bestaccuracy <- accuracy # init base accuracy
print(c("accuracy1", accuracy)) # baseline
精度が低くなったってことなのか?? よくわかんない。。
fol <- formula(Survived ~ Age + Sex + Pclass) # 0.838
rmodel <- rpart(fol, method="class", data=train)
rpred <- predict(rmodel, newdata=test, type="class")
accuracy <- modelaccuracy(test, rpred)
accuracyLabel <- checkaccuracy(accuracy)
# almost as good but little worse
print(c("accuracy2", accuracy, accuracyLabel)) # worse