Class: Lite::Statistics::Descriptive

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

Instance Method Summary collapse

Constructor Details

#initialize(collection) ⇒ Descriptive

Returns a new instance of Descriptive.



18
19
20
# File 'lib/lite/statistics/descriptive.rb', line 18

def initialize(collection)
  @collection = collection
end

Instance Method Details

#frequenciesObject



33
34
35
36
37
# File 'lib/lite/statistics/descriptive.rb', line 33

def frequencies
  return if @collection.empty?

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

#maxObject

rubocop:disable Style/RedundantSort



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

def max
  return if @collection.empty?

  sort.last
end

#meanObject Also known as: average

rubocop:enable Style/RedundantSort



51
52
53
54
55
# File 'lib/lite/statistics/descriptive.rb', line 51

def mean
  return if @collection.empty?

  sum / size.to_f
end

#medianObject

rubocop:disable Metrics/AbcSize



61
62
63
64
65
66
# File 'lib/lite/statistics/descriptive.rb', line 61

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



183
184
185
186
187
# File 'lib/lite/statistics/descriptive.rb', line 183

def midrange
  return if @collection.empty?

  [min, max].sum / 2.0
end

#minObject

rubocop:disable Style/RedundantSort



72
73
74
75
76
# File 'lib/lite/statistics/descriptive.rb', line 72

def min
  return if @collection.empty?

  sort.first
end

#modeObject

rubocop:enable Style/RedundantSort



81
82
83
84
85
86
87
88
# File 'lib/lite/statistics/descriptive.rb', line 81

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



92
93
94
95
96
# File 'lib/lite/statistics/descriptive.rb', line 92

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

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

#population_coefficient_of_variationObject



101
102
103
104
105
# File 'lib/lite/statistics/descriptive.rb', line 101

def population_coefficient_of_variation
  return if @collection.empty?

  population_standard_deviation / mean
end

#population_kurtosisObject



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

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



109
110
111
# File 'lib/lite/statistics/descriptive.rb', line 109

def population_size
  @collection.size - 1
end

#population_skewnessObject



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

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



135
136
137
138
139
# File 'lib/lite/statistics/descriptive.rb', line 135

def population_standard_deviation
  return if @collection.empty?

  Math.sqrt(population_variance)
end

#population_standard_errorObject



143
144
145
146
147
# File 'lib/lite/statistics/descriptive.rb', line 143

def population_standard_error
  return if @collection.empty?

  population_standard_deviation / Math.sqrt(population_size)
end

#population_summaryObject



151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/lite/statistics/descriptive.rb', line 151

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



164
165
166
167
168
# File 'lib/lite/statistics/descriptive.rb', line 164

def population_variance
  return if @collection.empty?

  sum_of_power(2) / population_size.to_f
end

#population_zscoresObject



172
173
174
175
176
177
178
179
# File 'lib/lite/statistics/descriptive.rb', line 172

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



192
193
194
195
196
# File 'lib/lite/statistics/descriptive.rb', line 192

def proportions
  return if @collection.empty?

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

#rangeObject



200
201
202
203
204
# File 'lib/lite/statistics/descriptive.rb', line 200

def range
  return if @collection.empty?

  max - min
end

#sample_coefficient_of_variationObject Also known as: coefficient_of_variation



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

def sample_coefficient_of_variation
  return if @collection.empty?

  sample_standard_deviation / mean
end

#sample_kurtosisObject Also known as: kurtosis



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

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



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

def sample_size
  @collection.size
end

#sample_skewnessObject Also known as: skewness



235
236
237
238
239
240
241
# File 'lib/lite/statistics/descriptive.rb', line 235

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



246
247
248
249
250
# File 'lib/lite/statistics/descriptive.rb', line 246

def sample_standard_deviation
  return if @collection.empty?

  Math.sqrt(sample_variance)
end

#sample_standard_errorObject Also known as: standard_error



255
256
257
258
259
# File 'lib/lite/statistics/descriptive.rb', line 255

def sample_standard_error
  return if @collection.empty?

  sample_standard_deviation / Math.sqrt(sample_size)
end

#sample_summaryObject Also known as: summary



264
265
266
267
268
269
270
271
272
273
274
275
# File 'lib/lite/statistics/descriptive.rb', line 264

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



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

def sample_variance
  return if @collection.empty?

  sum_of_power(2) / sample_size.to_f
end

#sample_zscoresObject Also known as: zscores



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

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



300
301
302
# File 'lib/lite/statistics/descriptive.rb', line 300

def sum
  @collection.sum
end

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



306
307
308
309
310
311
# File 'lib/lite/statistics/descriptive.rb', line 306

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

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