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编写检测数据库SA用户的方法
Jul 11 Python
Python随机生成彩票号码的方法
Mar 05 Python
Python常用随机数与随机字符串方法实例
Apr 09 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
Python中格式化字符串的四种实现
May 26 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
利用Python优雅的登录校园网
Oct 21 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
Python字典和列表性能之间的比较
Jun 07 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Python lambda和Python def区别分析
2014/11/30 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
django用户登录和注销的实现方法
2018/07/16 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
简单了解django文件下载方式
2020/02/10 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
中职应届生会计求职信
2013/10/23 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
单位未婚证明范本
2014/01/18 职场文书
2014年度安全工作总结
2014/12/04 职场文书
上甘岭观后感
2015/06/10 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python