前回 #1のつづき
2.2 値同士の関係
2.2.1相関関係を俯瞰する
データを見たことで相関がありそうな値がいくつかありそうだ。
年齢と生存率
客室と運賃
何が強く関係していて、
何が余分なデータなのか
みつけてみましょう。
まずいままでの操作で特定した数値と相関行列を可視化します。
pioperを使います。
まず乗客IDと文字列で入っている三つの行をselectによって取り除きます。
取り除きはマイナス記号を付けることで直観的に取り除くことができます。
ファクタを整数値に変換しましょう。
出力されてくるデータフレームは相関行列を計算するためのcor関数で処理します。
視覚化にはcorrplotを使用しましょう。
一方の値が変わると、もう一方も関係して変化するような値は、推定を作るときに役に立ちます。
相関関係は1で完全な関係性があり、-1で完全な反相関になります。
最終的には生存を予測したいので生存とどのような相関があるか興味があります。
ただし、データセットのばらつきを減らして予測精度を向上させるためにもほかの値の相関が知りたいです。
train %>%
select(-PassengerId, -Name, -Cabin, -Ticket) %>%
mutate(Sex = fct_recode(Sex,
"0" = "male",
"1" = "female")
) %>%
mutate(Sex = as.integer(Sex),
Pclass = as.integer(Pclass),
Survived = as.integer(Survived),
Embarked = as.integer(Embarked)) %>%
cor(use="complete.obs") %>%
corrplot(type="lower", diag=FALSE)
鮮明で大きな丸が相関関係の強さを表しています。
赤なら反相関
青なら相関
これらから、
・性別と生存には大きな相関があり(左上二番目)、次に客室と生存に相関があります(左上)。運賃や乗船した港は生存と薄いながらも関係があるかもしれません。
・運賃と客室は密接な関係がありそうです。
・SibSpとParchの相関関係は直観的にわかります。どちらも家族の大きさを示しています。
・客室と年齢は関連しているように思えます。(年齢の高い人ほど裕福だからいい部屋に宿泊するのか?)
相関をさらに詳しく調査するために以下の関係を調査対象として設定しました。
・客室と運賃
・客室と年齢
・客室と乗船した港
・性別と親子
・年齢と兄弟配偶者
・兄弟配偶者と親子
・運賃と乗船した港
必ずしも順番に調査するわけではないですが、目標設定をこうしてリスト化しておくと後から何を調査したかったのか見直しに来ることが出来ます。
2.2.2 複数の値同士の比較
前回のkaggleでデータ分析の基礎 #1では、生存とほかの変数の各統計量について細かく調べまました(しらみつぶし式にやってました)。
通常、今回やったように相関プロットを見て、強い関係を持っているものを見つけてから、関係性について細かく調べるほうが面白いでしょう。
2.2.2.1 客室と運賃
客室のような質的データを運賃のような連続値と比較するときの視覚化にはいろいろありますが、ここでは箱ひげ図を使いましょう。後で他にも試しますよ。
y軸を対数軸にしていることに注意してください。
箱ひげ図は中央値(箱中央の線)と、第一、第三四分位置(四角形の上下)、および異常値(点として表示)のような表示方法になっている。
異常値は第一四分位置(第三も同じく)よりも箱1.5倍離れている点である。
(baseのboxplotだと箱の上端と下端(第一と第三四分位)から箱1.5倍以内にデータがまとまって納まっているとき、ヒゲが1.5倍まで伸びるが、それよりも外れている場合、ヒゲが伸びずにプロットされる場合などもある。統計検定2級などでは1.5倍の位置まで伸びているものという説明があったので一見悩んだ記憶がある。)
この図から
・客室の階級は運賃の平均値で分類されていそうです。(箱が階段のようになっている)通常三等客室よりも一等客室が高価なので驚くことではないです。
・二等客室と(特に)一等客室を見ると、運賃が高いほうが生存率が高くなっています。(左二つの青い箱を見ると中央値が赤い箱の中央値よりも上になっている)これは、同じ客室階級でも値段に差があることがわかりますし、値段が安いほど救命ボートから遠いのでしょう。
客室に依存した運賃の分布を見てみる価値がありそうです。
分布をプロットし、比較するのにggplotのfacetが有用です。
facetを追加すると変数に沿って分離することができます。
train %>%
ggplot(aes(Fare, fill=Pclass)) +
geom_density(alpha = 0.5) +
scale_x_log10() +
facet_wrap(~ Survived, ncol = 1)
生存に対してfacetを使うとplotを二画面に分けてくれる。
高い客室は生存(下図)での山が高く面積も大きいので、一等客室は生き残りやすそう。
この図から
・ファーストクラスの分布をみると、運賃に幅があります(20~300まで一等客室になっている)
・二等客室のには興味深い二つのコブ、三等客室にはロングテール(裾を引く)分布が確認されました。
・客室階級の中で、安い階級の部屋は生存率が悪い特徴が出ています。これは箱ひげ図でも同じことが見て取れます。
2.2.2.2 客室と乗船した港
・Sという港で乗船した人は三等客室であることが多い。乗船Sと三等客室の組み合わせはとびぬけて死亡率が高い
・Qという港ではほぼ全員が三等客室
・一等客室はどの港でも生存率が高いです(左と右を比べて)
・二等客室はSで乗船した時に生存率が低いが、Cで乗船した場合は生存率に差が無かった。
2.2.2.3客室と年齢 多面的なプロットしてみる
年齢と運賃をfacetを使ってplotする。
乗船した港や客室でさらに分割してみる。
生存に対して異なる色を使い、性別にはplotの記号を対応させて視覚化する。
train %>%
filter(Embarked %in% c("S","C","Q")) %>%
ggplot(mapping = aes(Age, Fare, color = Survived, shape = Sex)) +
geom_point() +
scale_y_log10() +
facet_grid(Pclass ~ Embarked)
・一等客室は平均して年配の方がおおい。(二等三等と比較)
・二等客室の子供は性別によらず生存したようだ。
・三等客室は女性よりも男性が多い。
・一等客室の男女比は同程度。
・これらは年齢がわかっている人物のみをplotしているため、偏ったplotになっていることに注意!(欠損値はやっかい)
右下と左上のplotは特に顕著に生存と死亡が分かれています。
ここで見たことをもとにより詳しくみていきましょう。
2.2.2.4 年齢と性別
もともとの検討リストに入れていませんでしたが、さきほどのplotを見てみると、年齢と性別の関係をもっと調べてみる必要がありそうです。
今のように探査している段階では、興味深いと思ったシグナルを自由に追いかけてみてください。
でも本当にやるべきことを忘れないでください。
密度plotをしていきます。
・ピークは似ていますが、いくつか異なっています
・10代男性は20~30など若い男性よりも顕著に生存しています。が、女性では同じことは言えません。
・60歳以上の女性は生き残りますが、男性の高齢者は生き残れていません。
・これらは正規化された密度plotであり、histではないことに注意してください。
・年齢は欠損値を含む不完全なデータであることに注意してください。
2.2.2.5 客室と性別
Meganのカーネルを参考にした、モザイクプロットを行っています。
mosaicplot(table(train$Survived, train$Sex, train$Pclass),
main = "Survival by Pclass and Sex", shade = TRUE)
モザイクプロットの箱のサイズは観測値の数に対応しています。
左側が死亡、右側が生存
上側が女性、下側が男性
"多い"ものを青
"少ない"ものを赤
(検定結果によって色分けしている)
女性の生存は、Pclass=1のときに多い。=青
男性の生存は、Pclass=3の時に少ない=赤
男性の死亡は、Pclass=3の時におおい=青
女性の死亡はPclass=1の時に少ない=赤
・死亡した女性のほぼすべてが三等客室でした
・男性にとって三等客室にいることは生存に対して悪影響でした
2.2.2.6 親子と兄弟配偶者
家族関係(数)と兄弟や配偶者の数を見ていきます。
train %>%
ggplot(aes(Parch, SibSp, color = Survived)) +
geom_count()
円のサイズは頻度の多さを表しています。色は生存について分かれていて、生存が死亡の上にplotされています。(左下を見ると、ひとり身は赤色の円が見えているので死亡率が高いといえそうです)
・乗客の多くは一人旅でした
・両親や子供の人数が多い乗客は、兄弟数が少なかったです。
・生存率は小規模の家族が優れています。(ひとり身は例外)
2.2.2.7 親子と性別
棒グラフで書いてみます。
train %>%
ggplot() +
geom_bar(aes(Parch, fill = Sex), position = "dodge") +
scale_y_log10()
・女性よりも多くの男性が一人旅でした。("多く"というのが視覚的に実感できないのは対数軸だからです)
・対数軸を使用すると、頻度の低いものと頻度の高い物を同等に比較できます。
・女性は家族と旅行する傾向が多少あるようです。
train %>%
group_by(Parch, Sex) %>%
count()
## # A tibble: 13 x 3
## # Groups: Parch, Sex [13]
## Parch Sex n
## <dbl> <fct> <int>
## 1 0 female 194
## 2 0 male 484
## 3 1.00 female 60
## 4 1.00 male 58
## 5 2.00 female 49
## 6 2.00 male 31
## 7 3.00 female 4
## 8 3.00 male 1
## 9 4.00 female 2
## 10 4.00 male 2
## 11 5.00 female 4
## 12 5.00 male 1
## 13 6.00 female 1
単純な二項検定でわかるように、家族が3であるとき、4人の女性に対して1人が男性であるという考えは有意になりそうです。
では5人に1人が男性であることは全体の男女比でも当てはまるのでしょうか?
binom.test(1, 5, p = 577/(577+314))
##
## Exact binomial test
##
## data: 1 and 5
## number of successes = 1, number of trials = 5, p-value = 0.05538
## alternative hypothesis: true probability of success is not equal to 0.647587
## 95 percent confidence interval:
## 0.005050763 0.716417936
## sample estimates:
## probability of success
## 0.2
5人のうち1人である場合、ただしΘ=577/(577+314) という帰無仮説についてのp値は0.05538でした。
θ の95%信頼区間は [0.005,0.7164]
p値が5%以上になれば重要とは言えない。5%未満であったとしても、さまざまな要因がかかわっている。なので有意な結果を得るためには複数の結果を見るべきである。
(中拓さんありがとう)
2.2.2.8 年齢と兄弟
旅行している兄弟というと、何人かの子供を持つ家族であることが想定されますが、
今回のデータセットでもそうでしょうか?確かめてみましょう。
・最も兄弟が多いグループは年齢が低いほどピークの高さがある分布です。
・大家族の子供である可能性が高くなりました。
・これによって、生存に関する影響に年齢と兄弟関係が関係していることが考えられます。これだけ関係があるならば兄弟数から年齢を推測することもできるかもしれません。