帰ってきた「しっぽのさきっちょ」

しっぽのさきっちょ: 2016-12-11 付

『数学ガールの秘密ノート/やさしい統計』で遊ぶ

no extension

(今回はネタバレをガッツリ含むので見たくない方は静かにページを閉じてください)

本当は「この世界の片隅に」を観に行こうかと思っていたのだが,さすが地元広島は大人気のようで満席になっていた。 こりゃあ劇場で観るのは無理そうだな。

残念。こりゃあ劇場で見るのは無理そうだな。シネコンで見る気はないし。
残念。こりゃあ劇場で見るのは無理そうだな。シネコンで見る気はないし。

ということで映画は諦めて,夕方の待ち合わせ時間まで喫茶店で積ん読状態だった『数学ガールの秘密ノート/やさしい統計』を一気読みすることにした。

ちなみに『数学ガールの秘密ノート/やさしい統計』の詳しい解説は以下のページが参考になる。

この記事によると最近の中高生は統計についてきちんと習うらしい(でも選択科目?)。 私は高校は理数科だったので一通り習ったはずなのだが,あまり憶えてなかったりする。 統計について強く意識するようになったのは大学で誤差論を習ってから。 だから純粋に数学って感じじゃなくて,あくまでもデータを解析するための道具・手段として捉えていた。 『数学ガールの秘密ノート/やさしい統計』を通して統計の初歩について数学体系として学ぶのは多分初めての体験で(高校で習ったのはあくまでも受験用だったからね)とても面白かった。

今回はテトラちゃん回かなぁ。 1,2章のユーリちゃんとのやり取りも面白いけど,新しい用語が次々登場する状況で,言葉や名前に敏感なテトラちゃんがアワアワする感じがよかった。

今回の『数学ガールの秘密ノート/やさしい統計』がいつもと毛色が違うなと感じたのは,次々と用語が登場して,その定義と意味についてユーリちゃんやテトラちゃんに延々と説明していく,という流れになっていたからだろうか。 実は最近新しいプロジェクトで要求分析をやっているところなので,それと脳内でシンクロする感じが楽しかった。

要求分析で真っ先にやるのは「用語集」を作ることだ。 「用語集」を作る目的は2つある。 ひとつは顧客と「言葉」を合わせることで,もうひとつは「言葉」を厳密に定義することだ。 これを最初にやっておかないと顧客との間で齟齬が生じてしまう場合がある。 『数学ガールの秘密ノート/やさしい統計』でやっていることは用語集の作成プロセスに似ている。

さて,作中で登場した村木先生の《カード》

コインを10回投げたとき、表は何回出るだろう。
via 『数学ガールの秘密ノート/やさしい統計』第4章

プログラマならこれを擬似乱数を使って試してみたいって思うよね。 このサイトの別セクションで,以前「モンテカルロ法を使って円周率を求める」というのをやったので,これを応用してコードを組んでみることにしよう。

できあがりはこちら。

パッケージ構成は概ねこんな感じ。

パッケージ構成
パッケージ構成

gen パッケージで擬似乱数を使ってコイントスを行う。 こんな感じのコード。

/**
 * These codes are licensed under CC0.
 * http://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…$ である。

あー,遊んだ遊んだ。

photo
数学ガールの秘密ノート/やさしい統計
結城 浩
SBクリエイティブ 2016-10-28
評価

数学ガールの秘密ノート/場合の数 数学ガールの秘密ノート/ベクトルの真実 はじめての深層学習(ディープラーニング)プログラミング ポートとソケットがわかればインターネットがわかる――TCP/IP・ネットワーク技術を学びたいあなたのために 数学ガールの秘密ノート/数列の広場 数学ガールの秘密ノート/微分を追いかけて 数学ガールの秘密ノート/整数で遊ぼう 数学ガールの秘密ノート/丸い三角関数 経済数学の直観的方法 確率・統計編 (ブルーバックス) 速習 Python 3 上: プログラミングの基礎編

統計の本当に基礎の部分から。学業成績でよく聞く「偏差値」とは何を表していて何を意味しているのか。なんてなあたりから。

reviewed by Spiegel on 2016-12-11 (powered by G-Tools)

photo
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan Brian W. Kernighan 柴田 芳樹
丸善出版 2016-06-20
評価

スターティングGo言語 (CodeZine BOOKS) Go言語によるWebアプリケーション開発 Kotlinスタートブック -新しいAndroidプログラミング Docker実戦活用ガイド グッド・マス ギークのための数・論理・計算機科学

著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。

reviewed by Spiegel on 2016-07-13 (powered by G-Tools)