Python语言在学生成绩分析与评估中的应用
2022-05-12赵圆圆
赵 圆 圆
(石家庄职业技术学院 信息工程系,河北 石家庄 050081)
Python语言是一种简单易学、拥有丰富库的开源脚本语言,在人工智能、网络爬虫、数据分析等方面有着非常广泛的应用.本文使用Python 语言的第三方库对学生成绩进行处理和分析,绘制出雷达图、散点图和饼状图,供教师进行可视化分析,为课程教学效果的评估提供参考依据.
1 Python语言及第三方库
1.1 Python语言
程序设计语言包含机器语言、汇编语言和高级语言.机器语言指的是二进制语言,是计算机可以直接执行的程序设计语言,直接使用机器语言编写程序比较繁琐.汇编语言是一种比较低级的程序设计语言,不同的计算机结构使用的汇编指令不同,所以在使用过程中具有一定的局限性[1].高级语言比较接近自然语言,在不同结构的计算机上描述问题、解决问题的表述方式相同.高级语言分为静态语言和脚本语言,静态语言采用编译执行的方式,脚本语言采用解释执行的方式.Python语言简单易学、可移植、可扩展[2].Python语言因其拥有的优势,在2021年8月的TIOBE编程语言排行榜上位居第二[3].
1.2 第三方库
Python语言拥有Numpy(科学计算库)、Matplotlib(数据可视化库)、Pandas(数据分析库)等专业功能强大的第三方库,为人工智能领域进行科学的数据分析提供了较好的方法[4].
1.2.1 Numpy
Numpy是Python语言中最常用的可以实现高性能科学计算和数据分析的库,使用该库可以生成一个Ndarray对象,该对象为具有矢量运算和复杂广播能力的多维数组,无需使用循环语句就可对整组数据进行快速运算.本文使用Ndarray对象存储和处理班级、课程名称数组,班级、课程成绩及平均成绩数组.
1.2.2 Matplotlib
Matplotlib是Python语言中绘制数组的2D 图形库,具有强大的数据可视化绘图功能.它源于数学软件Matlab,有独特的优势.Matplotlib开源免费,虽然它属于Python 语言的扩展模块,但它继承了Python语言的面向对象易读、易维护等特点.Matplotlib提供子模块pyplot,该模块中封装了一套类似Matlab命令式的绘图函数,为编程开发人员提供了接口.开发人员只要调用pyplot模块中的函数,就可以快速绘图及设置图表的各种需求.pyplot模块包含了一组快速生成基础图表的函数,可以生成直方图、条形图、箱线图和雷达图等[5].本文使用pyplot模块中的polar()函数对各班级、各门课程学生的平均成绩进行雷达图的绘制,并以Python 程序设计课程成绩为例,进行散点图和饼状图的绘制.
1.2.3 Pandas
Pandas是Python 语言中常用的基于Numpy的数据分析模块,该模块纳入了大量的库和标准数据模型,提供了快速高效、具有默认和自定义索引的Series对象和DataFrame对象,支持在内存数据结构和不同文件格式中读取和写入数据,并进行快速、便捷处理,最终生成可视化图表.本文使用Pandas从存放成绩的Excel表格中导入学生成绩,且对异常数据进行清洗.
2 数据处理
某学校2019级计算机网络技术专业1班、2班和3班的学生第四学期期末考试后,教师需要处理和分析每个班6门专业课程(网络设备调试、Linux系统操作与管理、数据恢复技术、网络安全基础、融合通信技术、Python程序设计)的成绩,利用成绩数据绘制评估图,包含各班级、各门课程成绩评估雷达图.本文以Python 程序设计课程成绩为例绘制的散点图和饼状图.
2.1 数据样本
将学生成绩存放到Excel表格中,3个班的Python程序设计课程成绩存放的文件名为“scores+班级号”,例如,scores1.xlsx代表1班的Python程序设计课程成绩,文件中表头包含序号、学号、姓名、平时成绩、期末考试成绩、实验成绩和综合成绩等7列数据.每个班6门专业课的平均成绩存放在averagesscores.xlsx文件中.
2.2 数据处理流程
数据处理流程包含4个模块,分别为打开文件模块、获取数据模块、数据处理模块和数据可视化模块.数据处理流程图见图1.
2.2.1 打开文件模块
打开存放课程平均成绩的averagesscores.xlsx文件,进行读写操作.Pandas提供了一系列读写不同格式文件的函数,导入Pandas模块,使用read_excel()函数以只读方式打开文件,并将读取的数据存放到DataFrame对象“df_obj”中.实现代码如下:
import pandas as pd
df_obj=pd.read_excel(r′E:averagescore.xlsx′)
程序运行后会得到存放每个班级每门专业课程平均成绩的数据,将其存放到“df_obj”对象中.同样使用read_excel()函数分别打开存放各班级Python程序设计课程成绩的文件,1班、2班、3班的实现代码分别为:
df_obj1=pd.read_excel(r′E:scores1.xlsx′)
df_obj2=pd.read_excel(r′E:scores2.xlsx′)
df_obj3=pd.read_excel(r′E:scores3.xlsx′)
将读取到的存放各班Python程序设计课程学习成绩的文件数据分别存放到“df_obj1”,“df_obj2”和“df_obj3”对象中.
图1 数据处理流程图
2.2.2 获取数据模块
2.2.2.1 获取雷达图数据模块
从存放平均成绩的“df_obj”对象中读取绘制雷达图的指标和数据.
(1)读取课程名称、班级名称数组,确定分析指标
从文件中获取到的数据包含行与列的名称和成绩,输出从文件中读取的“df_obj”数据,见图2.从数据中可以看出,课程名称是DataFrame对象中的列索引,但不包含班级列索引,故通过DataFrame的属性columns获取列标签,再筛选出除了班级列索引以外的其他课程名称,将筛选出的课程名称存放到列表中.
图2 原始数据输出截图
关键代码如下:
columns=df_obj.column
course=[]#定义一个列表来存储最后的课程名称
for i in range(0,7):#循环遍历
if i! =0:
course.append(columns[i])#筛选出需要的课程名称,并将课程名称放到新的numpy数组中
程序运行完后可获取到课程名称数组,截图见图3.
图3 课程名称数组截图
获取班级名称,班级名称是DataFrame对象的第一列数据.通过ilco属性获取到第一列数据,列序列默认从0开始,iloc属性以二维矩阵的位置指标(即0,1,2,…)作为参数来获取某行的数据.比如,iloc[0]表示获取到的第一行数据,通过iloc[:,n]获取第n+1列的数据.获得第一列班级名称后,需要将它转换为一维数组,关键代码如下:
df_clas=df_obj.iloc[:,0]
clas=df_clas.values #获取到班级数组
获取的班级数组截图见图4.
图4 班级数组截图
(2)读取平均成绩,收集指标数据
指标数据是指原始数据中3个班级6门专业课程的平均成绩数据,即第二列至第六列数据.使用iloc[:,1:7]命令获取第二列到第六列数据后,将数据存储到DataFrame对象中,使用属性value获得由数据组成的数组,并对数据进行行列互换,得到6行3列的指标数据.关键代码如下:
df_scores=df_obj.iloc[:,1:7]
data_scores=df_scores.values#返回DataFrame对象包含数据的数组,获取到我们的数据
#行列互换才能得到绘图的数据
scores=data_scores.T
最终指标数据截图见图5.
图5 指标数据截图
2.2.2.2 获取散点图数据模块
以Python程序设计课程成绩为例,绘制各班成绩散点图.在原始数据文件scores1.xlsx,scores2.xlsx和scores3.xlsx中包含序号、学号、姓名、平时成绩、期末成绩、实验成绩和综合成绩7列数据,绘制散点图只使用序号和综合成绩两列数据,显示学生成绩的离散情况.本文以获取1班学生的Python程序设计课程成绩为例来分析散点图的数据,具体实现代码如下:
#获取某列的数据
num1=df_obj1.iloc[:,0]#序号列
score7=df_obj1.iloc[:,6]#综合成绩列
通过DataFrame类型的“df_obj”对象的iloc属性来获取某行或某列的数据,上述代码中下标0代表第一列,即获取序号列数据,下标6代表第七列,即获取综合成绩列数据.同理,使用“df_obj2”对象的属性、“df_obj3”对象的iloc属性即可获取2班和3班Python程序设计课程成绩的散点图数据.
2.2.2.3 获取饼状图数据模块
以获取1班学生的Python程序设计课程的综合成绩为例,获取各班级学生的Python 程序设计课程综合成绩的饼状图数据,具体实现代码如下:score7=df_obj1.iloc[:,6]#综合成绩列
通过DataFrame类型的“df_obj”对象的iloc属性的下标6获取第七列综合成绩列的数据.最终要根据综合成绩所在分数段范围([0,60)分、[60,70)分、[70,80)分、[80,90)分、[90,100]分)的人数绘制饼状图.在获取综合成绩列的基础上,需要统计综合成绩在不同分数段的人数占比,实现代码如下:
x1=[a/df_obj.size*100,b/df_obj.size*100,c/df_obj.size*100,d/df_obj.size*100,e/df_obj.size*100]
其中,代码中变量a代表1 班综合成绩在[90,100]分的人数;变量b代表综合成绩在[80,90)分的人数;变量c代表综合成绩在[70,80)分的人数;变量d代表综合成绩在[60,70)分的人数;变量e代表综合成绩在[0,60)分的人数;序列x1存储的是各分数段范围的人数占总人数的百分比.
同理,分别使用“df_obj2”对象和“df_obj3”对象的iloc属性获取2班和3班学生的Python程序设计课程的综合成绩,进行不同分数段范围的人数统计并计算占比,存到序列x2和x3中.
2.2.3 数据处理模块
读取的数据中可能会带有一些无效值,需将无效值替换为有效值.需要检查是否有空值,若有空值,使用具体值0替换所有的空值.关键代码如下:
df_obj.isnull()
df_obj.fillna(0)
2.2.4 数据可视化模块
2.2.4.1 绘制雷达图
(1)将圆周等分
先获取数据的长度,命令为data_length=len(course),再将圆周等分为data_length份,关键代码如下:
angles=np.linspace(0,2*np.pi,data_length,endpoint=False)
从0到2π,分成data_length等份.
(2)数据角度拼接,首尾相连
将数据和角度进行拼接,首尾闭合.关键代码如下:
scores= np.concatenate((scores,[scores[0]]))
angles= np.concatenate((angles,[angles[0]]))
course=np.concatenate((course,[course[0]]))
(3)绘制雷达图
所有数据闭合后,使用polar绘制雷达图.命令为plt.polar(angles,scores,′o-′,linewidth=3),第一个参数是角度,第二个参数是分数,第三和第四个参数是线条样式.
(4)设置角度和网格标签
设置极坐标的标签,并将标签放在六角形的顶点上.关键代码如下:
plt.thetagrids(angles*180/np.pi,course,fontproperties=′simhei′)
plt.title(′成绩评估′)设置图的题目
plt.legend(clas,loc=(0.94,0.80),labelspacing=0.1)设置图例
设置中文字符核心实现代码如下:
plt.rcParams[′font.sans-serif′]=[′Sim Hei′]
plt.rcParams[′axes.unicode_minus′]=False
最后使用show()函数显示成绩评估雷达图.
2.2.4.2 绘制散点图
使用Matplotlib的pyplot模块中scatter()函数绘制各班Python程序设计课程成绩分布的散点图.1班学生Python程序设计课程成绩分布散点图的具体实现代码如下:
plt.scatter(num1,score7,s=50,c=′black′,marker=′o′,alpha=0.5)#散点图
plt.title(“成绩分布图”)
其中,scatter函数的第一个参数num1是1班学生的Python 程序设计课程的第一列序号列数据,第二个参数score7是综合成绩列数据,第三个参数s=50设置的是散点图中点的大小,第四个参数c=′black′设置散点图中点的颜色为黑色,第五个参数market=′o′用于设置点的形状,第六个参数alpha=0.5用于设置透明度,title属性设置散点图的标题.
同理,可以绘制2班和3班学生的Python程序设计课程成绩分布散点图.
2.2.4.3 绘制饼状图
利用Matplotlib的pyplot模块中pie()函数绘制各班学生Python程序设计课程不同分数段成绩的饼状图.以1班为例,具体实现代码如下:
plt.pie(x1,labels=labels,autopct=′%3.2f%%′)
plt.axis(′equal′)
plt.title(“成绩分布饼图”)
plt.legend()
plt.show()
其中,pie()函数常用3个参数,第一个参数x1是1班学生Python程序设计课程成绩在不同分数段的占比.“plt.axis(′equal′)”表示 绘图的x轴和y轴范围相同.title属性设置饼状图的标题.legend()函数为设置图像图例.“plt.show()”命令显示绘制的图像.
同理,可以绘制2班和3班学生Python程序设计课程成绩在不同分数段的饼状图.
3 成绩分析与评估
在Python3.9 IDLE 下运行程序,绘制出各班级、各课程的平均成绩雷达图,见图6.绘制各班Python程序设计课程成绩分布散点图,见图7-9.绘制各班Python 程序设计课程成绩分布饼状图,见图10-12.
图6 各班级、各课程的平均成绩雷达图
图7 1班Python程序设计课程成绩分布散点图
图8 2班Python程序设计课程成绩分布散点图
图9 3班Python程序设计课程成绩分布散点图
图10 1班Python程序设计课程成绩分布饼状图
图11 2班Python程序设计课程成绩分布饼状图
图12 3班Python程序设计课程成绩分布饼状图
雷达图、散点图和饼状图可以辅助教师从不同角度对学生成绩进行分析.
通过雷达图可以全方位地看到3个班每门课程的平均成绩及每个班级的优势科目和劣势科目.从图6可以看出,1班与其他两个班相比,优势课程是融合通信技术,劣势课程是网络安全基础;2班与其他两个班相比,优势课程是网络设备调试,劣势课程相对不明显;3班的相对优势课程是网络基础安全,相对劣势课程是数据恢复技术.
通过散点图,可以直观地看出各班学生成绩的离散情况.从图7-9可以看出,每个班大部分学生的成绩都及格,而3班Python程序设计课程成绩不及格的偏多,且低分学生相比另外两个班数量也多,但是最高分也在其中.
通过饼状图可以看出,每个班级学生的成绩分布情况.从图10-11可以看出,1班和2班学生成绩分布相对合理,大多集中在[60,90)分;在[0,60)分的,1班和2班人数较3班少,说明这两个班学生对课程内容掌握得比较扎实.从图12可以看出,3班[0,60)分学生人数和[90~100]分的学生人数占比和其他分数段范围的人数占比相当,并未呈现出正态分布,说明该班学生出现轻微的两极分化现象;[0~60)分学生的人数占比较高,达25.81%,说明3班的低分学生较多,课程学习效果相对差一些.
4 结语
本文利用Python语言的第三方库对学生成绩进行处理和分析,绘制出各班级、各课程成绩的雷达图、散点图和饼状图,从不同角度直观地反映学生的学习情况,帮助教师对比分析各个班级、各门课程的知识掌握情况及学习状态,指导教师有针对性地调整教学内容、教学计划等,以达到较好的教学效果.