Kaggle のタイタニック問題をやってみる(1)

今までGoの記事を書いてきましたが、一旦お休みして、今回は kaggle の Titanic - Machine Learning from Disaster に挑戦しようと思います。挑戦とはいえ、初心者ですので、下記を Code を参考にしながら進めていきたいと思います。

まずは、データの中身を見ていきます。

データ

このタイタニック問題のデータの中身については、いろいろなサイトで解説されていますので、横着しますが、詳細はこちらのサイトを参照してもらえればと思います。データの項目として、乗客の名前やチケットクラス、年齢、性別などのデータと生存フラグがあります。訓練データにはこれら全ての項目があり、テストデータはこれらの項目の中から生存フラグが無いデータになります。

生存に大きく関与した項目として考えられるのは「年齢」「性別」「チケットクラス」が挙げられると思います。今回はシンプルに考えるためにも、この3項目に注目して、データの中身を見ていきたいと思います。その前にまずは、データ全体の概要を見ていきます。

データ概要

import numpy as np
import pandas as pd
import seaborn as sns
%matplotlib inline

df = pd.read_csv("/root/practice/titanic/csv/train.csv")

df.info()
df.isnull().sum().sort_values(ascending=False)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
Cabin          687
Age            177
Embarked         2
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
SibSp            0
Parch            0
Ticket           0
Fare             0
dtype: int64

データ数は891行、Cabin(客室番号)とAge(年齢)、Embarked(出港地)に欠損値があるようです。

チケットクラス

Pclass(チケットクラス)についてグラフにしてみます。

sns.set_style("whitegrid")
sns.countplot(x="Pclass", data=df, hue="Survived")

Pclassの数値の意味ですが下記の通りで、上のクラスの人ほど生存率が高いことがわかります。

  • 1:上層クラス
  • 2:中級クラス
  • 3:下層クラス

性別

性別についてグラフにします。

sns.set_style("whitegrid")
sns.countplot(x="Sex", data=df, hue="Survived")

女性の方が生存率が高いことがわかります。

年齢

年齢についてグラフにします。

age_survived = df.query("Survived == 1 and Age > 0")
age_not_survived = df.query("Survived == 0 and Age > 0")
sns.histplot(x="Age", data=age_survived, bins=30, kde=True, color="green", alpha=0.5)
sns.histplot(x="Age", data=age_not_survived, bins=30, kde=True, color="red", alpha=0.5)

10代以下の人の生存率が高いことがわかります。30代の生存者数は多いようですが、死亡者数も多いので生存率としては高くないようです。

その他要素

その他の要素についてもグラフにします。

兄弟/配偶者の数

sns.set_style("whitegrid")
sns.countplot(x="SibSp", data=df, hue="Survived")

親/子供の数

sns.set_style("whitegrid")
sns.countplot(x="Parch", data=df, hue="Survived")

料金

fare_survived = df.query("Survived == 1")
fare_not_survived = df.query("Survived == 0")
sns.histplot(x="Fare", data=age_survived, bins=30, kde=True, color="green", alpha=0.7)
sns.histplot(x="Fare", data=age_not_survived, bins=30, kde=True, color="red", alpha=0.5)

出港地

sns.set_style("whitegrid")
sns.countplot(x="Embarked", data=df, hue="Survived")

タイタニックに同乗している兄弟・配偶者の数、親・子供の数が0人以外だと、生存率が高いように見える、など気になるデータもありますが、今回はシンプルに考えたいので扱いません。

今回はデータの中身を調査して、下記のことがわかりました。

  • 上層クラスの生存率が高い
  • 女性の方が生存率が高い
  • 10代の生存率が高い

次回はこれらの項目を元に学習していきたいと思います。