【kaggle】タイタニックのコンペ(5)
Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。
↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle
Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle
17.データラングリング
・今までの分析の結果、様々な予想を立てることができた。
・データはいじらずに分析をしてきたが、ここではデータ自体をいじる。
17.1.不要な属性を取り除く
・部屋番号(Cabin)とチケット(Ticket)はそこまで重要じゃなさそう。
・データラングリングするときは、トレーニングデータセットとテストデータセットの両方に対して同じ操作を行う。
In [18]: train_df.shape Out[18]: (891, 12) In [20]: test_df.shape Out[20]: (418, 11) In [22]: train_df=train_df.drop(['Ticket','Cabin'],axis=1) In [23]: train_df.shape Out[23]: (891, 10) In [24]: test_df=test_df.drop(['Ticket','Cabin'],axis=1) In [25]: test_df.shape Out[25]: (418, 9) In [27]: combine[1].shape Out[27]: (418, 11) In [28]: combine=[train_df, test_df] In [29]: combine[1].shape Out[29]: (418, 9)
17.2.新しい属性を既存のデータから抽出、作成する。
・名前の肩書と生存率の相関を調べたい。
・The RegEx pattern (\w+\.)を使って肩書を抽出する。
In [32]: for dataset in combine: ...: dataset['Title']=dataset.Name.str.extract('([A-Za-z]+)\.',expand=False) ...: pd.crosstab(train_df['Title'],train_df['Sex']) Out[32]: Sex female male Title Capt 0 1 Col 0 2 Countess 1 0 Don 0 1 Dr 1 6 Jonkheer 0 1 Lady 1 0 Major 0 2 Master 0 40 Miss 182 0 Mlle 2 0 Mme 1 0 Mr 0 517 Mrs 125 0 Ms 1 0 Rev 0 6 Sir 0 1 In [33]: for dataset in combine: ...: dataset['Title']=dataset.Name.str.extract('([A-Za-z]+)\.',expand=False) In [42]: for dataset in combine: ...: dataset['Title']=dataset['Title'].replace(['Lady','Countess','Capt',\ ...: 'Col','Don','Dr','Major','Rev','Sir','Jonkheer','Dona'],'Rare') ...: dataset['Title']=dataset['Title'].replace('Mlle','Miss') ...: dataset['Title']=dataset['Title'].replace('Ms','Miss') ...: dataset['Title']=dataset['Title'].replace('Mme','Mrs') In [43]: train_df[['Title','Survived']].groupby(['Title'],as_index=False).mean() Out[43]: Title Survived 0 Master 0.575000 1 Miss 0.702703 2 Mr 0.156673 3 Mrs 0.793651 4 Rare 0.347826 In [44]: title_mapping={'Mr':1,'Miss':2,'Mrs':3,'Master':4,'Rare':5} In [45]: for dataset in combine: ...: dataset['Title']=dataset['Title'].map(title_mapping) ...: dataset['Title']=dataset['Title'].fillna(0) ...: In [46]: train_df.head() Out[46]: PassengerId Survived Pclass \ 0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 4 5 0 3 Name Sex Age SibSp \ 0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 4 Allen, Mr. William Henry male 35.0 0 Parch Fare Embarked Title 0 0 7.2500 S 1 1 0 71.2833 C 3 2 0 7.9250 S 2 3 0 53.1000 S 3 4 0 8.0500 S 1 #敬称を抽出したので、名前は不要になった。なので、取り除く。 #トレーニングデータからID番号も不要なので取り除く。 #テストデータでは最後の予測にIDと紐づけるためそのままにしておく。 In [47]: train_df=train_df.drop(['Name','PassengerId'],axis=1) In [48]: test_df=test_df.drop(['Name'],axis=1) In [49]: combine=[train_df,test_df] In [50]: train_df.shape, test_df.shape Out[50]: ((891, 9), (418, 9))
17.3.定性型属性を数字に変換する。
・文字列データを数字データに変換する。多くの予測モデルのアルゴリズムでは数字データにしておく必要がある。
・性別を男性0、女性1に変換する。
In [52]: for dataset in combine: ...: dataset['Sex']=dataset['Sex'].map({'female':1,'male':0}).astype(int) In [53]: train_df.head() Out[53]: Survived Pclass Sex Age SibSp Parch Fare Embarked Title 0 0 3 0 22.0 1 0 7.2500 S 1 1 1 1 1 38.0 1 0 71.2833 C 3 2 1 3 1 26.0 0 0 7.9250 S 2 3 1 1 1 35.0 1 0 53.1000 S 3 4 0 3 0 35.0 0 0 8.0500 S 1