Answers to the Benford's Law (Strange Digits) homework

 

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')