数据介绍: 数据来源于由宁波教育局与阿里云计算有限公司主办,宁波效实中学承办的数智教育数据可视化创新大赛数据集。 https:www。heywhale。commwdataset5eb3f5f9366f4d002d76e70f1teacher。csv:包含了近五年各班各学科的教师信息term:学期claid:班级IDclaName:班级名graName:年级名subid:学科IDsubName:学科名basid:教师idbasName:教师名2studentinfo。csv:包含了当前在校学生详细信息bfStudentID,学生IDbfName,学生姓名bfsex,性别bfnation,民族bfBornDate,出生日期(年)claName,班级名(与teacher。csv的claname对应)bfNativePlace,家庭住址(省市或省)BfResidenceType,家庭类型bfpolicy,政治面貌claid,班级IDclaterm,班级学期bfzhusu,是否住校bfleaveSchool,是否退学bfqinshihao,宿舍号3kaoqin。csvkaoqinid,考勤IDqjterm,学期DataDateTime,时间和日期ControllerID,对应考勤类型表里的ControllerIDcontrolername,考勤名称controltaskorderid,对应考勤类型表里的controltaskorderidbfstudentID,学生ID,对应学生信息表bfName,学生姓名claName,班级名bfclassid班级ID4kaoqintype。csv:考勤类型controlerid,考勤类型idcontrolername,考勤类型名称controltaskorderid,考勤事件idcontroltaskname:考勤事件名5chengji。csv:学生成绩mesTestID,考试idexamnumber,考试编码examnumname,考试编码名称messubid,考试学科idmessubname,考试学科名examterm,考试学期examtype,考试类型(对应考试类型表)examsdate,考试开始时间mesStudentID,学生idmesScore,考试成绩(1为作弊,2为缺考,3为免考)mesZScore,换算成Zscore(Zscore、Tscore、等第是一种学生成绩评价方式,可以参考网络百科)mesTScore,换算成Tscoremesdengdi:换算成等第(参见:https:tianchi。aliyun。comforumpostDetail?spm5176。12281978。0。0。65ca76d8kaGnldpostId47777)6examtype。csv:考试类型EXAMKINDID:考试类型idEXAMKINDNAME:考试类型名称7consumption。csv:本学年学生消费信息DealTime,消费时间MonDeal,消费金额bfstudentID:对应学生信息表studentidAccName,姓名PerSex,性别特别说明:1。由于人为登记等不可避免原因,某些字段可能存在缺失或者异常值2。从班级名可以看出,从2017年开始学校陆续启用了新校区,2018年新校区统一命名为型为白高二(01)和东高二(01)的班级名3。考勤类型中的校服〔移动考勤〕指的是没穿校服3。考勤类型中的校服〔移动考勤〕指的是没穿校服导入用到的库importpandasaspdimportmatplotlib。pyplotasplt 1。各科成绩分布图 结果分析: 1。体育,美术,音乐,通用技术成绩很稳定均匀,与之有关的影响因素较少,在于学生的个人选择及天赋,可不必投入较多资源; 2。该学校的数学,英语,语文平均成绩明显较其他科目成绩好,说明该校的主要的教师资源,人力资源主要集中在三大学科上; 代码:读取成绩文件chengjidatapd。readcsv(5chengji。csv)mesScore,考试成绩(1为作弊,2为缺考,3为免考)删除以上数据chengjidata1chengjidata〔chengjidata〔mesScore〕0〕查看每列空值chengjidata1。isna()。sum()按课程名分组chengjigroupchengjidata1。groupby(messubname)按学年分组chengjigroupyearchengjidata1。groupby(examterm)建立空表datapd。DataFrame({data:〔〕})boxes〔〕boxesname〔〕遍历按课程名分组的所有课程名及成绩fork,ginchengjigroup:ifk!data:boxes。append(g〔mesScore〕)boxesname。append(k)全部学年集合chengjiyear〔〕fork1,g1inchengjigroupyear:chengjiyear。append(k1) 定义图颜色colordict(boxesDarkGreen,whiskersDarkOrange,mediansDarkBlue,capsGray)plt。rcParams〔font。sansserif〕〔SimHei〕中文乱码问题!plt。rcParams〔axes。unicodeminus〕False横坐标负号显示问题!plt。figure(figsize(10,5))图片大小为105plt。boxplot(boxes,whis2,showmeansTrue,showboxTrue,labelsboxesname,showfliersFalse)plt。grid(axisy,alpha0。4)绘制plt。show() 2。历年成绩对比曲线 结果分析: 1。从图上可以看出所有成绩从20132015都比较平稳,许多课程从2015年开始成绩开始呈下降趋势; 2。可能跟近年来一直要求的素质教育有关,出题的方式及难度都有问题,以及老师的过往经验的不适用性; 代码:新建模板以分组日期集合为indexdata1pd。DataFrame({date:chengjiyear})data1。setindex(date,inplaceTrue)设置日期为indexfork,ginchengjigroup:遍历课程分组print(k)chengjigroupyearg。groupby(examterm)按学年分组取年和平均成绩写入新表forky,gyinchengjigroupyear:print(ky,gy)data1。loc〔ky,k〕gy〔mesScore〕。mean() plt。figure(figsize(12,5))图片大小为125plt。plot(data1,ms5,marker。,labeldata1。columns)plt。grid(alpha0。4)绘制plt。legend(loclowerright)显示图例plt。show() 3。考试类型与成绩对比分析 结果分析: 1。考试类型与各科成绩波动较大,可能存在明显的难易程度不同; 2。学校的期中期末考试成绩一般分布可以,其他类型考试波动很大; 代码:读取考试类型表kaoshilxpd。readcsv(6examtype。csv)kaoshilx。setindex(EXAMKINDID,inplaceTrue)设置类型为index 按课程分组遍历fork,ginchengjigroup:print(k)按考试类型分组chengjigroupyearg。groupby(examtype)取考试类型和平均成绩forky,gyinchengjigroupyear:print(ky,gy)kaoshilx。loc〔ky,k〕gy〔mesScore〕。mean()kaoshilx 4。政治面貌民族占比读取学生信息表zhengzhipd。readcsv(2studentinfo。csv)按政治面貌分组zhengzhigroupzhengzhi。groupby(bfpolicy)。count()按民族分组minzugroupzhengzhi。groupby(bfnation)。count()zhengzhigroup〔bfStudentID〕。plot。pie()minzugroup〔bfStudentID〕。plot。pie() 5。学生消费信息分布 结果分析: 1。图中可以看出各学生总消费以及每次消费金额都成明显的正态分布,说明该学校整体消费趋势正常 2。该数据统计了6个月(2018。72019。1)六个月的消费情况,平均来说该学校学生每月平均消费在〔250,500〕; 3。每次消费金额在710之间,但存在可能购买文具等小物件上,这里不做详细的分类讨论; 代码读取消费信息表salepd。readcsv(7consumption。csv)sale〔DealTime〕pd。todatetime(sale〔DealTime〕)转换日期格式ymmeansale。groupby(〔sale。DealTime。dt。year,sale。DealTime。dt。month〕)。sum()按月求和ymmean〔MonDeal〕abs(ymmean〔MonDeal〕)ymmean〔MonDeal〕。plot。bar()学生消费topsaletopsale。groupby(bfStudentID)。sum()按学生求和saletop。sortvalues(by〔MonDeal〕,inplaceTrue)saletop〔MonDeal〕abs(saletop〔MonDeal〕)saletop〔MonDeal〕。head(20)。plot。bar() 6。学生考勤分析 代码读取考勤表kaoqindfpd。readcsv(3kaoqin。csv)使用正则表达式清洗班级名foriinrange(len(kaoqindf)):str1re。sub(u(。?)白〔AZ〕东〔09〕,,kaoqindf。loc〔i,claName〕)str1str1。replace(,)kaoqindf。loc〔i,claName1〕str1取所有考勤汇总kaoqintypekaoqindf。groupby(〔controlername〕)。count()kaoqintype。indexkaoqinmobanpd。DataFrame({type:kaoqintype。index})kaoqinmoban。setindex(type,inplaceTrue)设置类型为indexkaoqinmoban按新的班级名分组kaoqingruopkaoqindf。groupby(〔claName1〕)遍历分组fork,ginkaoqingruop:print(k)按考勤类型汇总tmpg。groupby(〔controlername〕)。count()forj1intmp。index:print(tmp。loc〔j1,kaoqingid〕)根据考勤类型写入新表kaoqinmoban。loc〔j1,k〕tmp。loc〔j1,kaoqingid〕kaoqinmoban labelslist(kaoqinmoban。columns)firstlist(kaoqinmoban〔高一〕)secondlist(kaoqinmoban〔高二〕)thirdlist(kaoqinmoban〔高三〕)data〔first,second,third〕xrange(0,8)width0。35将bottomy元素都初始化为0bottomy〔0〕8计算每组柱子的总和,为计算百分比做准备sums〔sum(i)foriinzip(first,second,third)〕print(first,labels,sums)plt。figure(figsize(12,5))foriindata:计算每个柱子的高度,即百分比y〔abfora,binzip(i,sums)〕print(x,y)plt。bar(x,y,width,bottombottomy)计算bottom参数的位置bottomy〔(ab)fora,binzip(y,bottomy)〕plt。legend(labels,locright)plt。xticks(x,kaoqinmoban。index)plt。title(考勤分析)plt。show() labelslist(kaoqinmoban1。index)da1list(kaoqinmoban1〔操场考勤机〕)da2list(kaoqinmoban1〔早退〔移动考勤机〕〕)da3list(kaoqinmoban1〔校徽早退〕)da4list(kaoqinmoban1〔校服〔移动考勤机〕〕)da5list(kaoqinmoban1〔离校〔移动考勤机〕〕)da6list(kaoqinmoban1〔进校〔移动考勤机〕〕)da7list(kaoqinmoban1〔迟到〔移动考勤机〕〕)da8list(kaoqinmoban1〔迟到晚到〕)data〔da1,da2,da3,da4,da5,da6,da7,da8〕xrange(0,3)width0。35将bottomy元素都初始化为0bottomy〔0〕3计算每组柱子的总和,为计算百分比做准备sums〔sum(i)foriinzip(da1,da2,da3,da4,da5,da6,da7,da8)〕print(first,labels,sums)plt。figure(figsize(8,6))foriindata:计算每个柱子的高度,即百分比y〔abfora,binzip(i,sums)〕print(x,y)plt。bar(x,y,width,bottombottomy)计算bottom参数的位置bottomy〔(ab)fora,binzip(y,bottomy)〕plt。legend(kaoqinmoban1。columns,locuppercenter)plt。xticks(x,kaoqinmoban1。index)plt。title(考勤分析)plt。show()