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

-寫在最後

嗯,退伍大半年,計算機對於我終於不再是一塊板磚了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章