python实战——学生GPA分析
python实战——学生GPA分析
利用本专业每个人各科成绩,学分绩点、成绩排名(大数据专业)根据成绩数据,对本专业同学的学习整体情况进行分析说明。并根据成绩数据,对本专业同学的学习整体情况进行分析说明。通过导入pandas库,实现对表格数据的处理,得到的结果具有一定程度的参考性。
问题的提出
大学中,绩点(GPA)是大学生最为关注的数据之一,它不但直观反映了大学学习生活的情况,还是学生证明自我水平的重要凭证之一。而每个学期末,GFPA的计算也是一件繁琐的事情。
- 兵之情主速,乘人之不及,由不虞之道,攻其所不戒也。 ,无备为战之大患,有备无患,其乃至德也。这与数据科学有什么关系呢?这是你赢得编程马拉松的关键。如果你比竞争对手准备得更充分,你学习、迭代执行的速度越快,那么你就取得更好的名次,带来更好的结果。
- 由于近几年来,Python用户数量上涨及其本身的简洁性,使得这个工具包对数据科学世界的Python专家们变得有意义。 绝大多数优秀的数据科学家和kagglers建立自己的第一个有效模型并快速提交。 这不仅仅有助于他们领先于排行榜,而且提供了问题的基准解决方案。
- 由于水平有限,我以 简化的GA计算方法 为基础,希望能够编写岀计算GA程序的雏形,计算出GA。若有不当之处还望大佬指正
模型与算法
为了简化GPA的计算,我为其设立了一个大前提,在此前提下进行GPA的计算。我们将三个班的同学每门课成绩的excel表另存为csv文件,其中数据项目为Task_No、CurId、CurName、CurType,CurDep,CurEvaluate,CurGroup,CurCreditHour,StuId,StuName,StuSex,StuClass,StuDep,PayNo,TaskNo,ExamNo,ExamCurNo,ExamTimeOrder,Grade,GradeC,等,存储在表格的共28列。
成绩绩点计算依据:
(一)课程绩点
1、当成绩分数小于60分时,课程绩点=0;
2、当成绩分数大于等于60分时,课程绩点=分数÷10-5。
3、补考成绩参照期末考试方式处理。
(二)平均学分绩点=∑(课程学分×课程绩点)/∑(课程学分)
注:主要考虑是平均成绩无论学分多少都一样,而学分绩点考虑的是学分多的课程应占多的比例。
例:① 物理:成绩86,学分5;英语:成绩68,学分3
平均学分绩点=[(86/10-5)*5+(68/10-5)*3]/(5+3)=[18+5.4]/8=2.93
② 物理:成绩60,学分5;英语:成绩90,学分2
平均学分绩点=[(60/10-5)*5+(90/10-5)*2]/(5+2)=[5+8]/7=1.857
有许多方法可以解决计算GPA问题。对于我们的第一个模型,我们将专注于智能和快速技术来建立第一个有效模型。为缺失值创建假标志是非常有用的,有时缺失值本身就携带了大量的信息。
根据不同的业务问题,数据科学家推荐使用GBM或RandomForest技术的任意一种。这两个技术可以极其有效地创建基准解决方案。我已经看到数据科学家通常把这两个方法作为他们的第一个模型同时也作为最后一个模型。这最多用去4到5分钟。
使用KNN临近算法,对各科成绩进行预判。参数除weight=distance,其余为默认值。采用多次选取,取最小误差为最佳模型。使用神经网络模型,对各科成绩进行预判。参数slover为lbfgs,隐层hidden_layer_sizes为(10,10),其余参数为默认.去除3班数据,使得获得更好的模拟能力。
我的过程
首先导入panda库,读取csv文件。
import pandas as pd
#pd.set_option('display.max_columns', 1000)
#pd.set_option('display.width', 1000)
#pd.set_option('display.max_colwidth', 1000)
只读取相关的列,很多列无关可以省掉
all_score = pd.read_csv(r"C:\Users\Administrator\Desktop\各门作业\数据科学\18dashuju.csv",encoding="gbk") # 读入csv文件
#print(all_score.head())
#print(all_score.describe())
#print(all_score.info())
pd.options.display.max_rows = None
all_score2= pd.read_csv(r"C:\Users\Administrator\Desktop\各门作业\数据科学\18dashuju.csv", encoding="gbk")
#print(all_score2.head())
#print(all_score2.info())
#print(all_score2.groupyby('StuClass').mean())
#print(all_score2['StuName'])
#result = all_score2.loc[all_score2['StuName'] == '']
#print(result.head(100))
#result = all_score2.loc[all_score2['Task_No']=='201614869']
#df['数量'] = df_data['数量'].apply(str)
观察数据得上学期的课程都是以任务号’20191’开头,我们将其取出
all_score2['Task_No'] = all_score2['Task_No'].apply(str) #任务号转为字符串形式
#print(all_score2.loc[all_score2['Task_No'].str.contains('2019')])
all_score3=all_score2.loc[all_score2['Task_No'].str.contains('20191')]
all_score4 =all_score3.loc[all_score3['Task_No'] != '201911107'] #这门体育课都是0分我们将其删掉
#print(all_score4.info())
#df1=df1[~df1['A'].isin([1])]
#print(all_score3.info())
#print(all_score3.head())
#print(all_score3.loc[all_score2['StuName'] == '某某某'])
计算每门课的绩点
def Gpa(x):
if x<60:
return 0
else:
return x/10-5
jidian=all_score4['Grade'].apply(Gpa)
all_score4.insert(all_score4.shape[1],'GPA',jidian) #插入最后一列
grouped=all_score4.groupby('StuClass') #按班级分组
class1 = grouped.get_group('某班').reset_index()
personal = all_score4.groupby('StuName')
#she = geren.get_group('某某某').reset_index()
#print((she['GPA']*she['CurCreditHour']/(she['CurCreditHour'].sum())).sum()) #计算个人绩点
计算每个人的平均绩点
stuname =[]
for indexs in all_score4['StuName']:
if not indexs in stuname:
stuname.append(indexs)
#print(stuname)
#计算所有人的绩点
i=0
strresult=[] #以姓名加绩点的方式保存在列表中
for name in stuname:
pers = personal.get_group(name).reset_index()
result=(pers['GPA']*pers['CurCreditHour']/(pers['CurCreditHour'].sum())).sum() #计算个人绩点
strresult.append([name,str(result)])
#print(name,':',result)
i+=1
print('总人数:',i)
#print(strresult)
最后得出计算结果
#得到的结果转为dataframe
df = pd.DataFrame(strresult,columns=['姓名','绩点'])
#df.reset_index(drop = True)
df=df.sort_values(by='绩点' , ascending=False).reset_index(drop=True) # 按绩点排序
df.index=df.index+1 # 索引从零开始
df['绩点'] = df['绩点'].apply(float)
#df.set_index('姓名')
#print(df)
print(df.head()) #输出绩点前五名
print(df.tail()) #输出绩点后五名
print('平均绩点',df['绩点'].mean())
#print(df[df['绩点']>df['绩点'].mean()].count())
print(df[df['绩点']>=float(2.2)].count()) #绩点高于2.2的学生人数
print(df[(df.姓名=='某某某')]) #查看个人绩点及排名
#print(df.columns)
#print(type(name))
#print(type(result))
部分结果分析
平时成绩和期末成绩之比
可见,《大学物理(一)-1》、《大学物理(一)-2》、《大学英语-1》、《大学英语-2》和《高等数学(一)-2》平时成绩和期末成绩相差较大,其期末考核较为严格,因为这几门期末考绝大多数是和别的学校联考,卷子更难。
热力图分析
使用热力图,分析1班课程成绩高于72分的分布。可以发现期末考为联考的课程,绝大多数低于72分,可见联考卷子的难度非同小可,是否能真正检验出学生的学习情况,有待商榷。如郑强教授所言:“我期末监考看到有一道题很多学生都不会,我就直接上黑板讲了起来。因为如果不管,他们考完了也不会讲卷子,还不如现在就教会他们。”所言极是,期末考不能为了标新立异而一味地将卷子增加难度,考试是为了检验学生的学习和老师的教学,考试成绩普遍偏低,老师和学生都值得反思自己。
总述
分析整个专业,可以发现三个班绩点前五相差水平不大,1班和3班包揽前四。排名中间段出现明显差距,1班位于中间水平,具有很大的上升空间。绩点排名最后阶段,1班完胜其余两个班,这足以证明18大数据1班整体水平稳定且占据优势。1班绩点最低的同学比其余之后两个班的高了不少,该班整体向好,部分同学需要努把力。女生绩点明显优于男生,值得男生思考。
大数据应用导论. 学生成绩预测[Z]. 数据酷客