いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

生徒が試験を欠席したとき、Excelで見込み点をつける方法

学校によりますが、大きな試験は1、2学期は中間試験・期末試験、3学期は期末試験だけ、というところが多いのではないのでしょうか。成績は中間期末が8割、提出物や小テストが2割程度といった感じで決めます。ほぼ中間期末だけで決めるところもありました。さて、いずれにせよ中間期末が成績を決めるのに大事なんですが、風邪を引いたりインフルエンザにかかったり、生徒は試験を休むことがあります。こうしたとき、教員は「見込み点」というのをつけます。例えば中間試験を休んだけれど期末試験はちゃんと受けた、という生徒の中間の得点を「この生徒は期末でxx点取っているから中間ではyy点取れるはずだ」のように見込むのです。0点ではかわいそう、ということですね。次のような例を考えます。

この例では3番の生徒が中間を休み、期末は受けています。何か理屈を付けて中間試験の得点を見込みます。経験では学校によって2通りの見込み点のつけ方がありました。上の例で説明します。
[方法1]
45.5×40/46.8 = 38.88……≒39
該当生徒は期末では40点です。期末の平均点に対する割合を求め、同じ割合で中間試験でも点を取ると考えます。風邪など一般的な欠席ならこうして求めた点を0.8倍したりします。忌引き、インフルエンザなどの出席停止なら1倍です。
[方法2]
期末試験の順位を調べ、中間試験で同じ順位の生徒と同じ得点を見込み点とします。この例では期末で3位ですから、中間でも3位と考えるわけです。中間を受けた4人の中の3位の生徒の得点、45点が見込み点です。この場合も、通常の休みなら0.8倍します。順位でなく、偏差値でやる方がよいかも知れません。

 

ほとんどの学校では方法1でした。どちらの方法もそれなりに説得力がありますが、方法1では変なことが起こる可能性も。中間試験の平均点が高く期末は低かったとし、生徒は期末で高得点だったとすると、欠席した中間の見込み点が100点を超えることもありえます。実際、数年前にこれが起こりました(教員生活で初めて!)。
余談ですが、そのときそういう事情を科の先生に話したら「いや、普通は偏差値(方法2)でやるでしょう」と言われました。ぼくは黙っていましたが、「いや、『普通』じゃないよ……」と思いました。あちこちの学校で方法1でやっているんだから。方法2の方がより妥当な気はしますが、教員の狭い世界の特別なルールを押しつけられる感じでイヤになります。

 

問題なのはどちらの方法も手作業だと結構面倒だということです。面倒くさがっているわけではありません。面倒な作業だということはミスもしやすいということです。成績処理でミスはできませんから、それが困るのです。欠席者が2人くらいならまだよいのですが、学校によっては8、9人などということもあります。同じような、しかもミスしやすい作業を繰り返すのは苦痛です。そこでこの決まり切った作業を関数にしてしまいます。

 

動画をどうぞ。Excelで、こんな感じに見込み点を付けられます。

youtu.be

コードのblock1が中間試験、block2が期末です。rateは風邪など通常の欠席なら0.8、出席停止なら1という、かけ算の係数です。ExcelVBAコードは次です。

'------------------------------------------
'見込み点を付ける
'カーソルは、block1の空欄の高さで、そこへ書き込んで構わない列にセット。
'block2は見込み点を付ける元のデータ。同じ高さにデータが必要。
'rateは0.8など、見込み点を付ける際の倍率。
'カーソル位置に見込み点が入るので、それをコピーして使う。
'
Function mikomi(block1 As Range, block2 As Range, rate As Double) As Double
    Dim val1, val2, mean1, mean2 As Double
    Dim pos1, pos2 As Integer
    Dim adrs1, adrs2 As String
    Dim r, c1, c2 As Integer
    mean1 = WorksheetFunction.Average(block1)
    mean2 = WorksheetFunction.Average(block2)
    adrs = ActiveCell.Address(ReferenceStyle:=xlR1C1)
    pos1 = InStr(1, adrs, "R")
    pos2 = InStr(1, adrs, "C")
    r = Val(Mid(adrs, pos1 + 1, pos2 - pos1 - 1)) '行番号を得る
    adrs2 = block2.Cells(1, 1).Address(ReferenceStyle:=xlR1C1)
    pos2 = InStr(1, adrs2, "C")
    c2 = Val(Mid(adrs2, pos2 + 1)) '列番号を得る
    val2 = Cells(r, c2).Value 'block2の、対応する行の値
    val1 = val2 / mean2 * mean1 * rate '見込み点を計算
    mikomi = val1
End Function
'------------------------------------------

ぼくはVBAはほとんど使ったことがありません。必要でたまに書くくらいです。ひょっとして一般的でない書き方をしているのかも知れませんが、テストして大丈夫なのでいいでしょう。こうしたコードをどこに書くのかなど、前に記事にしました。参考にどうぞ。

www.omoshiro-suugaku.com

www.omoshiro-suugaku.com

今回の試験で8人くらい欠席者が出てしまい、憂鬱でしたが気がラクになりました。コンピュータを使うというのはこういうことです。とにかく導入、生徒に使わせることに意味がある、授業でタブレット、……ならよいというわけでないのです!