Python
matplotlib
python3
データサイエンス
seaborn

タイタニック号の生存者にどのような傾向があったかpythonで調べてみよう!②

この記事は、こちらの記事の二章目になっております!

この記事からも追うことが出来ると思いますが、気になる方はぜひ見てみてください(^^)!

準備するもの

・python3系(Python 3.5.2 |Anaconda 4.2.0 (x86_64))
・anacondaで科学計算ライブラリをインストール
・dataset:seabornにあるtitanic号のデータ
・jupyternotebook(他の方法でも出来ますが、このやり方がインタラクティブでおすすめです!)

知れること

前回はhistgram,sns.countplotについてご紹介しましたが、今回は必要となるデータを作成して、生存に関係する複数の要因について調べてみたいと思います!

目的1:生存に関する新しいカラム('survived_ppl')を作成してみる。
目的2:20歳以下の人を子供としたカラム('child_male_female')を作成して、子供であったことが事件後の生存と関係しているか調べる。

前回と同様にライブラリのインポートを始めます!

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

データのインポートを行います!

titanic_dataframe = sns.load_dataset('titanic')

kaggleのtitanic号に関するcsvを持っている方は、csvを同じディレクトリにおいて呼び出すことも出来ます!

#pandasをつかってcsvを呼び出す
titanic_df = pd.read_csv('csvの名前')

データセットの中身を調べてみます!

titainic_dataframe.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
survived       891 non-null int64
pclass         891 non-null int64
sex            891 non-null object
age            714 non-null float64
sibsp          891 non-null int64
parch          891 non-null int64
fare           891 non-null float64
embarked       889 non-null object
class          891 non-null category
who            891 non-null object
adult_male     891 non-null bool
deck           203 non-null category
embark_town    889 non-null object
alive          891 non-null object
alone          891 non-null bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.2+ KB
"""

私はjupyter notebookを使用しているので、head関数を利用して、csvの内容を調べてみます!

titanic_dataframe.head()

image.png

image.png

カラムを見ていただくとわかると思うんですが、生存に関するカラムが2つあります('survived','alive')

双方が取る値は[0 or 1]と[yes or no]なので、bool(True or False)を値に持つカラム'survived_ppl'を作成していきます。

データを扱う前に覚えておくと良い、カラムの削除方法!

間違ってnull値が入ってしまった場合、カラムを削除しないとうまくデータを作れない可能性があります。

誤って作成したカラムを修正しようとしてもうまくいかない可能性が高いため、先にカラムの削除方法をご紹介します!

一番簡単な方法は、del データセット['削除したいカラム名']で削除する方法です!

del データセット['カラム名'] で値を削除する!

#一度誤ったカラムを作成します!
titanic_dataframe['mistake_column'] = 'its mistake!'

titanic_dataframe.head()

image.png

mistake_columnというカラムを作成しました!

次に先程紹介した方法を利用して、再度比較してみます!

del titanic_dataframe['mistake_column']

image.png

無事削除されました!

困ったときはここの記事を見直してみてください!

目的1:生存に関する新しいカラム('survived_ppl')を作成して、目的2と3で用いる。

というわけで、['survived_ppl']カラムを作成します!

作り方はこのような感じです!

titanic_df['survived_ppl'] = titanic_df['survived'].map({0:False,1:True})

ポイント!

・変数を作成するときのように左辺にデータセットと新しいカラム名(この場合は'survived_ppl')を指定
・右辺には元になるデータセット('survived','alive'と2つありますが、今回はsurvivedを使います!)を指定します。
・map関数に値ごとにどのような要素になって欲しいか辞書型で渡します!

また、map関数に渡す際ですが、辞書の左側に来る値が今回はint型の数字なので文字で渡す()と、エラー(値がnullになる)が起きるのでご注意ください!

titanic_dataframe['check_survived_ppl'] = titanic_dataframe['survived'].map({'0':'False','1':'True'})

[uploading-0]()

誤ってこの方法で作成してしまった場合は、先ほどご紹介したdelを使って一度カラムを削除しましょう!


早速先ほど作成したカラムがうまく作成できているか確認してみましょう!

無事survived_pplに生存していればTrue、亡くなられている場合はFalseが入っていますね!

気になる方は元データと比較してみてください!

また、先ほど作成した値がboolになっているか、infoを使って調べてみましょう!

titanic_dataframe.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 16 columns):
survived        891 non-null int64
pclass          891 non-null int64
sex             891 non-null object
age             714 non-null float64
sibsp           891 non-null int64
parch           891 non-null int64
fare            891 non-null float64
embarked        889 non-null object
class           891 non-null category
who             891 non-null object
adult_male      891 non-null bool
deck            203 non-null category
embark_town     889 non-null object
alive           891 non-null object
alone           891 non-null bool
survived_ppl    891 non-null bool
dtypes: bool(3), category(2), float64(2), int64(4), object(5)
memory usage: 81.1+ KB
"""

無事boolと表示されました!

以前は文字列をvalueに撮っていたのですが、booleanの方が良い点を
@skotaro さんにおしえて頂きました!!ありがとうございますm(__)m

20歳以下の人を子供としたカラム('child_male_female')を作成して、子供であったことが事件後の生存と関係しているか調べる。

今回は関数を適応する方法でデータを作成します!

#性別と年齢についてのデータを引数に取る関数

def child_or_adult(data_and_column):
    #性別と年齢についてのデータを双方の変数に代入   
    sex, age = data_and_column

    #年齢が20歳以上の場合、大人なのでmaleかfemaleを返す。
    if(age > 20):
        return sex

    #年齢が20歳未満の場合は日本では子供なので、childという値を返す。
    else:
        return 'child'


#child_male_femaleというカラムを作成し、データにapply関数を使って先程の変数を適応
titanic_dataframe['child_male_female'] = titanic_dataframe[['sex','age']].apply(child_or_adult, axis=1)

今回は関数を利用して値を作成する方法を知りました!

値を確認してみましょう!

head関数に引数をつけると長く値を見ることが出来ます!

image.png

無事、childの値が入っていますね!

それでは、早速前回の章でご紹介したcountplotを利用して、先程作ったデータを描画して見ます!

countplot

sns.countplot('child_male_female', data=titanic_dataframe, palette='rainbow')


image.png

どうやら、子供の乗船者もたくさんいたようです。

次は乗船階級ごとに子供がどれだけ乗っていたか調べてみましょう。

sns.countplot('child_male_female', data=titanic_dataframe, hue='pclass', palette='rainbow')

image.png

第3階級乗った子供はとても多かったようです。

最後に、生還に子供だったことが関係しているか調べてみます。

sns.countplot('child_male_female', data=titanic_dataframe, hue='survived_ppl', palette='rainbow')

image.png

女性と同じくらい、子供も生還していたようです!

factorplotを使ったデータの描画で、より細かいデータを見よう!

今までcountplotを利用し他方法で、子供だったことが生死に関係したか調べてきましたが、簡潔故に引数を2つしか取れないというデメリットがあります。

そのため、seabornのfactorplotを利用して、より細かい条件で調べてみましょう!

まずは基本となる方法をご紹介します。

sns.factorplot('pclass', 'survived', data=titanic_dataframe)

image.png

ポイント!

・第一引数には、x軸に値するカラムを指定
・第二引数には、y軸に値するカラムを指定!
・第三引数には使いたいデータセットを指定します!
・第四引数からはオプションですが、前回の章でご紹介したhue,paletteの他に、aspect,order,legend,kind などの引数を取ることが出来ます!気になる方はこちら!をご確認ください!
・また、先ほど作成したsurvied_pplはaliveと同様に引数に取れないようなのでご注意ください!

オプションにorder=[1,2,3],kind='bar'(countplotのようにbarがでてきます)、paletteを指定した場合

sns.factorplot('pclass', 'survived', data=titanic_dataframe,order=[1,2,3], kind='bar',palette='rainbow')


image.png

しっかりと1,2,3の乗船階級ごとに並び、棒グラフが確率的に表示されていることを知ることが出来ます!

また、kindにはbar以外にも取れる引数がたくさんあるので、調べてみるのも勉強になるかもしれません!

最後に、第一引数に乗船階級、第二引数に生存に関する値をとって、オプションにlegend=True,hue='child_male_female'を取った場合(乗船階級と性別、生存に関する描画)を見てみましょう!

sns.factorplot('pclass', 'survived', data=titanic_dataframe,legend=True,hue='child_male_female')

image.png

どうやら、第一階級に乗船した子どもたちは100%に近いかたちで救出されていますが、第三階級では二人に一人以下の生存率だったようです。

しかし、第一階級に乗船する大人の男女とほぼ同じ確率で救出されているということは、子供の命は優先されていたということですね!

ちなみにlegendとは、「この色で描画されている値は、この値だよ!」と表示してくれるオプションです!

最後に

データの描画方法については、ご紹介出来ていないいろいろな方法があるので、随時更新していこうと思います!m(__)m

わかりづらい点等ありましたら、いつでもお声がけください!