統計処理において、母集団に含まれるデータのバラつき具合を表す数値として標準偏差が使われます。今回は配列に含まれる数値の標準偏差を返す関数(メソッド)をRubyで作ってみました。
#標準偏差を求める
def std(arr_x)
avg = arr_x.sum / arr_x.length
arr1 = arr_x.map{|x| (x - avg) ** 2}
return Math.sqrt(arr1.sum / arr_x.length).round(2)
end
配列arr_x(要素のデータ型は浮動小数点数型)が渡されたら、配列の要素の平均(avg)を求めます。次に、各要素と平均の差を2乗した新たな配列(arr1)を作ります。このarr1の要素を合計して要素数で割った値の平方根が配列の標準偏差になるので、これを戻り値として返します。標準偏差は、四捨五入して小数点第2位まで求めてます。
例えば与えられた配列が、[1,2,3,4,5,6,7,8,9,10]の場合、標準偏差として2.87を返します。
標準偏差を返す関数を作れたので、次は学力試験などでよく使われる、母集団内における立ち位置を示す数値である偏差値について扱います。
次の関数は、数値が要素になっている配列が渡されると、配列内の数値を偏差値に変換した値が要素になっている配列を返します。
#配列の各要素の偏差値を返す。
def dev(arr_x)
#標準偏差stdを求める。
avg = arr_x.sum / arr_x.length
arr1 = arr_x.map{|x| (x - avg) ** 2}
std = Math.sqrt(arr1.sum / arr_x.length)
#配列の要素を偏差値に変換して返す。
return arr_x.map{|x| ((x - avg) * 10 / std + 50).round(2)}
end
与えられた数値xの偏差値は、
50+(x – 平均)* 10 / 標準偏差
で求められます。
配列の要素についての平均と標準偏差を求めたら、この平均と標準偏差の値を使って、配列内の各要素を上記の数式を使って偏差値に変換します。偏差値はは、四捨五入して小数点第2位まで求めてます。その後、偏差値に変換した値を要素とする配列を返します。
例えば、与えられた配列が[1,2,3,4,5,6,7,8,9,10]の場合、各要素を偏差値に換算した値を要素とする配列[34.33, 37.81, 41.3, 44.78, 48.26, 51.74, 55.22, 58.7, 62.19, 65.67]として返します。
余談ですが、スプレッドシートには、母集団が正規分布に従っていると仮定して、平均と標準偏差から数値x以下に含まれる確率を求めるNORMDIST関数があります。1-NORMODISTにすれば、数値x以上に含まれる確率を求められるので、学力試験やアプリのイベントなどの順位予測に使えます。
Rubyにこのような機能を持つ関数があるかどうか探しましたが見つからなかったです。そうなると、Rubyで母集団に含まれる確率を求めたい場合は、自分でその処理を書いて作るしかなさそうです。