ここに至る経緯
ふと思い立って自作ライブラリを作ってみることにしました、その題材に統計を選んだ理由は単純に勉強したほうが良いと思った分野だからです。
正直まだ統計学とelmのことをわかっていないところがありますのでツッコミがあればお願いします。
数式は書き方わからないので略します。
ちなみに参考にした書籍は統計の場合は完全独習 統計学入門とはじめての統計学です。
最近は上で得た知識だけでは少し早いかもしれませんが統計学入門を読んでいます。
追記:勢いで書いてしまったのでソースコードを貼るのを忘れていました。https://github.com/saburooo/simple-stat
また、作った成果もリリースしています。https://mysimple-stat.web.app/
まずは平均から。
elmで平均を求めるやり方として真っ先に思い立つのはこんなコードです。
average:List Float -> Float
average sample = (List.sum sample) / (List.length sample)
これは正確には算術平均というそうで最もシンプルな平均の求め方です。求めやすいけどこの計算だけではデータの内部がどうなっているのかわからないのが欠点です。
偏差
この関数を使って偏差を求めてみたいと思います、これは要するに求められた平均からどんだけずれているかを表現した数字です、リストで返すことにします。
deviation : List Float -> List Float
deviation list =
map (\e -> e - average list) list
標準偏差
更に応用して標準偏差を求めて見たいと思います。よくS.D.と略されるこの数値ですがこれは平均からどんだけずれているか、そしてそのズレが常軌を逸脱しているか否かを示す数値になります。
計算の仕方は先程の偏差から算出したリストを2乗して合計し、それにリストの長さを割ってルート計算をする順番になります。
standardDeviation : List Float -> Float
standardDeviation list =
sqrt (sum (map (\e -> e ^ 2) (deviation list)) / Basics.toFloat (length list - 1))
正直ほぼ直訳で関数作りましたが多分これで通じると勝手に思ってます。いい書き方があったら教えてください。
変動係数
その次は変動係数を求めてみたいと思います。
標準偏差と算術平均で割ることで求められます。
coefficientOfVariation : List Float -> Float
coefficientOfVariation sampleData =
standardDeviation sampleData / average sampleData
これが求めることで平均値を2つ求められたとしてその2つを正確にばらつき具合を比較できます。例えば「昔と今では月収が変わってるけどばらつき具合がどうなのかがわからない」時に使います。
標準化
まずは標準化まで書いていこうと思います。
やり方は先程の計算式をもとに
standartdization: List Float -> List Float
standartdization list =
List.map (\l -> (l - (average list)) / (standardDeviation list)) list
こうして求めたリストのそれぞれの値に10を掛けて50を足した値が偏差値になります。今回はここまでにします。
シリーズ化していく予定です。