ベンフォードの法則
ベンフォードの法則とは,自然界に現れる数値の1桁目の1から9の数字が,等しく分布するのではなく,偏って分布するという法則です.数学的には数字$i$($0\leq i\leq 9$)が現れる頻度は,
$$
\log_{10}(i+1)-\log_{10}i
$$
となり,具体的には次のようになります.
$i$ | $\log_{10}(i+1)-\log_{10}i$ |
---|---|
1 | 30.1% |
2 | 17.6% |
3 | 12.5% |
4 | 9.7% |
5 | 7.9% |
6 | 6.7% |
7 | 5.8% |
8 | 5.1% |
9 | 4.6% |
Pythonプログラムによるベンフォードの法則の検証
ある銀行に口座を開設し,初日に1円を預けることにします.利子が毎日元本を2倍にすると仮定し,この状況で毎日の口座残高を記録します.注目点は,通帳に記載される金額の最初の数字がどのように分布するかです.簡単のため,残高が10以上になったときに10で割り,常に1以上10未満の金額が得られるようにします.そして,その整数部分からヒストグラムを作成します.この手順を実装したPythonプログラムが以下になります.
import math
from collections import defaultdict
iteration = 10000000
val = 1
histogram = defaultdict(int)
for _ in range(iteration):
histogram[int(val)] += 1
val *= 2
if val >= 10:
val /= 10
for i in range(1, 10):
print(
f"{i}: {histogram[i]/iteration*100:7.4f}% {(math.log10(i+1)-math.log10(i))*100:7.4f}%"
)
histogram
にdefaultdict
を使っているので,存在しないキーの値は0として扱われます.これを実行すると,次の結果が得られます.val = 1
から開始しているので,小さい値の頻度が理論値より僅かに大きくなっています.
1: 30.1033% 30.1030%
2: 17.6092% 17.6091%
3: 12.4939% 12.4939%
4: 9.6910% 9.6910%
5: 7.9181% 7.9181%
6: 6.6945% 6.6947%
7: 5.7991% 5.7992%
8: 5.1152% 5.1153%
9: 4.5756% 4.5757%
val
の初期値1を変更したり,利子を2倍でなく他の利率,例えば,1.001にしても同様の結果が得られます.