X-Git-Url: https://git.sesse.net/?p=bursty;a=blobdiff_plain;f=summarize.pl;h=0b17e24d6025f90e312a5083f0f9663700b0484a;hp=545fa0e5bab3daecb2d3afad4b957c407f199844;hb=725ffec44d53ddad34062abf7ccf1a1e86e810dd;hpb=fc6f7214ed765c6a1f76d84136d52424e747925e diff --git a/summarize.pl b/summarize.pl index 545fa0e..0b17e24 100755 --- a/summarize.pl +++ b/summarize.pl @@ -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; }