File:  [LON-CAPA] / capa / capa51 / CapaTools / capastat.pl
Revision 1.3: download - view: text, annotated - select for diffs
Mon Aug 7 20:47:28 2000 UTC (23 years, 9 months ago) by albertel
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_X, version_1_2_99_1, version_1_2_99_0, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, version_0_6_2, version_0_6, version_0_5_1, version_0_5, version_0_4, stable_2002_spring, stable_2002_july, stable_2002_april, stable_2001_fall, release_5-1-3, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, conference_2003, bz6209-base, bz6209, STABLE, HEAD, GCI_3, GCI_2, GCI_1, CAPA_5-1-6, CAPA_5-1-5, CAPA_5-1-4_RC1, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, BZ4492-feature_Support_horizontal_radioresponse, BZ4492-Support_horizontal_radioresponse
- fixed license notices the reference the GNU GPL rather than the GNU LGPL

    1: #!/usr/local/bin/perl
    2: 
    3: #
    4: # Jan 30 1997 by Isaac Tsai based on code written by Lily Cheng 
    5: # some simple statistics for CAPA
    6: #  Copyright (C) 1992-2000 Michigan State University
    7: #
    8: #  The CAPA system is free software; you can redistribute it and/or
    9: #  modify it under the terms of the GNU General Public License as
   10: #  published by the Free Software Foundation; either version 2 of the
   11: #  License, or (at your option) any later version.
   12: #
   13: #  The CAPA system is distributed in the hope that it will be useful,
   14: #  but WITHOUT ANY WARRANTY; without even the implied warranty of
   15: #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   16: #  General Public License for more details.
   17: #
   18: #  You should have received a copy of the GNU General Public
   19: #  License along with the CAPA system; see the file COPYING.  If not,
   20: #  write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   21: #  Boston, MA 02111-1307, USA.
   22: #
   23: #  As a special exception, you have permission to link this program
   24: #  with the TtH/TtM library and distribute executables, as long as you
   25: #  follow the requirements of the GNU GPL in regard to all of the
   26: #  software in the executable aside from TtH/TtM.
   27: 
   28: #
   29: 
   30:   require('getopts.pl');
   31: 
   32:   $MAX_TRIES = 99;
   33:   $Usage = "USAGE: capastat.pl [-s set][-t TryUpperLimit][-n NumberOfOccurrence]";
   34:   
   35:   sub  S_Enterpath {
   36:     local($set)=@_;
   37:     local($notdone,$path);
   38:     local($cfullpath);
   39:     
   40:     $notdone = 1;
   41:     while ($notdone) {
   42:       print "Please enter the CLASS absolute path:\n";
   43:       $path = <>; chomp($path);
   44:       if( $path =~ /\/$/ ) {
   45:         $cfullpath = "$path" . "classl";
   46:         $Rfullpath = "$path" . "records";
   47:         $Sfullpath = "$path" . "records/set$set.db";
   48:       } else {
   49:         $cfullpath = "$path" . "/classl";
   50:         $Rfullpath = "$path" . "/records";
   51:         $Sfullpath = "$path" . "/records/set$set.db";
   52:       }
   53:       if( -d $path ) {
   54:         if( -d $Rfullpath ) {
   55:           if( -f $Sfullpath ) {
   56:             $notdone = 0;
   57:           } else {
   58:             print "File [$Sfullpath] does not exist!\n";
   59:           }
   60:         } else {
   61:           print "Directory [$Rfullpath] does not exist!\n";
   62:         }
   63:       } else {
   64:         print "Directory [$path] does not exist!\n";
   65:       }
   66:     
   67:     }
   68:     return ($path);
   69:   }
   70:   
   71:   sub S_ScanDB  {
   72:     local($filename)=@_;
   73:     local($line_cnt)=0;
   74:     local($valid_cnt)=0;
   75:     local($valid);
   76:     local($ii);
   77:     local($s_num,$ans_str,$rest);
   78:     local(@ans_char,@tries);
   79:     local($score);
   80:     
   81:     open(IN, "<$filename") || die "Cannot open $filename file!";
   82:     while (<IN>) {
   83:       $line_cnt++;
   84:       if( $line_cnt == 2 ) {
   85:         chomp();
   86:         (@Weight) = split(/ */);
   87:       }
   88:       if( $line_cnt > 3) {
   89:         chomp();
   90:         ($s_num,$ans_str,$rest) = split(/ /,$_,3);
   91:         chop($ans_str);  # chop off one extr ,
   92:         
   93:         (@ans_char) = split(/ */,$ans_str);
   94:         (@tries)    = split(/,/,$rest);
   95:         for($valid = 'N', $ii=0;$ii<=$#ans_char;$ii++) {
   96:             $valid = 'Y' if $ans_char[$ii] ne '-';
   97:         }
   98:         if( $valid eq 'Y' ) {
   99:           for($score=0,$ii=0;$ii<=$#tries;$ii++) {
  100:             $Student_cnt[$ii][$tries[$ii]]++;
  101:             $Student_try[$valid_cnt][$ii] = $tries[$ii];
  102:             $Total_try[$ii] += $tries[$ii];
  103:             $Total_weight   += $Weight[$ii];
  104:             if($ans_char[$ii] eq 'Y') {
  105:               $Yes_cnt[$ii]++;
  106:               $score += $Weight[$ii];
  107:             }
  108:             if($ans_char[$ii] eq 'y') {
  109:               $yes_cnt[$ii]++;
  110:               $score += $Weight[$ii];
  111:             }
  112:             if( $ans_char[$ii] >= 0 && $ans_char[$ii] <= 9) {
  113:               $score += $ans_char[$ii];
  114:             }
  115:           }
  116:           $Total_scores += $score;
  117:           $Entry{"$valid_cnt"} = "$s_num\n" . "$ans_str," . " $rest\n";
  118:           $Score{"$valid_cnt"} = $score;
  119:           $valid_cnt++;
  120:         }
  121:       }
  122:     }
  123:     close(IN) || die "Cannot close $filename file!";
  124:     return ($#tries+1,$valid_cnt);
  125:   }
  126:   
  127:   sub  S_Average {
  128:     local($q_cnt,$l_cnt)=@_;
  129:     local($ii,$jj);
  130:     local(@s_cnt,@avg);
  131:     local(@sd, $sum);
  132:     local($sq);
  133:     local(@sd3,$tmp1,$tmp2);
  134:     
  135:     for($ii=0;$ii<$q_cnt;$ii++) {
  136:       $s_cnt[$ii] = 0;
  137:       $avg[$ii]   = 0.0;
  138:       for($jj=1;$jj<$MAX_TRIES;$jj++) {  # ignore the 0 try entry
  139:         if( $Student_cnt[$ii][$jj] > 0 ) {
  140:           $avg[$ii]   +=  $jj*$Student_cnt[$ii][$jj];
  141:           $s_cnt[$ii] +=  $Student_cnt[$ii][$jj];
  142:         }
  143:       }
  144:       if( $s_cnt[$ii] > 0 ) {      # avoid division by zero
  145:         $avg[$ii] = $avg[$ii] / $s_cnt[$ii];
  146:       }
  147:     }
  148:     
  149:     for($ii=0;$ii<$q_cnt;$ii++) {
  150:       $sd[$ii] = 0.0;
  151:       $sum = 0.0;
  152:       for($jj=0;$jj<$l_cnt;$jj++) {
  153:         $Max_try[$ii] = ($Student_try[$jj][$ii] > $Max_try[$ii]? $Student_try[$jj][$ii] : $Max_try[$ii]);
  154:         if( $Student_try[$jj][$ii] > 0 ) {
  155:           $sq  = ($Student_try[$jj][$ii] - $avg[$ii])*($Student_try[$jj][$ii] - $avg[$ii]);
  156:           $sum += $sq;
  157:         }
  158:         if( $s_cnt[$ii] > 1 ) {
  159:           $sd[$ii] = $sum / ($s_cnt[$ii] - 1.0 );
  160:         }
  161:         if( $sd[$ii] > 0 ) {
  162:           $sd[$ii] = sqrt( $sd[$ii] );
  163:         }
  164:       }
  165:     }
  166:     
  167:     for($ii=0;$ii<$q_cnt;$ii++) {
  168:       $sd3[$ii] = 0.0;
  169:       $sum = 0.0;
  170:       for($jj=0;$jj<$l_cnt;$jj++) {
  171:         if( $Student_try[$jj][$ii] > 0 ) {
  172:           $tmp1 = $Student_try[$jj][$ii] - $avg[$ii];
  173:           $tmp2 = $tmp1*$tmp1*$tmp1;
  174:           $sum  = $sum + $tmp2;
  175:         }
  176:         if( $s_cnt[$ii] > 0 && $sd[$ii] != 0.0 ) {
  177:           $sd3[$ii] = $sum/$s_cnt[$ii] ;
  178:           $sd3[$ii] = $sd3[$ii] / ($sd[$ii]*$sd[$ii]*$sd[$ii]);
  179:         }
  180:       }
  181:     }
  182:     
  183:     print "\nThis is the statistics for each problem:\n";
  184:     print "Prob\#   MxTries   avg.     s.d.    s.k.   \#Stdnts ";
  185:     print "  \#Yes   \#yes   Tries  DoDiff\n";
  186:     for($ii=0;$ii<$q_cnt;$ii++) {
  187:       if( $Total_try[$ii] > 0 ) {
  188:         $dod = 1-($Yes_cnt[$ii] + $yes_cnt[$ii]) / $Total_try[$ii];
  189:       }
  190:       printf "P %2d:",$ii+1;
  191:       printf "%7d  %8.2f  %7.2f  %6.2f   %5d   %5d  %5d    %5d  %5.2f\n",
  192:               $Max_try[$ii],$avg[$ii],$sd[$ii],$sd3[$ii],$s_cnt[$ii],$Yes_cnt[$ii],$yes_cnt[$ii],
  193:               $Total_try[$ii],$dod;
  194:      
  195:     }
  196:   }
  197:   
  198:   sub  Percentage_Scores {
  199:     local($set)=@_;
  200:     local($ratio);
  201:     
  202:     if($Total_weight > 0 ) {
  203:       $ratio = $Total_scores / $Total_weight;
  204:       $ratio = $ratio * 100.0;
  205:     }
  206:     printf "\nThe percentage score for set%d.db is %7.2f%%\n",$set,$ratio;
  207:   
  208:   }
  209:   
  210:   sub  Large_Tries {
  211:     local($t,$n,$q_cnt,$l_cnt)=@_;
  212:     local($ii);
  213:     
  214:     print "\nHere is a list of students who attempts $t tries more than $n times: \n\n";
  215: 
  216:     for ($i=0;$i<$l_cnt;$i++){
  217:        $count=0;
  218:        $credit=0;
  219:        for ($j=0;$j<$q_cnt;$j++){
  220:            if ($Student_try[$i][$j]>= $t){
  221:               $count++;
  222:            }
  223:        }
  224:        if ($count >= $n){
  225:           print "($Score{$i})  $Entry{$i} \n";
  226:        }
  227:     }
  228:   
  229:   }
  230:  
  231:   if(! &Getopts('s:t:n:') ) {
  232:      print STDERR "$Usage\n";
  233:      exit 2;
  234:   }
  235:   $opt_s = 1  if ! $opt_s;
  236:   $opt_t = 99 if ! $opt_t;
  237:   $opt_n = 1  if ! $opt_n;
  238:   
  239:   S_Enterpath($opt_s);
  240:   ($Q_cnt,$L_cnt) = S_ScanDB("$Sfullpath");
  241:   Percentage_Scores($opt_s);
  242:   S_Average($Q_cnt,$L_cnt);
  243:   Large_Tries($opt_t,$opt_n,$Q_cnt,$L_cnt);
  244:   
  245:   
  246:   

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