読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python】『データの見えざる手』第一章にあったU分布(指数分布)のシミュレーション

Python 社会シミュレーション 本・論文

この前のZANSAで発表した際、人間のシミュレーションするなら読んどけって教えて頂いた本を読んでます。

この本の一章で、人間の行動(例えば1分あたりに腕を振る回数)が指数分布に従っていることが多いと述べ、900個(=人間の活動時間900分/15時間)の箱に72000個のボール(=腕を振る回数)を割り振って、その箱の間でボールをやりとりする「繰り返しの力」として説明していましたが、シミュレーション結果の説明に納得がいかなかったのでコード書いて再現してみました。

使用した言語はPython(+numpy)です。

 

まず必要なライブラリをインポートします。

from pylab import *
import numpy as np
from numpy import random

次に、900個の配列の中に、独立に72000個のボールを割り振っていきます。

#初期値を決める
N = 900
balls = 72000
map = np.zeros(N)
for i in range(balls):
    x = random.randint(N)
    map[x] += 1
hist(map)

その結果、80.5を平均とする正規分布(に近いポアソン分布)が出てきます。

f:id:takeshi0406:20141022212124p:plain

次に、箱の中の玉の交換を10万回行います。if文で条件分岐しているのは、移動元の箱に玉が一つもない場合、そもそも移動させる玉がないためです。

def exchange():
    x_from = random.randint(N)
    x_to = random.randint(N)
    if map[x_from] != 0:
        map[x_from] -= 1
        map[x_to] += 1

for i in range(100000):
    exchange()
hist(map)

f:id:takeshi0406:20141022212940p:plain

あれ?指数分布というより、まだ正規分布に近そうな分布に見えます。個々で、本に書かれていたより試行回数を増やして、試行回数を1000万回にしてみましょう。(もしかすると繰り返しや条件分岐が著者のやったプログラムと違うのかもしれません)

すると指数分布らしきものが出てきました。

f:id:takeshi0406:20141022213323p:plain

もっと分かりやすくするために、y軸に対数目盛を振ってみます。

yscale('log')
hist(map)

f:id:takeshi0406:20141022213614p:plain

 

どうやら指数分布で間違いないようです。というか、pylabのヒストグラムって片対数をとるとこんな出力になるんですね。

これっておそらく、if文の条件分岐(玉の数がゼロの箱は、外に玉を出せない)が本質的なんじゃないかと思います。試しに、if文を除いてシミュレーションを行うと、次のような結果が出てきます。

def exchange():
    x_from = random.randint(N)
    x_to = random.randint(N)
    #if map[x_from] != 0:
    map[x_from] -= 1
    map[x_to] += 1

for i in range(10000000):
    exchange()
hist(map)

f:id:takeshi0406:20141022214241p:plain

ゼロ以下まで裾野が広がった分布が出てきます。この、ゼロ以下の部分がゼロ近傍のプラスの小さい値に留まったものが指数分布なのかもしれません(絶対もっとややこしい気がしますが)。

ところで、統計物理の確率分布では(正規分布ではなく)指数分布が使われることが多く、著者はこの説明で「目の前の霧が晴れた」と述べているのですが、私はちょっと腑に落ちません。一定時間(箱)の間で人間の腕を振る回数(ボール)をやりとりしている、というアナロジーがわからないんですが…。

それより、統計物理なら「一定空間内の粒子数やエネルギー準位がゼロ以下にならない」人間の行動なら「腕を振る回数は生の値だ」という、if文の条件分岐で決めたような、定義域の問題(?)が本質的なんじゃないかとも感じています。

そもそも単一のモデルで、指数分布が出てくるすべての現象について説明するというのも、かなり厳しいんじゃないでしょうか?

 

さらに、この指数分布が人間の行動の中でどれくらい普遍的なものなのかというのも疑問です。例えばネットワーク科学のBarabasi-Albertモデルで有名なバラバシさんが著書の中で人の行動はべき分布に従うことが多いと述べています。(人の「移動距離」や「手紙を出す間隔」の話が多かったので、今回の話とはドメインが違うかもしれませんが)

ちなみに彼は、著書『バースト!』の中でそのべき乗則を、「富める者がさらに富む性質(Barabasi-Albertモデルみたいなの)」と「タスクの優先順位を導入した待ち行列モデル」の二つで説明しています。

バースト!  人間行動を支配するパターン

バースト! 人間行動を支配するパターン

 

 

いろいろと疑念が出てきているのですが、人間行動の法則を統一的にモデリングする試みはとても刺激的です。おとなしく続きを読みます。