3.4 fclassについて fclass, fare_eff
3.4.1 fclass
運賃について、対数にしたときに10以上100以下であるものをfclassとする。
運賃を加工せずに割り振ることもできるが、探査的なことで何か見つけることが出来るかもしれません。
ggforceをつかっていろんなプロットをします。
train %>%
ggplot(aes(fclass, Fare, color = Pclass)) +
geom_sina(alpha = 0.5) +
scale_y_log10() +
# coord_flip() +
guides(color = guide_legend(override.aes = list(alpha = 1, size = 4)))
# +facet_zoom(x = Pclass == 3)
・運賃の高低から、三種類のfclassという分け方にしました。
・客室のグレードと対応させても新しい情報は得られませんでした。
・分類することで、高価な客室は生存率に関係するのか、という説明が成り立てば、モデルの設定に役に立つでしょう。
結論:fclassは採用しませんが、他の変数との影響は調べたいと思います
3.4.2 fare_eff
チケットに対して複数の共有している人が居て、複数人の乗客も同じ運賃を支払っているようです。ticket_groupを使って、本来の値段を出してみましょう。(一人の場合はそのままでいいので除く)
train %>%
group_by(Ticket) %>%
summarise(ct = n(),
sd_fare = sd(Fare)) %>%
filter(ct > 1) %>%
arrange(desc(sd_fare)) %>%
head(3)
## # A tibble: 3 x 3
## Ticket ct sd_fare
## <chr> <int> <dbl>
## 1 7534 2 0.445
## 2 110152 3 0
## 3 110413 3 0
これらの値から、データ中の運賃fareは、ひとりあたりの運賃ではなく、
チケット一枚当たりの値段を表しているようです。
乗客は運賃を人数で割って支払ったのでしょう。
fareをticket_groupで割ることで一人あたりの支払った金額を計算し、
fare_effとなずけて新しい変数に追加します。
p1 <- train %>%
filter(Fare>0) %>%
ggplot(aes(Fare, Pclass, fill = Pclass)) +
geom_density_ridges() +
scale_x_log10(lim = c(3,1000)) +
scale_fill_cyclical(values = c("blue", "red"))
p2 <- train %>%
filter(fare_eff>0) %>%
ggplot(aes(fare_eff, Pclass, fill = Pclass)) +
geom_density_ridges() +
scale_x_log10(lim = c(3,1000)) +
labs(x = "Effective Fare") +
scale_fill_cyclical(values = c("blue", "red"))
・運賃と客室はうまく分離できませんが、fare_effは客室をきれいに分離することが出来ました。
・二等客室の2コブ分布もなくなり、三等客室は高い分布になりました。
・さらに、もとの運賃で見られていた最高値が、fare_effになると極端な値ではなくなりました。
print(c(max(train$Fare), max(train$fare_eff)))
## [1] 512.3292 128.0823
fareとfare_effの関係を可視化するには、周辺にヒストグラムを配置している散布図を使いましょう。
これはggEctraで実現させられます。
p <- train %>%
filter(Fare>0) %>%
mutate(log_fare = log10(Fare), log_fare_eff = log10(fare_eff)) %>%
ggplot(aes(log_fare, log_fare_eff, color = Pclass)) +
geom_jitter(size=2, width = 0.01, height = 0.01) +
#geom_point(size=2) +
theme(legend.position = "bottom") +
guides(fill = guide_legend(ncol = 3, keywidth = 1, keyheight = 1))
ggMarginal(p, type="histogram", fill = "grey45", bins=20)
・fare_effは客室をきれいに分離して説明することができました。
・多少のはずれ値はありますが、運賃はticket_groupで割ることで均一にできたようです。
結論:fare_effは採用します。おそらくfareと置き換えてもいいでしょう
3.5 title
Nameから敬称(Mrなど)を抽出しました。
title_origを作りましたが、出現頻度の低い敬称をその他に分類したものをtitleとして定義します。
p1 <- combine %>%
group_by(title_orig) %>%
count() %>%
ggplot(aes(reorder(title_orig, -n, FUN = max), n, fill = title_orig)) +
geom_col() +
#scale_y_sqrt() +
theme(legend.position = "none", axis.text.x = element_text(angle=45, hjust=1, vjust=0.9)) +
labs(x = "Original Titles", y = "Frequency")
p2 <- train %>%
ggplot(aes(title, Age, fill = title)) +
geom_violin() +
theme(legend.position = "none") +
labs(x = "Title groups")
p3 <- train %>%
ggplot(aes(Survived, fill = title)) +
geom_bar(position = "dodge") +
labs(fill = "Title group")
・最も多い敬称はMr, Miss, Mrs, Masterです。
・violin plotで年齢軸を使い、密度を調べました。(masterは10代の子供を示していることがわかります)
・Missは20~40歳までの女性を示しました。敬称の中には年齢を特定するのに役に立たないものもあります。
・生存との関係では、Mrは極端に生存率を低下させる敬称であることがわかりました。
今までの探査で、すでにyoungという変数を使って二つにグループ化していました。
背景にある考えとしては、敬称や年齢についてを組み合わせて、欠損している年齢を補間したいのです。
30歳以下の人で、Master, Miss, Mlleをyoungとして定義し、他の珍しい敬称は、youngではないといえるほど高い年齢でありそうです。
3.6 俯瞰
この章では新しく追加した変数と、元の変数の関係を視覚化してみます。
相関プロットしてみます。
train %>%
select(-PassengerId, -Name, -Ticket, -Cabin, -title_orig) %>%
mutate_all(as.numeric) %>%
select(everything(), deck) %>%
ggcorr(method = c("pairwise","spearman"), label = FALSE, angle = -0, hjust = 0.2) +
coord_flip()
・新しく定義した変数と、元の変数には明らかに強い相関がありました。
・fclassとfare, aloneとfamily, ticket_groupとshared_ticketのように。
・ほかにも、ttypeとPclassが関係しています。これは、チケットに書かれている文字が客室のクラスを表していると考えられます。
・familyとshared_ticketが相関していることは、家族が同じチケットで旅行していたのでしょう。
相関のあった部分をより詳細に調べるため、GGallyやggpairsを使ってみましょう。
train %>%
select(Survived, Pclass, Sex, Age, cabin_known, shared_ticket) %>%
mutate(shared_ticket = as.factor(shared_ticket)) %>%
ggpairs(ggplot2::aes(colour=Survived))
・一番右の列をみてもらうと、新しいshared_ticketについて分析できそうなことがわかると思います。生存に対して良い影響があることがわかります。
・チケットは男性よりも女性が共有することが多く、一等と三等客室でシェアされることがおおいようです。
・また、チケットを共有している人は、部屋番号が欠損していない可能性が高いこともわかります。
つづく...
2019/05 時点で元のカーネルがここまでです。更新され次第追加していきます。
推定やモデル作成に関してはほかのカーネルを読みながらどんな推定をしているのか学んでいきたいと思います。その場合データの前処理も変更されると思うのでイチから紹介するか、モデル部分だけの手法を紹介するかは未定。(Rかpythonを予定)