文章目錄
- 各科目掛科人數分析
- 各科掛科人數占比及各班掛科人數
- 各班績點分布
- 班級平均績點
- 單人掛科數量分析
- 最終成績分析報告
期末考試結束,輔導員讓我做個成績分析,于是就簡單的寫個python做做,寫的很亂,將就看吧,
用到了pandas,pyecharts,csv,matplotlib這些包
我的資料樣本為這樣(一個班的資料為一個表):
各科目掛科人數分析
# @Time:2022/1/2123:35
# @Author:中意灬
# @File:各班掛科人數分析.py
# @ps:tutu qqnum:2117472285
import copy
import csv
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def Num_eaxm(class_name,columns,Data,file):
df=pd.read_csv(file,encoding='GBK',index_col=0)#讀取檔案,不將第一列作為索引
item=list(df.columns)[3:]
class_name=class_name
columns=columns
df.rename(columns=columns, inplace = True)
data=copy.deepcopy(Data)
lis=list(data.keys())
data[lis[0]]+=df[df.a<60].count()[0]
data[lis[1]]+=df[df.b<60].count()[0]
data[lis[2]]+=df[df.c<60].count()[0]
data[lis[3]]+=df[df.d<60].count()[0]
data[lis[4]]+=df[df.e<60].count()[0]
data[lis[5]]+=df[df.f<60].count()[0]
data[lis[6]]+=df[df.g<60].count()[0]
data[lis[7]]+=df[df.h<60].count()[0]
data[lis[8]]+=df[df.j<60].count()[0]
data[lis[9]]+=df[df.m<60].count()[0]
return data
if __name__ == '__main__':
Data = {'概率論': 0, '資料庫原理與應用': 0, '離散數學': 0, 'Python程式開發語言課程設計': 0, '毛澤東思想和中國特色社會主義理論體系概論Ⅰ': 0, 'Python程式開發語言': 0, '形勢與政策Ⅲ': 0,
'大學物理BⅠ': 0,'高級辦公自動化':0,'大學英語Ⅲ':0}
class_name = ['概率論', '資料庫原理與應用', '離散數學', 'Python程式開發語言課程設計', '毛澤東思想和中國特色社會主義理論體系概論Ⅰ', 'Python程式開發語言', '形勢與政策Ⅲ', '大學物理BⅠ', '高級辦公自動化', '大學英語Ⅲ']
columns = {'概率論': 'a', '資料庫原理與應用': 'b', '離散數學': 'c', 'Python程式開發語言課程設計': 'd', '毛澤東思想和中國特色社會主義理論體系概論Ⅰ': 'e', 'Python程式開發語言': 'f', '形勢與政策Ⅲ': 'g',
'大學物理BⅠ': 'h','高級辦公自動化':'j','大學英語Ⅲ':'m'}
# 各科目參加考試人數計算
data1= Num_eaxm(class_name, columns, Data, '大資料2020-1級.csv')
data2= Num_eaxm(class_name, columns, Data, '大資料2020-2級.csv')
data3= Num_eaxm(class_name, columns, Data, '大資料2020-3級.csv')
d1=[int(i) for i in list(data1.values())]
d2=[int(i) for i in list(data2.values())]
d3=[int(i) for i in list(data3.values())]
with open('各科掛科人數.csv', mode='w', encoding='utf-8',newline='') as f:
writer = csv.writer(f)
writer.writerow(['班級']+class_name)
writer.writerow(['一班']+d1)
writer.writerow(['二班']+d2)
writer.writerow(['三班']+d3)
bar = (
Bar(init_opts=opts.InitOpts(width="1350px"))
.add_xaxis(class_name) # x軸資料
.add_yaxis('一班', d1) # y軸資料
.add_yaxis('二班', d2)
.add_yaxis('三班', d3)
.set_global_opts(title_opts=opts.TitleOpts(title="2020級各班掛科人數統計"),
xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 350}))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)
bar.render('2020級各班各科目掛科人數.html')
結果:

各科掛科人數占比及各班掛科人數
# @Time:2022/1/2213:26
# @Author:中意灬
# @File:各個科目掛科人數比.py
# @ps:tutu qqnum:2117472285
import copy
from matplotlib import pyplot as plt
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def Num_eaxm(class_name,columns,data,file):
df=pd.read_csv(file,encoding='GBK',index_col=0)#讀取檔案,不將第一列作為索引
item=list(df.columns)[3:]
class_name=class_name
a=df[class_name].count()
columns=columns
df.rename(columns=columns, inplace = True)
num = df[(df.a < 60) | (df.b < 60) | (df.c < 60) | (df.e < 60) | (df.f < 60) | (df.g < 60) | (df.h < 60)].count()[0] # 掛科人數
lis=list(data.keys())
data[lis[0]]+=df[df.a<60].count()[0]
data[lis[1]]+=df[df.b<60].count()[0]
data[lis[2]]+=df[df.c<60].count()[0]
data[lis[3]]+=df[df.d<60].count()[0]
data[lis[4]]+=df[df.e<60].count()[0]
data[lis[5]]+=df[df.f<60].count()[0]
data[lis[6]]+=df[df.g<60].count()[0]
data[lis[7]]+=df[df.h<60].count()[0]
data[lis[8]]+=df[df.j<60].count()[0]
data[lis[9]]+=df[df.m<60].count()[0]
return a,num
if __name__ == '__main__':
data = {'概率論': 0, '資料庫原理與應用': 0, '離散數學': 0, 'Python程式開發語言課程設計': 0, '毛澤東思想和中國特色社會主義理論體系概論Ⅰ': 0, 'Python程式開發語言': 0, '形勢與政策Ⅲ': 0,
'大學物理BⅠ': 0,'高級辦公自動化':0,'大學英語Ⅲ':0}#初始掛科人數
class_name = ['概率論', '資料庫原理與應用', '離散數學', 'Python程式開發語言課程設計', '毛澤東思想和中國特色社會主義理論體系概論Ⅰ', 'Python程式開發語言', '形勢與政策Ⅲ', '大學物理BⅠ', '高級辦公自動化', '大學英語Ⅲ']#課程名稱
columns = {'概率論': 'a', '資料庫原理與應用': 'b', '離散數學': 'c', 'Python程式開發語言課程設計': 'd', '毛澤東思想和中國特色社會主義理論體系概論Ⅰ': 'e', 'Python程式開發語言': 'f', '形勢與政策Ⅲ': 'g',
'大學物理BⅠ': 'h','高級辦公自動化':'j','大學英語Ⅲ':'m'}#重命名
#各科目參加考試人數計算
a1,num1=Num_eaxm(class_name,columns,data,'大資料2020-1級.csv')
a2,num2=Num_eaxm(class_name,columns,data,'大資料2020-2級.csv')
a3,num3=Num_eaxm(class_name,columns,data,'大資料2020-3級.csv')
a5 = [int(i + j) for i, j in zip(a1, a2)]
a = [int(i + j) for i, j in zip(a3, a5)]#各科目參考人數
d=list(data.values())#各科目掛科人數
ratio=[round(j/i*100) for i ,j in zip(a,d)]
#繪圖
title=['概率論', '資料庫原理與應用', '離散數學', 'Python課程設計', '毛概Ⅰ', 'Python程式開發語言', '形勢與政策Ⅲ', '大學物理BⅠ', '高級辦公自動化', '大學英語Ⅲ']
plt.rcParams['font.sans-serif'] = ['SimHei'] # 處理中文顯現問題
plt.figure()
base_num = plt.bar(title,width=0.5, height=a) # 繪制條形圖,height表示高度
edu_num = plt.bar(title,width=0.5, height=d,color='r') # 繪制條形圖,height表示高度
for x, y in zip(title, ratio):
plt.text(x, y, '%.0f%%' % y, ha='center', va='center', fontsize=10,
c='black') # ha表示水平對齊方式,va表示錘子對其方式,fontsize表示字體大小
for x, y in zip(title, a):
plt.text(x, y, y, ha='center', va='bottom', fontsize=10)
plt.xticks(rotation=350)
plt.xlabel('科目',fontsize=10) # 設定x軸標簽
plt.ylabel('人數',fontsize=10) # 設定y軸標簽
plt.title('2020級各科目掛科人數占比') # 設定題目
plt.legend([base_num, edu_num], labels=['參考人數', '掛科人數'], bbox_to_anchor=(0.8, 0.99)) # 設定標簽,bbox_to_anchor設定絕對位置
plt.tight_layout # 調整多圖被截斷或遮擋等情況
plt.show()
#各班掛科人數柱狀圖
calssNum=['一班','二班','三班']
faiel_num=[int(num1),int(num2),int(num3)]
bar = (
Bar(init_opts=opts.InitOpts(width="1000px"))
.add_xaxis(calssNum) # x軸資料
.add_yaxis('掛科人數', faiel_num,bar_width='20%') # y軸資料
.set_global_opts(title_opts=opts.TitleOpts(title="2020級各班掛科人數"),
xaxis_opts=opts.AxisOpts(name_rotate=30, axislabel_opts={"rotate": 0})) # 設定一些標題,坐標軸引數
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 是否顯示資料值
)
bar.render('2020級各班掛科人數.html')
plt.rcParams['font.sans-serif'] = 'SimHei' # 中文問題
plt.figure()
shuju=[19,20 ,11 ,15,16,12,3 ]
lable=['概率論', '資料庫原理與應用', '離散數學', 'Python程式開發語言', '大學物理B','高級辦公自動化', '大學英語Ⅲ']
explode = [0.01, 0.01, 0.01, 0.01,0.01,0.01,0.01]
color = ['red', 'orange', 'green', 'blue','m','c','pink']
plt.pie(shuju, labels=lable, explode=explode, autopct='%1.1f%%', colors=color,
shadow=True) # labels表示標簽,explode表示各板塊離開中心的距離,autopct標簽餅圖百分比設定,colors表示顏色,shadow表示陰影(增加立體感)
plt.legend(loc='upper left', bbox_to_anchor=(1, 1.01)) # 設定標簽,bbox_to_anchor表示設定的絕對位置
plt.title('2020級各科掛科人數情況') # 設定標題
plt.tight_layout # 調整多圖被截斷或遮擋等情況
plt.show()
結果:




各班績點分布
# @Time:2022/1/2216:10
# @Author:中意灬
# @File:各班績點分布.py
# @ps:tutu qqnum:2117472285
import copy
import csv
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def sorce(file):
df = pd.read_csv(file, encoding='GBK', index_col=0) # 讀取檔案,不將第一列作為索引
a1=df[(df.平均績點<1)&(df.平均績點>=0)].count()[0]
a2=df[(df.平均績點<1.5)&(df.平均績點>=1)].count()[0]
a3=df[(df.平均績點<2)&(df.平均績點>=1.5)].count()[0]
a4=df[(df.平均績點<2.5)&(df.平均績點>=2)].count()[0]
a5=df[(df.平均績點<3)&(df.平均績點>=2.5)].count()[0]
a6=df[(df.平均績點<3.5)&(df.平均績點>=3)].count()[0]
a7=df[(df.平均績點<4)&(df.平均績點>=3.5)].count()[0]
a8=df[(df.平均績點<4.5)&(df.平均績點>=4)].count()[0]
a9=df[(df.平均績點<=5)&(df.平均績點>4.5)].count()[0]
a=[int(a1),int(a2),int(a3),int(a4),int(a5),int(a6),int(a7),int(a8),int(a9)]
return a
if __name__ == '__main__':
title=['[0,1)','[1,1.5)','[1.5,2)','[2,2.5)','[2.5,3)','[3,3.5)','[3.5,4)','(4,4.5)','[4.5,5]']
a1=sorce('大資料2020-1級.csv')
a2=sorce('大資料2020-2級.csv')
a3=sorce('大資料2020-3級.csv')
with open('各班績點分布.csv',mode='w',encoding='utf-8',newline='')as f:
writer=csv.writer(f)
writer.writerow(['班級']+title)
writer.writerow(['一班']+a1)
writer.writerow(['二班']+a2)
writer.writerow(['三班']+a3)
bar = (
Bar(init_opts=opts.InitOpts(width="1350px"))
.add_xaxis(title) # x軸資料
.add_yaxis('一班', a1) # y軸資料
.add_yaxis('二班', a2)
.add_yaxis('三班', a3)
.set_global_opts(title_opts=opts.TitleOpts(title="2020級分班級績點分布情況"),
xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0}))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)
bar.render('2020級分班級績點分布情況.html')
line = (
Line(init_opts=opts.InitOpts(width="1300px"))
.add_xaxis(title)
.add_yaxis('一班', a1,is_smooth=True) # y軸資料
.add_yaxis('二班', a2,is_smooth=True)
.add_yaxis('三班', a3,is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="2020級分班級績點分布情況"),
xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0}))
.set_series_opts(abel_opts=opts.LabelOpts(is_show=True))
)
line.render('2020級分班級績點分布折線圖.html')
結果:



班級平均績點
# @Time:2022/1/2216:32
# @Author:中意灬
# @File:班級平均績點.py
# @ps:tutu qqnum:2117472285
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def avg_sorce(file):
df = pd.read_csv(file, encoding='GBK', index_col=0) # 讀取檔案,不將第一列作為索引
avg=df['平均績點'].mean()
s=df['平均績點'].sum()
cout=df['平均績點'].count()
return avg,s,cout
def count_sorece_num(file,avg):
df=pd.read_csv(file,encoding='GBK',index_col=0)
high=int(df[df.平均績點>=avg].count()[0])
low=int(df[df.平均績點<avg].count()[0])
return high,low
if __name__ == '__main__':
a1,s1,c1=avg_sorce('大資料2020-1級.csv')
a2,s2,c2=avg_sorce('大資料2020-2級.csv')
a3,s3,c3=avg_sorce('大資料2020-3級.csv')
a5=(s1+s2+s3)/(c2+c3+c1)#本專業得平均績點
a=[float(round(a1,2)),float(round(a2,2)),float(round(a3,2)),float(round(a5,2))]
title=['一班','二班','三班','本專業']
bar = (
Bar(init_opts=opts.InitOpts(width="1000px"))
.add_xaxis(title) # x軸資料
.add_yaxis('績點', a,bar_width='30%',color='#4169E1') # y軸資料
.set_global_opts(title_opts=opts.TitleOpts(title="2020級各班級平均績點情況"),
xaxis_opts=opts.AxisOpts(name_rotate=30, axislabel_opts={"rotate": 0})) # 設定一些標題,坐標軸引數
.set_series_opts(label_opts=opts.LabelOpts(is_show=True),
markline_opts=opts.MarkLineOpts(
# 標記線資料
data=[
# MarkLineItem:標記線資料項
opts.MarkLineItem(
name="本專業平均績點",
y = a5,
)]))
)
bar.render('2020級各班級平均績點.html')
z1=[]
z2=[]
z3=[]
z1.extend(count_sorece_num('大資料2020-1級.csv',a5))
z2.extend(count_sorece_num('大資料2020-2級.csv',a5))
z3.extend(count_sorece_num('大資料2020-3級.csv',a5))
title=['高于本專業','低于本專業']
bar = (
Bar(init_opts=opts.InitOpts(width="1000px"))
.add_xaxis(title) # x軸資料
.add_yaxis('一班', z1) # y軸資料
.add_yaxis('二班', z2) # y軸資料
.add_yaxis('三班', z3) # y軸資料
.reversal_axis()
.set_global_opts(title_opts=opts.TitleOpts(title="2020級各班級績點情況"),
xaxis_opts=opts.AxisOpts(name_rotate=30, axislabel_opts={"rotate": 0})) # 設定一些標題,坐標軸引數
.set_series_opts(label_opts=opts.LabelOpts(position="right")
))
bar.render('2020級與本專業績點比較情況.html')
結果:


單人掛科數量分析
# @Time:2022/1/2219:20
# @Author:中意灬
# @File:單人掛科數量統計.py
# @ps:tutu qqnum:2117472285
import csv
from matplotlib import pyplot as plt
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Pie
import pandas as pd
def single_faile_num(file):
df=pd.read_csv(file,encoding="GBK",index_col=0)
d=df.fillna(value=60)
lis=[]
for i in range(len(df)):
a=0
for j in list(d.iloc[i][3:]):
if j <60:
a=a+1
lis.append(a)
return lis
def fun(lis,n):
a=0
b=0
c=0
d=0
e=0
for i in lis:
if i==0:
a=a+1
if i==1:
b=b+1
if i==2:
c=c+1
if i>2:
d=d+1
List=[a-n,b,c,d]
return List
if __name__ == '__main__':
lis1=single_faile_num('大資料2020-1級.csv')
lis2=single_faile_num('大資料2020-2級.csv')
lis3=single_faile_num('大資料2020-3級.csv')
#每班單人掛科數量情況
title=["0科","1科","2科","3科及其以上"]
a1=fun(lis1,2)
a2=fun(lis2,1)
a3=fun(lis3,1)
with open('個人掛科數量情況.csv',mode='w',encoding='utf-8',newline='')as f:
writer=csv.writer(f)
writer.writerow(['班級']+title)
writer.writerow(['一班']+a1)
writer.writerow(['二班']+a2)
writer.writerow(['三班']+a3)
#畫圖
bar = (
Bar(init_opts=opts.InitOpts(width="1350px"))
.add_xaxis(title) # x軸資料
.add_yaxis('一班', a1) # y軸資料
.add_yaxis('二班', a2)
.add_yaxis('三班', a3)
.set_global_opts(title_opts=opts.TitleOpts(title="2020級各班單人掛科數量情況"),
xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0}))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)
bar.render("2020級各班單人掛科情況柱狀圖.html")
line = (
Line(init_opts=opts.InitOpts(width="1350px"))
.add_xaxis(title) # x軸資料
.add_yaxis('一班', a1) # y軸資料
.add_yaxis('二班', a2)
.add_yaxis('三班', a3)
.set_global_opts(title_opts=opts.TitleOpts(title="2020級各班單人掛科數量情況"),
xaxis_opts=opts.AxisOpts(name_rotate=60, axislabel_opts={"rotate": 0}))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)
line.render("2020級各班單人掛科情況折線圖.html")
plt.rcParams['font.sans-serif'] = 'SimHei' # 中文問題
plt.figure()
a=[a1[0]+a2[0]+a3[0],a1[1]+a2[1]+a3[1],a1[2]+a2[2]+a3[2],a1[3]+a2[3]+a3[3]]
explode = [0.2, 0.0, 0.0, 0.0]
color = ['c', 'orange', 'green', 'red']
plt.pie(a, labels=title, explode=explode,autopct='%1.0f%%', colors=color,
shadow=True) # labels表示標簽,explode表示各板塊離開中心的距離,autopct標簽餅圖百分比設定,colors表示顏色,shadow表示陰影(增加立體感)
plt.legend(loc='upper left', bbox_to_anchor=(1, 1.01)) # 設定標簽,bbox_to_anchor表示設定的絕對位置
plt.title('2020級各班單人掛科數數量') # 設定標題
plt.tight_layout # 調整多圖被截斷或遮擋等情況
plt.show()




最終成績分析報告
成績分析報告
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421403.html
標籤:AI
上一篇:2021年CCF 惡意軟體家族分類 模型集成優秀方案分享
下一篇:聲紋識別demo環境的搭建
