MDL-14203 "split report into two seperate reports - Quiz Statistics report and Individual Item Analysis report" started quiz statistics report in directory 'statistics'

This commit is contained in:
jamiesensei 2008-06-10 16:18:10 +00:00
parent d558080856
commit 0c1c764e82
5 changed files with 286 additions and 0 deletions

View file

@ -0,0 +1,27 @@
<?PHP // $Id$
// quiz_analysis.php - created with Moodle 1.7 beta + (2006101003)
$string['statistics'] = 'Quiz statistics';
$string['calculatefrom'] = 'Calculate statistics from';
$string['quizinformation'] = 'Quiz information';
$string['quizoverallstatistics'] = 'Quiz overall statistics';
$string['quizname'] = 'Quiz name';
$string['coursename'] = 'Course name';
$string['nooffirstattempts'] = 'Number of first attempts';
$string['noofallattempts'] = 'Total number of attempts';
$string['statsforfirstattempts'] = 'Statistics for first attempts';
$string['statsforallattempts'] = 'Statistics for all attempts';
$string['firstattemptsavg'] = 'Average grade of first attempts';
$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['median'] = 'Median grade';
$string['standarddeviation'] = 'Standard deviation';
$string['skewness'] = 'Score distribution skewness';
$string['kurtosis'] = 'Score distribution kurtosis';
?>

View file

@ -243,4 +243,16 @@ function quiz_report_feedback_for_grade($grade, $quizid) {
return $feedbacktext; return $feedbacktext;
} }
function quiz_report_scale_sumgrades_as_percentage($rawgrade, $quiz, $round = true) {
if ($quiz->sumgrades) {
$grade = $rawgrade * 100 / $quiz->sumgrades;
if ($round) {
$grade = number_format($grade, $quiz->decimalpoints);
}
} else {
$grade = 0;
}
return $grade.' %';
}
?> ?>

View file

@ -0,0 +1,223 @@
<?php
/**
* This script lists student attempts
*
* @version $Id$
* @author Martin Dougiamas, Tim Hunt and others.
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package quiz
*//** */
require_once($CFG->libdir.'/tablelib.php');
require_once($CFG->dirroot.'/mod/quiz/report/statistics/statistics_form.php');
require_once($CFG->dirroot.'/mod/quiz/report/statistics/statistics_table.php');
class quiz_report extends quiz_default_report {
/**
* Display the report.
*/
function display($quiz, $cm, $course) {
global $CFG, $DB;
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$download = optional_param('download', '', PARAM_ALPHA);
$pageoptions = array();
$pageoptions['id'] = $cm->id;
$pageoptions['q'] = $quiz->id;
$pageoptions['mode'] = 'statistics';
$reporturl = new moodle_url($CFG->wwwroot.'/mod/quiz/report.php', $pageoptions);
$mform = new mod_quiz_report_statistics($reporturl);
if ($fromform = $mform->get_data()){
$useallattempts = $fromform->useallattempts;
if ($fromform->useallattempts){
set_user_preference('quiz_report_statistics_useallattempts', $fromform->useallattempts);
} else {
unset_user_preference('quiz_report_statistics_useallattempts');
}
} else {
$useallattempts = get_user_preferences('quiz_report_statistics_useallattempts', 0);
}
/// find out current groups mode
$currentgroup = groups_get_activity_group($cm, true);
if (!empty($currentgroup)) {
// all users who can attempt quizzes and who are in the currently selected group
if (!$groupstudents = get_users_by_capability($context, 'mod/quiz:attempt','','','','',$currentgroup,'',false)){
$groupstudents = array();
}
$groupstudentslist = join(',', array_keys($groupstudents));
$allowedlist = $groupstudentslist;
}
$questions = quiz_report_load_questions($quiz);
$table = new quiz_report_statistics_table($quiz , $questions, $reporturl);
$table->is_downloading($download, get_string('reportstatistics','quiz_statistics'),
"$course->shortname ".format_string($quiz->name,true));
if (!$table->is_downloading()) {
// Only print headers if not asked to download data
$this->print_header_and_tabs($cm, $course, $quiz, "statistics");
}
if ($groupmode = groups_get_activity_groupmode($cm)) { // Groups are being used
if (!$table->is_downloading()) {
groups_print_activity_menu($cm, $reporturl->out());
}
}
// Print information on the number of existing attempts
if (!$table->is_downloading()) { //do not print notices when downloading
print_heading(get_string('quizinformation', 'quiz_statistics'));
$quizinformationtable = new object();
$quizinformationtable->align = array('center', 'center');
$quizinformationtable->width = '60%';
$quizinformationtable->class = 'generaltable titlesleft';
$quizinformationtable->data = array();
$quizinformationtable->data[] = array(get_string('quizname', 'quiz_statistics'), $quiz->name);
$quizinformationtable->data[] = array(get_string('coursename', 'quiz_statistics'), $course->fullname);
if ($cm->idnumber){
$quizinformationtable->data[] = array(get_string('coursename', 'quiz_statistics'), $cm->idnumber);
}
if ($quiz->timeopen){
$quizinformationtable->data[] = array(get_string('quizopen', 'quiz'), userdate($quiz->timeopen));
}
if ($quiz->timeclose){
$quizinformationtable->data[] = array(get_string('quizclose', 'quiz'), userdate($quiz->timeclose));
}
if ($quiz->timeopen && $quiz->timeclose){
$quizinformationtable->data[] = array(get_string('duration'), format_time($quiz->timeclose - $quiz->timeopen));
}
print_table($quizinformationtable);
}
if (!$table->is_downloading()) {
// Print display options
$mform->set_data(array('useallattempts' => $useallattempts));
$mform->display();
}
$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 ' .
'GROUP BY (attempt=1)';
if (!$attempttotals = $DB->get_records_sql($sql, array('quiz' => $quiz->id))){
print_heading(get_string('noattempts','quiz'));
return true;
} else {
$firstattempt = $attempttotals[1];
$allattempts = new object();
$allattempts->countrecs = $firstattempt->countrecs +
(isset($attempttotals[0])?$attempttotals[0]->countrecs:0);
$allattempts->total = $firstattempt->total +
(isset($attempttotals[0])?$attempttotals[0]->total:0);
}
if (!$table->is_downloading()) {
print_heading(get_string('quizoverallstatistics', 'quiz_statistics'));
$quizoverallstatistics = new object();
$quizoverallstatistics->align = array('center', 'center');
$quizoverallstatistics->width = '60%';
$quizoverallstatistics->class = 'generaltable titlesleft';
$quizoverallstatistics->data = array();
$quizoverallstatistics->data[] = array(get_string('nooffirstattempts', 'quiz_statistics'), $firstattempt->countrecs);
$quizoverallstatistics->data[] = array(get_string('noofallattempts', 'quiz_statistics'), $allattempts->countrecs);
$quizoverallstatistics->data[] = array(get_string('firstattemptsavg', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($firstattempt->total / $firstattempt->countrecs, $quiz));
$quizoverallstatistics->data[] = array(get_string('allattemptsavg', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($allattempts->total / $allattempts->countrecs, $quiz));
print_table($quizoverallstatistics);
}
//get the median
if (!$table->is_downloading()) {
if ($useallattempts){
$usingattempts = $allattempts;
$usingattempts->heading = get_string('statsforallattempts', 'quiz_statistics');
$usingattempts->sql = '';
} else {
$usingattempts = $firstattempt;
$usingattempts->heading = get_string('statsforfirstattempts', 'quiz_statistics');
$usingattempts->sql = 'AND attempt=1 ';
}
print_heading($usingattempts->heading);
if (($usingattempts->countrecs/2)==floor($usingattempts->countrecs/2)){
//even number of attempts
$limitoffset = (floor($usingattempts->countrecs/2)) - 1;
$limit = 2;
} else {
$limitoffset = ($usingattempts->countrecs/2) - 1;
$limit = 1;
}
$sql = 'SELECT id, sumgrades ' .
'FROM {quiz_attempts} ' .
'WHERE quiz = :quiz AND preview=0 AND timefinish !=0 ' .
$usingattempts->sql.
'ORDER BY sumgrades';
if (!$mediangrades = $DB->get_records_sql_menu($sql, array('quiz' => $quiz->id), $limitoffset, $limit)){
print_error('errormedian', 'quiz_statistics');
}
if (count($mediangrades)==1){
$median = array_shift($mediangrades);
} else {
$median = array_shift($mediangrades);
$median += array_shift($mediangrades);
$median = $median /2;
}
//fetch sum of squared, cubed and power 4d
//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";
$params = array($mean, $mean, $mean, $quiz->id);
if (!$powers = $DB->get_record_sql($sql, $params)){
print_error('errorpowers', 'quiz_statistics');
}
$s = $usingattempts->countrecs;
$sd = sqrt($powers->power2 / ($s -1));
$m2= $powers->power2 / $s;
$m3= $powers->power3 / $s;
$m4= $powers->power4 / $s;
$k2= $s*$m2/($s-1);
$k3= $s*$s*$m3/(($s-1)*($s-2));
$k3= $s*$s*$s*$m3/(($s-1)*($s-2)*($s-3));
$k4= $s*$s*$s*(($s+1)*$m4-3*($s-1)*$m2*$m2)/(($s-1)*($s-2)*($s-3));
$skewness = $k3 / (pow($k2, 2/3));
$kurtosis = $k4 / ($k2*$k2);
$quizattsstatistics = new object();
$quizattsstatistics->align = array('center', 'center');
$quizattsstatistics->width = '60%';
$quizattsstatistics->class = 'generaltable titlesleft';
$quizattsstatistics->data = array();
$quizattsstatistics->data[] = array(get_string('median', 'quiz_statistics'), quiz_report_scale_sumgrades_as_percentage($median, $quiz));
$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);
print_table($quizattsstatistics);
}
return true;
}
}
?>

View file

@ -0,0 +1,20 @@
<?php // $Id$
require_once "$CFG->libdir/formslib.php";
class mod_quiz_report_statistics extends moodleform {
function definition() {
global $COURSE;
$mform =& $this->_form;
//-------------------------------------------------------------------------------
$mform->addElement('header', 'preferencespage', get_string('preferencespage', 'quiz_overview'));
$options = array();
$options[0] = get_string('attemptsfirst','quiz_statistics');
$options[1] = get_string('attemptsall','quiz_statistics');
$mform->addElement('select', 'useallattempts', get_string('calculatefrom', 'quiz_statistics'), $options);
$mform->setDefault('useallattempts', 0);
//-------------------------------------------------------------------------------
$this->add_action_buttons(false, get_string('preferencessave', 'quiz_overview'));
}
}
?>

View file

@ -3933,6 +3933,10 @@ table.quizreviewsummary td.cell {
width: 80%; width: 80%;
margin: auto; margin: auto;
} }
#mod-quiz-report table.titlesleft td.c0
{
font-weight: bold;
}
#mod-quiz-report table#attempts, #mod-quiz-report table#attempts,
#mod-quiz-report h2.main { #mod-quiz-report h2.main {
clear: both; clear: both;