Diff for /loncom/interface/statistics/lonproblemstatistics.pm between versions 1.116 and 1.117

version 1.116, 2009/01/20 16:38:44 version 1.117, 2009/03/05 09:12:14
Line 123  my @Fields = ( Line 123  my @Fields = (
              align  => 'left',               align  => 'left',
              color  => '#FFFFE6',               color  => '#FFFFE6',
              special  => 'link',               special  => 'link',
              sortable => 'yes',                sortable => 'yes',
              selectable => 'no',               selectable => 'no',
              defaultselected => 'yes',               defaultselected => 'yes',
            },             },
            { name   => 'part',              { name   => 'part',
              title  => 'Part',               title  => 'Part',
              align  => 'left',               align  => 'left',
              color  => '#FFFFE6',               color  => '#FFFFE6',
Line 375  my @SeqFields = ( Line 375  my @SeqFields = (
              align  => 'left',               align  => 'left',
              color  => '#FFFFE6',               color  => '#FFFFE6',
              special  => 'no',               special  => 'no',
              sortable => 'no',                sortable => 'no',
              selectable => 'yes',               selectable => 'yes',
              defaultselected => 'no',               defaultselected => 'no',
            },             },
Line 510  my @SeqFields = ( Line 510  my @SeqFields = (
              long_title => 'KR-21 reliability statistic',               long_title => 'KR-21 reliability statistic',
              selectable => 'yes',               selectable => 'yes',
              defaultselected => 'no',               defaultselected => 'no',
            },                        },
 );  );
   
 my %SelectedFields;  my %SelectedFields;
Line 709  sub BuildProblemStatisticsPage { Line 709  sub BuildProblemStatisticsPage {
     $r->print('<input type="hidden" name="sortby" value="'.$env{'form.sortby'}.      $r->print('<input type="hidden" name="sortby" value="'.$env{'form.sortby'}.
               '" />');                '" />');
     #      #
     my @CacheButtonHTML =       my @CacheButtonHTML =
         &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');          &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');
     my $Str;      my $Str;
     foreach my $html (@CacheButtonHTML) {      foreach my $html (@CacheButtonHTML) {
Line 718  sub BuildProblemStatisticsPage { Line 718  sub BuildProblemStatisticsPage {
     #      #
     $r->print($Str);      $r->print($Str);
     if (! exists($env{'form.firstrun'})) {      if (! exists($env{'form.firstrun'})) {
         $r->print('<h3>'.          $r->print('<p class="LC_info"><b>'.
                   &mt('Press "Generate Statistics" when you are ready.').                    &mt('Press "Generate Statistics" when you are ready.').
                   '</h3><p>'.                    '</b></p>'.
                     '<p class="LC_info">'.
                   &mt('It may take some time to update the student data '.                    &mt('It may take some time to update the student data '.
                       'for the first analysis.  Future analysis this session '.                        'for the first analysis. Future analysis this session '.
                       'will not have this delay.').                        'will not have this delay.').
                   '</p>');                    '</p>');
  &clean_up();   &clean_up();
Line 734  sub BuildProblemStatisticsPage { Line 735  sub BuildProblemStatisticsPage {
     # it does not slow things down noticably.      # it does not slow things down noticably.
     &Apache::loncoursedata::populate_weight_table();      &Apache::loncoursedata::populate_weight_table();
     #      #
     ($navmap,@sequences) =       ($navmap,@sequences) =
         &Apache::lonstatistics::selected_sequences_with_assessments();          &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {      if (! ref($navmap)) {
         $r->print('<div class="LC_error">'.&mt('A course-wide error occurred.').'</div>'.          $r->print('<div class="LC_error">'.&mt('A course-wide error occurred.').'</div>'.
Line 747  sub BuildProblemStatisticsPage { Line 748  sub BuildProblemStatisticsPage {
                   &Apache::lonstatistics::section_and_enrollment_description().                    &Apache::lonstatistics::section_and_enrollment_description().
                   '</h4>');                    '</h4>');
         &Excel_output($r);          &Excel_output($r);
     } else {       } else {
         $r->print('<input type="submit" name="Excel" value="'.          $r->print('<input type="submit" name="Excel" value="'.
                   &mt('Produce Excel Output').'" />'.'&nbsp;'x5);                    &mt('Produce Excel Output').'" />'.'&nbsp;'x5);
         $r->rflush();          $r->rflush();
Line 756  sub BuildProblemStatisticsPage { Line 757  sub BuildProblemStatisticsPage {
                   '</h4>');                    '</h4>');
         my $count = 0;          my $count = 0;
         foreach my $seq (@sequences) {          foreach my $seq (@sequences) {
             my @resources =               my @resources =
                 &Apache::lonstathelpers::get_resources($navmap,$seq);                  &Apache::lonstathelpers::get_resources($navmap,$seq);
             $count += scalar(@resources);              $count += scalar(@resources);
         }          }
Line 801  sub output_sequence_statistics { Line 802  sub output_sequence_statistics {
               '<table border="0" cellpadding="3">'."\n".                '<table border="0" cellpadding="3">'."\n".
               '<tr bgcolor="#FFFFE6">');                '<tr bgcolor="#FFFFE6">');
     $r->print(&sequence_html_header());      $r->print(&sequence_html_header());
     foreach my $seq (@sequences) {       foreach my $seq (@sequences) {
         last if ($c->aborted);          last if ($c->aborted);
         &compute_sequence_statistics($seq);          &compute_sequence_statistics($seq);
         $r->print(&sequence_html_output($seq));          $r->print(&sequence_html_output($seq));
Line 1024  sub make_single_stat_plot { Line 1025  sub make_single_stat_plot {
     }      }
     #      #
     # Build up the data sets to plot      # Build up the data sets to plot
     my @Labels;       my @Labels;
     my @Data;      my @Data;
     my $max = 1;      my $max = 1;
     foreach my $data (@StatsArray) {      foreach my $data (@StatsArray) {
Line 1064  sub degrees_plot { Line 1065  sub degrees_plot {
     my $plot = '';      my $plot = '';
     my $ymax = 0;      my $ymax = 0;
     my $ymin = 0;      my $ymin = 0;
     my @Disc; my @Diff; my @Labels;          my @Disc; my @Diff; my @Labels;
     foreach my $data (@StatsArray) {      foreach my $data (@StatsArray) {
         push(@Labels,$data->{'problem_num'});          push(@Labels,$data->{'problem_num'});
         my $disc = $data->{'deg_of_disc'};          my $disc = $data->{'deg_of_disc'};
Line 1154  sub degrees_plot { Line 1155  sub degrees_plot {
     </curve>      </curve>
 </gnuplot>  </gnuplot>
 END  END
     my $plotresult =       my $plotresult =
         '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;          '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;
     $r->print($plotresult);      $r->print($plotresult);
     return;      return;
Line 1239  sub tries_data_plot { Line 1240  sub tries_data_plot {
     </curve>      </curve>
 </gnuplot>  </gnuplot>
 END  END
     my $plotresult =       my $plotresult =
         '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;          '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;
     $r->print($plotresult);      $r->print($plotresult);
     return;      return;
Line 1350  sub Excel_output { Line 1351  sub Excel_output {
     $excel_sheet->write($rows_output,$cols_output++,      $excel_sheet->write($rows_output,$cols_output++,
                         'Compiled on '.localtime(time));                          'Compiled on '.localtime(time));
     #      #
     $rows_output++;       $rows_output++;
     $cols_output=0;      $cols_output=0;
     ##      ##
     ## Sequence Statistics      ## Sequence Statistics
     ##       ##
     &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,      &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,
                    \@SeqFields);                     \@SeqFields);
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
Line 1432  sub write_headers { Line 1433  sub write_headers {
     foreach my $field (@{$Fields}) {      foreach my $field (@{$Fields}) {
         next if ($field->{'selected'} ne 'yes');          next if ($field->{'selected'} ne 'yes');
         next if ($field->{'name'} eq 'problem_num');          next if ($field->{'name'} eq 'problem_num');
         # Use english for excel as I am not sure how well excel handles           # Use english for excel as I am not sure how well excel handles
         # other character sets....          # other character sets....
         $excel_sheet->write($$rows_output,$$cols_output,          $excel_sheet->write($$rows_output,$$cols_output,
                             $field->{'title'},                              $field->{'title'},
Line 1545  sub sort_data { Line 1546  sub sort_data {
   
 =item &get_statistics()  =item &get_statistics()
   
 Wrapper routine from the call to loncoursedata::get_problem_statistics.    Wrapper routine from the call to loncoursedata::get_problem_statistics.
 Calls lonstathelpers::get_time_limits() to limit the data set by time  Calls lonstathelpers::get_time_limits() to limit the data set by time
 and &compute_discrimination_factor  and &compute_discrimination_factor
   
 Inputs: $sequence, $resource, $part, $problem_num  Inputs: $sequence, $resource, $part, $problem_num
   
 Returns: Hash reference with statistics data from   Returns: Hash reference with statistics data from
 loncoursedata::get_problem_statistics.  loncoursedata::get_problem_statistics.
   
 =cut  =cut
Line 1579  sub get_statistics { Line 1580  sub get_statistics {
         &escape($resource->symb);          &escape($resource->symb);
     #      #
     if ($SelectedFields{'deg_of_disc'}) {      if ($SelectedFields{'deg_of_disc'}) {
         $data->{'deg_of_disc'} =           $data->{'deg_of_disc'} =
             &compute_discrimination_factor($resource,$part,$sequence);              &compute_discrimination_factor($resource,$part,$sequence);
     }      }
     #      #
Line 1592  sub get_statistics { Line 1593  sub get_statistics {
         $data->{'course'} = $env{'request.course.id'};          $data->{'course'} = $env{'request.course.id'};
         my $urlres=(&Apache::lonnet::decode_symb($resource->symb))[2];          my $urlres=(&Apache::lonnet::decode_symb($resource->symb))[2];
         $data->{'urlres'}=$urlres;          $data->{'urlres'}=$urlres;
         my %storestats =           my %storestats =
             &LONCAPA::lonmetadata::dynamic_metadata_storage($data);              &LONCAPA::lonmetadata::dynamic_metadata_storage($data);
         my ($dom,$user) = ($urlres=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)});           my ($dom,$user) = ($urlres=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)});
         &Apache::lonnet::put('nohist_resevaldata',\%storestats,$dom,$user);          &Apache::lonnet::put('nohist_resevaldata',\%storestats,$dom,$user);
     }      }
     #      #
Line 1608  sub get_statistics { Line 1609  sub get_statistics {
 #    my $hinttries = &Apache::lonnet::EXT('resource.'.$part.'.hinttries',$symb);  #    my $hinttries = &Apache::lonnet::EXT('resource.'.$part.'.hinttries',$symb);
     my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',$symb);      my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',$symb);
     $data->{'weight'} = $weight;      $data->{'weight'} = $weight;
 #    $data->{'duedate'} = $duedate;   #    $data->{'duedate'} = $duedate;
 #    $data->{'opendate'} = $opendate;  #    $data->{'opendate'} = $opendate;
 #    $data->{'maxtries'} = $maxtries;  #    $data->{'maxtries'} = $maxtries;
 #    $data->{'hinttries'} = $hinttries;  #    $data->{'hinttries'} = $hinttries;
Line 1642  sub compute_discrimination_factor { Line 1643  sub compute_discrimination_factor {
     #      #
     # rank      # rank
     my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();      my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
     my $ranking =       my $ranking =
         &Apache::loncoursedata::rank_students_by_scores_on_resources          &Apache::loncoursedata::rank_students_by_scores_on_resources
         (\@Resources,          (\@Resources,
          [&Apache::lonstatistics::get_selected_sections()],           [&Apache::lonstatistics::get_selected_sections()],
Line 1653  sub compute_discrimination_factor { Line 1654  sub compute_discrimination_factor {
     # compute their percent scores on the problems in the sequence,      # compute their percent scores on the problems in the sequence,
     my $number_to_grab = int(scalar(@{$ranking})/4);      my $number_to_grab = int(scalar(@{$ranking})/4);
     my $num_students = scalar(@{$ranking});      my $num_students = scalar(@{$ranking});
     my @BottomSet = map { $_->[&Apache::loncoursedata::RNK_student()];       my @BottomSet = map { $_->[&Apache::loncoursedata::RNK_student()];
                       } @{$ranking}[0..$number_to_grab];                        } @{$ranking}[0..$number_to_grab];
     my @TopSet    =       my @TopSet    =
         map {           map {
             $_->[&Apache::loncoursedata::RNK_student()];               $_->[&Apache::loncoursedata::RNK_student()];
           } @{$ranking}[-$number_to_grab..0];            } @{$ranking}[-$number_to_grab..0];
     if (! @BottomSet || (@BottomSet == 1 && $BottomSet[0] eq '') ||      if (! @BottomSet || (@BottomSet == 1 && $BottomSet[0] eq '') ||
         ! @TopSet    || (@TopSet    == 1 && $TopSet[0]    eq '')) {          ! @TopSet    || (@TopSet    == 1 && $TopSet[0]    eq '')) {
         return 'nan';          return 'nan';
     }      }
     my ($bottom_sum,$bottom_max) =       my ($bottom_sum,$bottom_max) =
         &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@BottomSet,          &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@BottomSet,
                                                   undef,$starttime,$endtime);                                                    undef,$starttime,$endtime);
     my ($top_sum,$top_max) =       my ($top_sum,$top_max) =
         &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@TopSet,          &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@TopSet,
                                                   undef,$starttime,$endtime);                                                    undef,$starttime,$endtime);
     my $deg_of_disc;      my $deg_of_disc;
Line 1689  sub compute_discrimination_factor { Line 1690  sub compute_discrimination_factor {
 ##  ##
 ## K=the number of items in your test  ## K=the number of items in your test
 ## M=the mean score on the test  ## M=the mean score on the test
 ## s=the standard deviation of the scores on your test   ## s=the standard deviation of the scores on your test
 ##  ##
 ## then:  ## then:
 ##   ##
 ## KR-21 rk= [K/(K-1)] * [1- (M*(K-M))/(K*s^2))]  ## KR-21 rk= [K/(K-1)] * [1- (M*(K-M))/(K*s^2))]
 ##  ##
 ###############################################  ###############################################
Line 1709  sub compute_sequence_statistics { Line 1710  sub compute_sequence_statistics {
     my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();      my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
     #      #
     # First compute statistics based on student scores      # First compute statistics based on student scores
     my ($smin,$smax,$sMean,$sSTD,$scount,$sMAX) =       my ($smin,$smax,$sMean,$sSTD,$scount,$sMAX) =
         &Apache::loncoursedata::score_stats          &Apache::loncoursedata::score_stats
                     ([&Apache::lonstatistics::get_selected_sections()],                      ([&Apache::lonstatistics::get_selected_sections()],
                      [&Apache::lonstatistics::get_selected_groups()],                       [&Apache::lonstatistics::get_selected_groups()],
Line 1724  sub compute_sequence_statistics { Line 1725  sub compute_sequence_statistics {
     $SeqStat{$symb}->{'max_possible'} = $sMAX;      $SeqStat{$symb}->{'max_possible'} = $sMAX;
     #      #
     # Compute statistics based on the number of correct problems      # Compute statistics based on the number of correct problems
     # 'correct' is taken to mean       # 'correct' is taken to mean
     my ($cmin,$cmax,$cMean,$cSTD,$ccount)=      my ($cmin,$cmax,$cMean,$cSTD,$ccount)=
         &Apache::loncoursedata::count_stats          &Apache::loncoursedata::count_stats
         ([&Apache::lonstatistics::get_selected_sections()],          ([&Apache::lonstatistics::get_selected_sections()],

Removed from v.1.116  
changed lines
  Added in v.1.117


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