標準偏差の式を書き忘れたのでつけ足しました。 第6回 目的に応じて使ってみよう レポート課題 氏名:土屋哲平 学籍番号:c1111085 語学クラス:中国語3 コース:政策マネジメント 1.筆記問題 A.アルファベットはa〜zまで26個ある。配列は0、1、2、3...と数えるので アルファベットは0〜25個あるということになる。 一覧にすると次のようになる。 a 0 b 1 c 2 d 3 e 4 f 5 g 6 h 7 i 8 j 9 k 10 l 11 m 12 n 13 o 14 p 15 q 16 r 17 s 18 t 19 u 20 v 21 w 22 x 23 y 24 z 25 これをもとに次の場合を考える。 ・alphabet[22] これはアルファベットの22番目を表している。 配列では0から数え始めるので、22番目は"w"ということになる。 ・alohabet[-1] これはアルファベットの-1番目を表している。しかしこの配列は0〜25 までしか配列がなく、配列的にも-1は存在しない。 なので-1という配列はない。 B.平均を求めるためには、データとなる数を全て足し、総個数で割ることで 求めることができる。 テストの点数を例に挙げてみる。5科目の点数が76,83,71,64,93だった場合、 点数を全て足すと387点になり、それを科目数である5で割ると77.4点となり、 これが平均になる。式に表すと (データ1+データ2...) / データの総個数 ということになる。 標準偏差はデータがどのくらいの範囲にどんな割合で分散しているか をみる尺度の1つである。 求め方は、まずデータとなる数1つ1つからそのデータ群の平均を引き、 平均との差を2乗する。2乗したものをすべて足し、データの総個数で 割り、最後にルートでくくることで求めることができる。 式に表すと {(データ1-平均)**2+(データ2-平均)**2...} / 総個数 √(上記の式の計算結果) となる。 例を挙げてみる。10、12、14、16、18の5つの数字があるとして、 平均は14になる。5つの数字それぞれから平均である14を引いていくと -4 -2 0 2 4 この平均との差を2乗すると 16 4 0 4 16 これらを全て足すと40になり、総個数(5)でわると8となる。 これを√でくくるので標準偏差は2√2となる。 <参考文献> webサイト http://www.cap.or.jp/~toukei/kandokoro/html/14/14_2migi.htm 平均と標準偏差 webサイトhttp://www.bekkoame.ne.jp/~mathebit/0f22i76/s_deviation3.html 標準偏差 -- 計算 Copyright (C) 1999 by Takanao Nakagawa. All right reserved. 2.プログラム問題 a.考えた設定 事故発生件数を入力するとひと月あたりの事故発生件数 の平均と分散を表示するプログラムdef_statistic.rbを作成した。 b.作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def ave(kensu) #平均を求める関数ave仮引数はkensu sum = 0.0 #事故発生件数を足していくための変数 for jiko in kensu #kensuの中のjikoについて、繰り返し処理 sum += jiko #sumにjikoを足していく end sum / kensu.length #発生件数の合計を要素の数で割る end def bunsan(kensu) #分散を求める関数bunsan,仮引数はkensu total = 0 for hensa in kensu #kensuの中のhensaについて、繰り返し処理 total += (hensa - ave(kensu)) ** 2 #データから平均を引き、2乗したものを足していく end total / kensu.length #前の計算で足したものを要素の総数で割る end jikokensu = Array.new #新しくjikokensuという配列を作る i = 0 #月のカウンター print("事故発生件数の平均を出します\n") while true #繰り返し処理を行なう。 STDERR.printf("%d月の事故発生件数は: ",i+=1) accident = gets #入力された値をaccidentに入れる if accident == nil break end jikokensu << accident.to_i #上か下かどちらでもよい end print("\n") printf("ひと月あたり平均 %3.1f 件発生\n",ave(jikokensu)) printf("分散 %4.1f\n",bunsan(jikokensu)) print("安全運転を心掛けましょう!!\n") c.もとにしたプログラムからの変更点 授業中に作成したdef_ary_movie.rbを参考にプログラムを作成した。 変数名を変更し、分散を計算する関数を付け加えた。 d.実行画面 pan{TSUCHIYA Teppei}% ./def_statistic.rb [~/Ruby] 事故発生件数の平均を出します 1月の事故発生件数は: 12 2月の事故発生件数は: 23 3月の事故発生件数は: 34 4月の事故発生件数は: 45 5月の事故発生件数は: 56 6月の事故発生件数は: 67 7月の事故発生件数は: ^D ひと月あたり平均 39.50 件発生 分散 352.9 安全運転を心掛けましょう!! e.考察 このプログラムでは、入力した数値の平均と分散を求めることができる。 プログラムを実行してでた計算結果が正しいものであるか 計算して確かめてみる。 ・平均の計算 pan{c111108}% bc -l 12+23+34+45+56+67 237 237/6 39.50000000000000000000 平均は入力された数値をすべて足していき、その合計を入力された数値の 個数で割ると計算できる。 計算した結果、プログラムの実行結果と同じ答えになった。 なのでこの計算は正しいといえる。 ・分散の計算 分散の計算はいくつかの手順がいる。 1.入力された数値から平均の値を引く。これを全ての数値で行なう 2.1で計算した答えを2乗する。これも全ての数値でおこなう 3.2で計算した結果を全て足して、その合計を入力された数値の総個数で割る 上記の手順で計算することで分散が求められる。 手順1 pan{c111108}% bc -l 12-39.5 -27.5 23-39.5 -16.5 34-39.5 -5.5 45-39.5 5.5 56-39.5 16.5 67-39.5 27.5 手順2 -27.5*-27.5 756.25 -16.5*-16.5 272.25 -5.5*-5.5 30.25 5.5*5.5 30.25 16.5*16.5 272.25 27.5*27.5 756.25 手順3 756.25+272.25+30.25+30.25+272.25+756.25 2117.50 2117.50/6 352.91666666666666666666 手順の通りに計算した結果、352.91666666666666666666 という答えになった。 小数点第1位以下は切り捨てなので、352.9となり プログラムの実行結果と同じになった。 なのでこの計算は正しいといえる。 平均と分散の計算結果が同じであった。 なのでこのプログラムは正しいといえる。 f.参考文献 webサイトhttp://roy/~madoka/2012/r2/06/r2_06_08_theme_07_aryavg.html 西村まどか 2012年度基礎プログラミングII 講義ノート 第6回 目的に応じて使ってみよう 「映画の星づけランキング」 webサイトhttp://www.takenet.or.jp/~hayakawa/u-tan1-1.htm ウータンの統計講座 「平均と偏差、分散、相関の概念」 3.感想 今回の授業で紹介されたるびおっちのように、なにかを育成するゲーム をもっと複雑なメソッドを使ってできるのではないか。 サッカーなどのスポーツを例にしてみると、ダッシュ、パス練習、シュート練習、 キーパー練習など複数の練習があり、その練習を行なうと筋力、技術力、瞬発力 のポイントが溜る。その溜ったポイントでシュート力、テクニック、スピード、 などの能力を上げて選手を育成するというようなゲームを、関数を使って 作ることができるだろう。 今回はプログラムを作成するのも苦労したが、標準偏差や分散の意味を理解した り、計算方法を理解することに多くの時間を費やした。だが、時間をかけたかい があり、自分のなかでしっかり消化することができ、また統計データの知識も 得ることができた。 次回からも時間を惜しまずに課題に取り組んでいきたい。 4.参考文献等 共同学習者:佐藤咲