Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.97 and 1.102

version 1.97, 2004/10/29 15:27:39 version 1.102, 2004/11/02 20:45:41
Line 164  sub BuildProblemAnalysisPage { Line 164  sub BuildProblemAnalysisPage {
                     }                      }
                 }                  }
             } else {              } else {
                 $r->print('<h2>This analysis is not supported</h2>');                  $r->print('<h2>Analysis of '.$current_problem->{'resptype'}.' is not supported</h2>');
             }              }
         }          }
         $r->print('<hr />');          $r->print('<hr />');
Line 240  sub NumericalResponseAnalysis { Line 240  sub NumericalResponseAnalysis {
     my $height = 100;      my $height = 100;
     my $plot = &one_dimensional_plot($r,500,100,scalar(@$Students),      my $plot = &one_dimensional_plot($r,500,100,scalar(@$Students),
                                      \@Labels,\@PlotData);                                       \@Labels,\@PlotData);
   
     $r->print($plot);      $r->print($plot);
     return;      return;
 }  }
Line 390  sub radio_response_analysis { Line 391  sub radio_response_analysis {
     my $foildata = $problem_analysis->{'_Foils'};      my $foildata = $problem_analysis->{'_Foils'};
     my ($table,$foils,$concepts) = &build_foil_index($problem_analysis);      my ($table,$foils,$concepts) = &build_foil_index($problem_analysis);
     #      #
       my %true_foils;
     my $num_true = 0;      my $num_true = 0;
     foreach my $foil (@$foils) {      if (! $problem_analysis->{'answercomputed'}) {
         if ($foildata->{$foil}->{'value'} eq 'true') {          foreach my $foil (@$foils) {
             $num_true++;               if ($foildata->{$foil}->{'value'} eq 'true') {
                   $true_foils{$foil}++; 
               }
         }          }
           $num_true = scalar(keys(%true_foils));
     }      }
     #      #
     $analysis_html .= $table;      $analysis_html .= $table;
Line 433  sub radio_response_analysis { Line 438  sub radio_response_analysis {
     #      #
     $analysis_html.='<table>';      $analysis_html.='<table>';
     for (my $plot_num = 1;$plot_num<=$ENV{'form.NumPlots'};$plot_num++) {      for (my $plot_num = 1;$plot_num<=$ENV{'form.NumPlots'};$plot_num++) {
         &Apache::lonnet::logthis('plot num = '.$plot_num);  
         # classify data ->correct foil -> selected foil          # classify data ->correct foil -> selected foil
         my ($restriction_function,          my ($restriction_function,
             $correct_foil_title,$incorrect_foil_title,              $correct_foil_title,$incorrect_foil_title,
Line 458  sub radio_response_analysis { Line 462  sub radio_response_analysis {
                  &get_time_from_row($response_data->[-1]),                   &get_time_from_row($response_data->[-1]),
                  $plot_num);                   $plot_num);
             $pre_graph_text =               $pre_graph_text = 
                 'Data from [_5] to [_6], [_2] submissions, [_3] correct, [_4] incorrect';                  'Data from [_6] to [_7]<br /> [_2] submissions from [_5] students, [_3] correct, [_4] incorrect';
             $extra_data[0] = &Apache::lonlocal::locallocaltime($starttime);              $extra_data[0] = &Apache::lonlocal::locallocaltime($starttime);
             $extra_data[1] = &Apache::lonlocal::locallocaltime($endtime);              $extra_data[1] = &Apache::lonlocal::locallocaltime($endtime);
             #              #
Line 509  sub radio_response_analysis { Line 513  sub radio_response_analysis {
         if ($problem_analysis->{'answercomputed'} || $num_true > 1) {          if ($problem_analysis->{'answercomputed'} || $num_true > 1) {
             ($stacked_plot,$count_by_foil) =              ($stacked_plot,$count_by_foil) =
                 &RR_create_stacked_selection_plot($foils,$foil_choice_data,                  &RR_create_stacked_selection_plot($foils,$foil_choice_data,
                                                   $incorrect_foil_title);                                                    $incorrect_foil_title,
                                                     \%true_foils);
         }          }
         #          #
         if ($concept_plot ne '' ||          if ($concept_plot ne '' ||
Line 524  sub radio_response_analysis { Line 529  sub radio_response_analysis {
                 '<font size="+1">'.                  '<font size="+1">'.
                 &mt($pre_graph_text,                  &mt($pre_graph_text,
                     $plot_num,$foil_choice_data->{'_count'},                      $plot_num,$foil_choice_data->{'_count'},
                     $correct,                                          $correct,
                     $foil_choice_data->{'_count'}-$correct,                      $foil_choice_data->{'_count'}-$correct,
                       $foil_choice_data->{'_students'},
                     @extra_data).                      @extra_data).
                     '</td></tr>'.$/;                      '</td></tr>'.$/;
             $analysis_html.=              $analysis_html.=
Line 627  sub RR_concept_plot { Line 633  sub RR_concept_plot {
 sub RR_create_percent_selected_plot {  sub RR_create_percent_selected_plot {
     my ($concepts,$foils,$foil_data,$title) = @_;      my ($concepts,$foils,$foil_data,$title) = @_;
     #      #
     my %foil_selections;      if ($foil_data->{'_count'} == 0) { return ''; };
     my %true;      my %correct_selections;
       my %incorrect_selections;
     foreach my $foil (@$foils) {      foreach my $foil (@$foils) {
         # foil_data has format $foil_data->{true_foil}->{selected foil}          # foil_data has format $foil_data->{true_foil}->{selected foil}=count
         next if (! exists($foil_data->{$foil}));          next if (! exists($foil_data->{$foil}));
         $true{$foil}++;  
         while (my ($f,$count)= each(%{$foil_data->{$foil}})) {          while (my ($f,$count)= each(%{$foil_data->{$foil}})) {
             $foil_selections{$f}+=$count;              if ($f eq $foil) {
                   $correct_selections{$foil} += $count;
               } else {
                   $incorrect_selections{$f} += $count;
               }
         }          }
     }      }
     #       # 
Line 643  sub RR_create_percent_selected_plot { Line 653  sub RR_create_percent_selected_plot {
     my @correct;      my @correct;
     my @incorrect;      my @incorrect;
     #      #
     my $total =0;      my $total = $foil_data->{'_count'};
     for (my $i=0;$i<scalar(@$foils);$i++) {      for (my $i=0;$i<scalar(@$foils);$i++) {
         my $foil = $foils->[$i];          my $foil = $foils->[$i];
         if ($true{$foil}) {          $correct[$i]   = $correct_selections{$foil};
             $correct[$i]   = $foil_selections{$foil};          $incorrect[$i] = $incorrect_selections{$foil};
             $incorrect[$i] = 0;  
         } else {  
             $correct[$i]   = 0;  
             $incorrect[$i] = $foil_selections{$foil};  
         }  
         $total+=$foil_selections{$foil};  
     }      }
     if ($total == 0) { return ''; };  
     for (my $i=0;$i<=$#correct;$i++) {       for (my $i=0;$i<=$#correct;$i++) { 
         $correct[$i] = sprintf('%0f',$correct[$i]/$total*100);          $correct[$i] = sprintf('%2f',$correct[$i]/$total*100);
     }      }
     for (my $i=0;$i<=$#incorrect;$i++) {      for (my $i=0;$i<=$#incorrect;$i++) {
         $incorrect[$i] = sprintf('%0f',$incorrect[$i]/$total*100);          $incorrect[$i] = sprintf('%2f',$incorrect[$i]/$total*100);
     }      }
     #      #
     # Put a blank in the data sets between concepts, if there are concepts      # Put a blank in the data sets between concepts, if there are concepts
Line 698  sub RR_create_percent_selected_plot { Line 701  sub RR_create_percent_selected_plot {
 }  }
   
 sub RR_create_stacked_selection_plot {  sub RR_create_stacked_selection_plot {
     my ($foils,$foil_data,$title)=@_;      my ($foils,$foil_data,$title,$true_foils)=@_;
     #      #
     my @dataset; # array of array refs - multicolor rows $datasets[row]->[col]      my @dataset; # array of array refs - multicolor rows $datasets[row]->[col]
     my @labels;      my @labels;
     my $count;      my $count;
     my %column; # maps foil name to column in @datasets      my %column; # maps foil name to column in @datasets
     for (my $i=0;$i<scalar(@$foils);$i++) {      for (my $i=0;$i<scalar(@$foils);$i++) {
           my $foil = $foils->[$i];
           if (defined($true_foils) && scalar(keys(%$true_foils)) > 0 ) {
               next if (! $true_foils->{$foil} );
               push(@labels,$i+1);
           } else {
               next if (! exists($foil_data->{$foil}));
               push(@labels,$i+1);
           }
         next if (! exists($foil_data->{$foils->[$i]}));          next if (! exists($foil_data->{$foils->[$i]}));
         my $correct_foil = $foils->[$i];          $column{$foil}= $count++;
         push(@labels,$i+1);  
         $column{$correct_foil}= $count++;  
         for (my $j=0;$j<scalar(@$foils);$j++) {          for (my $j=0;$j<scalar(@$foils);$j++) {
             my $value = 0;              my $value = 0;
             if ($i != $j ) {              if ($i != $j ) {
                 $value += $foil_data->{$correct_foil}->{$foils->[$j]};                  $value += $foil_data->{$foil}->{$foils->[$j]};
             }              }
             $dataset[$j]->[$column{$correct_foil}]=$value;              $dataset[$j]->[$column{$foil}]=$value;
         }          }
     }      }
     #      #
Line 754  sub RR_create_stacked_selection_plot { Line 763  sub RR_create_stacked_selection_plot {
 sub RR_classify_response_data {  sub RR_classify_response_data {
     my ($full_row_data,$correct,$function) = @_;      my ($full_row_data,$correct,$function) = @_;
     my %submission_data;      my %submission_data;
       my %students;
     foreach my $row (@$full_row_data) {      foreach my $row (@$full_row_data) {
         my %subm = &hashify_attempt($row);          my %subm = &hashify_attempt($row);
         if (ref($correct) eq 'HASH') {          if (ref($correct) eq 'HASH') {
Line 763  sub RR_classify_response_data { Line 773  sub RR_classify_response_data {
         }          }
         $subm{'submission'} =~ s/=\d+\s*$//;          $subm{'submission'} =~ s/=\d+\s*$//;
         if (&$function(\%subm)) {          if (&$function(\%subm)) {
               $students{$subm{'student'}}++;
             $submission_data{'_count'}++;              $submission_data{'_count'}++;
             if (&submission_is_correct($subm{'award'})) {               if (&submission_is_correct($subm{'award'})) { 
                 $submission_data{'_correct'}++;                  $submission_data{'_correct'}++;
Line 770  sub RR_classify_response_data { Line 781  sub RR_classify_response_data {
             $submission_data{$subm{'correct'}}->{$subm{'submission'}}++;              $submission_data{$subm{'correct'}}->{$subm{'submission'}}++;
         }          }
     }      }
       $submission_data{'_students'}=scalar(keys(%students));
     return \%submission_data;      return \%submission_data;
 }  }
   
Line 1092  sub OR_time_analysis { Line 1104  sub OR_time_analysis {
             &OR_time_process_data($performance_data,$begin_index,$end_index);              &OR_time_process_data($performance_data,$begin_index,$end_index);
         ##          ##
         $table .= '<tr><td colspan="4" align="center"><font size="+1">'.          $table .= '<tr><td colspan="4" align="center"><font size="+1">'.
             &mt('[_1] submissions from [_2] students submitting, [_3] correct, [_4] incorrect',              &mt('[_1] submissions from [_2] students, [_3] correct, [_4] incorrect',
                 $data_count,$student_count,$correct,$data_count-$correct).                  $data_count,$student_count,$correct,$data_count-$correct).
                 '</font></td></tr>'.$/;                  '</font></td></tr>'.$/;
         my $concept_correct_plot = '';          my $concept_correct_plot = '';
Line 1226  sub OR_time_process_data { Line 1238  sub OR_time_process_data {
     if ($end_index == scalar(@$performance_data)-1) {      if ($end_index == scalar(@$performance_data)-1) {
         $end_index++;          $end_index++;
     }      }
     &Apache::lonnet::logthis('  '.$begin_index.':'.$end_index);  
     my $count;      my $count;
     for (my $i=$begin_index;$i<$end_index;$i++) {      for (my $i=$begin_index;$i<$end_index;$i++) {
         my $attempt = $performance_data->[$i];          my $attempt = $performance_data->[$i];
Line 1246  sub OR_time_process_data { Line 1257  sub OR_time_process_data {
             }              }
         }          }
     }      }
     &Apache::lonnet::logthis('count = '.$count);  
     return (\%processed_time_data,$correct,$data_count,      return (\%processed_time_data,$correct,$data_count,
             scalar(keys(%distinct_students)));              scalar(keys(%distinct_students)));
 }  }

Removed from v.1.97  
changed lines
  Added in v.1.102


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>