From 8f0deab53b3a14632b749d35f9118df7097d1e27 Mon Sep 17 00:00:00 2001 From: Gabe Farrell Date: Wed, 7 Jun 2023 03:38:56 +0000 Subject: [PATCH] Use weighted average instead of simple average when calculating response rates --- .../student_response_rate_calculator.rb | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/app/models/student_response_rate_calculator.rb b/app/models/student_response_rate_calculator.rb index 9b3cb95f..0d594c10 100644 --- a/app/models/student_response_rate_calculator.rb +++ b/app/models/student_response_rate_calculator.rb @@ -2,7 +2,17 @@ class StudentResponseRateCalculator < ResponseRateCalculator def raw_response_rate - rates_by_grade.length.positive? ? rates_by_grade.average : 0 + rates_by_grade.values.length.positive? ? weighted_average : 0 + end + + def weighted_average + num_possible_responses = 0.0 + rates_by_grade.keys.map do |grade| + num_possible_responses += enrollment_by_grade[grade] + end + rates_by_grade.map do |grade, rate| + rate * (enrollment_by_grade[grade] / num_possible_responses) + end.sum end def rates_by_grade @@ -15,16 +25,20 @@ class StudentResponseRateCalculator < ResponseRateCalculator next nil end - actual_response_count_for_grade / count_of_survey_items_with_sufficient_responses / num_of_students_in_grade * 100 - end.compact + [grade, actual_response_count_for_grade / count_of_survey_items_with_sufficient_responses / num_of_students_in_grade * 100] + end.compact.to_h end def enrollment_by_grade @enrollment_by_grade ||= respondents.counts_by_grade end + def total_enrollment + respondents.counts_by_grade.sum + end + def survey_items_have_sufficient_responses? - rates_by_grade.length.positive? + rates_by_grade.values.length.positive? end def survey_items_with_sufficient_responses(grade:)