2017年1月31日火曜日

「データの見えざる手」の図が分かりにくかったので、Rで一次元プロット

↓この記事を書いていて思ったのですが、

「データの見えざる手」の正規分布の図が一様分布に見えたのでRで試した


一日の生活の900分は一次元的であるのに、それを30×30の二次元のマスで表現しているところが、そもそも分かりにくい。

人が理解するときのモデルとしても分かりにくいし、二次元になっているせいで、シミュレーションのスクリプトを書くときもいろいろと面倒な処理が必要になったりして(上記のリンクのinteractionのくだりとか)。

素直に、一次元的な図を載せた方が、読者の理解も進むのではと思って、Rで書いてみました。(点やマスの数は見た目がほどよくなるように減らしてあります)

n <- 80 # 点の数
m <- 10 # マスの数
x <- runif(n, min=0, max=m)
stripchart(x, pch=1, xlab="1分ごとのマス")
abline(v=0:m)
legend("topright", legend="手の動きのあった時点", pch=1, bg="white")




 こういう図の方が分かりやすいと思うけどなあ。




「データの見えざる手」の正規分布の図が一様分布に見えたのでRで試した

データの見えざる手」は読んでいて、引っ掛かりまくりでした。

読んだかた、「U分布」ってピンときました?

どこで躓いたかというと、こんな感じでコンピュータシミュレーションの結果が紹介されていたのですが、上の「正規分布(ポアソン分布)」と書かれている図↓の見た目が一様分布っぽいんですよね。

正規分布(ポアソン分布)とU分布 (「データの見えざる手」より)

本文を見てみると、
コンピュータシミュレーションでこれを実行するには、玉の位置をランダムに生成すればよい。横方向の位置(x)を決める1~30の乱数と縦方向の場所(y)を決める1~30の乱数を発生させ、(x,y)の位置に玉を置くのだ。

とあります。う~ん、xとyを一様分布に従って発生させて2次元にプロットしている、ってだけだよなー。

・・・(考え中)・・・

で、しばらく考えてみて、やっと分かりました。こうやって発生させたデータだと、マスの中の点の個数が正規分布になるのね。

実際に、一つずつやってみましょう。

n <- 1000 # 点の個数
m <- 10   # マスの区切りの数

# 座標は一様分布で従って発生させ、プロット
x <- runif(n, min=0, max=m)
y <- runif(n, min=0, max=m)
plot(x, y, pch="・")

# マスを書く
abline(h=0:m)
abline(v=0:m)
一様分布で発生させた点(マス内の個数は正規分布になる)

はい、本に載っているのと似たような絵になりました。

マスに入る個数を調べるには、引数を越えない整数を返すceilingが使えますね。

> interaction( ceiling(x), ceiling(y), sep="," )
   [1] 4,1   9,3   10,1  1,5   3,1   1,6   8,1   8,3   10,6  5,7   2,6
  [12] 2,5   2,7   7,6   6,10  4,9   3,3   1,1   2,4   9,6   10,10 2,3
  ...

マスが、(1,1), (1,2), ..., (1,10), (2,1), ..., (10,10)のように100個あって、1つ目の点は(4,1)のマスに、2つ目の点は(9.3)のマスに入っている、という感じです。

集計します。

> table( interaction( ceiling(x), ceiling(y), sep="," ) )

  1,1   2,1   3,1   4,1   5,1   6,1   7,1   8,1   9,1  10,1   1,2   2,2
   11    13    13    13     8     3    11    12    13     6    11    12
  3,2   4,2   5,2   6,2   7,2   8,2   9,2  10,2   1,3   2,3   3,3   4,3
    4     5     6     8    12    10     6    13     8     8    18     9
  ...

(1,1)のマスには11個の点、(2,1)のマスには13個の点が入っているようです。

ヒストグラムにしてみると、

マス100個、点1000個で発生させた正規分布
う~ん、正規分布かぁ?

点とマスが少な過ぎたようです。

書籍に書いてあった数字でやってみましょう。

n <- 72000 # 点の個数
m <- 30    # マスの区切りの数
x <- runif(n, min=0, max=m)
y <- runif(n, min=0, max=m)
t <- table( interaction( ceiling(x), ceiling(y), sep="," ) )
hist(t)

マス900個、点72000個で発生させた正規分布
うん、正規分布っぽいですね。

で、つまり手の動きが一様分布に従って発生するならば、単位時間あたりに動いた回数は正規分布に従うのだろうけど、実際はそうではなかった、ということみたいです。

考えている時間、キーボードを打つ時間、座っている時間、歩いている時間などがあることを考えると、手の動きが一様に発生するわけないってのは、なんだか当たり前のような気がします。