目前,山东新高考成绩采用3+3模式,即语数外使用原始分,其余三门选课参照正态分布原则,采用等级赋分制进行计算,将三门科总成绩与语数外三门课相加形成学生最后的总成绩。学校在进行等级赋分转换时需要充分考虑以下几个方面:
1:总分相同时的排名问题。
2:选课走班生,其走班科目的成绩应放在其教学班进行对比,而非行政班对比。
目前很多学校或软件,并未将选课走班生单独拿出来,而是一并归入采用行政班,这虽然在总成绩上没有影响,但对于观察班级整体成绩则会出现数据失真问题。
那么我们如何在全年级对某科进行等级赋分呢?下面以山东省选课等级赋分规则为例,对物理这一科目在算法上进行讲解。其余科目一样
注:举例数据 名字全是系统生成的化名,但成绩和班级都是真实的
一:山东省等级赋分规则
图为山东省等级赋分规则
该校共有1158名学生参加物理考试。计算步骤如下
1:不占位排序算法
先对学生成绩进行排序,排序规则为成绩相同,名次相同,如 A B C D四位学生 成绩分别为 98 87 87 34 名次则为 1 2 2 4即不占位排序。使用mysql数据则很容易完成这个排序工作
select studentName,score ,RANK() OVER(order by score DESC ) ranks from exam where 科目=物理
2:确定等级区间
如第一区间是0-3%。那么第一区间 最高名次为 1158 * 0.03= 34.74,这里采用向下取整原则,Math.floor(34.74),第34名就是3%的最高名次。这里,很多学校和软件在这里四舍五入了,这样有可能会把第二区间的第一名纳入到第一区间,造成计算错误。
如图:
实际上这里的前3%的名次最高到25名,共计34个学生。这样我们就可以获取该区间原始分最高分和原始分最低分为98-84分。计算完后,按赋分等级公式计算:
(原始成绩区间最高分-等级区间最低分)/ (考生原始分-原始成绩区间最低分)
(等级区间最高分-转换后的等级分) / (转换后的等级分- 赋分区间最低分)
简化公式为:为了java开发方便计算可将公式转换转换为
1:原始最高分-原始分=a
2:区间最高分- 原始分=b
3: a/b=y(注意Y不是原始分) 带入公式得:(区间最高+y * 区间最低 ) / 1+y = 最终赋分
(对上面的代码我必须吐槽,全是坑啊!!!!,为了怕算错,分开一步一步的写,愣是把一数学硕士给写晕)
如:17班的肖泽强 物理87分, 在前3%内 首先确认其等级为A , 经过等级赋分计算:
肖泽强最终物理为93分。
这里得93分 是 显示成绩,数据库中保留的则是92.9285分。为什么要保留4为小数呢?
1:是后面还需要进行线性拟合等运算,以预测学生的成绩和 班级 科目的增量运算,这需要精确的数值。
2:是计算总排名。
实际上,很多学生科目总分相同,但实际高考中存在同名次的情况几乎不会发生,我们也是模拟了真正高考的算法,小数点精确到了4位数。这也就是我们为什么看到有的学生总分相同,但名次却不同的原因。那么真的遇到相同总分、相同名次的情况怎么办呢?实际的算法是先看语数外总分谁高谁就排到在前面,再看综合分,这样如果还是相同,那就名次相同。
班级排名
班级排名很麻烦,因为必须考虑到这个学生是否走班,如果走班,该生的成绩不能在本行政班排名。
区间统计
完成赋分后,对区间统计就简单多了
这样我们可以通过数据库完成区间统计,效果如下:
就写这么多吧,这几天又在搞增量算法了,在工作量和难度上,这两根本不是一个等级,程序员真特么累!
希望天下老师没这么累,以前我也是一名教师,知道老师们也很辛苦,欢迎使用这款软件,希望能够帮助各位老师们从繁琐的工作中解脱出来,有任何的建议,敬请下面留言
测试地址
http://117.50.162.64:8082/
可以注册,也可以使用测试账号:xm123 密码 :123456