本福特定律


一堆从实际生活得出的数据中,以1为数字首位出现的概率约为总数的三成,而并不是我们靠直觉得出的 1/9 ,这就是本福特定律。

比方说,我们从1开始计数,1,2,3,4,5 …一直这么数下去,当我们数累了不数了,比方说我们数到19就不数了,那么显然以1为数字首位的数出现的概率要远远大于其它数,如果我们数到29不数了,那么显然以1或者以2作为数字首位的概率要远远大于其它数。意思就是,数字次序越靠后的,以它为首位出现的概率就越低。

我们可以用python作图来验证该定律:

import matplotlib.pyplot as plt
 
def firstDigital(x):
    while x >= 10:
        x //= 10
    return x
 
if __name__ == "__main__":
    n = 1
    x = [1,2,3,4,5,6,7,8,9]
    frequency = [0] * 9  #记录第一位数字中1-9数字出现次数
    for i in range(1,100):
        n *= i
        m = firstDigital(n) - 1
        frequency[m] += 1
    plt.plot(x,frequency,"r-",linewidth=2)
    plt.plot(x,frequency, "go", markersize=8)
    for i in range(1,10):
        plt.text(i,frequency[i-1]+0.3,frequency[i-1],ha = 'center',va = 'bottom',fontsize=12)
    plt.grid(True)
    plt.show()
    

在这里插入图片描述
上图统计的是从1到100!中以1到9为首位出现的概率。

在这里插入图片描述
上图统计的是从1到1000!中以1到9为首位出现的概率。

本福特定律多被用来验证数据是否有造假,但需要注意的是,本福特定律只对生活实际得到的数据,或者是顺序变化的数据起作用,倘若这些数据稍微被其它的随机函数所干扰,那么本福特定律将不再适用。

在Python中,验证数据是否符合本福特定律可以通过计算每个数字1到9作为首位数字的频率,并与理论频率(通常是1/3, 2/3, 1/4, 3/4, 1/5, 2/5, ...)进行对比来进行。以下是一个简单的步骤: 1. 首先,你需要整理数据并删除所有首位为0的值,因为根据本福特定律,首位不是0的数字才参与计算。 ```python import collections def benford_law(data): data = [int(d) for d in str(data).split()] first_digits = [d for d in data if d > 0] return first_digits ``` 2. 然后,计算实际频次: ```python def calculate_frequencies(first_digits): freqs = collections.Counter(first_digits) return {digit: freqs[digit] / len(first_digits) for digit in range(1, 10)} data = ... # 这里输入你要检查的数据 first_digit_freqs = calculate_frequencies(benford_law(data)) ``` 3. 比较实际频次与理论频次: ```python from scipy import stats expected_freqs = [1/10, 2/9, 3/8, 4/7, 5/6, 6/5, 7/4, 8/3, 9/2] chi_square_statistic, p_value = stats.chisquare(first_digit_freqs.values(), expected_freqs) if p_value > 0.05: # 设置显著性水平,如0.05代表p值大于0.05,则认为数据符合本福特定律 print("数据符合本福特定律") else: print("数据不符合本福特定律") ``` 在这里,`chi_square_statistic`是用来衡量差异程度的卡方统计量,`p_value`则是对应的P值,如果P值大于设定的显著性水平,那么我们可以接受数据符合本福特定律的假设。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值