kaggle初挑戦__タイタニック生存者を予測して見る

# 1. データ確認
•PassengerId – 乗客識別ユニークID
•Survived – 生存フラグ（0=死亡、1=生存）
•Pclass – チケットクラス
•Name – 乗客の名前
•Sex – 性別（male=男性、female＝女性）
•Age – 年齢
•SibSp – タイタニックに同乗している兄弟/配偶者の数
•parch – タイタニックに同乗している親/子供の数
•ticket – チケット番号
•fare – 料金
•cabin – 客室番号
•Embarked – 出港地（タイタニックへ乗った港）

pclass = チケットクラス
1 = 上層クラス（お金持ち）
2 = 中級クラス（一般階級）
3 = 下層クラス（労働階級）

Embarked = 各変数の定義は下記の通り
C = Cherbourg
Q = Queenstown
S = Southampton

trainデータとtestデータを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/b4f34c02-82d0-37a7-b994-98be04077699.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/0c079ad1-f48f-3d20-f30d-03787b496fb6.png)
trainデータとtestデータを結合してデータセットの欠損の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/872e3991-8ae8-5793-94dd-2d4013829ef4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/85dc2a36-9d0f-d031-5d5d-5a9e1abb95c8.png)
### 結論：
trainデータ数は891個、testデータ数は418個、トータル1309個のデータがあり、カラムはトータルで12個、変数型はfloat、int、object３種類あります。
その中欠損値のあるものは、Age（年齢）、Cabin（客室番号）、 Embarked（出港地）、 Fare（料金）で、Survived（生存フラグ）は予測したいものなので、trainデータの中にだけあります。
# 2. データの整理
まず欠損値を補完し、その後各カラムごとにエンコーディングする。

## 2.1 欠損値を補完する
### ① Embarked（乗船港）
全データ1309の中、欠損値は2つしかないので、all_dataのEmbarkedの最頻値で欠損値を補完する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/c89633e1-b8d7-f896-0a61-2a6001a2e52b.png)
### ② Age（年齢）
all_dataの中Nameカラムの敬称ごとの平均値で補完する。
具体的な方法としては、
・Nameからタイトルを抽出
・欠損値のタイトルを取得
・タイトルごとにNullでない年齢の平均値を取得
・タイトルごとの平均値を欠損値に補完
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/0de43e35-25bf-0607-38ea-b3cf2a27284a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/9f46c97e-ba4e-bd01-c604-b50da4a925cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/9315ce29-3e39-cedc-8253-71b4438c22e1.png)
### ③ Fare（運賃）
Pclass（クラスレベル）とEmbarked（乗船港）ごとに運賃が違います。 Fare（運賃）が欠損しているデータのPclass＝3、Embarked＝”S”なので、Pclass＝3、Embarked＝”S”のFare中央値で補完する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/a92c405d-5ec2-b3fb-7c01-491bda913345.png)
ここで問題発見！Pclass=3とEmbarked=”S”のFareを見ると他の運賃よりだいぶ高い運賃もあることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/b84b3551-d4e0-dc0b-7a2c-7078bd0e9f92.png)
欠損値が一つだけなので、とりあえずまずFareの欠損値を補完することで、異常に高い運賃があることも考慮して、Fareの中央値で欠損値を補完した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/8d30b881-80f6-5c2e-19f4-453239d066c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/1568f7b7-d8d4-f42c-4fc7-edd95e48f255.png)
### ④ Cabin（客室番号）
欠損値が多いなので、Cabinを二つグループに分けて、「Cabinあり」は1、「Cabinが無し」は0に置き換えた。それぞれの生存、死亡状況を見ると、「Cabinあり」の生存率は「Cabinが無し」のより良いことが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/3b914ff8-5406-d520-ad92-7a3583c26eee.png)
これで欠損値は全部補完した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/be8021d9-559a-cb9f-1dc6-6848800d0477.png)
## 2.2 カテゴリ変数のエンコーディング
特徴量の型は3種類：int, float, objectの３種類があり、型ごとにエンコーディングする。
### 2.2.1　object型の特徴量を数字に変更
### *① Sex（性別）*
male を0、femaleを１に置き換える。

### *②	Embarked（乗船港）*
乗船港は”S”、”C”、”Q”3種類あるので、One Hotエンコーディングで処理する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/23d5da76-5775-d492-2be5-a3dbaab74d4e.png)
### *③	Name（名前）*
Ageの欠損値を補完する際、すでに「Name」カラムからタイトルを抽出して、新しく「Title」カラムを作った。Titleの種類が多かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/6c2fff40-aa42-42de-720f-c8110394c8aa.png)
それなので、人数が１０名以上の「Mr」「Miss」「Mrs」「Master」はそのまま置いて、その他１０名以下のTitleは下記のように分けた。
「Mme」、「Ms」　→　「Mrs」
「Mlle」　→　「Miss」
「Capt」、「Col」、「Major」、「Dr」、「Rev」　→　「Officer」
「Jonkheer」、「Don」、「Sir」、「the countess」、「Dona」、「Lady」　→　「Royalty」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/1de28311-34ee-af64-30a0-23e0ea1fc98b.png)
最後にone-hotエンコーディングした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/2cedb128-23e6-a266-db11-5810a9d37170.png)
### *④ Cabin（客室番号）*
欠損値処理で、Cabinのnull値を0、nullでないものを1に置き換えたので、そのまま使う。
### *⑤ Ticket（チケット番号）*
チケットを数字だけのチケットと、アルファベットがあるチケット2種類に分ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/3561039b-088e-da2f-501d-10d1bd56175d.png)
数字だけのチケットの分布を見ると、大体500000以下と3000000以上の二つグループに分けたことが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/8447cf6b-e925-bf28-49aa-eed70ea8b767.png)
そしてチケット番号が500000以下の分布を拡大して見る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/9725331e-b084-322a-d19d-4f2cdbc8bdc6.png)
チケット番号が~100000, 100000~200000, 200000~300000, 300000~400000の４グループに分けたことが分かった。それなので数字だけのチケットは以下の5つのグループに分けた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/dd989d55-39a1-bb22-6128-ec937d60fa39.png)
グループごとの生存率を見ると、チケット番号が小さい方の生存率が高い。
アルファベット＋数字のチケットをアルファベットだけ抽出してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/54e329e4-2598-f8d9-02cd-83ff9c7c2201.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/98fcb947-23f5-467d-3b24-17ae3afd0288.png)
アルファベットのチケットをグループ化して、生存率を調べてみた。そして数字だけのチケットと合わせて人数のソート順にチケットにラベリングした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/89f0ebd5-5973-ec86-240a-cce884711019.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/5dfcdc12-8da0-194c-c410-dfc826c40b85.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/10a316f8-42e7-159b-700f-e968b651db67.png)
### 2.2.2　Intとfloat型の特徴量を処理
### *⑥ Fare（運賃）*
Fareの欠損値を補完するとき、PclassとEmbarkedが一緒の乗客の中、運賃が異常に高い乗客がいたことが分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/20b46c31-98fe-c63f-3278-88faa647dbc0.png)
運賃が異常に高い乗客の中から一人の苗字でその家族の運賃を調べてみると、家族の全員の運賃が同じであることが分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/f3b96003-3267-fce7-3d81-0a01859145c6.png)
運賃が異常に高い乗客の中、シングルの人もいた。下記のようにそれぞれファミリーネームが異なり、同乗しているParch、SibSpも全部０、つまりみんなシングルなのにTicketとFareが全く同じである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/535461bf-f398-95ce-82b5-91deadf13d9e.png)
多分この8人は家族ではないが、友人または知り合いで、一緒にチケットを買ったかもしれない。事故の時間は午前2時ごろなので、事故の直前は一緒にいた可能性も高い。それなので、同じグループ内の他の生死が予測対象の人の生死に影響することが思う。確かに上の例では客室クラスが一番低い男性（Pclass=3の男性）で、生存率が一番低いはずであるが、生存率が分かる7人の中5人が生存している。

それなので家族サイズより、ただの「グループサイズ」で、乗客のグループ人数を代入したほうがより良いではないかと思った。方法は下記の通り。
*・各Pclassごとのシングルの乗客の平均運賃を計算する。
・平均運賃の2倍より大きい運賃の乗客を抽出する。（運賃が複数人数の運賃の合計であるものを抽出）
・抽出した乗客から各運賃ごとにgroup byして人数をcountする。
・countした結果を特徴量「group」に代入して、抽出できなかった人のgroupは１に設定する。*
各グループの人数をカウントして、グループごとの生存率を調べてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/677273fa-2469-be79-740d-55ca12d048e1.png)
グループサイズと生存率によって、グループをGroup_small、Group_middle1、Group_middle2、Group_largeに分類した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/9daa1507-a3a6-a2b8-f059-5e146fa83b25.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/872c71ea-2554-e63b-1f2c-a96a2bc0e24f.png)
処理結果をall_dataに追加して、groupカラムを削除した。
### *⑦	Pclass（客室クラス）*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/380e8dee-a472-87b7-1ea4-93ee65c6149d.png)
Pclassは生存率に対する影響も大きいので、One-hotエンコーディングする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/cfa404c3-6e26-38db-8edf-52882f764d84.png)
処理結果をall_dataに追加して、Pclassカラムを削除する。

### *⑧ Age（年齢）、Parch（親or子の人数）、SibSp（兄弟or配偶者の人数）、Survived（生存結果）、PassengerId（乗客ID）*
特に処理せず、そのまま使う。

## 2.2.3 その他のデータ処理
各変数の相関性を見ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/ac76e433-c0c9-1231-e900-763bd4a30378.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/1cc6dbee-20be-3bba-925e-c4b3d80e3b3f.png)
PassengerIdより相関性が低いEmbarked_Qカラムを削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/72490cbc-f3f3-ee44-a3a4-3a624b1fe4eb.png)
# 3． モデルチューリング
ランダムフォレストモデルで結果を予測してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/35db4edf-82ac-cfb6-d36f-3487e4480e2d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/801b0d34-87e9-91be-4d31-c9243d85f060.png)
# 4. KaggleにSubmit
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448441/52df505f-6fa6-74b8-e5e3-0d2e35b3393c.png)
最終スコアは０.79904で、1683位/11000人、上位15％には入りました。

# 5.参考サイト
https://www.codexa.net/kaggle-titanic-beginner/
https://qiita.com/xxx_boy/items/36e4f6f52e0aad116649