File Coverage

blib/lib/Statistics/Lite.pm
Criterion Covered Total %
statement 110 112 98.2
branch 48 70 68.5
condition n/a
subroutine 17 18 94.4
pod 15 16 93.7
total 190 216 87.9


line stmt bran cond sub pod time code
1             package Statistics::Lite;
2 1     1   15969 use strict;
  1         2  
  1         40  
3 1     1   3 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  1         2  
  1         1074  
4             require Exporter;
5              
6             $VERSION = '3.61';
7             @ISA = qw(Exporter);
8             @EXPORT = ();
9             @EXPORT_OK = qw(min max range sum count mean median mode variance stddev variancep stddevp statshash statsinfo frequencies);
10             %EXPORT_TAGS=
11             (
12             all => [ @EXPORT_OK ],
13             funcs => [qw],
14             stats => [qw],
15             );
16              
17             sub definedvals
18             {
19 127     127 0 132 return grep{defined}@_;
  600         772  
20             }
21              
22             sub count
23             {
24 4     4 1 10 return scalar definedvals @_;
25             }
26              
27             sub min
28             {
29 7     7 1 20 my @data = definedvals @_;
30 7 100       22 return unless @data;
31 4 50       10 return $data[0] unless @data > 1;
32 4         6 my $min= shift @data;
33 4 100       6 foreach(@data) { $min= $_ if $_ < $min; }
  6         13  
34 4         14 return $min;
35             }
36              
37             sub max
38             {
39 11     11 1 22 my @data = definedvals @_;
40 11 100       31 return unless @data;
41 8 50       14 return $data[0] unless @data > 1;
42 8         9 my $max= shift @data;
43 8 100       10 foreach(@data) { $max= $_ if $_ > $max; }
  23         41  
44 8         19 return $max;
45             }
46              
47             sub range
48             {
49 7     7 1 14 my @data = definedvals @_;
50 7 100       18 return unless @data;
51 6 100       15 return 0 unless @data > 1;
52 5 100       20 return abs($data[1]-$data[0]) unless @data > 2;
53 1         2 my $min= shift @data; my $max= $min;
  1         1  
54 1 50       3 foreach(@data) { $min= $_ if $_ < $min; $max= $_ if $_ > $max; }
  2 50       8  
  2         6  
55 1         35 return $max - $min;
56             }
57              
58             sub sum
59             {
60 40     40 1 48 my @data = definedvals @_;
61 40 50       69 return unless @data;
62 40 50       53 return $data[0] unless @data > 1;
63 40         38 my $sum;
64 40         40 foreach(@data) { $sum+= $_; }
  206         177  
65 40         183 return $sum;
66             }
67              
68             sub mean
69             {
70 25     25 1 34 my @data = definedvals @_;
71 25 100       47 return unless @data;
72 24 100       36 return $data[0] unless @data > 1;
73 22         29 return sum(@data)/scalar(@data);
74             }
75              
76             sub median
77             {
78 3     3 1 8 my @data = definedvals @_;
79 3 50       9 return unless @data;
80 3 50       8 return $data[0] unless @data > 1;
81 3         10 @data= sort{$a<=>$b}@data;
  23         21  
82 3 100       11 return $data[$#data/2] if @data&1;
83 2         5 my $mid= @data/2;
84 2         12 return ($data[$mid-1]+$data[$mid])/2;
85             }
86              
87             sub mode
88             {
89 2     2 1 6 my @data = definedvals @_;
90 2 50       8 return unless @data;
91 2 50       16 return $data[0] unless @data > 1;
92 2         1 my %count;
93 2         5 foreach(@data) { $count{$_}++; }
  11         16  
94 2         6 my $maxhits= max(values %count);
95 2 100       4 foreach(keys %count) { delete $count{$_} unless $count{$_} == $maxhits; }
  8         21  
96 2         6 return mean(keys %count);
97             }
98              
99             sub variance
100             {
101 8     8 1 13 my @data = definedvals @_;
102 8 50       14 return unless @data;
103 8 50       13 return 0 unless @data > 1;
104 8         10 my $mean= mean @data;
105 8         10 return (sum map { ($_ - $mean)**2 } @data) / $#data;
  44         60  
106             }
107              
108             sub variancep
109             {
110 8     8 1 11 my @data = definedvals @_;
111 8 50       17 return unless @data;
112 8 50       11 return 0 unless @data > 1;
113 8         10 my $mean= mean @data;
114 8         9 return (sum map { ($_ - $mean)**2 } @data) / ( $#data +1 );
  46         49  
115             }
116              
117             sub stddev
118             {
119 4     4 1 7 my @data = definedvals @_;
120 4 50       12 return unless @data;
121 4 50       7 return 0 unless @data > 1;
122 4         6 return sqrt variance @data;
123             }
124              
125             sub stddevp
126             {
127 4     4 1 8 my @data = definedvals @_;
128 4 50       9 return unless @data;
129 4 50       7 return 0 unless @data > 1;
130 4         7 return sqrt variancep @data;
131             }
132              
133             sub statshash
134             {
135 3     3 1 3979 my @data = definedvals @_;
136 3 50       7 return unless @data;
137             return
138             (
139 3 50       7 count => 1,
140             min => $data[0],
141             max => $data[0],
142             range => 0,
143             sum => $data[0],
144             mean => $data[0],
145             median => $data[0],
146             mode => $data[0],
147             variance => 0,
148             stddev => 0,
149             variancep => 0,
150             stddevp => 0
151             ) unless @data > 1;
152 3         3 my $count= scalar(@data);
153 3         8 @data= sort{$a<=>$b}@data;
  34         28  
154 3         2 my $median;
155 3 100       9 if(@data&1) { $median= $data[$#data/2]; }
  1         3  
156 2         3 else { my $mid= @data/2; $median= ($data[$mid-1]+$data[$mid])/2; }
  2         6  
157 3         4 my $sum= 0;
158 3         3 my %count;
159 3         4 foreach(@data) { $sum+= $_; $count{$_}++; }
  19         14  
  19         26  
160 3         4 my $mean= $sum/$count;
161 3         10 my $maxhits= max(values %count);
162 3         7 foreach(keys %count)
163 16 100       32 { delete $count{$_} unless $count{$_} == $maxhits; }
164             return
165             (
166 3         11 count => $count,
167             min => $data[0],
168             max => $data[-1],
169             range => ($data[-1] - $data[0]),
170             sum => $sum,
171             mean => $mean,
172             median => $median,
173             mode => mean(keys %count),
174             variance => variance(@data),
175             stddev => stddev(@data),
176             variancep => variancep(@data),
177             stddevp => stddevp(@data)
178             );
179             }
180              
181             sub statsinfo
182             {
183 0     0 1 0 my %stats= statshash(@_);
184 0         0 return <<".";
185             min = $stats{min}
186             max = $stats{max}
187             range = $stats{range}
188             sum = $stats{sum}
189             count = $stats{count}
190             mean = $stats{mean}
191             median = $stats{median}
192             mode = $stats{mode}
193             variance = $stats{variance}
194             stddev = $stats{stddev}
195             variancep = $stats{variancep}
196             stddevp = $stats{stddevp}
197             .
198             }
199              
200             sub frequencies
201             {
202 1     1 1 414 my @data = definedvals @_;
203 1 50       3 return unless @data;
204 1 50       4 return ( $data[0], 1 ) unless @data > 1;
205 1         2 my %count;
206 1         2 foreach(@data) { $count{$_}++; }
  4         9  
207 1         7 return %count;
208             }
209              
210             1;
211             __END__