做者:xiaoyupython
微信公众号:Python数据科学微信
知乎:python数据分析师app
Kaggle做为公认的数据挖掘竞赛平台,有不少公开的优秀项目,而其中做为初学者入门的一个好的项目就是:泰坦尼克号生还者预测。学习
可能这个项目好多朋友也据说过,可能不少朋友也作过。可是项目完成后,是否有很好的反思总结呢?不少朋友只是潦草的敷衍过去了,知道大概的套路了就没再去看。其实,一个再简单的项目,若是把它作好也能有巨大的收获。测试
博主开始作的时候,也是通过反复琢磨和尝试,并从最初的20%到最好的2%,期间学习了不少,不得不说这个项目让我很好的了解了数据挖掘。spa
本篇,博主将会从零开始介绍这个项目,教你如何一步一步的把这个
项目作好。因为大部分星球的朋友们已经完成了分析部分的实战练习,所以将这部份内容拿出来进行简单的分享。3d
首先对这个项目进行一下介绍。code
万变不离其宗,拿到数据首先粗率的观察。orm
""" 导入数据 """ import pandas as pd import numpy as np data_train = pd.read_csv('train.csv') data_test = pd.read_csv('test.csv') df = data_train.append(data_test)
将训练集和测试集进行合并,以便后续数据内容变换的统一处理。blog
df.info() print('合并后一共{0}条数据。'.format(str(df.shape[0]))) print(pd.isnull(df).sum())
合并后一共1309条数据,并能够看到:age,cabin,embarked,Fare 四个特征有缺失值,其中cabin缺失比较严重。
df.describe()
异常值初始观察(主要观察一下最大与最小值):
结论: 经过以上观察和分析,咱们看到了一些可能的异常值,可是也不敢确定。这须要咱们进一步经过可视化来清楚的显示并结合对业务的理解来肯定。
import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline plt.style.use("bmh") plt.rc('font', family='SimHei', size=13) cat_list = ['Pclass','Name','Sex','SibSp','Embarked','Parch','Ticket','Cabin'] for n,i in enumerate(cat_list): Cabin_cat_num = df[i].value_counts().index.shape[0] print('{0}. {1}特征的类型数量是: {2}'.format(n+1,i,Cabin_cat_num))
结论:
从上面各特征值的类型数量来看:
所以,先对上面5种容易的分类进的特征行可视化。
f, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=(20,5)) sns.countplot(x='Sex', hue='Survived', data=data_train, ax=ax1) sns.countplot(x='Pclass', hue='Survived', data=data_train, ax=ax2) sns.countplot(x='Embarked', hue='Survived', data=data_train, ax=ax3) ax1.set_title('Sex特征分析') ax2.set_title('Pclass特征分析') ax3.set_title('Embarked特征分析') f.suptitle('定类/定序数据类型特征分析',size=20,y=1.1) f, [ax1,ax2] = plt.subplots(1,2,figsize=(20,5)) sns.countplot(x='SibSp', hue='Survived', data=data_train, ax=ax1) sns.countplot(x='Parch', hue='Survived', data=data_train, ax=ax2) ax1.set_title('SibSp特征分析') ax2.set_title('Parch特征分析') plt.show()
对于上面的定类和定序数据类型,咱们分别能够观察到各特征值的分布状况,以及与目标变量之间的联系。
就以上5个特征来看,Sex和Pclass两个特征是其中很是有影响的两个。
以上只是单独特征对是否生还的简单分析,但实际上对目标变量的影响是由多个因素形成的,而不仅是单独的影响。为此,咱们须要知道在某个特定条件下的特征的影响才更加能帮助咱们分析:
如下是用FaceGrid进行的具体分析:
# 在不一样社会等级下,男性和女性在不一样登录港口下的数量对比 grid = sns.FacetGrid(df, col='Pclass', hue='Sex', palette='seismic', size=4) grid.map(sns.countplot, 'Embarked', alpha=0.8) grid.add_legend()
观察结果:
# 在不一样社会等级下,男性和女性在不一样登录港口下的数量对比 grid = sns.FacetGrid(data_train, row='Sex', col='Pclass', hue='Survived', palette='seismic', size=4) grid.map(sns.countplot, 'Embarked', alpha=0.8) grid.add_legend()
1. Age分布和特征分析
# kde分布 f,ax = plt.subplots(figsize=(10,5)) sns.kdeplot(data_train.loc[(data_train['Survived'] == 0),'Age'] , color='gray',shade=True,label='not survived') sns.kdeplot(data_train.loc[(data_train['Survived'] == 1),'Age'] , color='g',shade=True, label='survived') plt.title('Age特征分布 - Surviver V.S. Not Survivors', fontsize = 15) plt.xlabel("Age", fontsize = 15) plt.ylabel('Frequency', fontsize = 15)
结论:
很明显看到,以上Survived与Not Survived特征分布的主要区别在 0 ~15左右。小于15岁如下的乘客(也就是孩子)获救率很是高,而大于15岁的乘客分布无明显区别。
# 箱型图特征分析 fig, [ax1,ax2] = plt.subplots(1,2,figsize=(20,6)) sns.boxplot(x="Pclass", y="Age", data=data_train, ax =ax1) sns.swarmplot(x="Pclass", y="Age", data=data_train, ax =ax1) sns.kdeplot(data_train.loc[(data_train['Pclass'] == 3),'Age'] , color='b',shade=True, label='Pcalss3',ax=ax2) sns.kdeplot(data_train.loc[(data_train['Pclass'] == 1),'Age'] , color='g',shade=True, label='Pclass1',ax=ax2) sns.kdeplot(data_train.loc[(data_train['Pclass'] == 2),'Age'] , color='r',shade=True, label='Pclass2',ax=ax2) ax1.set_title('Age特征在Pclass下的箱型图', fontsize = 18) ax2.set_title("Age特征在Pclass下的kde图", fontsize = 18) fig.show()
结论:
不一样Pclass下的年龄分布也不一样,三个分布的中位数大小按 Pclass1 > Pclass2 > Pclass3 排列。这也符合实际状况,Pclass1的乘客是社会上的拥有必定财富和地位的成功人士,年龄比较大,而Pclass3的人数最多,由于大多数人还都是普通人(有钱人毕竟少数),而且这些人可能是年轻人,年龄在20-30之间。
# Sex,Pclass分类条件下的 Age年龄对Survived的散点图 grid = sns.FacetGrid(data_train, row='Sex', col='Pclass', hue='Survived', palette='seismic', size=3.5) grid.map(plt.scatter, 'PassengerId', 'Age', alpha=0.8) grid.add_legend()
结论:
从散点图来分析:
印证了那个原则:妇女和孩子优先营救。
# Sex,Embarked分类条件下的 Age年龄对Survived的散点图 grid = sns.FacetGrid(data_train, col = "Embarked", row = "Sex", hue = "Survived", palette = 'seismic', size=3.5) grid = grid.map(plt.scatter, "PassengerId", "Age") grid.add_legend() grid
# Sex,SibSp分类条件下的 Age年龄对Survived的散点图 grid = sns.FacetGrid(data_train, col = "SibSp", row = "Sex", hue = "Survived", palette = 'seismic') grid = grid.map(plt.scatter, "PassengerId", "Age") grid.add_legend() grid
# Sex,Parch分类条件下的 Age年龄对Survived的散点图 grid = sns.FacetGrid(data_train, col = "Parch", row = "Sex", hue = "Survived", palette = 'seismic') grid = grid.map(plt.scatter, "PassengerId", "Age") grid.add_legend() grid
2. Fare分布和特征分析
# 箱型图特征分析 fig, [ax1,ax2] = plt.subplots(1,2,figsize=(20,6)) sns.boxplot(x="Pclass", y="Fare", data=data_train, ax =ax1) sns.swarmplot(x="Pclass", y="Fare", data=data_train, ax =ax1) sns.kdeplot(data_train.loc[(data_train['Pclass'] == 3),'Fare'] , color='b',shade=True, label='Pcalss3',ax=ax2) sns.kdeplot(data_train.loc[(data_train['Pclass'] == 1),'Fare'] , color='g',shade=True, label='Pclass1',ax=ax2) sns.kdeplot(data_train.loc[(data_train['Pclass'] == 2),'Fare'] , color='r',shade=True, label='Pclass2',ax=ax2) ax1.set_title('Fare特征在Pclass下的箱型图', fontsize = 18) ax2.set_title("Fare特征在Pclass下的kde图", fontsize = 18) fig.show()
结论:
观察到Pclass1相对于2和3的Fare比较高,由于地位高,财富多。可是Pclass1中有几个大于500的异常值存在,看一下这些异常数据。
df.loc[df['Fare']>500]
这些异常值中,有两个名字同样的Cardeza,又看到Parch都为1,SibSp都为0,Fare,Cabin,Embarked,Ticket都同样,可推测二人是夫妻。 另外两我的的Embarked,Ticket,Fare也都同样,这说明这个大于500的Fare可能不是异常值。后面咱们会对这些进行特征工程来特殊对待。
# Sex和Pclass状况下Fare和Age的散点图 grid = sns.FacetGrid(data_train, row='Sex', col='Pclass', hue='Survived', palette='seismic', size=3.5) grid.map(plt.scatter, 'Age', 'Fare', alpha=0.8) grid.add_legend()
g = sns.pairplot(data_train[[u'Survived', u'Pclass', u'Sex', u'Age', u'Parch', u'Fare', u'Embarked']], hue='Survived', palette = 'seismic', size=4,diag_kind = 'kde',diag_kws=dict(shade=True),plot_kws=dict(s=50) ) g.set(xticklabels=[])
这是上述7个特征的相互关联图的汇总,对角线为特征自身的kde分布。对于不方即可视化的Name,Cabin,Ticket将在特征工程中进一步进行处理并挖掘这些数据中到底有什么信息是很是有价值的。
公众号后台回复:泰坦尼克号,获取源训练集和测试集。下一篇将着重介绍特征工程的内容,敬请期待。
关注微信公众号:Python数据科学,查看更多精彩内容。