python学生成绩分析与预测

前言:数据科学大作业,学生成绩评价与预测。
数据采集-预处理-探索性分析—数据分析与洞见—结果展现—决策支持

-导入相应库并读取文件

import pandas as pd
import numpy as np
all_score = pd.read_csv(r"C:\Users\shezhiyuan\Desktop\18大数据成绩.csv")  # 读入csv文件 编译器不一样把utf-8 改为gbk
pd.options.display.max_rows = None   # 显示所有行

-数据预处理
只读入和我们数据处理相关的列

all_score2= pd.read_csv(r"C:\Users\shezhiyuan\Desktop\18大数据成绩.csv", usecols=['Task_No', 'CurName','StuName',
    'StuClass','Grade','CurCreditHour'])
# 观察数据得上学期得课程都是以任务号'20191'开头,将其取出
all_score2['Task_No'] = all_score2['Task_No'].apply(str)     #任务号转为字符串形式
all_score3=all_score2.loc[all_score2['Task_No'].str.contains('20191')]
#删除这门成绩都为0的体育课
all_score4 =all_score3.loc[all_score3['Task_No'] != '201911107']
#print(all_score3.info())
#print(all_score3.head())

处理前和处理后:
在这里插入图片描述
在这里插入图片描述
观察数据并没有缺失值,即已得到我们想要的数据,下面开始对数据进行分析

-计算单科成绩绩点并插入最后一列

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)  #插入最后一列

接下来算个人学期绩点,首先要得到个人的学期成绩单

personal = all_score4.groupby('StuName')
pers = personal.get_group('佘大炮').reset_index()
print((pers['GPA']*pers['CurCreditHour']/(pers['CurCreditHour'].sum())).sum()) #计算个人绩点

以列表加for循环得出本专业所有人的学期绩点

#先取出所有同学的姓名
stuname =[]
for indexs in all_score4['StuName']:
    if not indexs in stuname:   #去重
        stuname.append(indexs)
#print(stuname)

#计算所有人的学期绩点
i=0
sturesult=[]    #以姓名加绩点的方式保存在列表中
personal = all_score4.groupby('StuName')
for name in stuname:
    pers = personal.get_group(name).reset_index()
    result=(pers['GPA']*pers['CurCreditHour']/(pers['CurCreditHour'].sum())).sum() #计算个人绩点
    #计算后面预测所需的相关分数
    fenshu=(pers[pers['CurName']=='数据结构']['Grade'].values[0]*4/10+  ##
            pers[pers['CurName']=='离散数学']['Grade'].values[0]*4/10+
            pers[pers['CurName']=='2019夏季短学期答辩考核']['Grade'].values[0]*2/10)

    sturesult.append([name,str(result),str(fenshu)])  #统一列表格式
    #print(name,':',result)
    i+=1
print('学生总人数:',i)~

及想要的各种信息。如绩点前五名:
在这里插入图片描述
-建模预测
可以取前几个学期的绩点作为特征值来预测本学期成绩,我始终感觉这种并不太具有代表性。我是用上学的几门专业课成绩和一门能够代表学习态度的课目按一定比值得出相关分数作为特征值建立线性回归模型。

直接导入线性回归模型

from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
valu = pd.DataFrame(sturesult,columns=['姓名','绩点','相关分数']) ##
valu=valu.sort_values(by='绩点' , ascending=False).reset_index(drop=True)  # 按绩点排序
valu.index=valu.index+1    # 索引从零开始
valu['绩点'] = valu['绩点'].apply(float)
valu['相关分数'] = valu['相关分数'].apply(float)~
data=valu.values  #dataframe转化成array
#拆分训练集
x_train= data[:,2,np.newaxis]
y_train= data[:,1,np.newaxis]
x_test= data[::2,2,np.newaxis]
y_test= data[::2,1,np.newaxis]

查看数据散点图

plt.scatter(x_train,y_train)
plt.show()

建模

#创建并拟合模型
model = LinearRegression()
model.fit(x_train,y_train)

#模型评分(即准确率)
print('准确率:',model.score(x_test,y_test))

看下我们的回归线

plt.plot(x_train,y_train,'b.')
plt.plot(x_train,model.predict(x_train),'r')
plt.xlabel('相关分数',fontproperties='SimHei',fontsize=15)
plt.ylabel('绩点',fontproperties='SimHei',fontsize=15)
#plt.grid(True) 
plt.axis([70,95,2,5])
plt.show()
#pre_y = model.predict(new_x) 可用如下方法预测个人成绩

1

-写在最后

嗯,退伍大半年,计算机对于我终于不再是一块板砖了

  • 20
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值