Class: Lite::Statistics::Descriptive

Inherits:
Object
  • Object
show all
Extended by:
Memoize::Alias
Defined in:
lib/lite/statistics/descriptive.rb

Constant Summary collapse

CALCULATIONS =
%i[
  frequencies
  max
  mean
  median
  midrange
  min
  mode
  proportions
  percentile_from_value
  population_coefficient_of_variation
  population_kurtosis
  population_size
  population_skewness
  population_standard_deviation
  population_standard_error
  population_summary
  population_variance
  population_zscores
  range
  sample_coefficient_of_variation
  sample_kurtosis
  sample_size
  sample_skewness
  sample_standard_deviation
  sample_standard_error
  sample_summary
  sample_variance
  sample_zscores
  sum
  value_from_percentile
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(collection) ⇒ Descriptive

Returns a new instance of Descriptive.



42
43
44
# File 'lib/lite/statistics/descriptive.rb', line 42

def initialize(collection)
  @collection = collection
end

Instance Method Details

#frequenciesObject



57
58
59
60
61
# File 'lib/lite/statistics/descriptive.rb', line 57

def frequencies
  return if @collection.empty?

  @collection.each_with_object(Hash.new(0)) { |val, hash| hash[val] += 1 }
end

#maxObject

rubocop:disable Style/RedundantSort



66
67
68
69
70
# File 'lib/lite/statistics/descriptive.rb', line 66

def max
  return if @collection.empty?

  sort.last
end

#meanObject Also known as: average

rubocop:enable Style/RedundantSort



75
76
77
78
79
# File 'lib/lite/statistics/descriptive.rb', line 75

def mean
  return if @collection.empty?

  sum / size.to_f
end

#medianObject

rubocop:disable Metrics/AbcSize



85
86
87
88
89
90
# File 'lib/lite/statistics/descriptive.rb', line 85

def median
  return if @collection.empty?
  return sort[size / 2] unless size.even?

  (sort[(size / 2) - 1] + sort[size / 2]) / 2.0
end

#midrangeObject Also known as: midextreme



207
208
209
210
211
# File 'lib/lite/statistics/descriptive.rb', line 207

def midrange
  return if @collection.empty?

  [min, max].sum / 2.0
end

#minObject

rubocop:disable Style/RedundantSort



96
97
98
99
100
# File 'lib/lite/statistics/descriptive.rb', line 96

def min
  return if @collection.empty?

  sort.first
end

#modeObject

rubocop:enable Style/RedundantSort



105
106
107
108
109
110
111
112
# File 'lib/lite/statistics/descriptive.rb', line 105

def mode
  return if @collection.empty?

  top_two = frequencies.sort_by { |_, val| -val }.take(2)
  return if top_two.first.last == top_two.last.last

  top_two.first.first
end

#percentile_from_value(value) ⇒ Object Also known as: percentile



116
117
118
119
120
# File 'lib/lite/statistics/descriptive.rb', line 116

def percentile_from_value(value)
  return if @collection.empty?

  (sort.index(value) / size.to_f * 100).ceil
end

#population_coefficient_of_variationObject



125
126
127
128
129
# File 'lib/lite/statistics/descriptive.rb', line 125

def population_coefficient_of_variation
  return if @collection.empty?

  population_standard_deviation / mean
end

#population_kurtosisObject



139
140
141
142
143
144
145
# File 'lib/lite/statistics/descriptive.rb', line 139

def population_kurtosis
  return if @collection.empty?
  return 0 if size == 1

  quarted_standard_deviation = population_standard_deviation**4
  sum_of_power(4) / (population_size * quarted_standard_deviation.to_f)
end

#population_sizeObject



133
134
135
# File 'lib/lite/statistics/descriptive.rb', line 133

def population_size
  @collection.size - 1
end

#population_skewnessObject



149
150
151
152
153
154
155
# File 'lib/lite/statistics/descriptive.rb', line 149

def population_skewness
  return if @collection.empty?
  return 0 if size == 1

  cubed_standard_deviation = population_standard_deviation**3
  sum_of_power(3) / (population_size * cubed_standard_deviation.to_f)
end

#population_standard_deviationObject



159
160
161
162
163
# File 'lib/lite/statistics/descriptive.rb', line 159

def population_standard_deviation
  return if @collection.empty?

  Math.sqrt(population_variance)
end

#population_standard_errorObject



167
168
169
170
171
# File 'lib/lite/statistics/descriptive.rb', line 167

def population_standard_error
  return if @collection.empty?

  population_standard_deviation / Math.sqrt(population_size)
end

#population_summaryObject



175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/lite/statistics/descriptive.rb', line 175

def population_summary
  base_summary.merge(
    population_coefficient_of_variation: population_coefficient_of_variation,
    population_kurtosis: population_kurtosis,
    population_size: population_size,
    population_skewness: population_skewness,
    population_standard_deviation: population_standard_deviation,
    population_standard_error: population_standard_error,
    population_variance: population_variance,
    population_zscores: population_zscores
  )
end

#population_varianceObject



188
189
190
191
192
# File 'lib/lite/statistics/descriptive.rb', line 188

def population_variance
  return if @collection.empty?

  sum_of_power(2) / population_size.to_f
end

#population_zscoresObject



196
197
198
199
200
201
202
203
# File 'lib/lite/statistics/descriptive.rb', line 196

def population_zscores
  return if size < 2
  return Hash.new(0) if population_standard_deviation.zero?

  @collection.each_with_object({}) do |val, hash|
    hash[val] ||= (val - mean) / population_standard_deviation
  end
end

#proportionsObject



216
217
218
219
220
# File 'lib/lite/statistics/descriptive.rb', line 216

def proportions
  return if @collection.empty?

  frequencies.transform_values { |val| val / size.to_f }
end

#rangeObject



224
225
226
227
228
# File 'lib/lite/statistics/descriptive.rb', line 224

def range
  return if @collection.empty?

  max - min
end

#sample_coefficient_of_variationObject Also known as: coefficient_of_variation



232
233
234
235
236
# File 'lib/lite/statistics/descriptive.rb', line 232

def sample_coefficient_of_variation
  return if @collection.empty?

  sample_standard_deviation / mean
end

#sample_kurtosisObject Also known as: kurtosis



248
249
250
251
252
253
254
# File 'lib/lite/statistics/descriptive.rb', line 248

def sample_kurtosis
  return if @collection.empty?
  return 0 if size == 1

  quarted_standard_deviation = sample_standard_deviation**4
  sum_of_power(4) / (sample_size * quarted_standard_deviation.to_f)
end

#sample_sizeObject Also known as: size



241
242
243
# File 'lib/lite/statistics/descriptive.rb', line 241

def sample_size
  @collection.size
end

#sample_skewnessObject Also known as: skewness



259
260
261
262
263
264
265
# File 'lib/lite/statistics/descriptive.rb', line 259

def sample_skewness
  return if @collection.empty?
  return 0 if size == 1

  cubed_standard_deviation = sample_standard_deviation**3
  sum_of_power(3) / (sample_size * cubed_standard_deviation.to_f)
end

#sample_standard_deviationObject Also known as: standard_deviation



270
271
272
273
274
# File 'lib/lite/statistics/descriptive.rb', line 270

def sample_standard_deviation
  return if @collection.empty?

  Math.sqrt(sample_variance)
end

#sample_standard_errorObject Also known as: standard_error



279
280
281
282
283
# File 'lib/lite/statistics/descriptive.rb', line 279

def sample_standard_error
  return if @collection.empty?

  sample_standard_deviation / Math.sqrt(sample_size)
end

#sample_summaryObject Also known as: summary



288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/lite/statistics/descriptive.rb', line 288

def sample_summary
  base_summary.merge(
    sample_coefficient_of_variation: sample_coefficient_of_variation,
    sample_kurtosis: sample_kurtosis,
    sample_size: sample_size,
    sample_skewness: sample_skewness,
    sample_standard_deviation: sample_standard_deviation,
    sample_standard_error: sample_standard_error,
    sample_variance: sample_variance,
    sample_zscores: sample_zscores
  )
end

#sample_varianceObject Also known as: variance



303
304
305
306
307
# File 'lib/lite/statistics/descriptive.rb', line 303

def sample_variance
  return if @collection.empty?

  sum_of_power(2) / sample_size.to_f
end

#sample_zscoresObject Also known as: zscores



312
313
314
315
316
317
318
319
# File 'lib/lite/statistics/descriptive.rb', line 312

def sample_zscores
  return if size < 2
  return Hash.new(0) if sample_standard_deviation.zero?

  @collection.each_with_object({}) do |val, hash|
    hash[val] ||= (val - mean) / sample_standard_deviation
  end
end

#sumObject



324
325
326
# File 'lib/lite/statistics/descriptive.rb', line 324

def sum
  @collection.sum
end

#value_from_percentile(percentile) ⇒ Object Also known as: percentile_rank



330
331
332
333
334
335
# File 'lib/lite/statistics/descriptive.rb', line 330

def value_from_percentile(percentile)
  return if @collection.empty?

  index = (percentile.to_f / 100 * size).ceil
  sort[index]
end