【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値のデータは補完する必要がある。 #年齢を一定のグループ分けにするべき。
#定量型属性と順序尺度属性の相関を確認する。 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の乗客の多くは生き残った。 #各等級内の年齢の分布は異なる。 #★この分析の結論 #等級を予測モデルに取り込む。
#定性データの相関 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値を埋め、港属性を予測モデルに取り入れる。
#定性型属性と定量型属性の相関を確認する。 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値を埋める。 #★この分析の結論 #定量データの料金を区分化したデータを新たに作成する。