目录
6,探究孤身一人和有家人陪伴的生存率(SibSp,Parch)
写在前面
回顾这个项目的基本流程:
1、查看数据集,合并训练集测试集以一起进行数据清洗
2、数据清洗:查看数据集空缺值,并填充空缺值
3、探索性可视化:通过透视表和图表,探究各个特征与label(需要预测的值)的相关性,若有相关性则保留。
4、特征工程:
- 若特征为离散型特征(类别型特征)(Name,Pclass,Embarked,Sex等),则进行独热编码,若特征为连续型数值(Fare,Age),则对特征数值进行分组,并对不同组别进行赋值,再进行Ont_hot编码处理
- 属性几乎相同的多个特征(如SibSp: 乘客在船上的兄妹姐妹数/配偶数,Parch: 乘客在船上的父母数/子女数都属于亲人),在分别探究其与label的相关性决定保留后,可以将它们重组为新的特征。
4、特征选择:通过相关系数来选择
数据集情况查看
将训练数据与测试数据连接起来,以便一起进行数据清洗。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# 这里需要注意的是,如果没有后面的ignore_index=True
#那么index的值在连接后的这个新数据中是不连续的 继续从 0开始,如果要按照index删除一行数据,可能会发现多删一条。
full = pd.concat([train, test], ignore_index=True)
full.head() # 默认显示5行
PassengerId: 乘客ID;
Survived: 生存情况,0代表不幸遇难,1代表存活;
Pclass: 仓位等级,1为一等舱,2为二等舱,3为三等舱;
Name: 乘客姓名;
Sex: 性别;
Age: 年龄;
SibSp: 乘客在船上的兄妹姐妹数/配偶数(即同代直系亲属数);
Parch: 乘客在船上的父母数/子女数(即不同代直系亲属数);
Ticket: 船票编号;
Fare: 船票价格;
Cabin: 客舱号;
Embarked: 登船港口(S: Southampton; C: Cherbourg Q: Queenstown)
#查看字符型数据情况:
full.describe(include=['O'])
full.describe().T
#describe()函数只能查看数据类型的描述统计信息,无法查看类似字符类型的信息。
#故需用info()函数进一步查看每一列的数据信息。
full.info()
数据清洗
print(full.isnull().sum()) # 查看数据的缺失情况
PassengerId 0 Survived 418 Pclass 0 Name 0 Sex 0 Age 263 SibSp 0 Parch 0 Ticket 0 Fare 1 Cabin 1014 Embarked 2 dtype: int64
缺失值 Age 263, Fare 1 ,Cabin 1014, Embarked 2
Embarked:
分类数据,使用最常见的类别取代,用众数填充。
#用众数填补Embarked
#查看众数
full.Embarked.mode()
full['Embarked'].fillna('S',inplace=True)
Fare
船票费用是类别数据,但是不同客舱的票价不同 ,用Fare空缺所在的客舱号的票价中位数来填充
#填补Fare空缺值,用Pclass==3的客舱票价的中位数来填充
full[full.Fare.isnull()]#查看Fare缺失值的信息,获得Pclass
full.Fare.fillna(full[full.Pclass==3]['Fare'].median(),inplace=True)
Age
用中位数来填充年龄
如果是数值类型,使用平均值或者中位数进行填充
#年龄(Age) 最小值为0.17,不存在0值,其数据缺失率为263/1309=20.09%,由于Age的平均数与中位数接近,故选择平均值作为缺失项的填充值。
full.Age.fillna(full.Age.mean(),inplace = True)
# full['Age']=full['Age'].fillna(full['Age'].mean())
full.Age.describe()
'''count 1309.000000
mean 29.881138
std 12.883193
min 0.170000
25% 22.000000
50% 29.881138
75% 35.000000
max 80.000000
Name: Age, dtype: float64'''
Cabin
- 1,用U来填充,表示unkown
字符串类型,按照实际情况填写,无法追踪的信息,用”Unknow”填充。处理Cabin缺失值 U代表Unknow
full['Cabin'] = full['Cabin'].fillna('U')
- 2缺失个数:
687 超过75%的数据缺失,故不打算填补。考虑以Cabin是否缺失来构建一个新特征,看是否对生存有影响。若没有影响,则删除该列
full.Cabin.isnull().sum()
#1014
#创造新特征Cabin_exist,判断Cabin与Survived的相关性,相关性不大则删除
full['Cabin_exist'] = full['Cabin'].map(lambda x:"Yes" if type(x)==str else "No")# 判断类型是否相等
full[["Cabin_exist", "Survived"]].groupby("Cabin_exist",as_index=False).mean()
Cabin_exist | Survived | |
---|---|---|
0 | No | 0.299854 |
1 | Yes | 0.666667 |
full =full.drop('Cabin_exist',axis = 1)
full.head()
#将字符转换为数值
full['Cabin_exist'] = full['Cabin'].map(lambda x: 1 if type(x)==str else 0)
full = full.drop('Cabin',axis = 1)
full.head()
# full.loc[full.Cabin.notnull(),'Cabin'] = 1
# full.loc[full.Cabin.isnull(),'Cabin'] = 0
# full.Cabin.isnull().sum()#验证填充效果
sns.barplot(x="Cabin_exist",y="Survived",data=full)
full.isnull().sum()
#数据处理完毕
full.head()
特征工程
1,探究Sex与Survived的相关性
'''======================================================特征工程========================================================================'''
#1,探究Sex与Survived的相关性
full[['Sex','Survived']].groupby('Sex',as_index = False).mean().sort_values('Survived',ascending = False)
sns.countplot(x = 'Sex',hue = 'Survived',data =full)
#Sex(性别),将字符映射到字符
sex_dict = {'male': 1,'female':0}
full['Sex'] = full['Sex'].map(sex_dict)
full['Sex'].head()
full[["Pclass","Sex","Survived"]].groupby(["Pclass","Sex"],as_index=False).mean().sort_values(by="Survived",ascending=False)