おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

大沢統計第1章(2)

前回に続いて大沢統計をプログラミングしてみました。
内容は前回の記事とほぼ一緒です。最初にnum_person人にmoney=30をランダムで配ります。その後にランダムで選ばれた人が、ランダムに選ばれた人にmoney=1を渡すという過程を10000回繰り返します。結果として、どんな人も一度は大きなmoneyを持つことが出来ます。しかし、その確率はexp(-所有するmoney)に比例し、指数分布に従う状態で現れるので、大きなmoneyを所得している時間は、悲しいことかな、短いのです。この結果は、長い時間をかければ、ある状態が等確率で起こることを示唆しています。(簡単にいうと、長い時間をかければ、お金持ちになっている時間やお金を持っていない時間はみんな大体等しくなる。)

#! /usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import copy

### initial set
np.random.seed(0)
money=30
num_person=5
ave=money/num_person
num_exchange=10000
persons=np.zeros(num_person)
persons_trajectory=[]

### initial fig set
fig, axPlot = plt.subplots(figsize=(5.5,5.5))
divider = make_axes_locatable(axPlot)
axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axPlot)
plt.setp( axHisty.get_yticklabels(),visible=False)

for i in range(money):
    persons[np.random.randint(0,num_person)]+=1
persons_trajectory.append(persons)

### exhange money
for i in range(num_exchange):
    out=np.random.randint(0,num_person)
    if persons[out]==0:
        tmp=copy.copy(persons)
        persons_trajectory.append(tmp)
        continue
    persons[out]-=1
    persons[np.random.randint(0,num_person)]+=1
    tmp=copy.copy(persons)
    persons_trajectory.append(tmp)

### for fig
persons_trajectory=np.array(persons_trajectory).T

for i in range(num_person):
    axPlot.plot(persons_trajectory[i])
    axHisty.hist(persons_trajectory[i], bins=25, orientation='horizontal',alpha=0.6)

plt.savefig("ch1-2.png")
plt.draw()
plt.show()

下記の図は、左の図の縦軸がお金、横軸はステップを示しています。それぞれの色は5人に対応しています。ヒストグラムで示した分布が大体似ていることから、5人全員が大体同じ確率で高所得、低所得を経験することがわかります。
f:id:oimokihujin:20140614131226p:plain