第一篇博客,主要熟悉一下Pandas的使用,加上本人18年考的北科计算研,就顺手对北科计算机18年,19年的考研成绩做个分析吧,也算给自己学校打个广告吧。 计算机科学与技术是学硕,考数一英一,计算机技术是专硕,考数二英二,政治和专业课题目一样,专业课自主命题。
相关代码和数据请点击此处.
主要涉及到的技术点有:
主要目的是分析北科计算机近两年的考研动态,对成绩,分数线,报考人数,录取人数,题目难度等分析。
首先读取两年的考研成绩,都是Excel表
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取近两年北京科技大学考研成绩表,以第一栏作为表头
data2019 = pd.read_excel("/home/shaobin/tmp/20190215140202408200.xls", header=1)
data2018 = pd.read_excel("/home/shaobin/tmp/20180203165211753910.xls", header=1)
# 删除考生编号和姓名等敏感信息
data2018.drop(['考生编号', '姓名'], axis=1, inplace=True)
data2019.drop(['考生编号', '姓名'], axis=1, inplace=True)
为了确保数据分析的有效性,我把强军计划或其他学院部分计算机专业的筛掉,只保留北科计通学院,全日制,全国统考,无专项计划的考生,并删去隐私情况。
预览一下表格
2018年计算机技术
2019年计算机技术
可以看出,这两年的表格数据格式是有出入的,不过还好4门成绩的名称和总分的列名没变,省了很大功夫。
接下来,我们就把两年的计算机成绩抽出来,只需要成绩,其他数据都不需要了
cs = pd.DataFrame(data2018_jishu, columns=["政治理论", "外国语", "业务课1", "业务课2","总分"])
准备将抽出来的2年成绩合并到一个DataFrame表里,就。。。列对列怼上!怼上的同时别忘了插入标签列,不然全混一起了。插入新列并填入相同数据有两种方法
1.在指定位置插入空列,并用fillna函数以指定字符填充NaN当然,也可以先建立有字符的Series,直接插入,不过麻烦了点。
cs.insert(1,'专业名称', pd.Series())
cs.fillna("2018计算机技术", inplace = True)
2.使用reindex函数,将列以列表排序,并指定要插入值,这个主要是麻烦在得将其他列全写出来
cs = cs.reindex(columns=["专业名称","政治理论","外国语","业务课1","业务课2"], fill_value = "2018计算机技术")
最后使用pd.concat函数以相同列名为索引,列对列合并,axis=0是列,axis=1是行
# 将两年的计算机专硕和学硕成绩合在一起,并打标签
cs = pd.concat([rebuild(data2018_kexue, "2018计算机科学与技术"), rebuild(data2018_jishu,
"2018计算机技术"),rebuild(data2019_kexue, "2019计算机科学与技术"), rebuild(data2019_jishu,
"2019计算机技术"), ], axis=0)
# 重置索引,并把之前的索引删去
cs.reset_index(inplace = True,drop=True)
到此,数据初步成型,但还存在缺考的成绩,得删掉这部分数据
cs_clear = cs[~(cs["外国语"]=="缺考") & ~(cs["政治理论"]=="缺考") & ~(cs["业务课1"]=="缺考") &
~(cs["业务课2"]=="缺考") & ~(cs["政治理论"]=="作弊")]
现在数据终于干净了,让我们再看看数据长啥样
接下来进入正题——数据分析,都说考研热度一直在上升,我们来具体看看情况
首先使用groupby函数对数据进行简单聚合,统计下考研人数
# 计算机考研人数统计
cs_count = cs.groupby(['专业名称']).size()
# 计算机未弃考人数统计
cs_clear_count = cs_clear.groupby(['专业名称']).size()
将2018年,2019年报考北科,计算机学硕,计算机专硕的人数还有它们的增长率统计一下,麻烦的地方在于要用dict类型转为Dataframe型格式,使用from_dict函数构造,而且bug的是python字典是无序的,最后的行/列和预期的可能不一样,只能在最后调换一下行/列索引位置
# dict_table是统计数据,count_column是列索引值
dict_table = {"总报考人数":[len(data2018), len(data2019)],
"计算机科学与技术报考人数": [cs_count["2018计算机科学与技术"], cs_count["2019计算机科学与技术"]],
"计算机技术报考人数": [cs_count["2018计算机技术"], cs_count["2019计算机技术"]],
"计算机科学与技术成绩有效人数": [cs_clear_count["2018计算机科学与技术"], cs_clear_count["2019计算机科学与技术"]],
"计算机技术成绩有效人数": [cs_clear_count["2018计算机技术"], cs_clear_count["2019计算机技术"]]
}
count_column = ["2018", "2019"]
growth_count = pd.DataFrame.from_dict(dict_table, orient='index', columns = count_column)
growth_count = growth_count.loc[["总报考人数","计算机科学与技术报考人数", "计算机技术报考人数", "计算机科学与技术成绩有效人数", "计算机技术成绩有效人数"]]
感觉还不错,现在加上增长率的计算
# 在列末尾新加一列增长率,并输出为百分比形式
growth_count["增长率"] = ((growth_count["2019"] - growth_count["2018"])/growth_count["2018"])
.apply(lambda x: '%.2f%%' % (x*100))
费劲这么大功夫,我们终于可以得到一些结论了,根据教育部数据,2019年考研报考人数为290万人,比去年增长了52万人,增幅21%。咱们学校的整体上涨率符合大趋势。但对于计算机专业来说,两级分化严重,学硕毛增率11.7%,但净增率只有9.27%(未弃考),还跌了些,而专硕这边报考人数增长恐怖,毛增率达到61.68%,没有放弃考试的比去年多了67.26%。
分析原因,个人认为有三点
至于计算机学硕专硕报考人数差距为什么这么大,我认为有以下原因
下文会用数据具体分析
我们使用df.std(),df.mean(), df.median(), df.max()计算出各科成绩每年的标准差,平均分,中位数和最高分
2018年学硕成绩分析
2019年学硕成绩分析
学硕成绩分析
2018年专硕成绩分析
2019年专硕成绩分析
整体看,政治和外国语的成绩波动较小,均分,中位数,最高分都只涨了几分,而标准差几乎没变,可见政治和外国语难度降低,区分度减小,对偏理科的计算机考生来说是个好消息。
两门业务课倒是很有意思,学硕和专硕的成绩走向完全不同,学硕的高数虽然也有不小的提高,但专业课提升更大,平均分提升近10分。而专硕的高数增长简直爆炸,平均分高了17.4分,而中位数提高了24.5分,意味着高数高分端的考生数提升了相当一部分,但专业课起伏不是很大。
总分上,学硕专硕的成绩都有显著提高,考试难度总体下降不少。
下面基于成绩频率分布进一步分析,使用seaborn和pandas进行数据可视化绘图,将两年的计算机专硕成绩,计算机学硕成绩分别画在一起,分析考试难度的变化。
绘图函数如下,使用seaborn对政治成绩进行频率曲线绘制,比较坑的是提取完政治成绩后,Series的标签还是“政治成绩”,只能用rename函数重写标签
sns.kdeplot(cs_clear.loc[cs_clear["专业名称"] == "2018计算机科学与技术"]
["政治理论"].rename("2018政治理论"), color="b",shade = True)
政治理论的成绩有明显提高,专硕更为明显,可能的原因是专硕复习其他科目压力较小,可以有更多的精力复习政治。
英语的整体成绩变化不大,学硕的高分明显增多,集中成绩基于没有比变化;专硕集中成绩稍微提高了一点,但占比降低,低分明显增多。
高数的成绩显著提高,果然应了张宇老师说的话,“19级的同学要感谢18级学长学姐的付出,你们的高分是他们用眼泪换来的!”,记得我当时考高数的时候真的写懵了,线代部分题刁钻的无从下笔,是无从下笔,是感觉完全没见过,是能搞崩心态的那种怪题!感觉整个人都凉了,19年的数学看来是恢复常规了。数学考奇不考偶,今年考研的同学得注意加强高数的复习了!
专业课的成绩也有了明显提高,并且还是保持两极分化,整体往右平移了一格。专业课初试考数据结构和计算机组成原理,都不是特别难。但从17年考研开始,专业课改了题型,19年考生有17年,18年两次考研题型参考,对考研成绩帮助还是很大的,今年复试加入了上机编程,对考生的要求又提高了不少。
再来分析一下各科目过线率的情况
2018年的国家线是34分(100满分)和51分(150满分),总分是260分,录取线学硕是314分,专硕是318分。
2019年是39分(100满分)和59分(150满分),总分是270分,录取线学硕是340分,专硕是361分。
虽然国家线离专业录取线还有很大一截,但过线率还是能衡量一下考生素质和考试难度的,而且只有过了国家线才能参与调剂,所以各位想读研的小伙伴还是得注意一下国家线是多少,才好指定复习计划。
这里的过线率是用总报考人数计算的,没有去掉缺考的人数。
实际上,虽然考试难度降低了,除了专硕的高数上涨不少,其他科目的过线率不升反降,可以看的出整体考生的素质是有所降低的,所以大家不要被猛增的报考人数吓到了,很大一部分考生是抱着“两日游”的心态来考研的,只要认真复习,积极备战,大家一定会有所收获。
为了方便观察,给出两种比例方式。19年计算机学硕的竞争减小,而19计算机专硕的竞争相当激烈。值得一提的是,19年的招生指标变多了,复试易进难出,看的出来学院对考生的综合素质有更多要求,符合研究生的灵活科研,不再是应试学习。
很多小伙伴已经在积极备战20年考研了,现在英语和政治的出题风格求稳,起伏不大。但数学和专业课得引起大家的重视,特别是19年的高数难度降低,20年肯定会出有区分度的题。希望各位小伙伴认真对待哦,不过作为考研的过来人,我觉得不放弃才是最重要的,只要不弃考,一定能对的起自己的付出。
北科计算机专硕学硕差别不大,学硕可以硕博连读,而什么学费,培养计划是一样,专硕复习的范围相对较少,但竞争还是比较激烈的,大家根据自己的具体情况报考。
北科的计算机综合实力还是不错的,大家可以尝试哦,欢迎大家报考北科计算机!