Kaggle Titanicのデータ分析

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/82b09df4-1a2f-3c1e-dfaa-ca0b24f9cde2.png)

KaggleでTitanic問題を解くにあたって、与えられているデータがどういうものか整理して、良いモデル作成の足がかかりとしつつ、データ可視化のテクニックも整理していく。
データ抜けなどがあれば、その対応するだけで前回のモデル予測結果も改善されるはず。


#1. Titanicデータ定義


|Item|範囲|説明|
|---|---|---|
|PassengerId|1-891|乗客識別ユニークID|
|Survived |0-1|生存フラグ（0=死亡、1=生存）|
|Pclass |1-3|チケットクラス(1=金持ち、2=中流、3=労働階級)|
|Name |string|乗客の名前|
|Sex |male/female|性別（male=男性、female＝女性）|
|Age |0-80|年齢|
|SibSp |0-8|タイタニックに同乗している兄弟/配偶者の数|
|parch |0-6|タイタニックに同乗している親/子供の数|
|ticket |string|チケット番号|
|fare |0-512|料金|
|cabin |string|客室番号|
|Embarked  |string| 乗船港(C = Cherbourg、Q = Queenstown、S = Southampton)|


#2. 統計データ確認

##2.1. 全体データ確認

```python
train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/3d66dbc1-6276-75fa-e1cd-d43b4d5c2aab.png)

まずtrain_data[]の先頭5データからわかるのは、Cabin（客室番号）に抜け（Nan）があるということ。ほかのデータにも抜けがあるかもしれない。


```python
train_data.describe()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/2029e454-ba12-8463-b92e-49d1c8081ad1.png)

次に統計データを確認してみる。pandasのdescribe()で数値データの要約統計量（平均、標準偏差など）を知ることができる。乗客数は891人。75%の人が生存。ほとんど労働階級の人で、２０，３０歳代が多い。大体が一人で乗船しているが、最大8人の家族もいる。運賃のminが0なので、データ抜け（欠損値）があると思われる。よく見ると年齢のminが0.42とありえない数値になっている。


##2.2.  データ抜け確認（欠損値処理）

```python
train_data.isnull().sum()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/05e3611a-daa4-3163-15a8-6c909f20ba23.png)

データの欠損値は、isnull()で知ることができる。その集計をsum()で出してやると、年齢が177件も欠損していることが分かった。Cabin（客室番号）に至っては687件で半分以上が欠損である。乗船港も2件欠損がある。


とりあえずデータがない年齢は、中央値を放り込む。

```python
train_dataset = train_data
train_dataset["Age"].fillna(train_dataset.Age.mean(), inplace=True)
```


#3. 各データの可視化、分析

生存率に関係がありそうで、分析がしやすそうな以下の項目をまずはseabornで可視化してみる。

+ Pclass
+ Sex
+ Age
+ SibSp
+ Parch
+ Fare

なお、[Sex]は、分析のために事前にダミー変数にしておく。

```python
import seaborn as sns
sns.pairplot(data=dataset_dummies[["Sex_female","Sex_male","Survived","Age","SibSp","Parch","Pclass","Fare"]],hue="Survived", dropna=True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/7e033a70-4f0e-f6ac-a90d-6411a8d22a7a.png)

いろいろ特徴があるようだが、いきなり全部見るのはつらいので、ひとつづつ見ていく。


##3.1. Pclass(チケットクラス)と生存率

チケットクラスでお金持ちなのかどうかが判別できる。これと生存率の関係を見てみる。
チケットクラス(1=金持ち、2=中流、3=労働階級)。

可視化にはseabornのbarplotを使う。X軸にはチケットクラスで、縦軸は、各チケットクラスでの生存の平均値（生存率）とする。これを見ると、見事にお金持ち順に助かるという結果に見える。


```python
g= sns.barplot(x="Pclass", y="Survived", data=train_dataset, palette='Set1')
g.set_ylabel('Survival Probability')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/c5e49bba-9b82-294c-0a0f-449efb2f197a.png)


##3.2. 性別と生存率

次に性別（男女）と生存率を比較すると、圧倒的に女性は生きて、男性は死ぬという結果。ということは、お金持ちの女性は高確率で生き残っているということか。

```python
g= sns.barplot(x="Sex", y="Survived", data=train_dataset, palette='Set1')
g.set_ylabel('Survival Probability')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/1be2f28a-8c16-159b-2739-032d0630a8a8.png)

##3.3. 年齢と生存率

年齢と生存率の関係性はよくわからなかった。子供は助かる傾向らしいが、グラフからは読み取れない。

```python
age = sns.FacetGrid(train_dataset, hue="Survived",aspect=3)
age.map(sns.kdeplot,'Age',shade= True)
age.set(xlim=(0, train_dataset['Age'].max()))
age.add_legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/23d4bac7-a9b3-d7a0-1415-215436f4378b.png)


##3.4. 兄弟、配偶者等の同年代家族の人数と生存率

家族が多いと生存率が下がっていくように見える。

```python
g= sns.barplot(x="SibSp", y="Survived", data=train_dataset, palette='Set1')
g.set_ylabel('Survival Probability')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/e93f2d94-efcc-e396-4ead-556aabce5ee3.png)


##3.5. 子供、親等の扶養家族の人数と生存率

扶養家族の人数による生存率の際はグラフからは見て取れない。

```python
g= sns.barplot(x="Parch", y="Survived", data=train_dataset, palette='Set1')
g.set_ylabel('Survival Probability')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/f6c03773-0b19-9f5c-0ebb-c360362b7bfb.png)


##3.6. チケット料金と生存率

チケットが安い人は、生存率が低いようである。

```python
age = sns.FacetGrid(train_dataset, hue="Survived",aspect=3)
age.map(sns.kdeplot,'Fare',shade= True)
age.set(xlim=(0, train_dataset['Fare'].max()))
age.add_legend()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/41708d4b-5443-2bda-9053-a1cfab41ca04.png)

##3.7. 乗船地と生存率

乗船地は、生存率にかなり関係がありそうである。
乗船港(C = Cherbourg、Q = Queenstown、S = Southampton)
Cherbourgは、フランス北西部の港湾都市。
Southamptonは、イギリス南部の貿易都市。
Queenstownは、タイタニックが最後に寄ったアイルランドの小さな港町。
イギリス紳士は頑張って生き残ろうとはせず、アメリカ人は頑張って生き残ろうとしたという話もある。またアイルランド人にはあまりお金持ちがいなかったという話もある。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/b61ef530-5213-e83e-3d47-728b331da76b.png)





#4. seaborn

今回のデータ可視化にてseabornを多用したので少し整理しておく。
seabornは、いろんなデータを図にするための多数のAPIがそろっている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/87a1b86a-cea8-1b6f-b152-2a649bb0b292.png)



##4.1. FacetGrid

FacetGridが分かりづらいのでもう少し調べる。
Facetとは、小さな面という意味である。要は小さな図を複数並べる為のグリッドを作る機能である。そのグリッドないにどういうグラフを描くは自由に設定が出来る。
また、通常は1軸か2軸のグラフであるが、hueを指定する事で、2軸目、3軸目の評価軸を追加することが出来る。

```python
age = sns.FacetGrid(train_dataset, hue="Survived",aspect=3)
```

描画するグラフは、下記の場合であればヒストグラムを指定している。横軸は"Age"を指定して、さらにkdeグラフも重畳させる設定になっている。

```python
age.map(sns.histplot,'Age',kde= True)
age.add_legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/7647577b-1c61-49d3-ad0b-d13e007b0f65.png)