Statistics::Benford - calculate the deviation from Benford's Law
my $stats = Statistics::Benford->new; my $diff = $stats->diff(%freq); my %diff = $stats->diff(%freq); my $signif = $stats->signif(%freq); my %signif = $stats->signif(%freq);
The Statistics::Benford
module calculates the deviation from Benford's law,
also known as the first-digit law. The law states that for many sources of
real-life data, the leading digit follows a logarithmic, not uniform,
distribution. This fact can be used to audit data for signs of fraud by
comparing the expected frequency of the digits to the actual frequency in the
data.
The default values are: (10, 0, 1).
The z-statistic shows the statistical significance of the difference between the two proportions. Significance takes into account the size of the difference, the expected proportion, and the sample size. Scores above 1.96 are significant at the 0.05 level, and above 2.57 are significant at the 0.01 level.
# Generate a list of numbers approximating a Benford distribution. my $max = 10; # numbers range from 0 to 10 my @nums = map { ($max / rand($max)) - 1 } (1 .. 1_000); my %freq; for my $num (@nums) { my ($digit) = $num =~ /([1-9])/; # find first non-zero digit $freq{$digit}++; } my $stats = Statistics::Benford->new(10, 0, 1); my $diff = $stats->diff(%freq); my $signif = $stats->signif(%freq);
http://en.wikipedia.org/wiki/Benford's_law
http://www.mathpages.com/home/kmath302/kmath302.htm
When counting the first digit, make sure it is non-zero. For example the first non-zero digit of 0.038 is 3.
Convert non-decimal base digits to decimal representations. For example, to examine the first two digits of a hexadecimal number, like A1B2, take the first two digits 'A1', and convert them to decimal- 161.
The law becomes less accurate when the data set is small.
The law does not apply to data sets which have imposed limitations (e.g. max or min values) or where the numbers are assigned (e.g. ids and phone numbers).
The distribution becomes uniform at the 5th significant digit, i.e. all digits will have the same expected frequency.
It can help to partition the data into subsets for testing, e.g. testing negative and positive values separately.
Please report any bugs or feature requests to http://rt.cpan.org/NoAuth/ReportBug.html. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
You can find documentation for this module with the perldoc command.
perldoc Statistics::Benford
You can also look for information at:
Copyright (C) 2007 gray <gray at cpan.org>, all rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
gray, <gray at cpan.org>