提出问题

影响乘客生还的因素很多,这里只对乘客的性别、年龄、乘客等级、这三个因素感兴趣,

看看这四个因素是否会影响乘客的生还率。

1.性别是否会影响生还率
2.年龄是否会影响生还率
3.乘客等级会否会影响乘客率
4.性别和舱位共同对生还率的影响
5.年纪和性别共同对生还率的影响
6.年纪和等级共同对生还率的影响

这里:乘客的性别、年龄、等级、是三个自变量,生还率是因变量

import pandas as pd

import numpy as np

from matplotlib import pyplot as plt
df = pd.read_csv('./data/train.csv')
df.head()

熟悉数据

  • PassengerId:乘客ID
  • Survived:是否获救,用1和Rescued表示获救,用0或者not saved表示没有获救
  • Pclass:乘客等级,“1”表示Upper,“2”表示Middle,“3”表示Lower
  • Name:乘客姓名
  • Sex:性别
  • Age:年龄
  • SibSp:乘客在船上的配偶数量或兄弟姐妹数量)
  • Parch:乘客在船上的父母或子女数量
  • Ticket:船票信息
  • Fare:票价
  • Cabin:是否住在独立的房间,“1”表示是,“0”为否
  • embarked:表示乘客上船的码头距离泰坦尼克出发码头的距离,数值越大表示距离越远

1.查看各字段的数据类型

df.info()

2. 查看数据的摘要信息

df.describe()

从数据摘要中可以看出。乘客的生还率大约在38%,超越50的乘客在3等级,乘客的平均年龄在30岁左右,普遍比较年轻

3. 数据清洗和处理缺失值

  • Embarked有非常少的两个缺失值
  • 处理Age的缺失值

Embarked有非常少的两个缺失值,这里用'S'填充

df['Embarked']=df['Embarked'].fillna('S')
#处理Age的缺失值,Age是连续数据,这里用平均值填充缺失值
age_mean=df['Age'].mean()
df['Age']=df['Age'].fillna(age_mean)

4.处理性别数据

  • 这里把性别数据值字符串不便于计算换成数值,
  • 用1代表男性,用0代表女性,将性别数值化
def sex_value(Sex):
if Sex=='male':
return 1
else:
return 0 df['Sex'].apply(sex_value)
df['Sex'] = df['Sex'].map({"male":1, "female":0})
df.head()

5. 获取生还乘客的数据

survives_passenger_df=df[df['Survived']==1]
survives_passenger_df.head()

6.性别对生还率的影响

df_sex1=df['Sex'][df['Survived']==1]
df_sex0=df['Sex'][df['Survived']==0]
plt.hist([df_sex1,df_sex0],
stacked=True,
label=['Rescued','not saved'])
plt.xticks([-1,0,1,2],[-1,'F','M',2])
plt.legend()
plt.title('Sex_Survived')

看出全体乘客中男性占了大部分,但是生还乘客中女性占了大部分;

得出结论:女性的生还概率比男性的更高

7. 乘客等级对生还率的影响

#不同等级对生还率的影响
df_sex1=df['Pclass'][df['Survived']==1]
df_sex0=df['Pclass'][df['Survived']==0]
plt.hist([df_sex1,df_sex0],
stacked=True,
label=['Rescued','not saved'])
plt.xticks([1,2,3],['Upper','Middle','lower'])
plt.legend()
plt.title('Pclass_Survived')

全体乘客中lower等级的乘客超过了一半,生还乘客中upper等级的人最多,

对比各个等级的死亡人数和生还人数:

可以得出结论:Upper等级生还概率大于Middle、lower的生存概率,等级越好生还概率越好

8. 年龄对生还率的影响

df_sex1=df['Age'][df['Survived']==1]
df_sex0=df['Age'][df['Survived']==0]
plt.hist([df_sex1,df_sex0],
stacked=True,
label=['Rescued','not saved'])
#plt.xticks([1,2,3],['Upper','Middle','lower'])
plt.legend()
plt.title('title')
plt.title('Age_Survived')
#不同年龄段对生还率的影响elderly,child,youth
#年龄数据进行处理,0-18为child(少年),18-40为youth(青年),40-80为elderly(老年)
def age_duan(age):
if age<=18:
return 1
elif age<=40:
return 2
else:
return 3 df['Age']=df['Age'].apply(lambda x:age_duan(x)) df_sex1=df['Age'][df['Survived']==1]
df_sex0=df['Age'][df['Survived']==0]
plt.hist([df_sex1,df_sex0],
stacked=True,
label=['Rescued','not saved'])
plt.xticks([1,2,3],['child','youth','elderly'])
plt.legend()
plt.title('Age_Survived')

全部乘客中大部分人否在30岁左右,而0-10的生还率比其他年龄段都要高

结论:0-10岁的生还率率最高,20-40之间的生还人数最多

多因素分析

定义几个常用的方法

  • 按照xx对乘客进行分组,计算每组的人数

  • 计算每个组的生还率

  • 输出饼图

  • 输出柱状图

    - #定义几个常用的方法
    
    #按照xx对乘客进行分组,计算每组的人数
    def xx_group_all(df,xx):
    #按照xx对乘客进行分组后 ,每个组的人数
    return df.groupby(xx)['PassengerId'].count() #计算每个组的生还率
    def group_passenger_survived_rate(xx):
    #按xx对乘客进行分组后每个组的人数
    group_all=xx_group_all(df,xx)
    #按xx对乘客进行分组后每个组生还者的人数
    group_survived_value=xx_group_all(survives_passenger_df,xx)
    #按xx对乘客进行分组后,每组生还者的概率
    return group_survived_value/group_all #输出饼图
    def print_pie(group_data,title):
    group_data.plt.pie(title=title,figsize=(6,6),autopct='%.2f%%'\
    ,startangle=90,legend=True) #输出柱状图
    def print_bar(data,title):
    bar=data.plot.bar(title=title)
    for p in bar.patches:
    bar.annotate('%.2f%%'%(p.get_height()*100),(p.get_x()*1.005\
    ,p.get_height()*1.005))

9.性别和乘客等级共同对生还率的影响

print_bar(group_passenger_survived_rate(['Sex','Pclass']),'Sex_Pclass_Survived')

可以看到,对生还率的影响性别>乘客等级,其次是乘客等及对生还率的影响是1>2>3等

10. 性别和年纪对生还率的影响

#按Pclass分组计算每组的人数
def Pclass_survived_all(data,Pclass):
return data.groupby(Pclass)['Sex'].count()
dd0=df[['Age','Sex','Pclass']]
dd11=df[['Age','Sex','Pclass']][df['Survived']==1]
c=Pclass_survived_all(dd11,['Age','Sex','Pclass'])
dd0['Sex'].count()
#按Pclass分组计算每组的生还率
def Pclass_survived_probability(data):
#计算每组生还者的人数
groupby_survived=Pclass_survived_all(dd11,data)
#计算每组的总人数
groupby_survived_all=Pclass_survived_all(dd0,data)
return groupby_survived/groupby_survived_all
print_bar(Pclass_survived_probability(['Sex','Age']),'Sex_Sge_Survived')

可以看出,对生还率影响大的是性别,女性>男性

其次少年的生还率大于青年和老年,青年跟老年的对生还率差不多

年龄和乘客等级共同对生还率的影响

#Age中用1表示少年,用2表示青年,用3表示老年
print_bar(Pclass_survived_probability(['Age','Pclass']),'age_pclass_Survivedd')

可以看出乘客的等级对生还率的影响>乘客年龄的影响

年龄越大生还率越小,乘客等级越差生还率越差

结论

通过分析,可以看出对生还率影响最大的因素是乘客等级,其次是性别,最后年龄段也对生化率有影响

分析的局限性

这里并没有从统计上分析得出这些结果的偶然性,所以并不知道这里的结果是真正的差异造成的还是噪音造成的
年龄字段有一些缺失值,因为是连续数据这里用的是全体乘客年龄的均值填充缺失值,这样会缩小年龄之间的差异,也会影响分析结果

结果的相关性

这里的数据并非通过试验得出,所以无法说自变量之间的因果性,只能说她们之间有相关性

完整代码

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt df = pd.read_csv("./train.csv")
df_dec = df.describe() # 处理缺失行
# 1.删除缺失行
# df.drop(df[np.isnan(df["Age"])].index, inplace=True)
# print(df.describe())
# 2.填充平均数
age_mean = df["Age"].mean()
df["Age"] = df["Age"].fillna(age_mean)
# print(df.describe()) # 处理性别数据,将男性设置成1,女性设置成0
df["Sex"] = df["Sex"].map({"male": 1, "female": 0})
# print(df.head()) # 取出生还者的信息
survives_passenger_df = df[df["Survived"] == 1]
# print(survives_passenger_df.head()) # 获取生还者的性别信息
df_sex1 = df["Sex"][df["Survived"] == 1] # df_sex1中的数据是生还者中男性和女性的人数
# 获取遇难者的性别信息
df_sex0 = df["Sex"][df["Survived"] == 0] # df_sex0的数据是遇难者中男性和女性的人数 # 绘制直方图性别对生还者的影响
# plt.hist([df_sex1, df_sex0], label=["Rescued", "Not saved"], stacked=True)
# plt.xticks([-1, 0, 1, 2], [-1, "F", "M", 2])
# plt.title("Sex Survived")
# plt.legend()
# plt.show() # 绘制直方图等级对生还的影响
df_sur1 = df["Pclass"][df["Survived"] == 1]
df_sur0 = df["Pclass"][df["Survived"] == 0] # plt.hist([df_sur1, df_sur0], label=["Rescued", "Not saved"], stacked=True)
# plt.xticks([1, 2, 3], ["upper", "middle", "lower"])
# plt.title("Pclass Survived")
# plt.legend()
# plt.show() # 绘制直方图年龄对生还的影响 def age_duan(age):
"""年龄分段"""
if age <= 18:
return 1
elif age <= 40:
return 2
else:
return 3 df["Age"] = df["Age"].apply(age_duan) df_age1 = df["Age"][df["Survived"] == 1]
df_age0 = df["Age"][df["Survived"] == 0] plt.hist([df_age1, df_age0], label=["Rescued", "Not saved"], stacked=True)
plt.xticks([1, 2, 3], ["child", "young", "old"])
plt.legend()
plt.title("Age Survived")
plt.show()

Pandas分析泰坦尼克号生还比例的更多相关文章

  1. 多快好省地使用pandas分析大型数据集

    1 简介 pandas虽然是个非常流行的数据分析利器,但很多朋友在使用pandas处理较大规模的数据集的时候经常会反映pandas运算"慢",且内存开销"大". ...

  2. 利用python分析泰坦尼克号数据集

    1 引言 刚接触python与大数据不久,这个是学长给出的练习题目.知识积累太少,学习用了不少的时间.尽量详细的写,希望对各位的学习有所帮助. 2 背景 2.1 Kaggle 本次数据集来自于Kagg ...

  3. 数据挖掘竞赛kaggle初战——泰坦尼克号生还预测

    1.题目 这道题目的地址在https://www.kaggle.com/c/titanic,题目要求大致是给出一部分泰坦尼克号乘船人员的信息与最后生还情况,利用这些数据,使用机器学习的算法,来分析预测 ...

  4. 如何使用pandas分析金融数据

    [摘要]pandas是数据分析师分析数据最常用的三方库之一,结合matplotlib,非常强大. 首先我们收集一些数据. 从东方财富客户端导出券商信托板块2018年11月1日的基础行情和财务数据.分别 ...

  5. Python Pandas 分析郁达夫《故都的秋》

    最近刚学这块,如果有错误的地方还请大家担待. 本文用到的Python包: Ipython, Numpy, Pandas, Matplotlib 故都的秋原文参考:http://www.xiexingc ...

  6. 利用python进行微信好友分析

    欢迎python爱好者加入:学习交流群 667279387 本文主要利用python对个人微信好友进行分析并把结果输出到一个html文档当中,主要用到的python包为itchat,pandas,py ...

  7. R语言实战(五)方差分析与功效分析

    本文对应<R语言实战>第9章:方差分析:第10章:功效分析 ================================================================ ...

  8. Pandas快速入门(一)

    快速使用 bogon:Documents rousseau$ ipython --pylab Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23 ...

  9. Python数据分析与展示[第三周](pandas简介与数据创建)

    第三周的课程pandas 分析数据 http://pandas.pydata.org import pandas as pd 常与numpy matplotlib 一块定义 d=pd.Series(r ...

  10. 科学计算:Python 分析数据找问题,并图形化

    对于记录的数据,如何用 Python 进行分析.或图形化呢? 本文将介绍 numpy, matplotlib, pandas, scipy 几个包,进行数据分析.与图形化. 准备环境 Python 环 ...

随机推荐

  1. Ubuntu22.04上使用systemctl命令配置开机自启动服务、脚本、命令

    systemctl介绍 systemctl是Linux系统上用于管理系统服务(systemd单元)的命令行工具.它可以用来启动.停止.重启.禁用.启用.查询和管理系统服务的状态. 以下是一些常用的sy ...

  2. CoinBase是什么?

    什么是CoinBase交易? 比特币区块链上的每个区块中都会包含一个或者多个交易(transaction),其中第一个交易就叫做CoinBase交易. 什么是CoinBase交易? CoinBase交 ...

  3. kubernetes 资源管理概述

    本文转载自 Cizixs 的博客 kubernetes 资源管理概述 kubernetes 资源简介 什么是资源? 在 kubernetes 中,有两个基础但是非常重要的概念:node 和 pod.n ...

  4. python 基础 | 实现微秒级计时

    搬运一个计时代码: import datetime s = datetime.datetime.now() # 开始 # do something e = datetime.datetime.now( ...

  5. google浏览器网页截取全屏

    本想在谷歌浏览器滚动截取网页全屏,没有找到好的方法,在网上找到一个快捷键,未曾使用过,特地记录下: 第一步:按F12打开 第二步:window:Ctrl + Shift + P mac:command ...

  6. spring IoC 源码

    spring IoC 容器的加载过程 1.实例化容器: AnnotationConfigApplicationContext 实例化工厂: DefauiltListableBeanFactory 实例 ...

  7. 【SI】source insight4 添加指定类型的文件

    Options->File Type Options 红框可选择是否将指定类型的文件添加到工程 绿框可添加自定义文件类型,如汇编*.s;*.S 蓝框可新增文件类别,用于自定义文件类型 如不需将t ...

  8. 2023年SWPU NSS 秋季招新赛 (校外赛道) MISC复盘WP

    GIF Code 题目描述: 扫一扫即可获取Flag 给了一个含二维码的动图,分离一下得到九张二维码碎片,根据文件名数字按顺序组装,在线扫码即可 NSSCTF{3f0ac91b-3e0e-a7e2-7 ...

  9. [转帖]PostgreSQL数据库的版本历史及关键变化

    https://cloud.tencent.com/developer/article/2311843 举报 PostgreSQL是一个强大的开源关系型数据库,它的发展历程充满了创新和卓越的设计.让我 ...

  10. [转帖]实战演练 | Navicat 数据生成功能

    https://zhuanlan.zhihu.com/p/631823381 数据生成的目的是依据某个数据模型,从原始数据通过计算得到目标系统所需要的符合该模型的数据.数据生成与数据模型是分不开的,数 ...