C01 中心極限定理

2010年度日本数学会年会の一室で、神戸大学のT氏から次のような問題が出ました。まずT氏が R で解答を作り、続いて東京大学のN氏が python、そして私が GeoGebra で解答を作りました (このページ下部の添付ファイル参照)。シェルスクリプトで作っている人もいましたが、学会期間中には完成しなかったようです。

問題

一様乱数の N 個の平均として得られるデータを M 個作り、そのヒストグラムを作れ。さらに、N を大きくしたとき、正規分布に近づくことを視覚的に確認できるコードを書け。ただし、ウェブ上の情報などは見てはいけないが、KNOPPIX/Math/2010 DVD に収録してある情報は見てもよい。

人に言えないくらい時間はかかりましたが、T氏のWikiに解答が載っています。ツールを作成するとその定義を確認する手段がないため、同一のものを再現できませんが、大体次のようなコードを書きました。

0と1の間の一様乱数 N 個の平均を求めるツール (AveOfRand) を作成し、一様乱数の平均 M 個からなるリスト (rawdata) を作ります。

M = 100 (スライダー)

N = 40 (スライダー)

a = Sum[Sequence[Random[0,1000]/1000,i,1,N]]/N

新規ツール: a = AveOfRand[N]

rawdata = Sequence[AveOfRand[N], i, 1, M]

ここで、a = AveOfRand[N] とは、出力オブジェクト a、入力オブジェクト N で、AveOfRand という新規ツールを作成することを表します。

次に、リストの要素のうち、ある区間に属するものの個数を数えるツール (CountBetween) を作り、階級の幅を 0.01 に決め打ちして相対度数分布表を作ります。

beg = 0.01

end = 0.02

b = CountIf[x>=beg && x<end, rawdata]

新規ツール: b = CountBetween[beg, end, rawdata]

freqs = Sequence[CountBetween[i*0.01, (i+1)*0.01, rawdata]/M, i, 0, 99]

ヒストグラムの階級の境界 (boundaries) を作り、ヒストグラムを書きます。

boundaries = Sequence[0.01*i, i, 0, 100]

Histogram[boundaries, freqs]