[LON-CAPA-cvs] cvs: loncom /interface/statistics lonproblemanalysis.pm

matthew lon-capa-cvs@mail.lon-capa.org
Tue, 22 Feb 2005 05:28:22 -0000


matthew		Tue Feb 22 00:28:22 2005 EDT

  Modified files:              
    /loncom/interface/statistics	lonproblemanalysis.pm 
  Log:
  So the last commit of code for &numerical_plot_percent was stupid for
  plotting percents, but much better in &numerical_plot_differences, which
  now works well.
  
  
Index: loncom/interface/statistics/lonproblemanalysis.pm
diff -u loncom/interface/statistics/lonproblemanalysis.pm:1.112 loncom/interface/statistics/lonproblemanalysis.pm:1.113
--- loncom/interface/statistics/lonproblemanalysis.pm:1.112	Mon Feb 21 23:32:46 2005
+++ loncom/interface/statistics/lonproblemanalysis.pm	Tue Feb 22 00:28:21 2005
@@ -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 @@
     #
     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 @@
     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 @@
         $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 @@
     #
     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 @@
         '<th>'.&mt('Correct').'</th>'.
         '<th>'.&mt('Count').'</th>'.
         '</tr>'.$/;
-    for (my $i=0;$i<scalar(@{$bins});$i++) {
-        my $lownum;
-        if ($i == 0) {
-            $lownum = 0;
-        } else {
-            $lownum = $bins->[$i-1];
-        }
-        my $highnum = $bins->[$i];
+    for (my $i=0;$i<scalar(@{$bins}-1);$i++) {
+        my $lownum = $bins->[$i];
+        my $highnum = $bins->[$i+1];
         $table .= 
             '<tr>'.
             '<td>'.$labels->[$i].'</td>'.