泰坦尼克号数据分析

项目场景:

泰坦尼克号是一艘奥林匹克级邮轮,于1912年4月首航时撞上冰山后沉没。泰坦尼克号由位于北爱尔兰贝尔法斯特的哈兰·沃尔夫船厂兴建,是当时最大的客运轮船,由于其规模相当于一艘现代航空母舰,号称“上帝也沉没不了的巨型邮轮”。在泰坦尼克号的首航中,从英国南安普敦出发,途经法国瑟堡-奥克特维尔以及爱尔兰昆士敦,计划横渡大西洋前往美国纽约市。但由于人为操作失误,于1912年4月14日船上时间夜里11点40分撞上冰山;2小时40分钟后,即4月15日凌晨2点20分,船裂成两半后沉入大西洋,死亡人数超越1500人,堪称20世纪最大和最广为人知的海难事件。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬
泰坦尼克号上有不同阶级、不同年龄的乘客两千多人,而在这次沉船事故中幸存下来的仅有718人。根据数据统计分析,人们发现,幸存的乘客和他们的年龄、性别、乘坐车舱等级等因素存在某种关系。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬
train_titantic.csv给出了当时泰坦尼克号上891位乘客的基本数据及其生存情况。本次实验在原始数据上进行数据处理,并通过逻辑回归,svm等模型预测船上乘客的生存情况



数据集和代码

数据集

提示:这里描述项目中遇到的问题:

字段名以及含义:
PassengerId 乘客编号
Survived 生存情况(1=存活,0=死亡)
Pclass 船舱等级(1=头等舱,2=二等舱,3=三等舱)
Name 姓名
Sex 性别
Age 年龄
SibSp 兄弟姐妹数/配偶数(即同船的同代亲属人数)
Parch 父母/子女数(即同船的不同代直系亲属人数)
Ticket 船票编号
Fare 船票价格
Cabin 客舱号
Embarked 登船港口(S=美国南安普顿,C=法国瑟堡市,Q=爱尔兰昆士敦)

在这里插入图片描述


数据清洗:

数据清洗策略:

  1. 查看数据的缺失情况,并用中位数填充Age与Fare字段的缺失值;用“Unknown"填充Cabin字段的缺失值;用众数填充Embarked字段的缺失值。
df['Age'] = df['Age'].fillna(df['Age'].median())  #用中位数填充Age与Fare字段的缺失值
df['Embarked'] = df['Embarked'].fillna(df['Embarked'].mode()[0])  #用众数填充Embarked字段的缺失值
df['Cabin'] = df['Cabin'].fillna("Unknown")  #用“Unknown"填充Cabin字段的缺失值
  1. 将Age字段按照等宽间距划分为5等分,并统计输出每个区间的人数。
k = 5
data = df['Age']
d1 = pd.cut(data,k)  #利用cut函数将Age字段按照等宽间距划分为5等分

d1
  1. 将SibSP与Parch两个字段的数值相加,生成新的字段”Family",表示与乘客同船的家庭成员人数。
df['Family'] = df['SibSp']+df['Parch']
df.head()
  1. 将字段Pclass及Sex字段转化为哑变量的形式。其中,Age字段中,请用数字0代表male,用数字1代表female.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬
df['Family'] = df['SibSp']+df['Parch']
df.head()
  1. 提取乘客姓名Name中的头衔(如Mr.,Miss.,Mrs.等),按照下表所示的对应关系将乘客头衔归为6个类别,生成新字段“Title",并将该字段转化为哑变量的形式。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬
    这步是最麻烦的,就是通过名字前缀分为6类:
Title头衔
OfficerCapt,Col,Major,Dr,Rev
RoyaltyJonkheer,Don,Sir,the Countess,Dona,Lady
MasterMaster
MissMiss,Mlle
MrMr
MrsMrs,Ms,Mme

代码:

df['Title'] = df['Name'].str.split(' ') #将name值按空格分开,分开后类型为列表 如[Braund,, Mr., Owen, Harris]
lst = ['Capt.','Col.','Major.','Dr.','Rev.','Jonkheer.'
     ,'Don.','Sir.','Countess.','Dona.','Lady.',
    'Master.','Miss.','Mlle.','Mr.','Mrs.','Ms.','Mme.'
    ] #将关键字放到列表中
for i in range(len(df['Title'])):
  pos = 0
  for j in range(len(df['Title'][i])):
      if(df['Title'][i][pos] not in lst): #如果不是关键字,就删掉
          df['Title'][i].pop(pos)
      else:
          pos+=1
dd = df['Title'].apply(pd.Series).stack() #stack方法可以吧列表转换成字符串
df['Title'] = dd.values 
di = {'S':0,'C':1,'Q':2}
df['Embarked'] = df['Embarked'].apply(lambda x:di[x]) #将Embarked数值化
i = 0
for x in df['Title']:  #将Title数值化
  if(x in lst[0:5]):
      df.iloc[i,13] = 0
  if(x in lst[5:11]):
      df.iloc[i,13] = 1
  if(x == "Master."):
      df.iloc[i,13] = 2
  if(x in lst[12:14]):
      df.iloc[i,13] = 3
  if(x == "Mr."):
      df.iloc[i,13] = 4
  if(x in lst[-3:]):
      df.iloc[i,13] = 5
  i += 1

df.head()    

看不懂的话到GitHub上下代码一步一步跑把
处理后的数据:
在这里插入图片描述


数据分析:

通过相关性选取特征:
在这里插入图片描述

逻辑回归

首先通过循环随机种子选取准确率最高的数据集,随机种子不同选取的数据集就不同:
在这里插入图片描述
选择后的训练集与数据集中的年龄与票价查看分布:
在这里插入图片描述
对比两者可以看出,训练集相当于在每个年龄与票价区间都取了80%,分布均匀因此准确率高

逻辑回归的准确率
在这里插入图片描述

SVM

SVM的准确率:
在这里插入图片描述
sklearn中的核函数:
在这里插入图片描述

总结

最终我们使用逻辑回归达到了90%的准确率,使用SVM达到92%的准确率

  • 6
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值