§Algorithm§


☆偏差値を求める☆

 偏差値、学校のテストでは絶対ついてくるものですね。ここでは、 この偏差値の求め方をテストを例に取り解説しています。

なお、プログラムコード中のグローバルな変数とその役割は、次の通りです。


    Private Const DATA_MAX = 300  'データの最大個数
    Private TextBoxData As Object 'データを入力するテキストボックス
    Private ListData As Object    '偏差値を表示するリストボックス
    Private data() As Double      'データの格納先
    Private dataCount As Integer  'データの個数


偏差値を求めるには、平均、分散と標準偏差というものを求める必要があります。

★平均★

 単なる平均点のことで、全員の点数の平均値です。配列中のデータの総和を 求め、データ数で割ります。

'配列のデータの総和を求める
Public Function GetSum() As Double
    Dim SumValue As Double
    Dim i As Integer
    SumValue = 0#
    For i = 0 To dataCount - 1
        SumValue = SumValue + data(i)
    Next i
    GetSum = SumValue
End Function

'平均値を求める
Public Function GetAverage() As Double
    GetAverage = GetSum / CDbl(dataCount)
End Function

★分散★

 ちょっと難しそうな言葉ですが、これもそのままの意味で、 点数の分布の散らばり度合いのことです。この分散が大きいほど、点数の 分布が広い範囲に散在し、ばらつき度が大きいということになります。 計算式での求め方は、

分散 = (データを2乗した値の総和 - (データの総和の2乗 / データ数)) / データ数

です。

'配列のデータを2乗した値の総和を求める
Public Function GetSumSpa() As Double
    Dim SumSpaValue As Double
    Dim i As Integer
    SumSpaValue = 0#
    For i = 0 To dataCount - 1
        SumSpaValue = SumSpaValue + data(i) ^ 2#
    Next i
    GetSumSpa = SumSpaValue
End Function

'分散を求める
Public Function GetBunsan() As Double
    GetBunsan = (GetSumSpa - (GetSum ^ 2#) / _
                       CDbl(dataCount)) / CDbl(dataCount)
End Function

★標準偏差★

 これは、分散の平方根の正の数です。

'標準偏差を求める
Public Function GetStandard() As Double
    GetStandard = Sqr(GetBunsan)
End Function

★偏差と偏差値★

 偏差とは、ある数値の集合がありその集合の基準となる値から どれだけずれているかを表した値です。Aさんの点数が80点で、平均点が 55点だったら、偏差は25点になります。  一方偏差値とは、集合の平均からのズレの度合いのことで、集合の分布が 正規分布に従っているとみなした上での値です。つまり正規に分布して いなければ、当てにならない値ともいえます。計算式は次の通りです。

偏差 = ある値 - 平均値
偏差値 = (偏差 / 標準偏差) * 10 + 50

'偏差値を求め、それをリストボックスに表示する
Public Function GetHensaValue() As Double
    Dim i As Integer
    ListData.Clear
    If GetStandard = 0# Then Exit Function
    For i = 0 To dataCount - 1
        ListData.AddItem CStr(Format(((data(i) - GetAverage) / _
                        GetStandard) * 10# + 50#, "#0.00")) _
                        & "  (" & CStr(data(i)) & ")"
    Next i
End Function


★もし自分が?点だったら偏差値は?★

 これより下に示すものは、サンプルにおまけ機能として含まれています。 また、『もし?点だったら偏差値は・・・』でも 気軽に計算できます。
 テストの成績表に大抵の場合、偏差値は表示されて いますが、標準偏差は表示されていないようです。もし、自分が?点だったら 偏差値はどれぐらいかなぁ、って知りたい時、標準偏差が分かっていれば その偏差値は上のやり方で簡単に求めることができます。しかし、標準偏差が わからないならば、自分の点数と偏差値から逆算して標準偏差を求め、 その値と仮想的な点をもとに、その偏差値を求めなければなりません。 そこで、その計算を行うプログラムを下に示しました。よろしければ、 ご参考にして下さい。 (このコードでは補正を行っています。ここでいう補正とは、自分の点数を 仮想的な点数にした場合に生じる平均点等のズレの修正のことです。つまり、 その仮想的な点数をもとに平均値や標準偏差を求め直しています。)

'===========================================================
'GetIfHensa  もし?点だったら偏差値はいくらになるのかな
'---------引数----------------------------------------------
'ifmyData     もし?点
'myData       実際の点数
'myHensaValue 実際の偏差値
'myAverage    実際の平均点
'myDataCount  人数(データ数)
'---------戻り値--------------------------------------------
'仮想的な偏差値を返すが、得られなかった時は0.0を返す
'実際の偏差値が、50に近い場合は、計算不可能
'===========================================================
Public Function GetIfHensa(ifmyData As Double, myData _
           As Double, myHensaValue As Double, myAverage _
           As Double, myDataCount As Double) As Double
    '実際と仮想的な分散
    Dim myBunsan As Double, rBunsan As Double
    '実際と仮想的な標準偏差
    Dim myStandard As Double, rStandard As Double
    '実際と仮想的な2乗和
    Dim mySumSpa As Double, rSumSpa As Double
    '実際と仮想的な総和
    Dim mySum As Double, rSum As Double
    '仮想的な平均値
    Dim rAverage As Double
    'オーバーフロー及び0除算対策
    If myHensaValue >= 49.8 And myHensaValue <= 50.2 Then
        MsgBox "計算不可能です"
        IfHensa = 0#
        Exit Function
    End If
    '実際の標準偏差、分散、総和、2乗和を求める
    myStandard = (10# * (myData - myAverage)) / _
                 (myHensaValue - 50#)
    myBunsan = myStandard ^ 2#
    mySum = myAverage * myDataCount
    mySumSpa = myBunsan * myDataCount + (mySum ^ 2#) / _
               myDataCount
    '仮想的な平均値、総和、2乗和、分散、標準偏差を求める
    rAverage = (myAverage * myDataCount - myData + ifmyData) / _
               myDataCount
    rSum = rAverage * myDataCount
    rSumSpa = mySumSpa - myData ^ 2# + ifmyData ^ 2#
    rBunsan = (rSumSpa - (rSum ^ 2#) / myDataCount) / _
               myDataCount
    rStandard = Sqr(rBunsan)
    GetIfHensa = ((ifmyData - rAverage) / rStandard) * _
                 10# + 50#
End Function

上記にも記してありますが、この方法では偏差値が50に近い値の場合、 計算できません。


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0(ソース)
Visual Basic Ver.6.0(実行ファイル)
更新日 00/5/10

ソースファイル souHensa.lzh(5.52KB)

実 行 ファイル exeHensa.lzh(10.6KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で起きた損害などに関して一切の責任を負うことはできません。

★このコーナーに掲載されているプログラムコード、およびプログラムファ イルを無断で配布・転載することは、原則として禁止です。


(参考書)
『Visual Basic4.0 活用研究』
著者:川田徹
出版元:工学者

『Basic によるプログラミング工学』
著者:藤崎紘久、吉川博史、太田充
出版元:産業図書


Algorithmインデックス トップ


Copyright(C)2000 Tomoya. All rights reserved.