--- loncom/interface/statistics/lonproblemanalysis.pm 2005/02/22 04:32:46 1.112 +++ loncom/interface/statistics/lonproblemanalysis.pm 2005/02/22 05:28:21 1.113 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonproblemanalysis.pm,v 1.112 2005/02/22 04:32:46 matthew Exp $ +# $Id: lonproblemanalysis.pm,v 1.113 2005/02/22 05:28:21 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -303,9 +303,17 @@ sub numerical_plot_percent { # my $total = $stats->{'submission_count'}; return '' if ($total == 0); - my $min_bin_size = $stats->{'min_abs'}; + 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; + } + if (($high_bin -$low_bin)/$min_bin_size > 1000) { + $min_bin_size = abs($high_bin - $low_bin) / 1000; + } my @bins; for (my $num = $low_bin;$num <= $high_bin;$num+=($min_bin_size/2)) { push(@bins,$num); @@ -317,7 +325,7 @@ 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 = abs(($submission-$ans)/$ans); + my $scaled_value = ($submission-$ans)/$ans; my $bin=0; for ($bin=0;$bin<$#bins;$bin++) { # not <= for a reason last if ($bins[$bin]>$scaled_value); @@ -352,7 +360,7 @@ sub numerical_plot_percent { $plot_incorrect[$i] *= 100/$total; } # - my $title = &mt('Distribution by Percent'); + my $title = &mt('Percent Difference'); my @labels = (1..scalar(@bins)); my $graph = &Apache::loncommon::DrawBarGraph ($title,'Percent difference from correct','Number of answers', @@ -369,42 +377,50 @@ sub numerical_plot_differences { # my $total = $stats->{'submission_count'}; return '' if ($total == 0); - # + my $max_bins = 50; + 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'}; + if ($high_bin > 0 && $low_bin > -$high_bin) { + $low_bin = -$high_bin; + } elsif ($low_bin < 0 && $high_bin < -$low_bin) { + $high_bin = -$low_bin; + } + if (($high_bin -$low_bin)/$min_bin_size * 2 > $max_bins) { + $min_bin_size = abs($high_bin - $low_bin) / $max_bins * 2; + } my @bins; - my @labels; - # Hmmmm, should switch to absolute difference - for (my $i=1;$i<=20;$i++) { - push(@bins,$i/2); - push(@labels,$i); + for (my $num = $low_bin;$num <= $high_bin;$num+=($min_bin_size/2)) { + push(@bins,$num); } # my @correct; my @incorrect; my @count; while (my ($ans,$submissions) = each(%$responses)) { - next if ($ans =~ /^_/); while (my ($submission,$counts) = each(%$submissions)) { my ($correct_count,$incorrect_count) = @$counts; - my $value = abs($submission-$ans); + my $scaled_value = $submission-$ans; my $bin=0; for ($bin=0;$bin<$#bins;$bin++) { # not <= for a reason - last if ($bins[$bin]>$value); + last if ($bins[$bin]>$scaled_value); } $correct[$bin]+=$correct_count; $incorrect[$bin]+=$incorrect_count; $count[$bin]+=$correct_count+$incorrect_count; } } - # - my @plot_correct; - my @plot_incorrect; + my @plot_correct = @correct; + my @plot_incorrect = @incorrect; for (my $i=0;$i<=$#bins;$i++) { - $plot_correct[$i] = $correct[$i]*100/$total; - $plot_incorrect[$i] = $incorrect[$i]*100/$total; + $plot_correct[$i] *= 100/$total; + $plot_incorrect[$i] *= 100/$total; } - my $title = &mt('Distribution by Magnitude'); + # + my $title = &mt('Difference between submission and correct'); + my @labels = (1..scalar(@bins)); my $graph = &Apache::loncommon::DrawBarGraph - ($title,'magnitude difference from correct','Number of answers', + ($title,'Difference from Correct','Number of answers', 100,['#33FF00','#FF3300'],\@labels,\@plot_correct,\@plot_incorrect, {xskip=>1}); # @@ -528,14 +544,9 @@ sub numerical_bin_table { ''.&mt('Correct').''. ''.&mt('Count').''. ''.$/; - for (my $i=0;$i[$i-1]; - } - my $highnum = $bins->[$i]; + for (my $i=0;$i[$i]; + my $highnum = $bins->[$i+1]; $table .= ''. ''.$labels->[$i].''.