tropicbirdのブログ

備忘録です。

【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