Statistics Hacks ―統計の基本と世界を測るテクニック
- 作者: Bruce Frey,鴨澤眞夫,西沢直木
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/12/26
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 135回
- この商品を含むブログ (46件) を見る
相関係数の辺りで、実験したくなったので基本統計量を数える小さなスクリプトを書きました。あってるかわからないけど、本の通りの値になったから、きっと大丈夫。
メソッド名は長いとうんざりするのでExcelの関数名をパクりましたよ。
Statistics.correl()にあるように、injectの引数に渡して使います。
stat = ary.inject(Statistics.new) {|s, v| s << v}
こんな感じ。
class Statistics def initialize @size = 0 @sum = 0.0 @sum2 = 0.0 @min = nil @max = nil end attr_reader :sum, :min, :max def feed(value) @sum += value @sum2 += (value * value) @size += 1 @min = @min ? [@min, value].min : value @max = @max ? [@max, value].max : value return self end alias << feed def to_a [@size, @min, @max, average, stddev, stddevp] end def average @sum.quo(@size) end def varp @sum2.quo(@size) - average ** 2 end def stddevp Math::sqrt(varp) end def var @size.quo(@size - 1) * varp end def stddev Math::sqrt(var) end def self.correl(a, b) as = a.inject(self.new) {|s, v| s << v} bs = b.inject(self.new) {|s, v| s << v} sum = 0 a.zip(b) do |x, y| xz = (x - as.average).quo(as.stddev) yz = (y - bs.average).quo(bs.stddev) sum += xz * yz end sum.quo(a.size - 1) end end
なにを調べたかというと、平均速度と燃費の相関です。満タン法で調べた燃費と平均燃費に相関がありそうだったので試してみたのでした。予想を裏切ること無く相関がありそうだということがわかったので、ちょっとつまんなかったな。