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   19152 use strict;
  1         3  
  1         58  
3 1     1   7 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  1         1  
  1         1283  
4             require Exporter;
5              
6             $VERSION = '3.6';
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 149 return grep{defined}@_;
  600         912  
20             }
21              
22             sub count
23             {
24 4     4 1 9 return scalar definedvals @_;
25             }
26              
27             sub min
28             {
29 7     7 1 23 my @data = definedvals @_;
30 7 100       28 return unless @data;
31 4 50       8 return $data[0] unless @data > 1;
32 4         7 my $min= shift @data;
33 4 100       7 foreach(@data) { $min= $_ if $_ < $min; }
  6         14  
34 4         17 return $min;
35             }
36              
37             sub max
38             {
39 11     11 1 25 my @data = definedvals @_;
40 11 100       40 return unless @data;
41 8 50       13 return $data[0] unless @data > 1;
42 8         11 my $max= shift @data;
43 8 100       10 foreach(@data) { $max= $_ if $_ > $max; }
  23         39  
44 8         17 return $max;
45             }
46              
47             sub range
48             {
49 7     7 1 15 my @data = definedvals @_;
50 7 100       17 return unless @data;
51 6 100       14 return 0 unless @data > 1;
52 5 100       21 return abs($data[1]-$data[0]) unless @data > 2;
53 1         1 my $min= shift @data; my $max= $min;
  1         2  
54 1 50       3 foreach(@data) { $min= $_ if $_ < $min; $max= $_ if $_ > $max; }
  2 50       9  
  2         5  
55 1         4 return $max - $min;
56             }
57              
58             sub sum
59             {
60 40     40 1 53 my @data = definedvals @_;
61 40 50       71 return unless @data;
62 40 50       60 return $data[0] unless @data > 1;
63 40         32 my $sum;
64 40         44 foreach(@data) { $sum+= $_; }
  206         197  
65 40         197 return $sum;
66             }
67              
68             sub mean
69             {
70 25     25 1 34 my @data = definedvals @_;
71 25 100       48 return unless @data;
72 24 100       39 return $data[0] unless @data > 1;
73 22         31 return sum(@data)/scalar(@data);
74             }
75              
76             sub median
77             {
78 3     3 1 7 my @data = definedvals @_;
79 3 50       7 return unless @data;
80 3 50       8 return $data[0] unless @data > 1;
81 3         11 @data= sort{$a<=>$b}@data;
  23         22  
82 3 100       13 return $data[$#data/2] if @data&1;
83 2         5 my $mid= @data/2;
84 2         11 return ($data[$mid-1]+$data[$mid])/2;
85             }
86              
87             sub mode
88             {
89 2     2 1 6 my @data = definedvals @_;
90 2 50       10 return unless @data;
91 2 50       23 return $data[0] unless @data > 1;
92 2         4 my %count;
93 2         4 foreach(@data) { $count{$_}++; }
  11         19  
94 2         7 my $maxhits= max(values %count);
95 2 100       7 foreach(keys %count) { delete $count{$_} unless $count{$_} == $maxhits; }
  8         22  
96 2         8 return mean(keys %count);
97             }
98              
99             sub variance
100             {
101 8     8 1 11 my @data = definedvals @_;
102 8 50       17 return unless @data;
103 8 50       14 return 0 unless @data > 1;
104 8         12 my $mean= mean @data;
105 8         10 return (sum map { ($_ - $mean)**2 } @data) / $#data;
  44         69  
106             }
107              
108             sub variancep
109             {
110 8     8 1 41 my @data = definedvals @_;
111 8 50       17 return unless @data;
112 8 50       15 return 0 unless @data > 1;
113 8         16 my $mean= mean @data;
114 8         13 return (sum map { ($_ - $mean)**2 } @data) / ( $#data +1 );
  46         61  
115             }
116              
117             sub stddev
118             {
119 4     4 1 7 my @data = definedvals @_;
120 4 50       11 return unless @data;
121 4 50       10 return 0 unless @data > 1;
122 4         7 return sqrt variance @data;
123             }
124              
125             sub stddevp
126             {
127 4     4 1 9 my @data = definedvals @_;
128 4 50       10 return unless @data;
129 4 50       6 return 0 unless @data > 1;
130 4         9 return sqrt variancep @data;
131             }
132              
133             sub statshash
134             {
135 3     3 1 5534 my @data = definedvals @_;
136 3 50       8 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         10 @data= sort{$a<=>$b}@data;
  34         26  
154 3         7 my $median;
155 3 100       7 if(@data&1) { $median= $data[$#data/2]; }
  1         4  
156 2         5 else { my $mid= @data/2; $median= ($data[$mid-1]+$data[$mid])/2; }
  2         5  
157 3         4 my $sum= 0;
158 3         2 my %count;
159 3         6 foreach(@data) { $sum+= $_; $count{$_}++; }
  19         11  
  19         28  
160 3         5 my $mean= $sum/$count;
161 3         10 my $maxhits= max(values %count);
162 3         8 foreach(keys %count)
163 16 100       30 { delete $count{$_} unless $count{$_} == $maxhits; }
164             return
165             (
166 3         12 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 551 my @data = definedvals @_;
203 1 50       4 return unless @data;
204 1 50       5 return ( $data[0], 1 ) unless @data > 1;
205 1         2 my %count;
206 1         2 foreach(@data) { $count{$_}++; }
  4         17  
207 1         10 return %count;
208             }
209              
210             1;
211             __END__