1
0

ベンフォードの法則を確認するプログラム

Posted at

ベンフォードの法則

ベンフォードの法則とは,自然界に現れる数値の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}%"
    )

histogramdefaultdictを使っているので,存在しないキーの値は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にしても同様の結果が得られます.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0