From: jamiesensei Date: Tue, 10 Jun 2008 18:15:19 +0000 (+0000) Subject: MDL-14203 "split report into two seperate reports - Quiz Statistics report and Indivi... X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=08a7ead5d1bb755df95a13b93641985ffc6f4a20;p=moodle.git MDL-14203 "split report into two seperate reports - Quiz Statistics report and Individual Item Analysis report" added CIC, ER and SE calculations. Calculation needs debugging. --- diff --git a/lang/en_utf8/quiz_statistics.php b/lang/en_utf8/quiz_statistics.php index dfed5f6110..7feab43a30 100644 --- a/lang/en_utf8/quiz_statistics.php +++ b/lang/en_utf8/quiz_statistics.php @@ -19,9 +19,13 @@ $string['allattemptsavg'] = 'Average grade of all attempts'; $string['attemptsall'] = 'all attempts'; $string['attemptsfirst'] = 'first attempt'; $string['errormedian'] = 'Error fetching median'; -$string['errorpowers'] = 'Error fetching powers'; +$string['errorpowers'] = 'Error fetching data to calculate variance for quiz grades'; +$string['errorpowerquestions'] = 'Error fetching data to calculate variance for question grades'; $string['median'] = 'Median grade'; $string['standarddeviation'] = 'Standard deviation'; $string['skewness'] = 'Score distribution skewness'; $string['kurtosis'] = 'Score distribution kurtosis'; +$string['cic'] = 'Coefficient of internal consistency'; +$string['errorratio'] = 'Error ratio'; +$string['standarderror'] = 'Standard error'; ?> \ No newline at end of file diff --git a/mod/quiz/report/statistics/report.php b/mod/quiz/report/statistics/report.php index 57eab21a08..e2db6c6bce 100644 --- a/mod/quiz/report/statistics/report.php +++ b/mod/quiz/report/statistics/report.php @@ -101,13 +101,14 @@ class quiz_report extends quiz_default_report { $mform->set_data(array('useallattempts' => $useallattempts)); $mform->display(); } - + $fromqa = '{quiz_attempts} qa '; + $whereqa = 'quiz = ? AND preview=0 AND timefinish !=0 '; $sql = 'SELECT (attempt=1) AS isfirst, COUNT(1) AS countrecs, SUM(sumgrades) AS total ' . - 'FROM {quiz_attempts} ' . - 'WHERE quiz = :quiz AND preview=0 AND timefinish !=0 ' . + 'FROM '.$fromqa. + 'WHERE ' .$whereqa. 'GROUP BY (attempt=1)'; - if (!$attempttotals = $DB->get_records_sql($sql, array('quiz' => $quiz->id))){ + if (!$attempttotals = $DB->get_records_sql($sql, array($quiz->id))){ print_heading(get_string('noattempts','quiz')); return true; } else { @@ -133,8 +134,6 @@ class quiz_report extends quiz_default_report { print_table($quizoverallstatistics); } //get the median - - if (!$table->is_downloading()) { if ($useallattempts){ $usingattempts = $allattempts; @@ -143,7 +142,7 @@ class quiz_report extends quiz_default_report { } else { $usingattempts = $firstattempt; $usingattempts->heading = get_string('statsforfirstattempts', 'quiz_statistics'); - $usingattempts->sql = 'AND attempt=1 '; + $usingattempts->sql = 'AND qa.attempt=1 '; } print_heading($usingattempts->heading); if (($usingattempts->countrecs/2)==floor($usingattempts->countrecs/2)){ @@ -155,11 +154,11 @@ class quiz_report extends quiz_default_report { $limit = 1; } $sql = 'SELECT id, sumgrades ' . - 'FROM {quiz_attempts} ' . - 'WHERE quiz = :quiz AND preview=0 AND timefinish !=0 ' . + 'FROM ' .$fromqa. + 'WHERE ' .$whereqa. $usingattempts->sql. 'ORDER BY sumgrades'; - if (!$mediangrades = $DB->get_records_sql_menu($sql, array('quiz' => $quiz->id), $limitoffset, $limit)){ + if (!$mediangrades = $DB->get_records_sql_menu($sql, array($quiz->id), $limitoffset, $limit)){ print_error('errormedian', 'quiz_statistics'); } if (count($mediangrades)==1){ @@ -173,13 +172,12 @@ class quiz_report extends quiz_default_report { //differences between grades and mean grade $mean = $usingattempts->total / $usingattempts->countrecs; $sql = "SELECT " . - "SUM(POWER((sumgrades - ?),2)) AS power2, " . - "SUM(POWER((sumgrades - ?),3)) AS power3, ". - "SUM(POWER((sumgrades - ?),4)) AS power4 ". - "FROM {quiz_attempts} " . - "WHERE quiz = ? AND preview=0 AND timefinish !=0 " . - $usingattempts->sql. - "ORDER BY sumgrades"; + "SUM(POWER((qa.sumgrades - ?),2)) AS power2, " . + "SUM(POWER((qa.sumgrades - ?),3)) AS power3, ". + "SUM(POWER((qa.sumgrades - ?),4)) AS power4 ". + 'FROM ' .$fromqa. + 'WHERE ' .$whereqa. + $usingattempts->sql; $params = array($mean, $mean, $mean, $quiz->id); if (!$powers = $DB->get_record_sql($sql, $params)){ print_error('errorpowers', 'quiz_statistics'); @@ -211,9 +209,53 @@ class quiz_report extends quiz_default_report { $quizattsstatistics->data[] = array(get_string('standarddeviation', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($sd, $quiz)); $quizattsstatistics->data[] = array(get_string('skewness', 'quiz_statistics'), $skewness); $quizattsstatistics->data[] = array(get_string('kurtosis', 'quiz_statistics'), $kurtosis); + + $qgradeavgsql = "SELECT qs.question, AVG(qs.grade) FROM " . + "{question_sessions} qns, " . + "{question_states} qs, " . + "{question} q, " . + $fromqa.' '. + 'WHERE ' .$whereqa. + 'AND qns.attemptid = qa.uniqueid '. + 'AND qs.question = q.id ' . + 'AND q.length > 0 '. + $usingattempts->sql. + 'AND qns.newgraded = qs.id GROUP BY qs.question'; + $qgradeavgs = $DB->get_records_sql_menu($qgradeavgsql, array($quiz->id)); + $sum = 0; + foreach ($qgradeavgs as $qid => $qgradeavg){ + $sql = 'SELECT ' . + 'SUM(POWER((qs.grade - ?),2)) AS power2 ' . + 'FROM ' . + '{question_sessions} qns, ' . + '{question_states} qs, ' . + '{question} q, ' . + $fromqa.' '. + 'WHERE ' .$whereqa. + 'AND qns.attemptid = qa.uniqueid '. + 'AND qs.question = ? ' . + $usingattempts->sql. + 'AND qns.newgraded = qs.id'; + $params = array($qgradeavg, $quiz->id, $qid); + $power = $DB->get_field_sql($sql, $params); + if ($power === false){ + print_error('errorpowerquestions', 'quiz_statistics'); + } + $sum += $power; + } + $sumofvarianceforallpositions = $sum / ($usingattempts->countrecs -1); + $p = count($qgradeavgs);//no of positions + $cic = (100 * $p / ($p -1)) * (1 - ($sumofvarianceforallpositions/$k2)); + $quizattsstatistics->data[] = array(get_string('cic', 'quiz_statistics'), number_format($cic, $quiz->decimalpoints).' %'); + $errorratio = 100 * sqrt(1-($cic/100)); + $quizattsstatistics->data[] = array(get_string('errorratio', 'quiz_statistics'), number_format($errorratio, $quiz->decimalpoints).' %'); + $standarderror = ($errorratio * $sd / 100); + $quizattsstatistics->data[] = array(get_string('standarderror', 'quiz_statistics'), + quiz_report_scale_sumgrades_as_percentage($standarderror, $quiz)); + print_table($quizattsstatistics); - } + } return true; }