泰坦尼克号python数据分析统计服_python_泰坦尼克号数据分析报告
泰坦尼克号数据可视化分析报告
1. 提出问题
泰坦尼克号作为一部感人至深的电影流传至今,作为数据分析领域的一员,也站在数据分析的角度对其进行一些思考和分析,究竟什么样的人在泰坦尼克号更容易生还?
2.理解数据
2.1 采集数据
从Kaggle泰坦尼克号项目界面下载数据:Kaggle泰坦尼克号项目
2.2 导入数据
import numpy as np
import pandas as pd
train = pd.read_csv("C:/study/train.csv")
test = pd.read_csv("C:/study/test.csv")
2.3 查看数据集信息
print('训练数据集:',train.shape,'测试数据集:',test.shape)
训练数据集: (891, 12) 测试数据集: (418, 11)
# 合并数据集
full=train.append(test,ignore_index=True)
# 浏览前五条数据信息
full.head()
# 查看数据类型列的描述性统计信息
full.describe()
# 查看每列数据类型和非空数据总数
full.info()
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 1309 non-null int64
1 Survived 891 non-null float64
2 Pclass 1309 non-null int64
3 Name 1309 non-null object
4 Sex 1309 non-null object
5 Age 1046 non-null float64
6 SibSp 1309 non-null int64
7 Parch 1309 non-null int64
8 Ticket 1309 non-null object
9 Fare 1308 non-null float64
10 Cabin 295 non-null object
11 Embarked 1307 non-null object
dtypes: float64(3), int64(4), object(5)
memory usage: 122.8+ KB
由上面信息可看出,数据集共有1309行,其中Survived,Age,Fare,Cabin,Embarked 5个字段有缺失值,Cabin缺失率最高。
3. 数据清洗
3.1 数据预处理(缺失值处理)
缺失值常见处理方式:数值类型用平均值替代,分类数据用最常见类别替代或用U(Unkonwn) 替代
print('处理前:')
full.info()
full['Age']=full['Age'].fillna(full['Age'].mean())
full['Fare']=full['Fare'].fillna(full['Fare'].mean())
print('处理后:')
full.info()
处理前:
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 1309 non-null int64
1 Survived 891 non-null float64
2 Pclass 1309 non-null int64
3 Name 1309 non-null object
4 Sex 1309 non-null object
5 Age 1046 non-null float64
6 SibSp 1309 non-null int64
7 Parch 1309 non-null int64
8 Ticket 1309 non-null object
9 Fare 1308 non-null float64
10 Cabin 295 non-null object
11 Embarked 1307 non-null object
dtypes: float64(3), int64(4), object(5)
memory usage: 122.8+ KB
处理后:
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 1309 non-null int64
1 Survived 891 non-null float64
2 Pclass 1309 non-null int64
3 Name 1309 non-null object
4 Sex 1309 non-null object
5 Age 1309 non-null float64
6 SibSp 1309 non-null int64
7 Parch 1309 non-null int64
8 Ticket 1309 non-null object
9 Fare 1309 non-null float64
10 Cabin 295 non-null object
11 Embarked 1307 non-null object
dtypes: float64(3), int64(4), object(5)
memory usage: 122.8+ KB
full['Embarked'].head()
0 S
1 C
2 S
3 S
4 S
Name: Embarked, dtype: object
# 查看Embarked字段最常见的值
full['Embarked'].value_counts()
S 914
C 270
Q 123
Name: Embarked, dtype: int64
# 用最常见的S填充缺失值
full['Embarked']=full['Embarked'].fillna('S')
full['Cabin'].head()
0 NaN
1 C85
2 NaN
3 C123
4 NaN
Name: Cabin, dtype: object
#因为Cabin字段缺失值多,用U填充缺失值,代表Unknown
full['Cabin']=full['Cabin'].fillna('U')
3.2 特征工程
3.2.1 数据分类数值类型:乘客编号(PassengerId),年龄(Age),船票价格(Fare),同代直系亲属人数(SibSp),不同代直系亲属人数(Parch)
时间序列:无
分类数据:1)有直接类别的:乘客性别(Sex),登船港口(Embarked),客舱等级(Pclass):1=1等舱,2=2等舱,3=3等舱;2)字符串类型:乘客姓名(Name),客舱号(Cabin),船票编号(Ticket)
3.2.2 分类数据:直接类别型
乘客性别(Sex)
# 对性别进行0,1赋值
sex_mapDict={'male':1,'female':0}
full['Sex']=full['Sex'].map(sex_mapDict)
full.head()
登船港口(Embarked)
# 使用get_dummies 对Embarked进行one-hot编码
embarkedDf=pd.DataFrame()
embarkedDf=pd.get_dummies( full['Embarked'] , prefix='Embarked')
embarkedDf.head()
# 使用concat添加embarkedDf到full数据集
full = pd.concat([full,embarkedDf],axis=1)
# 因为已对Embarked进行one-hot编码生成虚拟变量,删除Embarked字段
full.drop('Embarked',axis=1,inplace=True)
full.head()
客舱等级(Pclass)
# 使用get_dummies 对Pclass进行one-hot编码
pclassDf=pd.DataFrame()
pclassDf=pd.get_dummies(full['Pclass'],prefix='pPlass')
pclassDf.head()
full=pd.concat([full,pclassDf],axis=1)
full.drop('Pclass',axis=1,inplace=True)
full.head(
3.2.2 分类数据:字符串类型
乘客姓名(Name)
full['Name'].head()
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
Name: Name, dtype: object
# 获取称呼
def getTitle(name):
str1=name.split(',')[1]
str2=str1.split('.')[0]
str3=str2.strip()
return str3
titleDf=pd.DataFrame()
titleDf['Title']=full['Name'].map(getTitle)
titleDf.head()
# 定义头衔
title_mapDict = {
"Capt": "Officer",
"Col": "Officer",
"Major": "Officer",
"Jonkheer": "Royalty",
"Don": "Royalty",
"Sir" : "Royalty",
"Dr": "Officer",
"Rev": "Officer",
"the Countess":"Royalty",
"Dona": "Royalty",
"Mme": "Mrs",
"Mlle": "Miss",
"Ms": "Mrs",
"Mr" : "Mr",
"Mrs" : "Mrs",
"Miss" : "Miss",
"Master" : "Master",
"Lady" : "Royalty"
}
titleDf['Title']=titleDf['Title'].map(title_mapDict)
titleDf=pd.get_dummies(titleDf['Title'])
titleDf.head()
full=pd.concat([full,titleDf],axis=1)
full.drop('Name',axis=1,inplace=True)
客舱号(Cabin)
full['Cabin'].head()
0 U
1 C85
2 U
3 C123
4 U
Name: Cabin, dtype: object
# 使用匿名函数取获取首字母
cabinDf=pd.DataFrame()
full['Cabin']=full['Cabin'].map(lambda c:c[0])
# 使用one-hot对Cabin进行编码
cabinDf=pd.get_dummies(full['Cabin'],prefix='Cabin')
cabinDf.head()
full=pd.concat([full,cabinDf],axis=1)
full.drop('Cabin',axis=1,inplace=True)
full.head(
3.2.3 数值类型:同代直系亲属人数(SibSp),不同代直系亲属人数(Parch)
建立家庭人数和家庭类别
# 同代直系+不同代直系+自己
familyDf=pd.DataFrame()
familyDf['FamilySize']=full['Parch']+full['SibSp']+1
# 按人数对家庭进行分类
familyDf['Family_Single']=familyDf['FamilySize'].map(lambda s:1 if s==1 else 0)
familyDf['Family_Small']=familyDf['FamilySize'].map(lambda s:1 if 2<=s<=4 else 0)
familyDf['Family_Large']=familyDf['FamilySize'].map(lambda s:1 if 5<=s else 0)
familyDf.head()
full=pd.concat([full,familyDf],axis=1)
full.head()
full.shape
(1309, 33)
3.2.3 特征选择
# 查看各特征的相关系数
corrDf=full.corr()
corrD
# 查看各特征与Survived的相关系数,降序排序
corrDf['Survived'].sort_values(ascending=False)
Survived 1.000000
Mrs 0.344935
Miss 0.332795
pPlass_1 0.285904
Family_Small 0.279855
Fare 0.257307
Cabin_B 0.175095
Embarked_C 0.168240
Cabin_D 0.150716
Cabin_E 0.145321
Cabin_C 0.114652
pPlass_2 0.093349
Master 0.085221
Parch 0.081629
Cabin_F 0.057935
Royalty 0.033391
Cabin_A 0.022287
FamilySize 0.016639
Cabin_G 0.016040
Embarked_Q 0.003650
PassengerId -0.005007
Cabin_T -0.026456
Officer -0.031316
SibSp -0.035322
Age -0.070323
Family_Large -0.125147
Embarked_S -0.149683
Family_Single -0.203367
Cabin_U -0.316912
pPlass_3 -0.322308
Sex -0.543351
Mr -0.549199
Name: Survived, dtype: float64
由上可知,Survived与Mrs和Mrss正相关性,和Mr负相关性,有可能当时逃生遵守了女士优先的原则。
根据各个特征与生成情况(Survived)的相关系数大小,我们选择了这几个特征作为模型的输入:
头衔(前面所在的数据集titleDf)、客舱等级(pclassDf)、家庭大小(familyDf)、船票价格(Fare)、船舱号(cabinDf)、登船港口(embarkedDf)、性别(Sex)
# 特征选择
full_X = pd.concat( [titleDf,#头衔
pclassDf,#客舱等级
familyDf,#家庭大小
full['Fare'],#船票价格
cabinDf,#船舱号
embarkedDf,#登船港口
full['Sex']#性别
] , axis=1 )
full_X.head()
4. 构建模型
4.1 建立训练数据集和测试数据集
sourceRow=891
# 特征
source_X = full_X.loc[0:sourceRow-1,:]
# 标签
source_y=full.loc[0:sourceRow-1,'Survived']
# 预测数据集标签
pred_X=full_X.loc[sourceRow:,:]
print('测试数据集大小:',source_X.shape[0])
print('预测数据集大小:',pred_X.shape[0])
测试数据集大小: 891
预测数据集大小: 418
# 现已无sklearn.cross_validation import train_test_split ,更新如下
from sklearn.model_selection import train_test_split
train_X,test_X,train_y,test_y=train_test_split(source_X,source_y,train_size=.8)
print('原始数据特征:',source_X.shape,'训练数据特征:',train_X.shape,'预测数据特征:',test_X.shape,
'原始数据标签:',source_y.shape,'训练数据标签:',train_y.shape,'预测数据标签:',test_y.shape)
原始数据特征: (891, 27) 训练数据特征: (712, 27) 预测数据特征: (179, 27) 原始数据标签: (891,) 训练数据标签: (712,) 预测数据标签: (179,)
4.2 选择及训练模型
# 使用逻辑回归
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
# 训练模型
model.fit(train_X,train_y)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:940: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class='auto', n_jobs=None, penalty='l2',
random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
warm_start=False)
5. 模型评估
model.score(test_X,test_y)
0.8379888268156425
6. 方案实施
# 对预测数据集进行预测
pred_y=model.predict(pred_X)
# 格式化为整型
pred_y=pred_y.astype(int)
# 用乘客ID预测
passenger_id=full.loc[sourceRow:,'PassengerId']
predDf=pd.DataFrame({'PassengerId':passenger_id,'Survived':pred_y})
# 保存结果
predDf.to_csv('titannic_pred.csv',index=False)
附:可视化
柱状图
import pandas as pd
import matplotlib.pyplot as plt
full.head()
full['Mrs'].head()
0 0
1 1
2 0
3 1
4 0
Name: Mrs, dtype: uint8
#求3类型人的人数
MCountList=[full['Mr'].sum(),
full['Mrs'].sum(),
full['Miss'].sum(),
]
#创建pandas一维数组Series
MCountSer=pd.Series(MCountList,
index=['Mr',
'Mrs',
'Miss',
])
MCountSer.plot(kind='bar')
#图片标题
plt.title('男女士人数')
#x坐标轴文本
plt.xlabel('类型')
#y坐标轴文本
plt.ylabel('人数')
plt.grid(True)
plt.show()
泰坦尼克号python数据分析统计服_python_泰坦尼克号数据分析报告相关推荐
- 泰坦尼克号python数据分析统计服_泰坦尼克号乘客数据分析
本文是优达学城数据分析师 P2 项目的结课报告,主要探寻泰坦尼克号上的生还率和各因素(客舱等级.年龄.性别.上船港口等)的关系. # Imports import numpy as np import ...
- python上海房价数据分析统计服_(干货)数据分析案例--以上海二手房为例
如果你手上有一批数据,你可能应用统计学.挖掘算法.可视化方法等技术玩转你的数据,但你没有数据的时候,我该怎么玩呢?接下来就带着大家玩玩没有数据情况下的数据分析. 本文从如下几个目录详细讲解数据分析的流 ...
- 转行学python 数据分析统计服_转行数据分析,你准备好了吗?
前言 笔者从去年5月份下定决心离开汽车制造行业,6月份开始学习Udacity的DAND(Data Analysis Nano Degree, 数据分析纳米学位)课程至今.历经10个月挑灯苦读和1个月四 ...
- python excel 数据分析统计服_数据分析从入门到进阶(透彻讲解EXCEL.SQL.TABLEAU、PYTHON四项数据分析必会工具.免费提供1GB数据集...
透彻讲解Excel.SQL.Tableau.Python四项数据分析必会工具,数据分析工作者的案头推荐工具书.系统介绍数据分析的策略.方法(数据分析之道):实例讲解引导.快速掌握数据分析工具(数据分析 ...
- 泰坦尼克号python数据分析统计服_python数据处理——泰坦尼克
承接上篇豆瓣数据分析 本次主要是进行以下内容: 1.泰坦尼克号的数据分析,主要分析哪些特征影响了乘客的获救和遇难,是年龄?是性别? #泰坦尼克数据集导入 titanic_df = sns.load_d ...
- 泰坦尼克号python数据分析统计服_Titanic数据分析报告(Python)
研究目的:使用机器学习来创建一个模型,该模型可以预测哪些乘客在泰坦尼克号沉船事故中幸存下来. 研究结论: 分析过程: 本次分析使用Jupter Notebook进行分析 该notebook 服务的版本 ...
- 泰坦尼克号python数据分析统计服_数据分析可视化——泰坦尼克号幸存者分析(上)...
文章目录数据获取.结构分析如何获取seaborn提供数据源 特征列分析 缺失值与数据清洗年龄缺失值处理 填充embarked 删除不必要的列 幸存者分析分析性别对存活率的影响 分析年龄对存活率影响 分 ...
- 泰坦尼克号python数据分析统计服_Python-数据可视化案例分析之泰坦尼克号(二)...
在第一节"Python-数据清洗与分析案例之泰坦尼克号(一)"网址:https://www.lixdx.cn/archives/93 中进行了数据清洗与缺失值填充,接下来进行数据可 ...
- python做excel数据分析统计服_Python也能做到Excel那样,条件统计轻松解决工作需求...
此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...
- 如何用python做数据分析统计服_使用python实现数据分析
1:文件内容格式为json的数据如何解析import json,os,sys current_dir=os.path.abspath(".") filename=[file for ...
最新文章
- 代码操作Oracle
- 李开复看2019投资趋势:最坏的时代将酝酿最伟大的公司
- linux 连接远程命令行,screen命令行远程连接
- 刚刚开源的Python静态类型检查器:Pyright
- 不能错过的RTS经典:《蘑菇战争2》是如何做玩法创新的?
- 2017蓝桥杯省赛---java---A---4(方格分割)
- [css] position跟margin collapse这些特性相互叠加后会怎么样?
- 网络4 交换机终端命令
- Eclipse下如何导入jar包
- 继涉黄被约谈 “比心陪练”App因内容涉宣扬暴力再被处罚
- Linux下后台执行java程序
- GPS拓展无线同步模块GSYN1000系列在广域同步测量的应用方案
- Xor异或是什么意思? - 已解决 - 搜搜问问
- DDoS 攻击次数和攻击流量
- excel 度分秒转度
- 阳历和阴历的互转函数
- 怎么禁用计算机usb驱动,u盘驱动程序被禁用怎么办
- html中dom什么意思,dom属性是什么意思啊 html dom是什么意思,通俗易懂
- 三种方法绘制单位圆-R语言
- UVA12716 LA6657 GCD XOR【GCD+位运算+前缀和】
热门文章
- 腾讯产品笔试策划+经验​
- 80端口未被占用,却依然提示已被占用
- 缺陷报告单写作准则(5C)
- 一年Java的阿里电话面试全纪录
- 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
- 51开发板的功能及简单使用
- FAT文件系统简明教程
- 转 Unity知识点0001(Yanlz+协程+List+MeshRender+对象池+链条关节+PlayerPrefs+脚本生命周期+LOD+)
- 联想l430主板图纸_【有图】Thinkpad L430升级内存,点亮,成功实现双通道!附详细教程及评测!!!...
- 烽火fr2600怎么web登录_烽火配置教程