第八课:案例分析 - 泰坦尼克数据
本节课将重点分析泰坦尼克号沉船事故,我们将探索是什么因素决定了最后是否生还。
我们将前面课程所学过的知识点融会贯通,举一反三。
新增知识点:
缺失值处理:pandas中的fillna()方法数据透视表:pandas中的pivot_table函数
上篇文章的作业疑惑,其实用下图是可以简洁说明的,此图截屏于 新生大学-解密大数据《Python编程&数据科学入门》线上课程(说明来处,应该没侵权啊。。)。
对啦,我上的就是这个课,有读者问到这课程讲得那么详细是什么课,这个介绍一下,就是 新生大学-解密大数据《Python编程&数据科学入门》,感兴趣的读者可以去了解一下。

为什么前面听了那么久,我都不知道index是行索引,columns是列索引呢??!
好吧,接下来是正文内容:
3-4 年龄与生还情况
与上面的舱位、性别这些分类变量不同,年龄是一个连续的变量。
生还组和罹难组的年龄分布直方图
分类变量可以绘制条形图,连续变量可以绘制直方图。将泰坦尼克号的数据映射到 hist 函数中,来绘制 Age 这一列的直方图,并且把区间设成 20,输出得到年龄分布的直方图。

这张图并没能明显显示 FacetGrid 图表的优势,由于我们需要的是罹难和生还两个组的年龄分布,所以这时候可以加一个语句:

这个 col='Survived' 充满了魔力啊!!!一变二!这里就能显示生还组(Survived=1)和罹难组( Survived=0 )两个图表中年龄的分布了。col代表的是列的属性,这时把0和1分布在两个图表中,为了一致起见,把两个图表归一化,使用normed=True 这个参数,我们能够看到纵坐标的值改变了,并不是频数等统计,归一化的意思就是下面阴影区域的面积为1。
在这个图可以看到,相对来说,生还组中儿童占比比较大。
结论:儿童有更高的生还可能。
作业 8-3:
考虑舱位因素后,绘制生还组和罹难组的年龄分布直方图提示:FacetGrid参数中同时设置col和row
年龄是一个连续的值,要是用直方图来观察,不是太方便。这里就需要将连续性的变量离散化了:
连续型变量离散化是建模中一种常用的方法
离散化指的是将某个变量的所在区间分割为几个小区间,落在同一个区间的观测值用同一个符号表示
以年龄为例,最小值是0.42(婴儿),最大值是80,如果我们想产生一个五个级(levels),我们可使用cut或者qcut函数
cut函数将年龄的区间均匀分割为5分,而qcut则选取区间以至于每个区间里的观察值个数都是一样的(五等分), 这里演示中使用cut函数。
我们上面的图中可以看到年龄是0-80岁,我们可以尝试将它划分为五等分,等于就是把一个连续的值变成离散的值了,将数值变量变成一个分类变量。


此处离散化的方法是使用 pandas 里面的 cut 函数,首先传递给这个函数将要离散化的数据:年龄,后面的5,表示将数据分割成五等分。这里将原本数据的每一行对应到一个区间数据。

然后把这个输出添加到原来的数据中,通过添加一个新的列,赋值给 AgeBand,代表了年龄区间。
查看落在不同年龄区间里的人数

sort=False 表示不需要将结果排序,上图是没有加上这句话的输出,可以看到区间是按照区间数量的多少进行从大到小的排序的,要是想要把区间捋一捋,将区间从小到大无缝连接地排序,就可以加上 sort=False 这个语句了,下图是输出效果:

这里的结果输出可以看到年龄最小的区间人数有100人,按年龄区间分布最多的是16-32岁之间,老年人最少。
同样的,得出这样结果的方法不止一个,我们用 pivot_table 方法进行操作:

因为这里统计的是频数,values 对应的是非空数值就可以了。这里的主语是年龄区间,所以索引引导的是 AgeBand。也因为这里统计的是频数,所以聚合函数 aggfunc 的值是 count。
方法一和方法二不同的是,方法一是Series格式,方法二是DataFrame格式。
查看各个年龄区间的生还率

上面表格可以看到不同年龄区间的生还率,年龄最小区间的生还率是最高的,有55.5%,中坚力量三个区间的生还率不相上下,老年人最低,只有9%,从上面看到老年人只有11人,应该就是只有个别老人成功逃离了。。。
按照套路,我们下面到了绘制图表的时间啦!

这个图标的横坐标每个数据有点长,相互打架了。所以我们进行设置:

plt.xticks 这个函数我们之前提到过的,一般是用来调整坐标轴,可以通过旋转角度,对图表进行调整。这里 rotation=60,表示旋转的度数为 60 度,然后可以看到输出。
结论:儿童的生还率更高。
以上是单独看年龄/性别/舱位和生还率的关系,下面我们综合不止一个因素来看生还率。
3-5 年龄、性别 与生还概率

这里设置行索引 index 是年龄区间 AgeBand ,列索引 columns 是性别 Sex,聚合函数 aggfunc 是 numpy 的平均值。
第八课讲到挺多这样结构的案例的,前面我搞得挺迷糊,昨天在地铁上忍不住打开电脑敲代码的时候,真的发现这东西因为太简洁了,所以逻辑性特别强。比如这里需要看年龄和性别两个因素同时与生还概率的关系,所以是用了二重索引来作为分支,数字是生还率,所以 values 是等于生还率的,我的理解就是主语是这些数字,主要就是为了展示主语。然后有分支分类的从句,对句子进行补充,行索引 是年龄区间,列索引 是性别,我的理解就是 行索引 和 列索引 的关系是并列的,然后同时从属于主句,为生还率这个主语服务。得出来的输出就是 在某年龄区间,男性的生还率和女性的生还率分别是多少。这段话是文科生说给文科生听的🤓
接下来是绘制图表:

这里会自动帮你把Y轴 survived 这个数据求平均。不过这张图只有一条折线,因为这里还没有进行按性别来分组。折线图的分组句型记得啊!是hue!加上要修改距离打架的X轴,下面两处改动:

这张折线图可以看到,绿色代表的女性生还率无论在哪个年龄区间都是大于男性的,而且女性的生还率随年龄的增加也在递增。对于男性来说,也就是蓝色那条线的代表值,幼者生还率最大,年长的生还率都低于20%。老师说,从这幅图可以看出营救的策略应该是儿童优先,然后女性优先。
3-6 年龄、舱位、性别 与生还概率

我觉得要是前面说给文科生的那段话理解清楚,或者知道那段话代表的内容能理解清楚,这里加多一个因素的时候,不会那么慌。这里加了一个舱位的分支。看到最后一行输出,老年组女性的值是NaN,这一区间,无人生还。
看数据会有点懵,接下来绘制折线图,直观点吧!

上图并没有年龄区间的划分,这个函数不合适有三重索引地表达吧。所以下面要引进另一个函数,正确表达年龄,舱位,性别和生还概率的关系。


把年龄区间放在row上,按照年龄区间来分图,老师说到第二句代码map的时候,说把sns.pointplot,也就是上面运行的结果,映射到新赋值的函数中,我就想,反正都把结果弄上去了,为什么后面还要加上横纵坐标以及分类的参数呢,所以就试了一下不放其他参数的结果:

结果就是,五个空图,有年龄区间,有频数,就是没有参数的内容。不能偷懒啊不能偷懒~~🙈🙈
因为上面正确输出的图不是太完美,所以要进行调整:


aspect是长宽比等于1.5倍,还是胖一点好看😂😂😂
palette是调色板,用内置的色板进行调整,然后那条几乎隐形的白线终于显示出来了,变成绿色了。绿色代表女性数据,蓝色代表男性数据。
然而。。。这还没完,看上面五张图,几乎都是绿色在上面,也就是女性生还率高于男性,但是在第三个图,也就是年龄区间在32到48岁之间的绿色线是在蓝色线下面的!!!不可能啊,翻看前面的数据表格,也是女性生还率高啊!然后老师说,这里蓝色和绿色代表的数值调换了,也就是这张图中的蓝色代表女性,绿色代表男性。为什么呢?老师没说🙈
这里的设置是加一句 hue_order=[ 'male' , 'female' ] ,此处用的是列表形式扩住参数。然后就正常了:

老师说,对上图的色板配色感兴趣的,可以去这个链接:palette 配色参考 https://seaborn.pydata.org/tutorial/color_palettes.html?highlight=palette
哈我就没多大要求了,默认隐藏的够用就行,你们拿去收藏吧!🤓
作业8-4:
综合考虑性别,舱位和登船码头三个因素,计算其生还概率,并在一副图中探索它们和生还概率的关系。
来来来总结一下第八课的内容,我们一开篇就提出一个问题:生还率和什么因素有关,然后拿到了原始数据,数据通过清洗填充了缺失值,然后看单个因素和生还率的关系,再看多个因素和生还率的关系,进行可视化图表的绘制更容易得出结论,看下图(我又侵权了吗。。。🙈外框绿色蝴蝶是新生大学Logo,内框那只老虎是解密大数据团队Logo)

第八课终于结束了,老泪纵横。。。写不完的第八课😭😭😭今晚上第九课啦!!!预习资料还没看😤抓紧时间
网友评论