一、明确目标
数据分析的目的取决于项目需求,脱离了实际项目需求的数据分析就是无源之水,所以第一步就是明确分析的目标是什么。
本次项目是著名的泰坦尼克号沉船事件,这里想知道影响沉船生存率的因素是什么,并且预测乘客的的生存率。
二、分析思路和方法
在统计学领域,数据分析分为描述性数据分析、探索性数据分析、验证性数据分析;本次项目属于探索性和验证性,所以主要用到相关分析和回归分析,但是也会用到描述统计分析,分析思路如下面的思维导图:
三、理解数据
3.1采集数据
从官网了解项目需求,下载数据,了解变量的意思
3.2导入数据
将下载的数据导入python,这里的数据集train用于模型的训练和测试,test用于预测结果。查看数据的行列数,train比test多一列,即survived生存这一列,这是需要我们通过机器学习,预测的结果。
#导入数据处理包
import pandas as pd
import numpy as np
#导入下载好的数据集
train=pd.read_csv(r'F:\houzi\train.csv')
test=pd.read_csv(r'F:\houzi\test.csv')
print('训练数据集:',train.shape,'测试数据集:',test.shape)
训练数据集: (891, 12) 测试数据集: (418, 11)
train和test的字段一致,所以可以用append将两个数据集合并,一起清洗,提高效率。
合并两个数据集的时候,test数据集少一列,ignore_index=true表示忽略用NAN填充。
3.3查看数据信息
用info()查看数据类型和缺失情况。
如上图,有四个字段有缺失值
float64数值型数据Age缺失1309-1046=263,缺失率为263/1309=20%,Fare缺失1个数据;
object类型数据Cabin缺失1309-295=1014,缺失率为77%,Embarked缺失2条
知道缺失值信息,为后面数据清洗明确方向。
四、清洗数据
4.1处理缺失数据
4.1.1 数值型数据Age,Fare缺失值处理,一般用均值填充
full['Age']=full['Age'].fillna(full['Age'].mean())
full['Fare']=full['Fare'].fillna(full['Fare'].mean())
4.1.2 object型数据缺失值处理
Cabin,Embarked为分类型数据,一般用众数填充
Cabin的缺失率为77%,缺失值比较多,众数未知unknown,用U表示;
#缺失值比较多,填充为U,表示未知
full['Cabin']=full['Cabin'].fillna('U')
Embarked只有2条缺失,用value_counts得出每个值出现的次数,找出众数
查看填充完缺失值的数据集信息,填充成功。
4.2特征工程
数据预处理的工作完成,接下来就是选取用于数据分析,机器学习的数据特征,也就是自变量。选出和分析需求,也就是生存率survived相关性大的数据特征训练模型
4.2.1提取特征
对特征进行分类,每一类数据提取方式不同,如下图
将本项目的特征进行分类
分类数据:Cabin,Embarked,Pclass,Sex,Parch,SibSp
字符串数据:Name,Ticket
数值数据:Age,Fare,PassengerId
分类数据特征提取
直接类别的特征:
Cabin,Embarked,Pclass,Sex,Parch,SibSp
(1)Sex
原始数据有两个分类:female,male,为了方便训练模型,用map函数将其映射为数值0,1,map函数可以对Series的每个数据引用自定义的函数。
#定义一个字典,将性别的值映射为数值
sex_mapDict={'male':1,
'female':0}
full['Sex']=full['Sex'].map(sex_mapDict)
(2)Embarked登入港口
用value_counts查看Embarked有3个分类C,S,Q,这里用one_hot编码将分类数据转换为二元特征的数值数据,原始数据中C,S,Q都在同一列,这里转换为C,S,Q各占一列,某一位乘客的登入口为C,则该C列的值为1,S,Q列下的值为0;如下用pandas中的get_dummies方法:
将转换后的数据合并到原数据中,应用函数concat,表连接的方法还有join和merge
#将虚拟变量EmbarkedDf添加到full
full=pd.concat([full,EmbarkedDf],axis=1)
full.drop('Embarked',axis=1,inplace=True)
(3)Pclass船舱等级
也是分类数据,处理方法和Embarked一致
(4)Cabin船舱号
Cabin的数据需要进行整理,统一用船舱号的首字母代替,然后再用get_dummies进行one_hot编码,这里用到了匿名函数lambda,不需要定义函数,对函数命名,lambda后面是变量,冒号:后面是函数的返回值,这里的lambda函数表示返回a的第一个元素,再结合map函数,表示对full['Cabin']的每一个元素应用该匿名函数。
(5)Parch,SibSp
用来衡量乘客的家庭大小,家庭大小会影响乘客生还率,创建衡量家庭规模的变量familysize
familysize=同代亲属数Parch+不同代亲属数SibSp+1乘客本人
Parch:兄弟姐妹数和配偶书,即同代直系亲属数量
SibSp:父母数和子女数,即不同代直系亲属数量
,制定一个衡量家庭大小的标准:
当familysize=1时,为小家庭
2
familysize>=5,为大家庭
字符串数据特征提取
字符串数据:Name,Ticket
(1)Name
每一个名字中都有称谓Mr,Mrs,Miss,可以用split分割字符串提取这些称谓,提取之后进行统计,结果显示称谓分类太多,不便于分析,西方人对头衔分为officer,Royalty,Master,Mr,Mis,Miss六种,用map函数进行映射完成转换。再用get_dummies实现one-hot编码将字符串特征转换为数值特征便于分析,将转化好的数据集合并到full中取代原来的Name列。
数值数据特征提取
Age,Fare的数值可以直接作为特征。
4.2.2特征选取
前面提取的特征相互之间有什么关系,这些特征与生存Survived有什么关系,我们要选取与Survived相关性大的特征。
用dataframe的corr方法获取full中所有元素之间的相关系数,相关系数的绝对值越接近1,表示两者之间的相关性越大。
我们重点关注各元素与Survived之间的相关性,可以提取出与Survived相关性大的特征,Title,Pclass,Fare,Cabin,Embarked,FamilyDf,Age,Sex,组成建模、训练、预测的数据集full_x。
五、构建模型
5.1拆分训练数据和测试数据
训练数据用于训练模型,测试数据用于评估模型的准确性,最后将预测数据带入训练好的模型中预测最终的结果。
首先用train_test_split方法从上面提取的两个样本数据集中拆分出训练数据和测试数据。
5.2建立、训练模型
用sklearn的liner_model的逻辑回归算法构建模型,用fit函数和拆分好的训练数据训练模型。
六、评估模型
6.1评估模型
用模型model的score方法,将模型预测出的结果test_y和预留的test_y对比,查看模型的正确率。
模型的正确率为0.87,表示模型拟合的很好,可以用该模型进行预测。
6.2预测结果
用预测数据特征pre_x和模型的predict方法预测生存数据pre_y,将结果转换成整数型数据。
将预测出来的结果整理成kaggle要求的格式,其中包括PassengerId和Survived两个字段,准备好结果之后写到excel表格里面,将预测结果提交给sklearn官网,就可以看自己的排名了。
排名结果为
这只是一个开始,后面还需要不断学习优化。