Here's the code:
# Benford's Law
import matplotlib.pyplot as plt
import random
def isnum(s):
try:
a = float(s)
return True
except:
return False
def ReadTownPopulations():
TownPop = 'population-of-towns.csv'
digits = [0]*10
f = open(TownPop,'r')
lines = f.read().strip().split('\n')
f.close()
for aline in lines:
parts = aline.split(',')
if len(parts) == 3 and parts[2].isdigit():
digits[int(parts[2][0])] += 1
digit_fracs = [x/sum(digits) for x in digits]
return digit_fracs
def OrdinaryRandom(low,high,n):
digits = [0]*10
for i in range(n):
m = random.randint(low,high)
digits[int(str(m)[0])] += 1
return digits
def ExpGrowth(n,low_iters=50, high_iters=300, rate=1.05):
digits = [0]*10
for i in range(n):
m = random.randint(low_iters, high_iters)
x = rate**m
digits[int(str(x)[0])] += 1
return digits
def BarOfDigits(data,title):
plt.bar(list(range(1,10)),data[1:],tick_label=[str(x) for x in range(1,10)])
plt.title(title)
plt.show()
def VideoGames():
vg_sales = 'video-game-sales.csv'
f = open(vg_sales,'r')
lines = f.read().strip().split('\n')
f.close()
digits = [0]*10
for aline in lines:
parts = aline.split(',')
if len(parts) >= 11 and isnum(parts[10]):
digits[int(str(float(parts[10])*100)[0])] += 1
digit_fracs = [x/sum(digits) for x in digits]
return digit_fracs
#BarOfDigits(ReadTownPopulations(),'Populations')
#BarOfDigits(VideoGames(),'Video Game Sales')
#BarOfDigits(OrdinaryRandom(1,999,10000),'Random')