Kaggle入門【Titanic】 可視化

データをグラフに

可視化することで何か得られることがあるかもしれないので,データを可視化して把握することはとても重要です.
今回はTitanicのデータを可視化してみたいと思います.

もろもろインポート

# Imports

# pandas
import pandas as pd
from pandas import Series,DataFrame

# numpy, matplotlib, seaborn
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

性別を可視化

sns.countplot('Sex',data=train)

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708150158.png?1531029755

# 乗客の性別をチケットクラスで層別化してみる
sns.countplot('Sex',data=train,hue='Pclass')

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708150155.png?1531029784

# 乗客のチケットクラスを性別で層別化してみる
sns.countplot('Pclass',data=train,hue='Sex')

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708150153.png?1531029806

以上から,Pclass=3の男性だけが非常に多いことがわかりますね.

年齢を可視化

# FacetGridを使うと、複数のカーネル密度推定のグラフを1つのプロットに描くことができる
# 性別で層別化して、グラフを少し横長に設定します。
fig = sns.FacetGrid(train, hue="Sex",aspect=4)
# mapを使って、性別ごとにkdeplotを描くようにする
fig.map(sns.kdeplot,'Age',shade= True)
# xの最大値を長老に合わせます。
oldest = train['Age'].max()
# x軸の範囲を設定する
fig.set(xlim=(0,oldest))
# 凡例を付け加える
fig.add_legend()

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708153226.png?1531031578

# 年齢をチケットクラスで層別化してみる
fig = sns.FacetGrid(train, hue="Pclass",aspect=4)
fig.map(sns.kdeplot,'Age',shade= True)
oldest = train['Age'].max()
fig.set(xlim=(0,oldest))
fig.add_legend()

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708153223.png?1531031555

#年齢を生存の有無で層別化してみる
facet = sns.FacetGrid(train, hue="Survived",aspect=4)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, train['Age'].max()))
facet.add_legend()

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708151303.png?1531030458

#年齢毎の生存率
fig, axis1 = plt.subplots(1,1,figsize=(18,4))
average_age = train[["Age", "Survived"]].groupby(['Age'],as_index=False).mean()
sns.barplot(x='Age', y='Survived', data=average_age)

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708151826.png?1531030730

若い方が,チケットクラス2,3に多くいることが分かります.20代の生存率が低く,0~10代前半までの生存率は高いことが分かります.
20代の生存率の低さはチケットクラスのランクに関わっていそうです.

家族がいるかを可視化

'Family'カラムの追加

  • SibSp – タイタニックに同乗している兄弟/配偶者の数
  • Parch – タイタニックに同乗している親/子供の数

でした.ここから,SibSp+Parchが1以上ならば,家族がいる.0ならば家族がいないとするFamilyカラムを作ります.

# Family

# Parch と SibSpをまとめる
#Parch または SibSp がいるなら'Family'=1,いないならば,'Family'=0
train['Family'] =  train["Parch"] + train["SibSp"]
train['Family'].loc[train['Family'] > 0] = 1
train['Family'].loc[train['Family'] == 0] = 0

test['Family'] =  test["Parch"] + test["SibSp"]
test['Family'].loc[test['Family'] > 0] = 1
test['Family'].loc[test['Family'] == 0] = 0

# Parch と SibSp を削除
train = train.drop(['SibSp','Parch'], axis=1)
test    = test.drop(['SibSp','Parch'], axis=1)

'Family'の可視化

fig, (axis1,axis2) = plt.subplots(1,2,sharex=True,figsize=(10,5))
sns.countplot(x='Family', data=train, order=[1,0], ax=axis1)

family_perc = train[["Family", "Survived"]].groupby(['Family'],as_index=False).mean()
sns.barplot(x='Family', y='Survived', data=family_perc, order=[1,0], ax=axis2)

axis1.set_xticklabels(["With Family","Alone"], rotation=0)

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708155012.png?1531032656
家族がいる方が生存率が高いですね.

料金の可視化

fare_not_survived = train["Fare"][train["Survived"] == 0]
fare_survived     = train["Fare"][train["Survived"] == 1]
avgerage_fare = DataFrame([fare_not_survived.mean(), fare_survived.mean()])
std_fare      = DataFrame([fare_not_survived.std(), fare_survived.std()])
train['Fare'].plot(kind='hist', figsize=(15,3),bins=100, xlim=(0,50))

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708160940.png?1531033789
料金はチケットクラスと相関が高いはずだと思います.

出港港の可視化

fig, (axis1,axis2,axis3) = plt.subplots(1,3,figsize=(15,5))
sns.countplot(x='Embarked', data=train, ax=axis1)
sns.countplot(x='Survived', hue="Embarked", data=train, order=[1,0], ax=axis2)
embark_perc = train[["Embarked", "Survived"]].groupby(['Embarked'],as_index=False).mean()
sns.barplot(x='Embarked', y='Survived', data=embark_perc,order=['S','C','Q'],ax=axis3)

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708160213.png?1531033441
Sの港のデータが非常に多いですね.

チケットクラスの可視化

sns.factorplot('Pclass','Survived',order=[1,2,3], data=train,size=5)

https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20180708/20180708160210.png?1531033425
チケットクラスのランクが下がっていくと生存率も下がっています.

最後に

グラフにして可視化することで色々な発見があったと思います.機械学習は事前処理が非常に重要になってくるので,ここで得られたことを踏まえて,進んでいきましょう.

munemakun.hatenablog.com