tropicbirdのブログ

備忘録です。

【kaggle】タイタニックのコンペ(4)

Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。

↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle

Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle

14.今までの分析結果から、生存の有無について予測する。
14.1.相関(Correlating)

・予測したいことは各乗客の生存の有無である。よって、各属性データと生存の有無の相関を早い段階で確認する。

14.2.補完(Completing)

・生存の有無を予測する際に、年齢が重要な属性の場合、その欠損値を埋める必要があるかもしれない。
・乗船港も生存の有無や他の要素と相関がある可能性がるため、欠損値を埋める必要があるかもしれない。

14.3.補正(Correcting)

・チケットの属性はデータセットから取り除いてもよいかもしれない。22%のチケットに同じ名称であり、チケットの名称は生存の有無に関係ないかもしれないから。
・客室の情報も取り除いてもよかもしれない。客室の情報の多くは、トレーニングデータセットとテストデータセットにおいて、未完またはNull値であるため、
・乗客のID番号も取り除いてもよいかもしれない。ID番号は生存の有無とは関係が関係ない可能性があるため。
・乗客の名前のデータも取り除いてもよいかもしれない。全員が違う名前であり、標準化されていないため。

14.4.作成(Creating)

・ParchとSibSbデータを元に、家族(Family)のデータを作りたい可能性がある。
・名前のデータから、肩書(Mr.など)を抽出したいかもしれない。
・年齢をカテゴリー化したデータを作りたいかもしれない。つまり、定量データを順序尺度の定性データに変更したい。
・料金をカテゴリー化したデータを作りたいかもしれない。つまり、定量データを順序尺度の定性データに変更したい。

14.5.分類(Classifying)

・問題の背景や条件から、予測をすることもできる。
・女性は男性よりも生存率が高い。
・何歳以下の子どもは生存率が高い。
・等級が高い乗客(Pclass=1)は生存率が高い。

15.属性をピボットして分析する。

・今までの観測と推測を確かめるために、属性同士をピボットして簡単に分析することができる。
・この時点では、Null値がないデータのみを扱う。
・この時点では、名義尺度(性別)、順序尺度(等級)、離散変数(兄弟姉妹・配偶者の数、両親・子供の数)のみ扱う。

#データフレームの引数に属性を入れると、その属性のみを示したデータセットが表示される。
In [27]: train_df[['Pclass','Survived']]
Out[27]:
     Pclass  Survived
0         3         0
1         1         1
2         3         1
3         1         1
4         3         0
..      ...       ...
886       2         0
887       1         1
888       3         0
889       1         1
890       3         0

[891 rows x 2 columns]

#等級と生存率には高い相関が確認された。
#よって、等級を予測モデルの属性に含める。
In [30]: train_df[['Pclass','Survived']].groupby(['Pclass'],as_index=False).mean().
    ...: sort_values(by='Survived', ascending=False)
Out[30]:
   Pclass  Survived
0       1  0.629630
1       2  0.472826
2       3  0.242363

#性別と生存率も高い相関が確認された。
In [31]: train_df[['Sex','Survived']].groupby(['Sex'],as_index=False).mean().sort_v
    ...: alues(by='Survived',ascending=False)
Out[31]:
      Sex  Survived
0  female  0.742038
1    male  0.188908

#兄弟姉妹・配偶者の数(SibSp)と両親・子供の数(Parch)は幾つかの属性値で、相関が0である。
#そのため、14.4.作成(Creating)に示したとおり、家族(Family)という新しい属性を作ってから分析した方がいいかもしれない。
In [34]: train_df[['SibSp','Survived']].groupby(['SibSp'],as_index=False).mean().so
    ...: rt_values(by='Survived',ascending=False)
Out[34]:
   SibSp  Survived
1      1  0.535885
2      2  0.464286
0      0  0.345395
3      3  0.250000
4      4  0.166667
5      5  0.000000
6      8  0.000000

In [36]: train_df[['Parch','Survived']].groupby(['Parch'],as_index=False).mean().so
    ...: rt_values(by='Survived',ascending=False)
Out[36]:
   Parch  Survived
3      3  0.600000
1      1  0.550847
2      2  0.500000
0      0  0.343658
5      5  0.200000
4      4  0.000000
6      6  0.000000
16.データを視覚化する。

・視覚化によって、引き続き今までの観測と推測を確認する。

#定量型属性の相関を確認する。
#生存率と年齢の関係を確認する。
In [51]: g=sns.FacetGrid(train_df,col='Survived')

In [52]: g.map(plt.hist, 'Age',bins=20)
Out[52]: <seaborn.axisgrid.FacetGrid at 0x7f3d106e34e0>

#4歳以下の子どもの生存率は高い。
#80歳の乗客は生き残った。
#15歳から25歳の乗客の多くは亡くなった。

#★この分析の結論
#年齢を予測モデルに組み込むべき。
#年齢がNull値のデータは補完する必要がある。
#年齢を一定のグループ分けにするべき。

f:id:tropicbird:20190722205744p:plain

#定量型属性と順序尺度属性の相関を確認する。
In [54]: grid=sns.FacetGrid(train_df,col='Survived',row='Pclass',height=2.2,aspect=
    ...: 1.6)

In [55]: grid.map(plt.hist,'Age',alpha=.5,bins=20)
Out[55]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb63f390>

In [56]: grid=sns.FacetGrid(train_df,col='Survived',row='Pclass',height=2.2,aspect=
    ...: 1.6)

In [57]: grid.map(plt.hist,'Age',alpha=.5,bins=20)
Out[57]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb63f5f8>

In [58]: grid.add_legend()
Out[58]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb63f5f8>
#乗客は等級3が最も多く、亡くなった乗客も等級3が多い。
#等級2と3の幼児の大半は生き残った。
#等級1の乗客の多くは生き残った。
#各等級内の年齢の分布は異なる。

#★この分析の結論
#等級を予測モデルに取り込む。

f:id:tropicbird:20190722205719p:plain

#定性データの相関
In [60]: grid=sns.FacetGrid(train_df, row='Embarked',height=2.2,aspect=1.6)

In [61]: grid.map(sns.pointplot,'Pclass','Survived','Sex',palette='deep',order=[1,2,3],hue_order=['male','female'])
Out[61]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb775ac8>

In [62]: grid.add_legend()
Out[62]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb775ac8>

#女性は男性よりも生存率が高い。
#港Cからの乗客は例外的に男性の方が生存率が高い。これは、港と等級の相関がある可能性を示唆している。
#港Cと港Qの等級3の生存率は比較的高い。
#港と生存率を大きく相関している。

#★この分析の結論
#性別を予測モデルに取り入れる。
#港属性のデータのNull値を埋め、港属性を予測モデルに取り入れる。

f:id:tropicbird:20190722205657p:plain

#定性型属性と定量型属性の相関を確認する。
In [64]: grid=sns.FacetGrid(train_df,row='Embarked',col='Survived',height=2.2,aspec
    ...: t=1.6)

In [65]: grid.map(sns.barplot,'Sex','Fare',alpha=.5,ci=None,order=['female','male'])

Out[65]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb25f320>

In [66]: grid.add_legend()
Out[66]: <seaborn.axisgrid.FacetGrid at 0x7f3cfb25f320>

#高い料金を支払っている乗客は生存率が高い。料金をカテゴリー化したデータを作る。
#港と生存率は相関がある。港のNull値を埋める。

#★この分析の結論
#定量データの料金を区分化したデータを新たに作成する。

f:id:tropicbird:20190722205630p:plain