『数学ガールの秘密ノート/やさしい統計』で遊ぶ
(今回はネタバレをガッツリ含むので見たくない方は静かにページを閉じてください)
本当は「この世界の片隅に」を観に行こうかと思っていたのだが,さすが地元広島は大人気のようで満席になっていた。 こりゃあ劇場で観るのは無理そうだな。
ということで映画は諦めて,夕方の待ち合わせ時間まで喫茶店で積ん読状態だった『数学ガールの秘密ノート/やさしい統計』を一気読みすることにした。
ちなみに『数学ガールの秘密ノート/やさしい統計』の詳しい解説は以下のページが参考になる。
この記事によると最近の中高生は統計についてきちんと習うらしい(でも選択科目?)。 私は高校は理数科だったので一通り習ったはずなのだが,あまり憶えてなかったりする。 統計について強く意識するようになったのは大学で誤差論を習ってから。 だから純粋に数学って感じじゃなくて,あくまでもデータを解析するための道具・手段として捉えていた。 『数学ガールの秘密ノート/やさしい統計』を通して統計の初歩について数学体系として学ぶのは多分初めての体験で(高校で習ったのはあくまでも受験用だったからね)とても面白かった。
今回はテトラちゃん回かなぁ。 1,2章のユーリちゃんとのやり取りも面白いけど,新しい用語が次々登場する状況で,言葉や名前に敏感なテトラちゃんがアワアワする感じがよかった。
今回の『数学ガールの秘密ノート/やさしい統計』がいつもと毛色が違うなと感じたのは,次々と用語が登場して,その定義と意味についてユーリちゃんやテトラちゃんに延々と説明していく,という流れになっていたからだろうか。 実は最近新しいプロジェクトで要求分析をやっているところなので,それと脳内でシンクロする感じが楽しかった。
要求分析で真っ先にやるのは「用語集」を作ることだ。 「用語集」を作る目的は2つある。 ひとつは顧客と「言葉」を合わせることで,もうひとつは「言葉」を厳密に定義することだ。 これを最初にやっておかないと顧客との間で齟齬が生じてしまう場合がある。 『数学ガールの秘密ノート/やさしい統計』でやっていることは用語集の作成プロセスに似ている。
さて,作中で登場した村木先生の《カード》
プログラマならこれを擬似乱数を使って試してみたいって思うよね。 このサイトの別セクションで,以前「モンテカルロ法を使って円周率を求める」というのをやったので,これを応用してコードを組んでみることにしよう。
できあがりはこちら。
パッケージ構成は概ねこんな感じ。
gen
パッケージで擬似乱数を使ってコイントスを行う。
こんな感じのコード。
/**
* These codes are licensed under CC0.
* https://creativecommons.org/publicdomain/zero/1.0/
*/
package gen
import "math/rand"
//New returns generator of random number [0,2)
func New(s rand.Source, ct int64) <-chan int {
ch := make(chan int)
r := rand.New(s)
go func(ct int64) {
for i := int64(0); i < ct; i++ {
ch <- r.Intn(2)
}
close(ch)
}(ct)
return ch
}
コイントスを行った結果を入れる channel を生成し,実際のコイントスは goroutine の中で擬似乱数生成器を使い指定した回数だけ行っている。 1が出れば表である。 では実際にコインを10回投げてみよう。
$ go run main.go toss -t 10
0
0
1
0
0
0
0
0
1
1
ここでは10回中表になったのは3回。 さらに「コインを10回投げる」行為を10回行って統計値を取ってみる。
$ go run main.go repeat -t 10 -c 10
6
6
5
1
9
5
5
5
6
3
minimum value: 1
maximum value: 9
average value: 5.10000
standard deviation: 1.97231
ここでは表が出た回数の最小値が1,最大値が9,平均値が5.1,標準偏差が約1.97となった。 10回ではよくわからないので次はどどーんと1万回やってみる。
$ go run main.go repeat -t 10 -c 10000 > cointoss.dat
minimum value: 0
maximum value: 10
average value: 4.99690
standard deviation: 1.57477
結果データは cointoss.dat
ファイルに保存している。
ここでは表が出た回数の最小値が0,最大値が10,平均値が約5.0,標準偏差が約1.57となった。
では cointoss.dat
ファイルを gnuplot に食わせてヒストグラムにしてみる(階級幅は1)1。
gnuplot> unset key
gnuplot> set xrange [-1:11]
gnuplot> filter(x,y)=int(x/y)*y
gnuplot> plot "cointoss.dat" u (filter($1,1)):(1) smooth frequency with boxes lc rgb "black"
結果はこんな感じ。
おおっ。 きれいに正規分布っぽくなっている。 さて,『数学ガールの秘密ノート/やさしい統計』4章で数学的に求めた値とどのくらい違うかな(笑) ちなみに $\sqrt{2.5} = 1.5811…$ である。
あー,遊んだ遊んだ。
- 数学ガールの秘密ノート/やさしい統計
- 結城 浩 (著)
- SBクリエイティブ 2016-10-28 (Release 2016-11-10)
- Kindle版
- B01MSJMKMW (ASIN)
- 評価
統計の本当に基礎の部分から。学業成績でよく聞く「偏差値」とは何を表していて何を意味しているのか。なんてなあたりから。
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
-
「gnuplot でヒストグラム(頻度分布図)を描画する - Qiita」を参考にした。 ↩︎