データサイエンスの勉強をしてみようと思い、今更ながらですがKaggleのタイタニック号の生存者予測に挑戦してみました。

Kaggleを進める工程を大まかに分けると以下の3つの工程に分けることができます。

  • EDA(探索的データ解析)
  • 特徴量エンジニアリング
  • パラメータチューニング

本記事ではカーネルを参考にしながら、基本となるEDAで分析した内容についてまとめていきます。





タイタニックのデータの基本情報を確認する(EDA)


まずは、使用するライブラリをインポートします。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set()

次に、データをロードします。

# load dataset
train_df = pd.read_csv("./train.csv")

データのロードができましたらとりあえずテーブルを確認してみます。

とりあえず10行分ほど表示

train_df.head(10)

1


次にデータの基本統計量を確認します。

train_df.describe()

2

AgeのCountが他が891になっているのに対して714となっているのが気になります。おそらくデータが欠損しているのかな…。

なのでその他に欠損値がないのかを以下の関数で確認します。

# 欠損数確認
def missing_table(df): 
        null_val = df.isnull().sum()
        percent = 100 * df.isnull().sum()/len(df)
        kesson_table = pd.concat([null_val, percent], axis=1)
        kesson_table_ren_columns = kesson_table.rename(
        columns = {0 : '欠損数', 1 : '%'})
        return kesson_table_ren_columns
missing_table(train_df)

3

Ageの他にCabinとEmbarkedが欠損しています。Cabinに関しては欠損数が多すぎるので特徴量として使うには微妙なのかもしれません…。






グラフを使用してデータの特徴を分析する


データの基本的な様子は分かったのですが、上記の情報だけでは説明変数を選択することはまだ難しいです。

そこで、『Seaborn』というライブラリを使用してデータを可視化していきます。


とりあえず、どれぐらいの人物が生存しているのかを棒グラフで確認します。
sns.countplot(train_df['Survived'])

4


次に性別ごとの生存者の割合を確認します。
sns.countplot(x='Survived', hue='Sex', data=train_df)

5

男性よりも女性のほうが生存率が高いみたいですね。



ではチケットの等級ごとの割合はどうなんでしょうか。
sns.countplot(x='Survived', hue='Pclass', data=train_df)

6

等級が高いほど生存率が高いことが分かります。



では、船に登場した港が生存率に関係あるのかも確認していきます。
sns.countplot(x='Survived', hue='Embarked', data=train_df)

9

データ名を見る限りでは影響しなさそうな気がしていたのですが、C港から搭乗している人のほうがS港、Q港から搭乗している人よりも生存率が高いみたいですね。




次に同乗している兄弟と配偶者の数と親と子どもの数が生存率に影響するのかを見ていきます。
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "SibSp", kde=False) 
g.add_legend()

7
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "Parch", kde=False) 
g.add_legend()

8

それぞれのグラフを見てみると同乗者がいない人に比べて、同乗者がいる人のほうが生存率が高くなることが分かります。

ただ、同乗者が4人以上の場合はどちらのグラフを見ていても生存率が低くなっていますね。



次に年齢別の生存率はどのぐらいなのかを確認していきます。

まず、船に乗っている人たちの年齢がどれぐらいの人が多いのかをヒストグラムで確認してみます。
train_df['Age'].hist(bins=40);

10

20、30代の人が大半以上のようです。

では年齢別の生存率を見てみましょう。
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "Age", kde=False) 
g.add_legend()

11

5歳未満、10~15歳と75~80歳の人たちは生存する確率が高いみたいです。

それ以外の年代は生存する確率が低いみたいですね。特に65~75歳の人たちは生存率が0%みたいです。


また、性別ごとの年齢別の生存率の割合もみてみましょう。
g = sns.FacetGrid(train_df, col='Sex', hue="Survived", height=5)
g.map(sns.distplot, "Age", kde=False) 
g.add_legend()

12

女性はほぼ全ての年齢で生存する確率のほうが高いみたいです。

一方男性は15~45歳の生存率がかなり低いです。救助などを行っていた結果避難船に乗り遅れたのかな…。




次に運賃別の生存率を見てみましょう。
bins = np.arange(0, 550, 50)
g = sns.FacetGrid(train_df, hue="Survived", height=5)
g.map(sns.distplot, "Fare", kde=False, bins=bins) 
g.add_legend()

13

運賃が50$未満の人たちは生存率が低いですが、それ以外は生存率が高いみたいです。



とりあえず一通りデータを分析してみましたが、以下のことが分かりました。
  • Sex : 男性より女性のほうが生存率が高い
  • Pclass : クラスが高いほど生存率が高い
  • Parch、SibSp : 同乗者がいない人は生存率が低い。同乗者が1~3人の人は生存率が高い。同乗者が4人以上になると生存率が低くなる。
  • Embarked : S港とQ港に比べてC港から搭乗した人は生存率が高い
  • Age : 5歳未満の人は性別関係なく生存率が高い。15~45の男性は生存率が低い。女性はほぼ全ての年代で生存する確率のほうが高い。
  • Fare : 運賃が50ドル未満の人は生存率が低い



最後に


上記の分析ができたところでEDAは終わろうと思います。

次の記事ではEDAで分かったことから特徴量エンジニアリングをしていきたいと思います。

まだまだ勉強不足ですのでご指摘等がありましたらコメントをいただけると助かります。