泰坦尼克号数据可视化分析报告

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_泰坦尼克号数据分析报告相关推荐

  1. 泰坦尼克号python数据分析统计服_泰坦尼克号乘客数据分析

    本文是优达学城数据分析师 P2 项目的结课报告,主要探寻泰坦尼克号上的生还率和各因素(客舱等级.年龄.性别.上船港口等)的关系. # Imports import numpy as np import ...

  2. python上海房价数据分析统计服_(干货)数据分析案例--以上海二手房为例

    如果你手上有一批数据,你可能应用统计学.挖掘算法.可视化方法等技术玩转你的数据,但你没有数据的时候,我该怎么玩呢?接下来就带着大家玩玩没有数据情况下的数据分析. 本文从如下几个目录详细讲解数据分析的流 ...

  3. 转行学python 数据分析统计服_转行数据分析,你准备好了吗?

    前言 笔者从去年5月份下定决心离开汽车制造行业,6月份开始学习Udacity的DAND(Data Analysis Nano Degree, 数据分析纳米学位)课程至今.历经10个月挑灯苦读和1个月四 ...

  4. python excel 数据分析统计服_数据分析从入门到进阶(透彻讲解EXCEL.SQL.TABLEAU、PYTHON四项数据分析必会工具.免费提供1GB数据集...

    透彻讲解Excel.SQL.Tableau.Python四项数据分析必会工具,数据分析工作者的案头推荐工具书.系统介绍数据分析的策略.方法(数据分析之道):实例讲解引导.快速掌握数据分析工具(数据分析 ...

  5. 泰坦尼克号python数据分析统计服_python数据处理——泰坦尼克

    承接上篇豆瓣数据分析 本次主要是进行以下内容: 1.泰坦尼克号的数据分析,主要分析哪些特征影响了乘客的获救和遇难,是年龄?是性别? #泰坦尼克数据集导入 titanic_df = sns.load_d ...

  6. 泰坦尼克号python数据分析统计服_Titanic数据分析报告(Python)

    研究目的:使用机器学习来创建一个模型,该模型可以预测哪些乘客在泰坦尼克号沉船事故中幸存下来. 研究结论: 分析过程: 本次分析使用Jupter Notebook进行分析 该notebook 服务的版本 ...

  7. 泰坦尼克号python数据分析统计服_数据分析可视化——泰坦尼克号幸存者分析(上)...

    文章目录数据获取.结构分析如何获取seaborn提供数据源 特征列分析 缺失值与数据清洗年龄缺失值处理 填充embarked 删除不必要的列 幸存者分析分析性别对存活率的影响 分析年龄对存活率影响 分 ...

  8. 泰坦尼克号python数据分析统计服_Python-数据可视化案例分析之泰坦尼克号(二)...

    在第一节"Python-数据清洗与分析案例之泰坦尼克号(一)"网址:https://www.lixdx.cn/archives/93 中进行了数据清洗与缺失值填充,接下来进行数据可 ...

  9. python做excel数据分析统计服_Python也能做到Excel那样,条件统计轻松解决工作需求...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

  10. 如何用python做数据分析统计服_使用python实现数据分析

    1:文件内容格式为json的数据如何解析import json,os,sys current_dir=os.path.abspath(".") filename=[file for ...

最新文章

  1. 代码操作Oracle
  2. 李开复看2019投资趋势:最坏的时代将酝酿最伟大的公司
  3. linux 连接远程命令行,screen命令行远程连接
  4. 刚刚开源的Python静态类型检查器:Pyright
  5. 不能错过的RTS经典:《蘑菇战争2》是如何做玩法创新的?
  6. 2017蓝桥杯省赛---java---A---4(方格分割)
  7. [css] position跟margin collapse这些特性相互叠加后会怎么样?
  8. 网络4 交换机终端命令
  9. Eclipse下如何导入jar包
  10. 继涉黄被约谈 “比心陪练”App因内容涉宣扬暴力再被处罚
  11. Linux下后台执行java程序
  12. GPS拓展无线同步模块GSYN1000系列在广域同步测量的应用方案
  13. Xor异或是什么意思? - 已解决 - 搜搜问问
  14. DDoS 攻击次数和攻击流量
  15. excel 度分秒转度
  16. 阳历和阴历的互转函数
  17. 怎么禁用计算机usb驱动,u盘驱动程序被禁用怎么办
  18. html中dom什么意思,dom属性是什么意思啊 html dom是什么意思,通俗易懂
  19. 三种方法绘制单位圆-R语言
  20. UVA12716 LA6657 GCD XOR【GCD+位运算+前缀和】

热门文章

  1. 腾讯产品笔试策划+经验​
  2. 80端口未被占用,却依然提示已被占用
  3. 缺陷报告单写作准则(5C)
  4. 一年Java的阿里电话面试全纪录
  5. 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
  6. 51开发板的功能及简单使用
  7. FAT文件系统简明教程
  8. 转 Unity知识点0001(Yanlz+协程+List+MeshRender+对象池+链条关节+PlayerPrefs+脚本生命周期+LOD+)
  9. 联想l430主板图纸_【有图】Thinkpad L430升级内存,点亮,成功实现双通道!附详细教程及评测!!!...
  10. 烽火fr2600怎么web登录_烽火配置教程