热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python泰坦尼克号存活率分析

对泰坦尼克号的数据进行特征分析、数据清理、数据填充、处理分类特征、将连续特征转化为离散特征、合并特征、制作模型、模型预测importpandasaspdimportnumpya

对泰坦尼克号的数据 进行特征分析、数据清理、数据填充、处理分类特征、将连续特征转化为离散特征、合并特征、制作模型、模型预测

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#将警告不显示
import warnings
warnings.filterwarnings('ignore')#导入测试集和训练集
train_df=pd.read_csv('train.csv')
# train_df.head()
test_df=pd.read_csv('test.csv')
combine=[train_df,test_df]PassengerId=test_df['PassengerId']#因为后续会将该列删除 所以先对这一列数据进行备份

特征分析
分析存活率与几个因素之间的关系

#pclass与survived的关系
train_df[['Pclass','Survived']].groupby(['Pclass'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#Sex与survived的关系
train_df[['Sex','Survived']].groupby(['Sex'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#SibSp与Survived的关系
train_df[['SibSp','Survived']].groupby(['SibSp'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#Parch与Survived的关系
train_df[['Parch','Survived']].groupby(['Parch'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#Embarked与Survived的关系
train_df[['Embarked','Survived']].groupby(['Embarked'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#绘制年龄与死亡率、存活率的条形图
fig=plt.figure(figsize=(12,8))ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)age1=train_df.Age[train_df['Survived']==0]
age2=train_df.Age[train_df['Survived']==1]ax1.set_title('Survived=0')
ax1.hist(age1,bins=20)
ax1.set_xlabel('age')
ax1.set_yticks([10,20,30,40,50,60])ax2.set_title('Survived=1')
ax2.hist(age2,bins=20)
ax2.set_xlabel('age')
ax2.set_yticks([10,20,30,40,50,60])
#定义同一规格的y轴 方便查看死亡与存货的区别plt.show()

在这里插入图片描述

#fare和Survived 绘制图像
fare=train_df.Fare[train_df['Survived']==1]
plt.hist(fare)
plt.show()

在这里插入图片描述
数据清理

#删除无用特征
train_df=train_df.drop(['Ticket','Cabin'],axis=1)
test_df=test_df.drop(['Ticket','Cabin'],axis=1)
combine=[train_df,test_df]
train_df.head()

#创建新特征train_df.Name.str.extract(' ([a-zA-Z]+)\.',expand=False)
#通过正则表达式 将姓名中与性别有关的称呼截取出来 创建为新的特征for database in combine:database['Title']=database.Name.str.extract(' ([a-zA-Z]+)\.',expand=False)pd.crosstab(train_df['Title'],train_df['Sex'])
#crosstab 交叉提取列 两个参数(列,行)

在这里插入图片描述

#分类title 归为几个大类
for database in combine:database['Title']=database['Title'].replace(['Lady','Countess','Capt','Col','Don','Dr','Major','Rev','Sir','Jonkheer','Dona'],'Rare')#将出现次数少的归类为Rare一类database['Title']=database['Title'].replace('Mlle','Miss')#将表达为同一意思的称呼归为一类database['Title']=database['Title'].replace('Ms','Miss')database['Title']=database['Title'].replace('Mme','Mrs')
#replace函数 两个参数(被替换内容,替换后内容) train_df[['Title','Survived']].groupby(['Title'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述

#删除无用两列数据
train_df.drop(['PassengerId','Name'],axis=1,inplace=True)
test_df.drop(['PassengerId','Name'],axis=1,inplace=True)
combine=[train_df,test_df]
train_df

数据填充

#快速查找缺失值
train_df.info()

在这里插入图片描述
从图中会发现 Age 和 Embarked 都有缺失值

#填充Embarked特征(缺失值较少 利用众数进行填充)
freq=train_df.Embarked.dropna().mode()[0]
#mode 显示数量最多的数for database in combine:database.Embarked=database.Embarked.fillna(freq)

#填充Age(缺失值较多 不可以用众数填充 需通过其他特征填充值)
grp = train_df.groupby(['Pclass','Sex','Title'])['Age'].mean().reset_index()#定义一个新函数 填充缺失值
def fill_age(x):return grp[(grp['Pclass']==x['Pclass']) & (grp['Sex']==x['Sex']) & (grp['Title']==x['Title'])].Age.values[0]#如果缺失值的三个条件满足平均的三个条件,即填充对应的Age值#用lambda 定义另一个简单的新的函数 判断Age值是否缺失
train_df['Age'] = train_df.apply(lambda x: fill_age(x) if np.isnan(x['Age']) else x['Age'] ,axis=1)
test_df['Age'] = test_df.apply(lambda x: fill_age(x) if np.isnan(x['Age']) else x['Age'] ,axis=1)
combine = [train_df,test_df]

处理分类特征
将数据根据分类转化为数字 0.1.2.3…

#处理sex 将数据转化为1和0
for database in combine:database['Sex'] = database['Sex'].map({'female':1,'male':0}).astype(int)

#处理Title
title_mapping = {'Mr':1 ,'Miss':2 ,'Mrs':3 ,'Master':4 ,'Rare':5}
for database in combine:database['Title'] = database['Title'].map(title_mapping).astype(int)

在这里插入图片描述
将连续特征转化为离散特征
将连续的数据 分为几组\几类

#处理Age离散化#将age分为五组 准确分组
train_df['AgeBand'] =pd.cut(train_df['Age'],5)
train_df['AgeBand']

在这里插入图片描述
通过切割数据 可以将Age准确的分为五个组 并将不同组用1.2.3.4.5代替

for database in combine:database.loc[ database[&#39;Age&#39;] <16,&#39;Age&#39;]&#61;0database.loc[(database[&#39;Age&#39;] >&#61;16)&(database[&#39;Age&#39;] <32),&#39;Age&#39;]&#61;1database.loc[(database[&#39;Age&#39;] >&#61;32)&(database[&#39;Age&#39;] <48),&#39;Age&#39;]&#61;2database.loc[(database[&#39;Age&#39;] >&#61;48)&(database[&#39;Age&#39;] <64),&#39;Age&#39;]&#61;3database.loc[ database[&#39;Age&#39;] >&#61;64,&#39;Age&#39;]&#61;4train_df.drop([&#39;AgeBand&#39;],axis&#61;1,inplace&#61;True)
combine&#61;[train_df,test_df]
train_df

利用qcut处理Fare的数据

#处理Fare &#xff08;不可用cut均分的方法 使用qcut 根据数量均等分&#xff09;
train_df[&#39;FareBand&#39;]&#61;pd.qcut(train_df[&#39;Fare&#39;],4,duplicates&#61;&#39;drop&#39;)#处理test_df中的缺失值&#xff08;因为缺失1个&#xff0c;所以选择平均值填充&#xff09;
test_df[&#39;Fare&#39;] &#61; test_df[&#39;Fare&#39;].fillna(test_df[&#39;Fare&#39;].mean())for dataset in combine:dataset.loc[ dataset[&#39;Fare&#39;] <&#61;7.91,&#39;Fare&#39;]&#61;0dataset.loc[(dataset[&#39;Fare&#39;] >7.91)&(dataset[&#39;Fare&#39;] <&#61;14.454),&#39;Fare&#39;]&#61;1dataset.loc[(dataset[&#39;Fare&#39;] >14.454)&(dataset[&#39;Fare&#39;] <&#61;31),&#39;Fare&#39;]&#61;2dataset.loc[dataset[&#39;Fare&#39;] >31,&#39;Fare&#39;]&#61;3dataset[&#39;Fare&#39;] &#61; dataset[&#39;Fare&#39;].astype(int)train_df.drop([&#39;FareBand&#39;],axis&#61;1,inplace&#61;True)
combine&#61;[train_df,test_df]
train_df

在这里插入图片描述

合并特征


将SibSp(兄弟姐妹配偶)和Parch(父母)两组数据合并为一组Family
后借助family判断是否为一个人出行IsAlong


for database in combine:database[&#39;Family&#39;]&#61;database[&#39;SibSp&#39;] &#43; database[&#39;Parch&#39;] &#43; 1# train_df.head()for database in combine:database[&#39;IsAlong&#39;]&#61;1database.loc[database[&#39;Family&#39;]>1,&#39;IsAlong&#39;]&#61;0train_df.drop([&#39;SibSp&#39;,&#39;Parch&#39;,&#39;Family&#39;],inplace&#61;True,axis&#61;1)
test_df.drop([&#39;SibSp&#39;,&#39;Parch&#39;,&#39;Family&#39;],inplace&#61;True,axis&#61;1)train_df

在这里插入图片描述
制作模型

#选择变量
X_train &#61; train_df.drop(&#39;Survived&#39;,axis&#61;1)
Y_train &#61; train_df[&#39;Survived&#39;]

#逻辑回归模型
from sklearn.linear_model import LogisticRegressionlogreg &#61; LogisticRegression()#实例化 调用
logreg.fit(X_train,Y_train)#fit拟合模型
Y_pred &#61; logreg.predict(test_df)#利用predict进行预测
acc_log &#61; round(logreg.score(X_train,Y_train)*100)#round函数--四舍五入 保留两位小数#支持向量机 SVC
from sklearn.svm import SVCsvc &#61; SVC()
svc.fit(X_train,Y_train)
Y_prd &#61; svc.predict(test_df)
acc_svc &#61; round(svc.score(X_train,Y_train)*100,2)#决策树
from sklearn.tree import DecisionTreeClassifierdecision_tree &#61; DecisionTreeClassifier()
decision_tree.fit(X_train,Y_train)
Y_pred &#61; decision_tree.predict(test_df)
acc_decision_tree &#61; round(decision_tree.score(X_train,Y_train)*100,2)#随机森林
from sklearn.ensemble import RandomForestClassifierrandom_forest &#61; RandomForestClassifier()
random_forest.fit(X_train,Y_train)
Y_pred &#61; random_forest.predict(test_df)
acc_random_forest &#61; round(random_forest.score(X_train,Y_train)*100,2)#K阶近邻
from sklearn.neighbors import KNeighborsClassifierknn &#61; KNeighborsClassifier()
knn.fit(X_train,Y_train)
Y_pred &#61; knn.predict(test_df)
acc_knn &#61; round(knn.score(X_train,Y_train)*100,2)#朴素贝叶斯
from sklearn.naive_bayes import GaussianNBgaussian &#61; GaussianNB()
gaussian.fit(X_train,Y_train)
Y_pred &#61; gaussian.predict(test_df)
acc_gaussian &#61; round(gaussian.score(X_train,Y_train)*100,2)

将模型根据评分进行排名

models &#61; pd.DataFrame({ #采用字典&#39;Modle&#39;:[&#39;Logistic Regression&#39;,&#39;Support Vector Machines&#39;,&#39;KNN&#39;,&#39;Naive Bayes&#39;,&#39;Decision Tree&#39;,&#39;Random Forest&#39;],&#39;Score&#39;:[acc_log,acc_svc,acc_knn,acc_gaussian,acc_decision_tree,acc_random_forest]
})
models.sort_values(by&#61;&#39;Score&#39;,ascending&#61;False)

在这里插入图片描述
模型预测
有以上模型的排名情况 可选择决策树对数据进行预测

#决策树
from sklearn.tree import DecisionTreeClassifierdecision_tree &#61; DecisionTreeClassifier()
decision_tree.fit(X_train,Y_train)
Y_pred &#61; decision_tree.predict(test_df)
acc_decision_tree &#61; round(decision_tree.score(X_train,Y_train)*100,2)#定义一个新的变量 为预测后的值
submission &#61; pd.DataFrame({&#39;PassengerId&#39;:PassengerId,&#39;Survived&#39;:Y_pred
})#将结果输出为文件
submission.to_csv(&#39;submission.csv&#39;,index&#61;False)
submission

在这里插入图片描述


推荐阅读
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
author-avatar
牛奶香橙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有