--- loncom/interface/statistics/lonproblemanalysis.pm 2005/02/22 05:28:21 1.113
+++ loncom/interface/statistics/lonproblemanalysis.pm 2005/03/14 20:28:22 1.118
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonproblemanalysis.pm,v 1.113 2005/02/22 05:28:21 matthew Exp $
+# $Id: lonproblemanalysis.pm,v 1.118 2005/03/14 20:28:22 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -97,6 +97,9 @@ sub BuildProblemAnalysisPage {
$r->print($html.(' 'x5));
}
#
+ $r->print(&Apache::lonstathelpers::submission_report_form
+ ('problem_analysis'));
+ #
$r->print('
');
$r->rflush();
#
@@ -104,7 +107,7 @@ sub BuildProblemAnalysisPage {
my $current_problem = &Apache::lonstathelpers::get_target_from_id
($ENV{'form.problemchoice'});
#
- my ($prev,$curr,$next) =
+ my ($navmap,$prev,$curr,$next) =
&Apache::lonstathelpers::get_prev_curr_next($current_problem,
$problem_types,
'response',
@@ -127,14 +130,15 @@ sub BuildProblemAnalysisPage {
$r->print('resource is undefined');
} else {
my $resource = $current_problem->{'resource'};
- $r->print(''.$resource->{'title'}.'
');
- $r->print(''.$resource->{'src'}.'
');
+ $r->print(''.$resource->compTitle.'
');
+ $r->print(''.$resource->src.'
');
+ $r->print(''.&Apache::lonstatistics::section_and_enrollment_description().'
');
if ($ENV{'form.show_prob'} eq 'true') {
$r->print(&Apache::lonstathelpers::render_resource($resource));
}
$r->rflush();
my %Data = &Apache::lonstathelpers::get_problem_data
- ($resource->{'src'});
+ ($resource->src);
my $problem_data = $Data{$current_problem->{'part'}.
'.'.
$current_problem->{'respid'}};
@@ -159,8 +163,7 @@ sub BuildProblemAnalysisPage {
&mt('Analyze Problem').'" />');
$r->print(' 'x5);
$r->print(''.&mt('Please select a problem to analyze').'
');
- $r->print(&Apache::lonstathelpers::ProblemSelector
- ($problem_types));
+ $r->print(&Apache::lonstathelpers::problem_selector($problem_types));
}
}
@@ -184,9 +187,9 @@ sub numerical_response_analysis {
$problem->{'respid'});
# Gather student data
my $response_data = &Apache::loncoursedata::get_response_data
- (\@Apache::lonstatistics::SelectedSections,
+ ([&Apache::lonstatistics::get_selected_sections()],
$Apache::lonstatistics::enrollment_status,
- $resource->{'symb'},$respid);
+ $resource->symb,$respid);
#
$problem_analysis->{'answercomputed'} = 1;
if ($problem_analysis->{'answercomputed'}) {
@@ -303,21 +306,31 @@ sub numerical_plot_percent {
#
my $total = $stats->{'submission_count'};
return '' if ($total == 0);
- my $min_bin_size = $stats->{'min_percent'};
- my $low_bin = $stats->{'lowest_ans'}-$stats->{'max_bin_size'};
- my $high_bin = $stats->{'highest_ans'}+$stats->{'max_bin_size'};
- if ($high_bin > 0 && $low_bin > -$high_bin) {
- $low_bin = -$high_bin;
- } elsif ($low_bin < 0 && $high_bin < -$low_bin) {
- $high_bin = -$low_bin;
+ my $max_bins = 50;
+ my $lowest_percent = $stats->{'min_percent'};
+ my $highest_percent = $stats->{'max_percent'};
+ my $percent_spread = $highest_percent - $lowest_percent;
+ foreach (qw/20 30 40 50 100 200/) {
+ if ($percent_spread < $_) {
+ $highest_percent =$_/2;
+ last;
+ }
}
- if (($high_bin -$low_bin)/$min_bin_size > 1000) {
- $min_bin_size = abs($high_bin - $low_bin) / 1000;
+ my $bin_size = 1;
+ foreach (qw/0.01 0.05 0.1 0.5 1 2 5 10 20 25 50 100/) {
+ if ($lowest_percent/2 < $_){
+ $bin_size = $_;
+ last;
+ }
}
my @bins;
- for (my $num = $low_bin;$num <= $high_bin;$num+=($min_bin_size/2)) {
- push(@bins,$num);
+ for (my $bin = -$highest_percent;$bin<0;$bin+=$bin_size) {
+ push (@bins,$bin);
}
+ for (my $bin = 0; $bin<$highest_percent;$bin+=$bin_size) {
+ push (@bins,$bin);
+ }
+ push(@bins,$highest_percent);
#
my @correct;
my @incorrect;
@@ -325,46 +338,40 @@ sub numerical_plot_percent {
while (my ($ans,$submissions) = each(%$responses)) {
while (my ($submission,$counts) = each(%$submissions)) {
my ($correct_count,$incorrect_count) = @$counts;
- my $scaled_value = ($submission-$ans)/$ans;
- my $bin=0;
- for ($bin=0;$bin<$#bins;$bin++) { # not <= for a reason
+ my $scaled_value = 100*($submission-$ans)/abs($ans);
+ if ($scaled_value < $bins[0]) {
+ $bins[0]=$scaled_value -1;
+ }
+ my $bin;
+ for ($bin=0;$bin<$#bins;$bin++) {
last if ($bins[$bin]>$scaled_value);
}
- $correct[$bin]+=$correct_count;
- $incorrect[$bin]+=$incorrect_count;
- $count[$bin]+=$correct_count+$incorrect_count;
+ $correct[$bin-1]+=$correct_count;
+ $incorrect[$bin-1]+=$incorrect_count;
+ $count[$bin-1]+=$correct_count+$incorrect_count;
}
}
#
- # Skip empty bins
- my (@plot_correct,@plot_incorrect,@new_bins,@new_count);
- my $min_skip = 2;
- for (my $i=0;$i<=$#bins;$i++) {
- my $sum=0;
- for (my $j=-$min_skip;$j<=$min_skip && $i+$j<=$#bins;$j++) {
- $sum += $correct[$i+$j] + $incorrect[$i+$j];
- }
- if ($sum) {
- push(@new_bins,$bins[$i]);
- push(@plot_correct,$correct[$i]);
- push(@plot_incorrect,$incorrect[$i]);
- push(@new_count,$correct[$i]+$incorrect[$i]);
- }
- }
- @correct = @plot_correct;
- @incorrect = @plot_incorrect;
- @count = @new_count;
- @bins = @new_bins;
- for (my $i=0;$i<=$#bins;$i++) {
+ my @plot_correct = @correct;
+ my @plot_incorrect = @incorrect;
+ my $max;
+ for (my $i=0;$i<$#bins;$i++) {
$plot_correct[$i] *= 100/$total;
$plot_incorrect[$i] *= 100/$total;
+ if (! defined($max) ||
+ $max < $plot_correct[$i]+$plot_incorrect[$i] ) {
+ $max = $plot_correct[$i]+$plot_incorrect[$i];
+ }
+ }
+ foreach (qw/1 5 10 15 20 25 30 40 50 75 100/) {
+ if ($max <$_) { $max = $_; last; }
}
#
my $title = &mt('Percent Difference');
- my @labels = (1..scalar(@bins));
+ my @labels = (1..scalar(@bins)-1);
my $graph = &Apache::loncommon::DrawBarGraph
- ($title,'Percent difference from correct','Number of answers',
- 100,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
+ ($title,'Percent Difference from Correct','Percent of Answers',
+ $max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
{xskip=>1});
#
my $table = $graph.$/.
@@ -377,7 +384,7 @@ sub numerical_plot_differences {
#
my $total = $stats->{'submission_count'};
return '' if ($total == 0);
- my $max_bins = 50;
+ my $max_bins = 21;
my $min_bin_size = $stats->{'min_abs'};
my $low_bin = $stats->{'lowest_ans'}-$stats->{'max_bin_size'};
my $high_bin = $stats->{'highest_ans'}+$stats->{'max_bin_size'};
@@ -401,27 +408,38 @@ sub numerical_plot_differences {
while (my ($submission,$counts) = each(%$submissions)) {
my ($correct_count,$incorrect_count) = @$counts;
my $scaled_value = $submission-$ans;
+ if ($scaled_value < $bins[0]) {
+ $bins[0]=$scaled_value-1;
+ }
my $bin=0;
- for ($bin=0;$bin<$#bins;$bin++) { # not <= for a reason
+ for ($bin=0;$bin<$#bins;$bin++) {
last if ($bins[$bin]>$scaled_value);
}
- $correct[$bin]+=$correct_count;
- $incorrect[$bin]+=$incorrect_count;
- $count[$bin]+=$correct_count+$incorrect_count;
+ $correct[$bin-1]+=$correct_count;
+ $incorrect[$bin-1]+=$incorrect_count;
+ $count[$bin-1]+=$correct_count+$incorrect_count;
}
}
my @plot_correct = @correct;
my @plot_incorrect = @incorrect;
+ my $max;
for (my $i=0;$i<=$#bins;$i++) {
$plot_correct[$i] *= 100/$total;
$plot_incorrect[$i] *= 100/$total;
+ if (! defined($max) ||
+ $max < $plot_correct[$i]+$plot_incorrect[$i] ) {
+ $max = $plot_correct[$i]+$plot_incorrect[$i];
+ }
+ }
+ foreach (qw/1 5 10 15 20 25 30 40 50 75 100/) {
+ if ($max <$_) { $max = $_; last; }
}
#
my $title = &mt('Difference between submission and correct');
- my @labels = (1..scalar(@bins));
+ my @labels = (1..scalar(@bins)-1);
my $graph = &Apache::loncommon::DrawBarGraph
- ($title,'Difference from Correct','Number of answers',
- 100,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
+ ($title,'Difference from Correct','Percent of Answers',
+ $max,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect,
{xskip=>1});
#
my $table = $graph.$/.
@@ -498,7 +516,7 @@ sub numerical_classify_responses {
&capa::caparesponse_get_real_response($myunit,
$mysub,
\$scaled);
- &Apache::lonnet::logthis('scaled = '.$scaled.' result ='.$result);
+# &Apache::lonnet::logthis('scaled = '.$scaled.' result ='.$result);
next if (! defined($scaled));
# next if ($result ne '6');
my $submission = $scaled;
@@ -546,7 +564,9 @@ sub numerical_bin_table {
''.$/;
for (my $i=0;$i[$i];
+ if ($i == 0) { $lownum = '-∞'; }
my $highnum = $bins->[$i+1];
+ if ($i == scalar(@{$bins})-2) { $highnum = '∞'; }
$table .=
''.
''.$labels->[$i].' | '.
@@ -746,9 +766,9 @@ sub radio_response_analysis {
$analysis_html .= $table;
# Gather student data
my $response_data = &Apache::loncoursedata::get_response_data
- (\@Apache::lonstatistics::SelectedSections,
+ ([&Apache::lonstatistics::get_selected_sections()],
$Apache::lonstatistics::enrollment_status,
- $resource->{'symb'},$respid);
+ $resource->symb,$respid);
my $correct; # either a hash reference or a scalar
if ($problem_analysis->{'answercomputed'} || scalar(@$concepts) > 1) {
# This takes a while for large classes...
@@ -1153,9 +1173,9 @@ sub OptionResponseAnalysis {
$problem->{'respid'});
# Note: part data is not needed.
my $PerformanceData = &Apache::loncoursedata::get_response_data
- (\@Apache::lonstatistics::SelectedSections,
+ ([&Apache::lonstatistics::get_selected_sections()],
$Apache::lonstatistics::enrollment_status,
- $resource->{'symb'},$respid);
+ $resource->symb,$respid);
if (! defined($PerformanceData) ||
ref($PerformanceData) ne 'ARRAY' ) {
$r->print(''.
@@ -1289,6 +1309,7 @@ sub OR_tries_analysis {
# Create Foil Plots
my $data_count = $response_data{'_total'}->[$try];
my $correct = $response_data{'_correct'}->[$try];
+ if (! defined($correct)) { $correct = 0; }
my @Datasets;
foreach my $option ('_correct',@{$ORdata->{'_Options'}}) {
next if (! exists($foil_plot[$try]->{$option}));
@@ -1794,7 +1815,6 @@ sub CreateInterface {
$Str .= '';
$Str .= ''.&mt('Sections').' | ';
$Str .= ''.&mt('Enrollment Status').' | ';
-# $Str .= ''.&mt('Sequences and Folders').' | ';
$Str .= ' | ';
$Str .= '
'."\n";
##
@@ -1807,17 +1827,6 @@ sub CreateInterface {
$Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
$Str .= '';
#
-# $Str .= '';
- my $only_seq_with_assessments = sub {
- my $s=shift;
- if ($s->{'num_assess'} < 1) {
- return 0;
- } else {
- return 1;
- }
- };
- &Apache::lonstatistics::MapSelect('Maps','multiple,all',5,
- $only_seq_with_assessments);
##
##
$Str .= ' | ';
|