一、数据分布
1、数值型数据的分布情况
探查这个问题帮助我们了解训练数据在泰坦尼克事件中是否具有代表性。
train_df.describe()
数值型数据统计
(1)样本总数为891个,约占泰坦尼克号乘客总数的40%
(2)样本中人员存活率为38%(实际存活率为32%)(survived字段)
(3) 75%以上的乘客没带孩子和父母出行(Parch字段)
(4)25%以上的乘客与兄弟姊妹或伴侣同行(SibSp字段)
(5)费用波动较大,只有少量乘客(<1%)花费达到$512这么高(Fare字段)
(6)少量高龄乘客(<1%)(65-80岁)(Age字段)
2、类别型数据的分布情况
train_df.describe(include=['O'])
类别型数据分布情况
(1)数据集中姓名不重复
(2)男性约占65%
(3)船舱有几个重复值,有几个乘客分享一个仓
(4)上船港口有三个可能值,从S港口上船的人数最多
(5)票据的重复性较高(22%),完全不重复的有681张
3、基于以上分析我们安排一下接下来的工作
(1)关联性:
了解每个特征和目标值的关联程度,并将结果应用到模型中
(2)完善数据:
完善年龄数据,因为这个特征肯定和目标值有关联关系
完善登船港口,因为这个特征和目标值或其他重要特征有关联
(3)校正数据:
①去除Ticket字段,因为这个字段的重复值过高,而且和目标值也没什么明显关系
②去除Cabin字段,因为这个字段的缺失值太多了
③去除PassengerId字段,因为这个字段和目标值没什么明显关系
④Name字段可能应当去除,因为这个字段不规范和目标值也没关系
(4)创造数据
①创造Family数据,将Parch、SibSp字段的值组合起来,得到一个乘客有多少家庭成员在船上
②从Name字段中提取数据,建立Title字段(没看懂原文,但是看后边源码应该就晓得了)
③创造Age bands字段,将连续数值型数据转换为有序的分类数据( ordinal categorical feature)
④可能会创建Fare range字段,如果有用的话
(5)分类
①女性更容易存活
②孩子更易存活
③高等仓乘客更易存活
4、通过“pivoting”(就是groupby了之后求平均啥的,不知道咋翻译)分析特征相互关系
为了进一步验证以上发现和假设,我们可以快速地分析特征相互之间的关系。但是我们只能对没有空值的数据进行分析,如 Pclass、Pclass、(SibSp, Parch)
① Pclass:我们发现Pclass和Survived有显著的关系, 多于一半的Pclass=1的人存活。我们的模型应该考虑这个特征。
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived',ascending=False)
Pclass的关联性
② Sex:性别也和Survived有显著关系,女性的存活率显著多于男性
train_df[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived',ascending=False)
Sex的关联性
③ SibSp and Parch:没有显著的关系,或许需要用这两个字段派生出一个字段。
train_df[["SibSp", "Survived"]].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)
SibSp
train_df[["Parch", "Survived"]].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Parch
5、基于数据可视化来进行数据分析
接下来通过数据可视化来继续进行分析
(1)数值型特征和目标值之间的联系
直方图对分析像年龄这类的数值型变量比较有用。可以通过直方图看出某个数据范围可能的倾向(eg: 是不是婴儿具有更高的存活率?)
g = sns.FacetGrid(train_df, col='Survived')
g.map(plt.hist, 'Age', bins=20)
Age
根据上图,我们发现:
①婴儿(Age <= 4)有较高存活率
②年龄最大(Age = 80)的人活了下来
③大量15 - 25岁的人没有活下来
④多少乘客年龄在15-35之间
所以我们需要对Age字段可以做以下处理:
①在进行模型训练时将Age字段考虑进来。
②完善Age字段。
③给不同的年龄段分组
(2)数值数据和序数数据的关系
可以根据类别分别建立单个图表,分析数值数据和序数数据之间的关系
# grid = sns.FacetGrid(train_df, col='Pclass', hue='Survived')
grid = sns.FacetGrid(train_df, col='Survived', row='Pclass', height=2.2, aspect=1.6)
grid.map(plt.hist, 'Age', alpha=.5, bins=20)
grid.add_legend();
Pclass
根据上图,我们发现:
①Pclass=3有最多的乘客,然而多数都没有活下来
②Pclass=2、3 中的婴儿大多数都活下来了
③Pclass=1的乘客多数存活
④每个Pclass中的乘客年龄分布不同
可以得出决策:
训练模型时考虑Pclass
(3)类别特征与目标值的关联(从哪个港口上船)
点图(pointplot)聚焦一个或多个分类变量的不同级别之间的比较
# grid = sns.FacetGrid(train_df, col='Embarked')
grid = sns.FacetGrid(train_df, row='Embarked', height=2.2, aspect=1.6)
grid.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='deep')
grid.add_legend()
Embarked
根据上图,我们发现:
①再次确认女性的存活率多于男性。
②除了当Embarked=C时,男性拥有更高的存活率。Embarked和Pclass相关,和Survived间接相关。
③ 相较于Pclass=2的Embarked=C、Q的男性,Pclass=3的男性拥有更高的生存率(我没看出来。。。。)
④Pclass=3的男性Embarked不同,生产率也不同
可以得出决策:
①模型训练时考虑Sex特征
②完善Embarked特征,并在模型训练时使用他们
(4)分析非数值类型的分类数据与数值型数据的关系
看看Embarked (非数值型分类数据), Sex (非数值型分类数据), Fare (连续数字), 与Survived (数值型分类数据)的关系。
# grid = sns.FacetGrid(train_df, col='Embarked', hue='Survived', palette={0: 'k', 1: 'w'})
grid = sns.FacetGrid(train_df, row='Embarked', col='Survived', height=2.2, aspect=1.6)
grid.map(sns.barplot, 'Sex', 'Fare', alpha=.5, ci=None, order=['female','male'])
grid.add_legend()
Fare
根据上图,我们发现:
①消费越高,存活几率越大
②从哪个港口(Embarked)上船和生存几率有关
可以得出决策:
①将Fare分段
网友评论