趙 圓 圓
(石家莊職業(yè)技術學院 信息工程系,河北 石家莊 050081)
Python語言是一種簡單易學、擁有豐富庫的開源腳本語言,在人工智能、網絡爬蟲、數據分析等方面有著非常廣泛的應用.本文使用Python 語言的第三方庫對學生成績進行處理和分析,繪制出雷達圖、散點圖和餅狀圖,供教師進行可視化分析,為課程教學效果的評估提供參考依據.
程序設計語言包含機器語言、匯編語言和高級語言.機器語言指的是二進制語言,是計算機可以直接執(zhí)行的程序設計語言,直接使用機器語言編寫程序比較繁瑣.匯編語言是一種比較低級的程序設計語言,不同的計算機結構使用的匯編指令不同,所以在使用過程中具有一定的局限性[1].高級語言比較接近自然語言,在不同結構的計算機上描述問題、解決問題的表述方式相同.高級語言分為靜態(tài)語言和腳本語言,靜態(tài)語言采用編譯執(zhí)行的方式,腳本語言采用解釋執(zhí)行的方式.Python語言簡單易學、可移植、可擴展[2].Python語言因其擁有的優(yōu)勢,在2021年8月的TIOBE編程語言排行榜上位居第二[3].
Python語言擁有Numpy(科學計算庫)、Matplotlib(數據可視化庫)、Pandas(數據分析庫)等專業(yè)功能強大的第三方庫,為人工智能領域進行科學的數據分析提供了較好的方法[4].
Numpy是Python語言中最常用的可以實現高性能科學計算和數據分析的庫,使用該庫可以生成一個Ndarray對象,該對象為具有矢量運算和復雜廣播能力的多維數組,無需使用循環(huán)語句就可對整組數據進行快速運算.本文使用Ndarray對象存儲和處理班級、課程名稱數組,班級、課程成績及平均成績數組.
Matplotlib是Python語言中繪制數組的2D 圖形庫,具有強大的數據可視化繪圖功能.它源于數學軟件Matlab,有獨特的優(yōu)勢.Matplotlib開源免費,雖然它屬于Python 語言的擴展模塊,但它繼承了Python語言的面向對象易讀、易維護等特點.Matplotlib提供子模塊pyplot,該模塊中封裝了一套類似Matlab命令式的繪圖函數,為編程開發(fā)人員提供了接口.開發(fā)人員只要調用pyplot模塊中的函數,就可以快速繪圖及設置圖表的各種需求.pyplot模塊包含了一組快速生成基礎圖表的函數,可以生成直方圖、條形圖、箱線圖和雷達圖等[5].本文使用pyplot模塊中的polar()函數對各班級、各門課程學生的平均成績進行雷達圖的繪制,并以Python 程序設計課程成績?yōu)槔?進行散點圖和餅狀圖的繪制.
Pandas是Python 語言中常用的基于Numpy的數據分析模塊,該模塊納入了大量的庫和標準數據模型,提供了快速高效、具有默認和自定義索引的Series對象和DataFrame對象,支持在內存數據結構和不同文件格式中讀取和寫入數據,并進行快速、便捷處理,最終生成可視化圖表.本文使用Pandas從存放成績的Excel表格中導入學生成績,且對異常數據進行清洗.
某學校2019級計算機網絡技術專業(yè)1班、2班和3班的學生第四學期期末考試后,教師需要處理和分析每個班6門專業(yè)課程(網絡設備調試、Linux系統操作與管理、數據恢復技術、網絡安全基礎、融合通信技術、Python程序設計)的成績,利用成績數據繪制評估圖,包含各班級、各門課程成績評估雷達圖.本文以Python 程序設計課程成績?yōu)槔L制的散點圖和餅狀圖.
將學生成績存放到Excel表格中,3個班的Python程序設計課程成績存放的文件名為“scores+班級號”,例如,scores1.xlsx代表1班的Python程序設計課程成績,文件中表頭包含序號、學號、姓名、平時成績、期末考試成績、實驗成績和綜合成績等7列數據.每個班6門專業(yè)課的平均成績存放在averagesscores.xlsx文件中.
數據處理流程包含4個模塊,分別為打開文件模塊、獲取數據模塊、數據處理模塊和數據可視化模塊.數據處理流程圖見圖1.
打開存放課程平均成績的averagesscores.xlsx文件,進行讀寫操作.Pandas提供了一系列讀寫不同格式文件的函數,導入Pandas模塊,使用read_excel()函數以只讀方式打開文件,并將讀取的數據存放到DataFrame對象“df_obj”中.實現代碼如下:
import pandas as pd
df_obj=pd.read_excel(r′E:averagescore.xlsx′)
程序運行后會得到存放每個班級每門專業(yè)課程平均成績的數據,將其存放到“df_obj”對象中.同樣使用read_excel()函數分別打開存放各班級Python程序設計課程成績的文件,1班、2班、3班的實現代碼分別為:
df_obj1=pd.read_excel(r′E:scores1.xlsx′)
df_obj2=pd.read_excel(r′E:scores2.xlsx′)
df_obj3=pd.read_excel(r′E:scores3.xlsx′)
將讀取到的存放各班Python程序設計課程學習成績的文件數據分別存放到“df_obj1”,“df_obj2”和“df_obj3”對象中.
圖1 數據處理流程圖
2.2.2.1 獲取雷達圖數據模塊
從存放平均成績的“df_obj”對象中讀取繪制雷達圖的指標和數據.
(1)讀取課程名稱、班級名稱數組,確定分析指標
從文件中獲取到的數據包含行與列的名稱和成績,輸出從文件中讀取的“df_obj”數據,見圖2.從數據中可以看出,課程名稱是DataFrame對象中的列索引,但不包含班級列索引,故通過DataFrame的屬性columns獲取列標簽,再篩選出除了班級列索引以外的其他課程名稱,將篩選出的課程名稱存放到列表中.
圖2 原始數據輸出截圖
關鍵代碼如下:
columns=df_obj.column
course=[]#定義一個列表來存儲最后的課程名稱
for i in range(0,7):#循環(huán)遍歷
if i! =0:
course.append(columns[i])#篩選出需要的課程名稱,并將課程名稱放到新的numpy數組中
程序運行完后可獲取到課程名稱數組,截圖見圖3.
圖3 課程名稱數組截圖
獲取班級名稱,班級名稱是DataFrame對象的第一列數據.通過ilco屬性獲取到第一列數據,列序列默認從0開始,iloc屬性以二維矩陣的位置指標(即0,1,2,…)作為參數來獲取某行的數據.比如,iloc[0]表示獲取到的第一行數據,通過iloc[:,n]獲取第n+1列的數據.獲得第一列班級名稱后,需要將它轉換為一維數組,關鍵代碼如下:
df_clas=df_obj.iloc[:,0]
clas=df_clas.values #獲取到班級數組
獲取的班級數組截圖見圖4.
圖4 班級數組截圖
(2)讀取平均成績,收集指標數據
指標數據是指原始數據中3個班級6門專業(yè)課程的平均成績數據,即第二列至第六列數據.使用iloc[:,1:7]命令獲取第二列到第六列數據后,將數據存儲到DataFrame對象中,使用屬性value獲得由數據組成的數組,并對數據進行行列互換,得到6行3列的指標數據.關鍵代碼如下:
df_scores=df_obj.iloc[:,1:7]
data_scores=df_scores.values#返回DataFrame對象包含數據的數組,獲取到我們的數據
#行列互換才能得到繪圖的數據
scores=data_scores.T
最終指標數據截圖見圖5.
圖5 指標數據截圖
2.2.2.2 獲取散點圖數據模塊
以Python程序設計課程成績?yōu)槔?繪制各班成績散點圖.在原始數據文件scores1.xlsx,scores2.xlsx和scores3.xlsx中包含序號、學號、姓名、平時成績、期末成績、實驗成績和綜合成績7列數據,繪制散點圖只使用序號和綜合成績兩列數據,顯示學生成績的離散情況.本文以獲取1班學生的Python程序設計課程成績?yōu)槔齺矸治錾Ⅻc圖的數據,具體實現代碼如下:
#獲取某列的數據
num1=df_obj1.iloc[:,0]#序號列
score7=df_obj1.iloc[:,6]#綜合成績列
通過DataFrame類型的“df_obj”對象的iloc屬性來獲取某行或某列的數據,上述代碼中下標0代表第一列,即獲取序號列數據,下標6代表第七列,即獲取綜合成績列數據.同理,使用“df_obj2”對象的屬性、“df_obj3”對象的iloc屬性即可獲取2班和3班Python程序設計課程成績的散點圖數據.
2.2.2.3 獲取餅狀圖數據模塊
以獲取1班學生的Python程序設計課程的綜合成績?yōu)槔?獲取各班級學生的Python 程序設計課程綜合成績的餅狀圖數據,具體實現代碼如下:score7=df_obj1.iloc[:,6]#綜合成績列
通過DataFrame類型的“df_obj”對象的iloc屬性的下標6獲取第七列綜合成績列的數據.最終要根據綜合成績所在分數段范圍([0,60)分、[60,70)分、[70,80)分、[80,90)分、[90,100]分)的人數繪制餅狀圖.在獲取綜合成績列的基礎上,需要統計綜合成績在不同分數段的人數占比,實現代碼如下:
x1=[a/df_obj.size*100,b/df_obj.size*100,c/df_obj.size*100,d/df_obj.size*100,e/df_obj.size*100]
其中,代碼中變量a代表1 班綜合成績在[90,100]分的人數;變量b代表綜合成績在[80,90)分的人數;變量c代表綜合成績在[70,80)分的人數;變量d代表綜合成績在[60,70)分的人數;變量e代表綜合成績在[0,60)分的人數;序列x1存儲的是各分數段范圍的人數占總人數的百分比.
同理,分別使用“df_obj2”對象和“df_obj3”對象的iloc屬性獲取2班和3班學生的Python程序設計課程的綜合成績,進行不同分數段范圍的人數統計并計算占比,存到序列x2和x3中.
讀取的數據中可能會帶有一些無效值,需將無效值替換為有效值.需要檢查是否有空值,若有空值,使用具體值0替換所有的空值.關鍵代碼如下:
df_obj.isnull()
df_obj.fillna(0)
2.2.4.1 繪制雷達圖
(1)將圓周等分
先獲取數據的長度,命令為data_length=len(course),再將圓周等分為data_length份,關鍵代碼如下:
angles=np.linspace(0,2*np.pi,data_length,endpoint=False)
從0到2π,分成data_length等份.
(2)數據角度拼接,首尾相連
將數據和角度進行拼接,首尾閉合.關鍵代碼如下:
scores= np.concatenate((scores,[scores[0]]))
angles= np.concatenate((angles,[angles[0]]))
course=np.concatenate((course,[course[0]]))
(3)繪制雷達圖
所有數據閉合后,使用polar繪制雷達圖.命令為plt.polar(angles,scores,′o-′,linewidth=3),第一個參數是角度,第二個參數是分數,第三和第四個參數是線條樣式.
(4)設置角度和網格標簽
設置極坐標的標簽,并將標簽放在六角形的頂點上.關鍵代碼如下:
plt.thetagrids(angles*180/np.pi,course,fontproperties=′simhei′)
plt.title(′成績評估′)設置圖的題目
plt.legend(clas,loc=(0.94,0.80),labelspacing=0.1)設置圖例
設置中文字符核心實現代碼如下:
plt.rcParams[′font.sans-serif′]=[′Sim Hei′]
plt.rcParams[′axes.unicode_minus′]=False
最后使用show()函數顯示成績評估雷達圖.
2.2.4.2 繪制散點圖
使用Matplotlib的pyplot模塊中scatter()函數繪制各班Python程序設計課程成績分布的散點圖.1班學生Python程序設計課程成績分布散點圖的具體實現代碼如下:
plt.scatter(num1,score7,s=50,c=′black′,marker=′o′,alpha=0.5)#散點圖
plt.title(“成績分布圖”)
其中,scatter函數的第一個參數num1是1班學生的Python 程序設計課程的第一列序號列數據,第二個參數score7是綜合成績列數據,第三個參數s=50設置的是散點圖中點的大小,第四個參數c=′black′設置散點圖中點的顏色為黑色,第五個參數market=′o′用于設置點的形狀,第六個參數alpha=0.5用于設置透明度,title屬性設置散點圖的標題.
同理,可以繪制2班和3班學生的Python程序設計課程成績分布散點圖.
2.2.4.3 繪制餅狀圖
利用Matplotlib的pyplot模塊中pie()函數繪制各班學生Python程序設計課程不同分數段成績的餅狀圖.以1班為例,具體實現代碼如下:
plt.pie(x1,labels=labels,autopct=′%3.2f%%′)
plt.axis(′equal′)
plt.title(“成績分布餅圖”)
plt.legend()
plt.show()
其中,pie()函數常用3個參數,第一個參數x1是1班學生Python程序設計課程成績在不同分數段的占比.“plt.axis(′equal′)”表示 繪圖的x軸和y軸范圍相同.title屬性設置餅狀圖的標題.legend()函數為設置圖像圖例.“plt.show()”命令顯示繪制的圖像.
同理,可以繪制2班和3班學生Python程序設計課程成績在不同分數段的餅狀圖.
在Python3.9 IDLE 下運行程序,繪制出各班級、各課程的平均成績雷達圖,見圖6.繪制各班Python程序設計課程成績分布散點圖,見圖7-9.繪制各班Python 程序設計課程成績分布餅狀圖,見圖10-12.
圖6 各班級、各課程的平均成績雷達圖
圖7 1班Python程序設計課程成績分布散點圖
圖8 2班Python程序設計課程成績分布散點圖
圖9 3班Python程序設計課程成績分布散點圖
圖10 1班Python程序設計課程成績分布餅狀圖
圖11 2班Python程序設計課程成績分布餅狀圖
圖12 3班Python程序設計課程成績分布餅狀圖
雷達圖、散點圖和餅狀圖可以輔助教師從不同角度對學生成績進行分析.
通過雷達圖可以全方位地看到3個班每門課程的平均成績及每個班級的優(yōu)勢科目和劣勢科目.從圖6可以看出,1班與其他兩個班相比,優(yōu)勢課程是融合通信技術,劣勢課程是網絡安全基礎;2班與其他兩個班相比,優(yōu)勢課程是網絡設備調試,劣勢課程相對不明顯;3班的相對優(yōu)勢課程是網絡基礎安全,相對劣勢課程是數據恢復技術.
通過散點圖,可以直觀地看出各班學生成績的離散情況.從圖7-9可以看出,每個班大部分學生的成績都及格,而3班Python程序設計課程成績不及格的偏多,且低分學生相比另外兩個班數量也多,但是最高分也在其中.
通過餅狀圖可以看出,每個班級學生的成績分布情況.從圖10-11可以看出,1班和2班學生成績分布相對合理,大多集中在[60,90)分;在[0,60)分的,1班和2班人數較3班少,說明這兩個班學生對課程內容掌握得比較扎實.從圖12可以看出,3班[0,60)分學生人數和[90~100]分的學生人數占比和其他分數段范圍的人數占比相當,并未呈現出正態(tài)分布,說明該班學生出現輕微的兩極分化現象;[0~60)分學生的人數占比較高,達25.81%,說明3班的低分學生較多,課程學習效果相對差一些.
本文利用Python語言的第三方庫對學生成績進行處理和分析,繪制出各班級、各課程成績的雷達圖、散點圖和餅狀圖,從不同角度直觀地反映學生的學習情況,幫助教師對比分析各個班級、各門課程的知識掌握情況及學習狀態(tài),指導教師有針對性地調整教學內容、教學計劃等,以達到較好的教學效果.