Python分析学校四六级过关情况


Posted in Python onNovember 22, 2017

这段时间看了数据分析方面的内容,对Python中的numpy和pandas有了最基础的了解。我知道如果我不用这些技能做些什么的话,很快我就会忘记。想起之前群里发过一个学校的四六级成绩表,正好可以用来熟悉一下pandas中的一些用法。

1.数据介绍。

成绩表中包含的字段十分详细,里面有年级、性别、姓名、分数等等的一系列内容,我只想简单的分析一下我们学校的四六级过关率而已,所以去除了一些不必要的字段。留下的有如下几个字段:

Python分析学校四六级过关情况

第一列是自增的序号,没有什么实际意义。

第二列就是代表着该学生参加的是四级还是六级。

第三列是我们学校的院系名称。

第四列是学校院系的各个专业。

第五列是年级,13代表着2013年入学。

第六列是性别。

后面的三列分别是总分、听力、阅读、写作等。

其中总分为0的都是缺考的。一共有接近9000条数据(没有报名的不在其中)。

2.预期结果。

我想利用这些数据最终通过图标的形式展示出以下几点:

1.各个学院的四六级平均分。

2.各个学院的四六级过关人数。

3.各个学院的各个年级过关人数。

4.各个年级的过关人数。

5.男生女生分别过关人数。

最终结果:

各个学院的四六级过关人数:

Python分析学校四六级过关情况

3.实现过程。

(1)导入依赖包。

程序分别使用了pandas进行分组转换,和matplotlib提供的绘图功能。

import pandas as pd
import matplotlib.pylab as plt

(2)加载数据。

想要分析数据自然要得到数据了,我将整理的数据存放在sj.xls中,是一个Excel类型的数据。
这一步使用pandas的read_excel即可,生成一个DataFrame对象。

#加载全部数据
sj = pd.read_excel(r'F:\DataAnalysis\sj.xls')

加载完之后输出一下看看内容:

Python分析学校四六级过关情况

除了排版没有对齐之外其他都一样。

(3)统计各个学院平均分。

在这里就可以完成我们预期的第一个结果:

各个学院的四六级平均分:

想要各个学院的情况当然是要根据学院来进行分组了,同时也需要分出“CET4”和“CET6”两组。使用groupby即可,这样会生成一个SeriesGroupBy对象,然后再调用mean函数(默认是轴0计算,也就是我们想要的结果)即可统计出平均分情况。

#按照各个学院进行分组
xymean = sj['总分'].groupby([sj['院系名称'],sj['语言级别']])

#计算各个学院的平均分数
xymean = xymean.mean()

这个时候将其输出的话会得到如下结果:

Python分析学校四六级过关情况

由于院系名称和语言级别是层次化索引的缘故,看起来并不是十分的友好,因此使用unstack将语言级别转从行转换为列。

xymean = xymean.unstack(level='语言级别')

再次输出的话结果就比较清晰了

Python分析学校四六级过关情况

使用pandas的绘图功能进行绘图:

#使用横向柱状图显示
xymean.plot(kind='barh')

#在PyCharm中需要使用,在Ipython环境中如果以--pylab形式打开就不需要
plt.show()

运行一下看看结果:

Python分析学校四六级过关情况

可以看到这时候数据的结果都能够显示出来了,但是中文部分出现了问题,不过不要紧,科学上网一查就解决了:https://github.com/mwaskom/seaborn/issues/1009

添加一下代码即可:

import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']

再次运行就OK了。

Python分析学校四六级过关情况

接下来要分析过关的情况了。

(4)筛选数据。

既然已经有了所有的数据内容了,下一步就是筛选出所有过关的人数了。

#过滤出过关人数
sjpass = sj[sj['总分'] >= 425]

这时候sjpass存放的就是所有的过关人数了。

Python分析学校四六级过关情况

在输出结果的最下面就可以看到一共有1507行数据,当然也可以使用len()或者shape[0]查看共有多少行。

(5)各个学院的四六级过关人数。

已经有了全部过关人的数据了,接下来根据预期结果进行分组即可。同样的根据“院系名称”和“语言级别”对总分进行分组,然后使用count函数进行求和最后再用unstack进行调整绘图展示。

#按照各个学院进行分组
xypass = sjpass['总分'].groupby([sjpass['院系名称'],sjpass['语言级别']])


#计算各个学院的过关总人数
xypass = xypass.count()

#将语言级别作为columns
xypass = xypass.unstack(level='语言级别')

#进行绘图
xypass.plot(kind='barh')
plt.show()

绘图结果:

Python分析学校四六级过关情况

(6)各个学院的各个年级过关人数。。

这次分组的时候加上年级即可,并且为了绘图比较好看一点,这次可以将“年纪”转换为列,并且像12年这种的有些学员已经没有人参加了,所以需要将缺失值用0填充:

#按照各个学院和年级进行分组
xypass = sjpass['总分'].groupby([sjpass['院系名称'],sjpass['语言级别'],sjpass['年级']])

#计算各个学院的过关总人数
xypass = xypass.count()

#将语言级别作为columns,并且将缺失值用0进行填充
xypass = xypass.unstack(level='年级').fillna(0)

xypass.plot(kind='barh')
plt.show()

绘图结果:

Python分析学校四六级过关情况

(7)各个年级的过关人数。

使用groupby对年级进行分组即可:

#-----------------各个年级过关人数------------------
njpass = sjpass['总分'].groupby([sjpass['年级'],sjpass['语言级别']]).count().unstack(level='语言级别')
njpass.plot(kind='barh')
plt.show()

绘图结果:

Python分析学校四六级过关情况

(8)男生女生分别过关人数。

将性别和语言级别进行分组:

#---------------男生女生过关情况----------------------
nvpass = sjpass['总分'].groupby([sjpass['性别'],sjpass['语言级别']]).count().unstack(level='语言级别')
nvpass.plot(kind='bar')
plt.show()

绘图结果:

Python分析学校四六级过关情况

4.结果分析。

从绘图的结果上来看的话,各个学院之间音乐学院的平均分比较低,艺术设计和外国语学院的平均分都比较高,但是过关人数却没有那么的多,尤其是艺术设计的人数比较少,主要也是因为该学院的总人数比较少。

四级的过关人数明显比六级的人数多的多,而且因为15级是大二年级,在我们学校大二才可以参加四六级考试,所以过关的人数里面15级占有比较大的比分。

而且不得不承认,女生的过关率要比男生高的不止一点。

源码以及数据:https://github.com/jiajia0/DataAnalysis

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python标准库内置函数complex介绍
Nov 25 Python
Django中对数据查询结果进行排序的方法
Jul 17 Python
好的Python培训机构应该具备哪些条件
May 23 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 Python
Python面向对象封装操作案例详解
Dec 31 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
Mar 19 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
python析构函数用法及注意事项
Jun 22 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 #Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 #Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 #Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 #Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 #Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 #Python
解决python3中自定义wsgi函数,make_server函数报错的问题
Nov 21 #Python
You might like
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
JSON Web Tokens的实现原理
2017/04/02 Python
分析Python读取文件时的路径问题
2018/02/11 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
幼师自荐信
2013/10/26 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
2015年教师教学工作总结
2015/04/28 职场文书