本福德定律
我们正在考虑使用斐波那契数列在Julia编程语言中实现本福德定律。
导言
本福德定律是一个经验定律,它描述了现实生活中数字数据集中第一位数字的分布。 根据这一规律,数字1作为第一个出现的频率明显高于其他数字(约30%),数字9频率最低(小于5%)。 该法在数据审计、欺诈检测和经济分析领域具有广泛的应用.
在这个例子中,我们用Julia编程语言实现了Benford定律。 我们还将创建一个斐波那契数列,将定律应用于它,然后绘制并比较经验数据与理论分布。
算法实现
本福德规则由公式给出:
哪里 -第一个数字是从1到9,和 -这个数字是第一个的概率。
In [ ]:
"""
Вычисляет вероятность первой цифры по закону Бенфорда.
"""
P(d) = log10(1 + 1 / d)
Out[0]:
benford(numbers) --计算一组数字中第一位数字的频率。
返回一个由9个元素组成的数组,其中第i个元素指示数字的哪个部分以数字i开头。
In [ ]:
function benford(numbers)
# Получает первую цифру числа n (самую правую цифру после обращения)
firstdigit(n) = last(digits(n))
# Инициализируем массив счетчиков для каждой цифры (1–9)
counts = zeros(9)
# Для каждого числа увеличиваем соответствующий счетчик
foreach(n -> counts[firstdigit(n)] += 1, numbers)
# Нормируем частоты, чтобы их сумма была равна 1
counts ./ sum(counts)
end
Out[0]:
我们定义一个迭代器来生成斐波那契数列。 Base.iterate 它的实现方式是,可以使用 big.Int 防止溢出。
In [ ]:
# Создаем тип для обозначения итератора Фибоначчи
struct Fibonacci end
类型的迭代协议的实现 Fibonacci
In [ ]:
Base.iterate(::Fibonacci, (a, b) = big.((0, 1))) = b, (b, a + b)
从斐波那契数列生成前1000个数字
In [ ]:
sample = Iterators.take(Fibonacci(), 1000)
Out[0]:
我们计算第一位数字的观察频率并将其转换为百分比。
In [ ]:
observed = benford(sample) .* 100
Out[0]:
我们根据本福德定律计算理论值并将其转换为百分比。
In [ ]:
expected = P.(1:9) .* 100
Out[0]:
创建表格以方便数据比较
In [ ]:
table = Real[1:9 observed expected]
Out[0]:
我们绘制观测数据的柱线和预期数据的线。
In [ ]:
using Plots
plot(
[observed expected];
title = "Benford's Law",
seriestype = [:bar :line],
linewidth = [0 5],
xticks = 1:9,
xlabel = "first digit",
ylabel = "frequency %",
label = ["1000 Fibonacci numbers" "P(d)=log10(1+1/d)"]
)
Out[0]:
我们以格式良好的形式将结果输出到控制台。
In [ ]:
using Printf
println("Benford's Law\nFrequency of first digit\nin 1000 Fibonacci numbers")
println("digit observed expected")
foreach(i -> @printf("%3d%9.2f%%%9.2f%%\n", table[i, :]...), 1:9)
结论
我们已经审查了本福德法律在Julia语言中的实施情况。 我们编写了一个函数来计算第一位数字的分布,将其应用于前1,000个斐波那契数的样本,并将获得的数据与定律的理论值进行比较。 还构建了视觉图,证明了观察到的统计数据与数学定律的重合。 这些方法可用于验证数据的自然性或识别可能的扭曲和欺诈。
该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Benford's_law )