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()
     

2017年1月20日

大手攜小手的數理科學營-手作顯微鏡與行動顯微鏡課程

延續著去年的經驗,繼續開辦這個活動,由數學、理化、生物三科設計課程,邀請小學生來參加。但特別的是,除了老師講解之外,我們還請了七八年級的學生擔任「大手」助教,由他們來教導學員。

從學習者到教學者,角色的轉變和態度的改變,對學生來說是一大挑戰,不過一回生二回熟,我們看到學生都能夠從這裡獲得不少經驗值。

book


課程裡,由老師先講解原理、概念。喔忘了說,我們的課程是包含了自製顯微鏡和利用行動顯微鏡觀察各種自然物與人造物。
IMAG3141


接下來的手作顯微鏡,就是由這些「大手」來教這些「小手」
IMAG3139



IMAG3134



而後半段的行動顯微鏡是使用uHandy,讓學生觀察各式各樣的自然物,而這些自然物也都是早上請各組「大手」學生去採集,由他們來設計出要給「小手」們觀察的活動。讓我很驚訝的是,他們居然還主動跟我要採血針,想要採集血液給學員看。

那我當然答應啦,自願獻血哩!一天六堂課,就自扎了好幾個洞,也太可愛了。
IMAG3159



IMAG3158




IMAG3156


IMAG3154

結尾則是由老師讓大家把顯微攝影的結果,投影到螢幕,讓大家互相看看攝影的結果。
IMAG3147


當天的課程我另外還有準備一些特別的觀察材料,不過當天我跑來跑去(同時還有一場專題研究的講座),所以不知道大手們有沒有利用那材料(先賣個關子)。想想,以後再來設計一個新的主題課程,結合顯微觀察和生活情境,一定相當有意思!

2017年1月16日

手機app研究擴大機的聲音

今天從學校離開的時候,聽到很大聲的持續的低頻聲音,本以為是學校廣播沒關,所以就走去學務處問問,看到總務主任也在查聲音來源。(並不是學校廣播)

我就在校園走來走去想聽出聲音在哪,但是聲音實在低頻,低到不容易判斷方向,而且聽一聽耳朵就疲勞了。於是拿出app,開啟偵測音強、音高的app、還開了頻譜分析的來做傅立葉分析。結果一看是300多Hz的正弦波。

接著拿著手機開始四處掃描,終於掃到了是某班教室的擴大機沒關。原來低頻聲音真的不容易定位,像我都到那班教室的隔壁教室,我都還是沒聽出來聲音是來自哪,要一直到很靠近才發現。
另外這種頻率的聲音對不同介質的穿透度還真不一樣,玻璃的就很能擋,但是混凝土的就不容易阻擋。

這樣玩一玩,讓我好想做這相關問題的實驗啊。

最後附上我使用的app
Physics Toolbox Sensor Suite
https://play.google.com/store/apps/details?id=com.chrystianvieyra.physicstoolboxsuite

Spectrogram
https://play.google.com/store/apps/details?id=net.galmiza.android.spectrogram

或者,用電腦上的audacity,它也可以作到傅立葉分析,做Spectrum或是Spectrogram,或是音強分析,也都是可以匯出數據來分析的。

2017年1月5日

用Excel VBA理解像素的數字和顏色

幾個月前答應科科月刊,要寫一篇ImageJ的文章,不過自己到了去年年底才動手。為了要說明數位影像裡,像素和顏色的關係,我就用excel 和VBA搭配去把儲存格裡的數字轉換成儲存格的背景顏色。

這可以幹嘛哩?比方說mario的圖像,其實就是少少百來個像素組成的,顏色用的也不多。



上面三張圖是拆解出RGB顏色的三種數值分別做成灰階的圖樣
(拆解的方式,是用ImageJ的功能,去分解,然後儲存成文字檔)




同樣的方式,也可以用來理解像素數字和顏色的關係

  









那個excelVBA的說明就用影片來說明吧,影片裡也順便提到一些程式怎麼寫的(其實是給未來的我看的,不然一陣子沒碰,就會忘記一些語法)


如果有人發神經想玩玩看看,檔案在這邊
https://drive.google.com/file/d/0Bzwhi7Oh9a5Zc0FRZDg3dTFRMnM/view?usp=sharing

用Excel VBA作亂數分組和轉盤抽籤

這週因為上課的需求,要將學生隨機分組做實驗,所以就興起了用Excel VBA來做分組的檔案。不然以前的作法就是用excel 再加一欄放亂數,重新排序名字後再編組。而這VBA的作法其實就是算法就是這樣,只是我直接寫程式來完成它,並且直接可以設定要分出一組多少人的分法。





第二種是昨天的需求,想用電腦抽學生出來,雖然十年前(我的天啊真久)也做過一個VBA,不過這次想重作一個新的,就乾脆用類似俄羅斯輪盤的方式來做,可惜沒辦法產生聲音,不然更有趣。


操作的影片如下,檔案在文章底下
 

亂數分組和抽籤的檔案 



====
2020.3.26更新
因為最近有讓學生同儕互評的需求,所以我新增了一個功能,只要輸入互評人數,就可以產生互評的名單

我也為自己錄了一段影片,是講解這個程式的演算法。我怕我下週就忘記這個程式怎麼做了。有興趣的可以看看,我還順便用autosub直出未修正的字幕呢,會有一堆諧音亂字。








====
2020.3.30更新
增加了分組抽籤的功能,可以把學生名單放入預先排好的座位表中。座位預設用黃色填色,只要是黃色區域都可以填姓名,而組名用灰色填色。分完組的同時也會產出各學生分到哪一組的名單。

操作和設計原理的影片如下