1. 字段描述
2. info()方法
3. 数据分布
38%的乘客生存率
超过76%的乘客没有与父母和孩子一起旅行
大约31% 的乘客与亲属一起登船
少于1%的乘客付了高达512美元的船票费,少于1%的乘客年龄在64~80岁
Sex特征中有65%为男性
577➗891=0.6476
Cabin 中的count 与unique并不相等,说明有些乘客共享一个Cabin
Embarked一共有3种取值,其中从S港口登船的人最多
Ticket的特征下,有22%左右的重复值(unique=618)
4. 特征相关性分析
女性有更大的存活率
train_df[['Sex','Survived']].groupby(['Sex'],as_index=False).mean()
上等舱的乘客(Plass=1)有更大的存活率
train_df[['Pclass','Survived']].groupby(['Pclass'],as_index=False).mean()
SipSp和Parch与Survive有相关性
train_df[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)
train_df[['Parch', 'Survived']].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Age与Survived有相关性
使用了seaborn库中的FacetGrid对象来绘制一个分面图(faceted plot),其中按照train_df数据集中的’Survived’列的值(0表示未存活,1表示存活)来分面,并在每个分面中绘制’Age’列的直方图:
g = sns.FacetGrid(train_df,col='Survived')
g.map(plt.hist, 'Age',bins=20)
plt.show()
'Age’参数指定了要绘制直方图的列,bins=20指定了直方图中条形的数量
5. 数据清洗与预处理
前面我们已经收集了一些假设和结论,接下来清洗数据
修正数据
丢弃Cabin 和 Ticket这两个特征(同时在训练集和测试集中丢弃)
train_df = train_df.drop(['Ticket','Cabin'], axis=1) #axis 删除的是列(axis=1)还是行(axis=0)
test_df = test_df.drop(['Ticket','Cabin'], axis=1)
combine = [train_df, test_df]
female 转换为1,male 转换为0
for dataset in combine:
dataset['Sex'] = dataset['Sex'].map({'male': 0, 'female': 1}).astype(int)
train_df.head()
创建数据
Title特征
从Name特征中提取Title特征,并测试Title与Survive之间的关系
在泰坦尼克号数据集中,乘客的姓名(Name 列)通常包含了他们的称谓(如 Mr., Mrs., Miss., Master, Dr., etc.),这些称谓后面通常跟着一个点(.)和乘客的名字。由于这些称谓可能与乘客的社会地位、年龄或性别有关,它们可能包含对预测乘客生存几率有用的信息。
在数据分析和机器学习的预处理阶段,提取这些称谓并将其作为新的特征(或称为列)添加到数据集中是很常见的做法。这有助于捕捉原始数据中可能隐藏的模式或相关性,并可能提高模型的预测性能。
for dataset in combine:
dataset['Title'] = dataset['Name'].str.extract('([A-Za-z]+)\.',expand=False)
pd.crosstab(dataset['Title'], dataset['Sex'])
使用 pandas 的 .str.extract()
方法可以很容易地从包含这些称谓的字符串中提取它们。在这个方法中,我们使用了正则表达式 ([A-Za-z]+)\.
来匹配一个或多个字母(不区分大小写),后面紧跟着一个点号(.)。正则表达式的括号 () 用于捕获匹配的文本,而 expand=False
参数确保只返回一个列
再将Title特征中常见的称呼用“Rare”来替代:
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')
train_df[['Title','Survived']].groupby(['Title'],as_index=False).mean()
再将离散型的Title转化为有序的数值型:
title_mapping = {"Mr":1,"Miss":2,"Mrs":3,"Master":4,"Rare":5}
for dataset in combine:
dataset['Title'] = dataset['Title'].map(title_mapping)
dataset['Title'] = dataset['Title'].fillna(0)
train_df.head()
丢弃Name 特征和PassengerId 特征
现在丢弃训练集和测试集中的Name特征,丢弃训练集的PassengerId特征
train_df = train_df.drop(['Name','PassengerId'], axis=1) #axis 删除的是列(axis=1)还是行(axis=0)
test_df = test_df.drop(['Name'], axis=1)
combine = [train_df, test_df]
IsAlone 特征
组合Parch和SibSp特征,创建一个新的FamilySize特征,再通过FamilySize特征创建一个名为IsAlone的特征。最后丢弃Parch、SibSp和FamilySize特征,保留IsAlone特征。
for dataset in combine:
dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
train_df[['FamilySize','Survived']].groupby(['FamilySize'],as_index=False).mean().sort_values(by='Survived',ascending=False)