タイタニック号の乗客データをIsomapやMDS、t-SNEで可視化して遊びました。
悲しい気持ちでいっぱいです。
タイタニック号の乗客データ
- タイタニック号の乗客の属性と生還・死亡を記録したスモールデータ
- 公式がよくわからなかったので(そもそも遊んでただけなのでなんでもよかった)、下のリンクの人が分析に使ったデータを拾ってきた
- https://www.kaggle.com/mkempers/titanic
- RだとIrisみたいに基本ライブラリに入ってた気がする
Isomapでデータを眺める
- 金持ちや女は生還、貧乏人や男や単身は死亡
- 家族づれの中流家庭みたいなのの生還は五分
- 船員判断か合議の結果かは分からないが、命のレーティング結果の例
- 乗ったら確実に死んでた
- 軸の幅が合ってないのが不安、MDSの一種だとすると縦横合わせないとダメ?
Isomapの描き方
# Isomap
from sklearn import manifold
# クラスタリングのk<=5はよさげ、k>5はイマイチ
iso = manifold.Isomap(n_neighbors=5, n_components=2)
# allは表側:乗客ID、表頭:乗客属性のpandasデータフレーム、ダミー変数化したもの
allt = all.T
pos = iso.fit_transform(allt)
# プロット (Jupyter
import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(pos[:, 0], pos[:, 1])
# ラベル貼り
import random as rnd
cnt = 0
for label in list(all.columns):
r = rnd.random() * 3
plt.text(pos[cnt, 0]+r, pos[cnt, 1]+r, label)
plt.plot([pos[cnt, 0]+r, pos[cnt, 0]], [pos[cnt, 1]+r, pos[cnt, 1]])
cnt += 1
- これだけ!(要・クリーニング、ダミー変数化)
データを触ってわかったこと
- 相関行列やヒストグラムを見ても上のマップと同じような特徴だった(ので、n_components=5くらいでよさげ
比較的重い命
ハイクラス、女、若い、家族連れ、船室に登録されている
比較的軽い命
ハイクラス以外、男、若くない、単身、船室未登録
- 判別分析(SVC)の正解率は約78%
- 主成分分析もついでにやってみたけど説明力弱くてイマイチ、生還した層の特徴がはっきりしているという程度かと思う
第一主成分 - 金持ち (18%)
生還、フランス、notイギリス、ハイクラス、船室登録あり(船室B〜D)
第二主成分 - モブキャラ (10%)
生死五分五分、クラスそこそこ、年齢高め、イギリスかニュージーランド、notフランス、船室EFまたは登録なし
第三主成分 - ヒロイン (9%)
生還、女、若い、家族づれ、イギリス、notフランス、船室G、not船室A
あとは6%とかそのくらい
主成分を出してみる以上のことはしていません
- 乗客のクラスタリングはいい感じにならなかった
- MDSは概ねうまくいくんだけど、生還する者の特徴が2+αパターンあるようで、それらが同時に生還側に来ることがほぼない(ハイクラス、ミドルクラス、女性、若さ、フランス、家族1〜2が喧嘩する感)、死亡パターンは一貫している、実行する度結果が変わるので下図は一例
- tSNEもとりあえずやってみた、n_componentsとrandom_stateの選び方でだいぶ変わるので扱いが難しい気がする...そもそもこれクラスタリングで用途違うのでは
- やっぱいきなり図だけ描いて把握っていうのは難しそうだな、という感
データから妄想して遊ぶ(本題)
- なんとなく船室のグレード(B〜Dが高め)や、乗船地の客層(フランスは貴族)の予想がつく
- 料金情報を残しておけば、おそらく寄港順を予想できる(今回消してしまった
- 客室登録なしの死人が多いのは、一般人が広間で雑魚寝していたのかも
- イギリス・単身・若い・男・客室なしは実は乗務員だったりしないか
- ある価値基準で生存者が厳選されているので、水没まで十分余裕があったはず(だとすればおそらくボートなどの準備不足
- 極限下で人のモラルに頼ってこの結末を作るのは難しそう、情報を操作したか、武器で脅したのかもしれない
- キャメロン監督より、原作・福本伸行、主演・藤原竜也で映画化したい
- 金のない独身男はすでに人生が辛い上、その命は羽のように軽く扱われる1
宇宙旅行に行くとき気をつけたいこと
命を選ぶ時間を与えられた場合の極限状況下では、社会的地位(日頃ちやほやされる度合い)がそのまま生存率に影響することがなんとなくわかった。
有事に備え、他の乗客にステータスの差をつけ、勝ち組オーラを高めた上で臨みたい。
もし資金に余裕があるなら、自分よりステータスの低い人を大勢誘って席を埋めよう。
出発の前日までに済ませておこう
- 金持ちになり、プロジェクトに出資しよう
- 若めの女性になり、子供を連れて行こう
- 母親同伴の少女になろう
少女の面影を残した若い女性の実業家で、お腹に愛する人の子供がいるんです、が最強。
...宇宙旅行に行くのはやめておこう。
おまけ:前処理でいじった点
- 1親等の血縁者と2親等の血縁者は足して家族の数にした
- 船室の欠損値を残した(船室記録なし
- 乗船地の欠損値を残した(乗船地記録なし
- 乗客ID、チケット、氏名、料金は消した、が、生存者と死亡者のヒストグラムを見たら乗客IDは使えそうな気配があった
- 年齢の欠損値はレコードごと消した2
参考引用
-
↓これの練習でした。
-
↓いいねをくれた方が、タイタニックデータを丁寧に分析されていたので紹介します。
-
(本文中で少し触れましたが、自分もペアプロットで分布確認したり、相関行列書いたりして、一応そこそこ下調べをした上で記事を書きました。)