最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天观点:Pandas分析泰坦尼克号生还比例

来源:博客园

提出问题

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

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

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


(相关资料图)

import pandas as pd

import numpy as np

from matplotlib import pyplot as pltdf = 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 1else: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 1elif age<=40:return 2else: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_allprint_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 pdimport numpy as npfrom matplotlib import pyplot as pltdf = 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,女性设置成0df["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 3df["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()

关键词: 可以看出 因素分析