在上一篇文章中,已经介绍了泰坦尼克号生存率预测的数据处理,预测模型训练
老菜鸟:泰坦尼克号幸存者预测zhuanlan.zhihu.com这一次对分析的结果进行数据可视化:
在泰坦尼克号中幸存者的分析中,通过相关性分析选择出7种特征:头衔titleDf,客舱等级pclassDf,家庭大小familyDf,船票价格Fare,船舱号cabinDf, 登船港口embarkedDf,性别Sex。 最后探讨一下年龄特征:老年人,未成年人是否更容易遇难
本次研究的核心指标是生存率,通过下面代码获得总体的生存率
surviveDf=full.groupby("Survived")['Survived'].count()
fig=plt.figure()
ax1=fig.add_subplot(1,2,1)
surviveDf.plot(ax=ax1,kind='bar')
plt.ylabel("人数")
plt.title("生存人数分布")
sns.despine()
plt.xticks(range(len(surviveDf)),['死亡','幸存'],rotation=360)
ax2=fig.add_subplot(1,2,2)
surviveDf.plot(ax=ax2,kind='pie',labels=['死亡','存活'],autopct='%1.2f%%')
plt.axis("equal")
plt.title("生存率分布情况")
plt.show()
分析结果: 上图表明,在891个乘客中,生存率为38.38%,遇难率为61.62%
后面要多次使用幸存与死亡人数的柱状图,幸存率的柱状图,而且代码相似,因此构造一个函数,避免重复劳动
#函数以列名为参数,直接输入列名,获得对应列的生存死亡人数柱状图,生存率柱状图
def survived_rate(string):#
#计算幸存率
survivedRate=full.groupby([string,'Survived']).Survived.count().unstack()
survivedRate['总人数']=survivedRate[0].values+survivedRate[1].values
survivedRate['幸存率']=survivedRate[1].values/survivedRate['总人数'].values
#对survivedRate按照幸存率排序
survivedRate=survivedRate.sort_values(by='幸存率',ascending=True)
#画幸存与死亡人数的柱状图
survivedRate=survivedRate.fillna(0)
survivedRate.rename(columns={
0:"死亡",1:"幸存"},inplace=True)
survivedRate[["死亡","幸存"]].plot(kind="barh",stacked=True)
plt.grid(axis="x",ls="--")
plt.ylabel(string,fontsize=15)
plt.xlabel("人数",fontsize=15)
fig=plt.figure(figsize=(6,6))
x=range(len(survivedRate["幸存率"]))
#画幸存率的柱状图
plt.bar(x,survivedRate["幸存率"])
plt.xticks(x,survivedRate.index)
plt.xlabel(string,fontsize=15)
plt.ylabel("幸存率",fontsize=15)
plt.grid(axis="y",ls="--")
for x,y in zip(x,survivedRate["幸存率"]):
plt.text(x,y,"%.0f%%"%(y*100),ha='center',va="bottom",fontsize=13)
sns.despine()
plt.show()
return survivedRate
1.船舱等级对生存率影响
#更改列名
dict={
"Pclass":"船舱等级","Embarked":"登船港口","title":"头衔","Cabin":"船舱号","Sex":"性别"}
full.rename(columns=dict,inplace=True)
survived_rate("船舱等级")
分析结果: 由上图可以看出,3等级客舱的人数最多,为491人,占55.04%,在幸存率方面,1等级客舱的生存率最高,为63%,其次是2等级客舱,说明了客舱的等级越高,生存率越高。
2.头衔对生存率影响
survived_rate("头衔")
分析结果: 由上图可知,在891名乘客中,人数较多的头衔是Mr, Mrs, Miss, Master,在幸存率方面,Mr的最低,为16%,,而Master,royalty,Mrs, Miss的生存率分别为 57%,60%,70%,80%,说明女性,学者,贵族在此次灾难中生存的机率相对较高
3.登船港口对生存率影响
具体登船情况
survived_rate("登船港口")
分析结果: 由上图可知,登录港口为C(法国瑟堡)的乘客生存率最高,为55.36%,出发地S(英国南安普顿)的乘客生存率最低,为33.7%
4.船舱号对生存率影响
survived_rate('船舱号')
分析结果: 从上图可以看出,大多数乘客的船舱号是u类别(数据处理时,把不知道船舱号的船员分为u类,因为没有研究价值),在幸存率方面,D号船舱的幸存率最大,为76%,其次是E和B,生存率分别是75%和74%,幸存率最小的为T号船舱:没有人幸存
5.性别对生存率影响
dict={
1:"male",0:"female"}
full['性别']=full["性别"].map(dict)
survived_rate("性别")
分析结果: 由上图可知,在891名乘客中,男性有577人,占比64.75%,在幸存率方面,女性是74%显著高于男性
6.票价对生存率影响
sns.boxplot(x="Survived",y='Fare',data=full)
plt.ylim(0,130)
分析结果: 箱线图表明,生存者的船票价格中位数比遇难者高,说明船票价格越贵,生存率越大
7.年龄分布与生存率的关系
由下图可知,年龄呈正态分布
sns.distplot(full.Age)
那么老人和未成年人的生存率是否要低一些?
分析如下
def get_age(age):
if age<18:
return "未成年"
elif 18<=age<60:
return "中年"
else:
return "老年"
full["年龄分布"]=full.Age.map(get_age)
survived_rate("年龄分布")
分析结果: 从上图可知,船上是以中年人为主体,共752人, 但是幸存率是未成年人最高,为54%, 而老年人最低,为27%