@m_seki の

I like ruby tooから引っ越し

この処理はきっとみんな書いていて、星の数ほどあるんだろうな

Statistics Hacks ―統計の基本と世界を測るテクニック

Statistics Hacks ―統計の基本と世界を測るテクニック

相関係数の辺りで、実験したくなったので基本統計量を数える小さなスクリプトを書きました。あってるかわからないけど、本の通りの値になったから、きっと大丈夫。
メソッド名は長いとうんざりするので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

なにを調べたかというと、平均速度と燃費の相関です。満タン法で調べた燃費と平均燃費に相関がありそうだったので試してみたのでした。予想を裏切ること無く相関がありそうだということがわかったので、ちょっとつまんなかったな。