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

この記事は、[こちらの記事](https://qiita.com/yossyyossy/items/0413b04d4eff5465b015)の二章目になっております！

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

#準備するもの

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

#知れること

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

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

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

```py3

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

%matplotlib inline

```

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

```py3

titanic_dataframe = sns.load_dataset('titanic')

```

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

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

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

```py3

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の内容を調べてみます！

```py3

titanic_dataframe.head()

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/994cc6a7-919c-bd45-f66e-a262bf407eff.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/1db8db89-c775-2e86-b88d-d1e8ecb640ed.png)

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

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

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

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

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

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

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

```py3

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

titanic_dataframe.head()

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/36891e83-08ae-0f6c-5c45-03f7b81079a2.png)


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

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

```py3

del titanic_dataframe['mistake_column']

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/5ad7ca76-28d8-e35a-4e55-080aa17d6e7a.png)

無事削除されました！

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

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

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

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

```py3

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

```

####**ポイント！**

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

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

```py3

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

```

![uploading-0]()


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

---

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


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

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

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

```py3

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')を作成して、子供であったことが事件後の生存と関係しているか調べる。

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

```py3

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

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'


```

```py3

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

```

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

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/94931c7c-c967-96cd-4c21-2f9e79ce591d.png)

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

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

#countplot

```py3

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


```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/42b8d3c0-0df4-b2d7-a57c-8d85d12f546a.png)


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

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

```py3

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

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/d3069080-64f7-c642-e789-ca2943e53e42.png)

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

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

```py3

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

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/4a30ee49-232a-1ede-3d61-6ce5ee46144c.png)

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

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

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

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

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

```py3

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/09d60fc6-5d56-55e6-c170-6d73d6378a87.png)


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

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

```py3

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


```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/bc3fbaf6-9436-d5ad-5c9c-a17b0f30551d.png)

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

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



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

```py3

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

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/d09e7d98-af11-7889-194c-112ba2d5c065.png)

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

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



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


#最後に

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


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