lib/easystats.rb in easystats-0.0.2 vs lib/easystats.rb in easystats-0.0.3
- old
+ new
@@ -14,30 +14,44 @@
sum_of_numbers
end
# take in an array of numbers and calculate the mean (average)
def mean(data)
- self.sum(data) / data.count
+ self.sum(data) / data.count.to_f
end
- # take in an array of numbers and calculate the standard deviation
- def standard_deviation(data)
- average = self.mean(data)
+ # this is an internat function (technically the developer can use it but should have no need)
+ # this function returns the sum of each squared difference of mean
+ def sum_of_deviations_squared(data)
deviations = Array.new
+ average = self.mean(data)
sum_of_deviations = 0
data.each do |num|
deviations.push((num-average)**2)
end
deviations.each do |num|
sum_of_deviations += num
end
+ sum_of_deviations
+ end
+
+ # take in an array of numbers and calculate the standard deviation
+ def standard_deviation(data)
+ sum_of_deviations = self.sum_of_deviations_squared(data)
+
Math::sqrt(sum_of_deviations / (data.count-1))
end
+ def variance(data)
+ average = self.mean(data)
+ sum_of_deviations = self.sum_of_deviations_squared(data)
+ sum_of_deviations / data.count.to_f
+ end
+
# take in the array of numbers and calculate the median
def median(data)
halfway = data.count / 2
# Sort the array
@@ -46,11 +60,11 @@
# The median will be different based on the number of numbers in the array
# If there is an even number in the array
if(data.count % 2) == 0
median = (data[halfway] + data[halfway-1]) / 2.0
- # Else, there is an odd number in the array
+ # Else, there is an odd number of elements in the array
else
median = data[halfway]
end
median
@@ -60,7 +74,66 @@
def range(data)
# Sort the array
data = data.sort
data[data.count-1] - data[0]
end
-end
+ # take in an array of numbers and return the mode
+ def mode(data)
+ # Sort the array
+ data = data.sort
+
+ # create a flag to tell the user if all the numbers only appear once
+ no_mode = true
+
+ # The variable that will hold the highest number
+ highest_value = 0
+
+ # The variable that holds the most time the value appears
+ most_times = 0
+
+ # Create a new hash to hold the numbers
+ tmp = Hash.new
+
+ # Populate the hash
+ data.each do |num|
+ if tmp["#{num}"].nil? == false
+ tmp["#{num}"] = tmp["#{num}"].to_i + 1
+ else
+ tmp["#{num}"] = 1
+ end
+ end
+
+ # Check to make sure that there is a mode
+ data.each do |num|
+ if tmp["#{num}"].to_i > 1
+ no_mode = false
+ end
+ end
+
+ if no_mode == true
+ "There is no mode"
+ else
+ data.each do |num|
+ if tmp["#{num}"].to_i > most_times
+ highest_value = num
+ most_times = tmp["#{num}"]
+ end
+ end
+
+ # now loop through again just to make sure another number doesn't appear an equal number of times
+ data.each do |num|
+ if num != highest_value
+ if tmp["#{num}"].to_i == most_times
+ no_mode = true
+ end
+ end
+ end
+
+ if no_mode == true
+ "There is no mode"
+ else
+ highest_value
+ end
+ end
+ end
+end