美国多家媒体相继发布推送:美国前副总统、民主党总统候选人拜登获得超过胜选所需的270张选举人票,赢得2020年美国总统大选。
但是推特等社交媒体上开始涌现一种说法:经统计各候选人在某地所有选区的得票数后发现,川普一切正常,而拜登得票不符合“本福特定律”涉嫌舞弊。


图中蓝色线条偏离本福特曲线



一、本福特(Benford)定律
本福特(Benford)定律又称第一数字定律,号称“机器之眼”。
它是数字统计的一种内在规律,指所有自然随机变量,只要样本空间足够大,首位1-9的数字出现的概率在一定范围内具有稳定性,即以1开头的样本占样本总量的30.1%,以2开头的样本占样本总量的17.6%,而以9开头的样本始终只占5%左右。


常用于检查各种数据是否有舞弊、造假。
二、起源
1881年,天文学家西蒙·纽康伯发现对数表包含以1起首的数那首几页较其他页破烂。
1938年,物理学家法兰克·本福特重新发现这个现象,还通过了检查许多数据来证实这点。
2009年,西班牙数学家在素数中发现了一种新模式,并且惊讶于为何现在才为人发现。虽然素数一般被认为是随机分布的,但西班牙数学家发现素数数列中每个素数的首位数字有明显的分布规律,它可以被描述了素数的本福德法则。这项新发现除了提供对素数属性的新洞见之外,还能应用于欺骗检测和股票市场分析等领域。
比如人口、死亡率、物理和化学常数、棒球统计表、半衰期放射性同位数、物理书中的答案、素数数字和斐波纳契数列数字中均有“第一数字定律”现象的出现。
三、python验证
这里借助python的matplotlib.pyplot库,以1000的阶乘数据为例,暴力求证一下:
1、运算结果:
1-9每个数字出现的次数为:
[293, 176, 124, 101, 69, 87, 51, 51, 47]
1-9每个数字出现的概率为:
0.293 0.176 0.124 0.101 0.069 0.087 0.051 0.051 0.047
2、图像:

3、源码:
import matplotlib.pyplot as plt
import math
def firstDigital(x):
while x >= 10:
x //= 10
return x
n = 1
frequency = [0] * 9 #记录第一位数字中1-9数字出现次数
for i in range(1,1000):
n *= i
m = firstDigital(n) - 1
frequency[m] += 1
print("1-9每个数字出现的次数为:")
print(frequency)
print("1-9每个数字出现的概率为:")
for j in range(9):
print(round(frequency[j]/999,3),end=' ') #每个数字出现的概率
plt.plot(frequency,"r-",linewidth=2)
plt.plot(frequency, "go", markersize=8)
plt.grid(True)
plt.show()
Reference
1、本福特定律:百度百科
2、python验证本福特定律:
http://blog.gqylpy.com/gqy/24738/
3、拜登赢了:但严重违反“本福特定律”:
https://new.qq.com/rain/a/20201108A03N1C00
4、本福特定律在线测试:
https://www.itshenji.com/benfute/

