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 (24 years, 1 month 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_5_msu,
version_2_11_5,
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>