]> git.sesse.net Git - bursty/blobdiff - summarize.pl
Fix some corruption issues in truncate-end.pl.
[bursty] / summarize.pl
index 545fa0e5bab3daecb2d3afad4b957c407f199844..0b17e24d6025f90e312a5083f0f9663700b0484a 100755 (executable)
@@ -3,6 +3,19 @@
 use strict;
 use warnings;
 
+sub wilson_interval {
+       my ($x, $n) = @_;
+       my $z = 1.96;  # 95% confidence interval
+
+       my $p = $x / $n;
+       my $min = ($p + $z * $z / (2 * $n) - $z * sqrt($p * (1 - $p) / $n + $z * $z / (4 * $n * $n))) / (1 + $z * $z / $n);
+       my $max = ($p + $z * $z / (2 * $n) + $z * sqrt($p * (1 - $p) / $n + $z * $z / (4 * $n * $n))) / (1 + $z * $z / $n);
+
+       $min = 0 if ($min < 0);
+
+       return ($min, $max);
+}
+
 my %buckets = ();
 
 while (<>) {
@@ -20,8 +33,18 @@ while (<>) {
 }
 
 for my $n (sort { $a <=> $b } keys %buckets) {
-       my $drop_rate = $buckets{$n}->{'num_drops'} / ($n * $buckets{$n}->{'num_bursts'});
-       my $drop_event_rate = $buckets{$n}->{'num_drops'} / ($n * $buckets{$n}->{'num_bursts'});
-       printf "%3d: drop_rate %.5f  drop_event_rate %.5f\n",
-               $n, $drop_rate, $drop_event_rate; 
+       my $num_bursts = $buckets{$n}->{'num_bursts'} // 0;
+       my $num_drops = $buckets{$n}->{'num_drops'} // 0;
+       my $bursts_with_drops = $buckets{$n}->{'bursts_with_drops'} // 0;
+
+       my $drop_rate = $num_drops / ($n * $num_bursts);
+       my $drop_event_rate = $bursts_with_drops / $num_bursts;
+
+       my ($drop_rate_min, $drop_rate_max) = wilson_interval($num_drops, $n * $num_bursts);
+       my ($drop_event_rate_min, $drop_event_rate_max) = wilson_interval($bursts_with_drops, $num_bursts);
+
+       printf "%3d: drop_rate %.5f  95%%ci = [%.5f, %.5f] (%4d/%8d)   drop_event_rate %.5f  95%%ci = [%.5f, %.5f] (%3d/%4d)\n",
+               $n,
+               $drop_rate, $drop_rate_min, $drop_rate_max, $num_drops, $n * $num_bursts,
+               $drop_event_rate, $drop_event_rate_min, $drop_event_rate_max, $bursts_with_drops, $num_bursts;
 }