2017年1月24日

段考進步怎麼看(2)-利用python製作學期成績PR變化折線圖

上次段考結束寫這篇《段考進步怎麼看》,這次段考結束,有了三次段考的成績,可以針對個人做出一些三次段考的PR變化,用這樣來了解每個學生這個學期的學習狀況。(再次強調,不可以光用原始成績來判斷成績進步與否,因為每次都是不同的測驗)


原始成績會受到每次測驗難易度而影響,而PR值是看自己在全校成績中的位置。

在考完國中第一次段考後,很多小孩剛上國中的家長心裡都會受打擊:「我小孩國小都考九十分,怎麼上國中只有考八十分或是更低」於是開始去尋覓補習班,幫小孩補習,然後到第二次段考發現成績有一些起色,就覺得補習真是有效。

可是啊,事情真的是這樣嗎?

這是最近三次段考的全校成績分佈圖,第二次段考成績比第一次高,不代表全校都用功了,可能是學生適應國中生活了,同時第二次也比較簡單。而第三次的低分成績多,是因為考的範圍變多了。
all 

學生的成績變化除了跟自身的努力有關,同時也跟該次評量的難易度有關。小學的原始成績是90分,但是如果拿全校成績分佈來看,那90分的PR值可能會只有80-90,因為更多人考100。所以光看原始成績來比較,就容易產生這種謬誤。


這次的圖表製作,是直接用python3寫幾十行程式去從資料裡撈出數據做折線圖,並且將個人圖表組成全班圖表,也方便我在段考結束後跟導師討論學生的學習狀況。畢竟導師還是要透過和任課老師討論才比較能知道學生在個別課的上課狀況。



馬賽克


code


=====以下是python3的code=====
# -*- coding: utf-8 -*-
#coding:utf-8

"""
Created on Wed Jan 18 21:41:17 2017

@author: pancala
"""
#讀取csv檔
import os
import pandas as pd
os.chdir("/media/pancala/3T/試題分析/105")
file='105A.csv'
data = pd.read_csv(file)



#定義中文,字型檔用  fc-list :lang=zh 查詢
from matplotlib.font_manager import *
myfont = FontProperties(fname='/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc')
#解決負號'-'顯示為方塊的問題
matplotlib.rcParams['axes.unicode_minus']=False



import numpy as np
import matplotlib.pyplot as plt


#把任教班級取出
for stuclass in [7,8,16,18]:
#for stuclass in [7]:
    #篩選出特定班級
    filter = data["班級"] == stuclass
    new_data = data[filter]
 
    #計算班級人數
    studentNum = new_data.shape[0]
 
    #subplot的列數由總班級人數決定
    subplotRowNum = int(np.ceil(studentNum/5))
 
    #設定subplots的列數、欄數和大小
    fig, axarr = plt.subplots(nrows=subplotRowNum,
                            ncols=5,
                            sharex=False,
                            sharey=False,
                            figsize=(10,subplotRowNum*2+2))
 
    #設定主標題
    fig.suptitle(str(stuclass)+ "班" +"上學期生物段考PR變化",fontproperties=myfont, size=20)  
    #plt.title(str(stuclass)+ "班" +"上學期生物段考PR變化",fontproperties=myfont, fontsize=10)
 
    #各小圖之間的間隔設定
    fig.tight_layout(pad=6, w_pad=1, h_pad=3.0)
 
    #把每一個學生的資料取出
    for i in range(0,studentNum):  
    #for i in [1]:
        #座號
        num = new_data.iloc[i,3]
        #座號前面補零
        if num <10:
            num=str(0)+str(num)
         
        #姓名
        name = new_data.iloc[i,4]
        #A1的PR
        a1 = new_data.iloc[i,8]
        a1 = float(a1)
        #A2的PR
        a2 = new_data.iloc[i,9]
        a2 = float(a2)
        #A3的PR
        a3 = new_data.iloc[i,10]
        a3 = float(a3)
   

        x= [1,2,3]
        y = [a1,a2,a3]
     

        #畫出PR折線圖
        axarr[int(i/5),i%5].plot(x,y)

        #限定y軸大小
        axarr[int(i/5),i%5].set_ylim([-5,105])

        #設定小圖的標題為姓名
        axarr[int(i/5),i%5].set_title(str(num) + name,fontproperties=myfont,size=15)
     
        #X軸標示設定為一二三
        axarr[int(i/5),i%5].set_xticks((1,2,3))
        axarr[int(i/5),i%5].set_xticklabels( ("一","二","三"),fontproperties=myfont)
        axarr[int(i/5),i%5].tick_params(labelsize=10)
     
        #plt.show()
 
    #班級前面補零
    if stuclass <10:
        stuclass=str(0)+str(stuclass)
    else:
        stuclass=str(stuclass)
     
     
    fig.savefig(stuclass + ".png",dpi = 250)
        #plt.close()