module DescriptiveStatistics

Public Class Methods

empty_collection_default_value() click to toggle source
# File lib/descriptive_statistics/class_methods.rb, line 5
def empty_collection_default_value
  @empty_collection_default_value
end
empty_collection_default_value=(value) click to toggle source
# File lib/descriptive_statistics/class_methods.rb, line 9
def empty_collection_default_value=(value)
  @empty_collection_default_value = value
  DescriptiveStatistics.instance_methods.each { |m| default_values[m] = value }
end

Private Class Methods

default_values() click to toggle source
# File lib/descriptive_statistics/class_methods.rb, line 25
def default_values
  @default_values ||= {}
end

Public Instance Methods

descriptive_statistics(&block) click to toggle source
# File lib/descriptive_statistics/descriptive_statistics.rb, line 2
def descriptive_statistics(&block)
  return { :number => self.number(&block),
           :sum => self.sum(&block),
           :variance => self.variance(&block),
           :standard_deviation => self.standard_deviation(&block),
           :min => self.min(&block),
           :max => self.max(&block),
           :mean => self.mean(&block),
           :mode => self.mode(&block),
           :median => self.median(&block),
           :range => self.range(&block),
           :q1 => self.percentile(25, &block),
           :q2 => self.percentile(50, &block),
           :q3 => self.percentile(75, &block) }
end
mean(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/mean.rb, line 2
def mean(collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.mean_empty_collection_default_value if values.empty?

  values.sum / values.number
end
median(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/median.rb, line 2
def median(collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.median_empty_collection_default_value if values.empty?

  values.percentile(50)
end
mode(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/mode.rb, line 2
def mode(collection = self, &block)
  values = Support::extract(collection, &block)
  return if values.to_a.empty?

  values
    .group_by { |e| e }
    .values
    .max_by(&:size)
    .first
end
number(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/number.rb, line 2
def number(collection = self, &block)
  values = Support::extract(collection, &block)

  values.to_a.size.to_f
end
percentile(p, collection = self, &block) click to toggle source
# File lib/descriptive_statistics/percentile.rb, line 2
def percentile(p, collection = self, &block)
  values = Support::convert(collection, &block)

  return DescriptiveStatistics.percentile_empty_collection_default_value if values.empty?
  return values.first if values.size == 1

  values.sort!
  return values.last if p == 100
  rank = p / 100.0 * (values.size - 1)
  lower, upper = values[rank.floor,2]
  lower + (upper - lower) * (rank - rank.floor)
end
percentile_rank(p, collection = self, &block) click to toggle source

percent of cases that are at or below a score

# File lib/descriptive_statistics/percentile_rank.rb, line 3
def percentile_rank(p, collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.percentile_rank_empty_collection_default_value if values.empty?

  return (((values.sort.rindex { |x| x <= p } || -1.0) + 1.0)) / values.number * 100.0
end
range(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/range.rb, line 2
def range(collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.range_empty_collection_default_value if values.empty?

  values.max - values.min
end
standard_deviation(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/standard_deviation.rb, line 2
def standard_deviation(collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.standard_deviation_empty_collection_default_value if values.empty?

  Math.sqrt(values.variance)
end
sum(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/sum.rb, line 2
def sum(collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.sum_empty_collection_default_value if values.empty?

  return values.reduce(:+)
end
variance(collection = self, &block) click to toggle source
# File lib/descriptive_statistics/variance.rb, line 2
def variance(collection = self, &block)
  values = Support::convert(collection, &block)
  return DescriptiveStatistics.variance_empty_collection_default_value if values.empty?

  mean = values.mean
  values.map { |sample| (mean - sample) ** 2 }.reduce(:+) / values.number
end