提出问题

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

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

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. 关闭 cockpit 登陆提示

    sudo rm /etc/issue.d/cockpit.issue sudo rm /etc/motd.d/cockpit

  2. java项目实践-jsp-filter-监听器-day19

    目录 1. jsp 2. 过滤器 3. listener 监听器 1. jsp servle逻辑处理方便 html页面表现麻烦 jsp 页面表现方便 但是逻辑处理麻烦 JSP 是一种页面技术 JSP本 ...

  3. node pressure and pod eviction

    0. overview There are too many guides about node pressure and pod eviction, most of them are specifi ...

  4. Go-快速排序

    package main import "fmt" // 快速排序 // 特征: // 1. 选定一个数,让这个数左边的比这个数小,右边比这个数大 // 2. 然后这个基数就是已经 ...

  5. Oracle12c新增max_idle_time参数的学习与感触

    Oracle12c新增max_idle_time参数的学习与感触 TLDR 其实任何软件出了新版本.readme 是很重要的. 尤其是数据库, 涉及到底层问题的. 比如这次遇到的Oracle的max_ ...

  6. [转帖]Oracle性能优化-大内存页配置

    一.为什么需要大页面? 如果您有一个大的RAM和SGA,那么HugePages对于Linux上更快的Oracle数据库性能是至关重要的.如果您的组合数据库SGAs很大(比如超过8GB,甚至对于更小的数 ...

  7. [转帖]TIDB-TIDB节点磁盘已满报警

    一.背景 今日突然收到tidb节点的磁盘报警,磁盘容量已经超过了80%,但是tidb是不放数据的,磁盘怎么会满,这里就需要排查了 二.问题排查 解决步骤 1.df -h查看哪里占用磁盘比较多,然后通过 ...

  8. [转帖]Docker-Compose 自动创建的网桥与局域网冲突解决方案

    https://zhuanlan.zhihu.com/p/379305319 Docker-Compose 自动创建的网桥与局域网冲突解决方案 当我使用docker-compose的方式部署内网的ha ...

  9. [转帖]Nginx四层负载均衡详解

    https://developer.aliyun.com/article/885599?spm=a2c6h.24874632.expert-profile.315.7c46cfe9h5DxWK 202 ...

  10. nginx 企业版与开源版本的区别