[LON-CAPA-cvs] cvs: loncom /interface/statistics lonproblemanalysis.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Tue, 22 Feb 2005 22:51:16 -0000
matthew Tue Feb 22 17:51:16 2005 EDT
Modified files:
/loncom/interface/statistics lonproblemanalysis.pm
Log:
Finishing off NRA. Plots of percent difference and difference can be made.
Index: loncom/interface/statistics/lonproblemanalysis.pm
diff -u loncom/interface/statistics/lonproblemanalysis.pm:1.113 loncom/interface/statistics/lonproblemanalysis.pm:1.114
--- loncom/interface/statistics/lonproblemanalysis.pm:1.113 Tue Feb 22 00:28:21 2005
+++ loncom/interface/statistics/lonproblemanalysis.pm Tue Feb 22 17:51:16 2005
@@ -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.114 2005/02/22 22:51:16 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -303,21 +303,31 @@
#
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 +335,40 @@
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 +381,7 @@
#
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 +405,38 @@
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 +513,7 @@
&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 +561,9 @@
'</tr>'.$/;
for (my $i=0;$i<scalar(@{$bins}-1);$i++) {
my $lownum = $bins->[$i];
+ if ($i == 0) { $lownum = '-∞'; }
my $highnum = $bins->[$i+1];
+ if ($i == scalar(@{$bins})-2) { $highnum = '∞'; }
$table .=
'<tr>'.
'<td>'.$labels->[$i].'</td>'.