pythonの文法をもうちょっと
前回までで、pythonを用いてプログラムを作成する方法をほぼ習得した。しかし、関数とメソッド、及びデータファイルの読み込み方法がわからないと、実用的なプログラムが書けないので、まずはそれらの解説を行う。
測定誤差
いかなる測定でも、誤差が発生する。誤差はその発生の原因によって、(1)測定者の過失による誤差、(2)測定機器の特性などに由来する系統的な誤差、及び、(3)どうしても制御できない偶然誤差に分類することができる。(1)は測定者が細心の注意をすることで取り除くことができる誤差である。測定時にはちゃんと測定に集中してほしい。(2)は機器の特性をよく理解して、場合によっては補正を加えることで減少することができる誤差である。測定する場所の温度を可能な限り制御して、機器の伸縮を最低に留め測定することは重要である。目盛りによる測定の際には、刻まれている最小目盛りの1/10までを読み取ることが決められている。このことは有効数字とも関係してくる。しかし(1)と(2)で細心の努力をしても偶然誤差を取り除くことはできない。偶然誤差の存在は測定の宿命である。それではどのような測定をすることで真の値を得ることができるのであろうか?
真の値を得るために
偶然誤差は「でたらめに発生する」という法則がある。この法則をうまく利用することで、真の値をある範囲のもとで求めることができる。そのためには、同じ測定を何回か行う必要がある。
では、真の値を得るための努力の第1歩として、たくさんのデータからその平均値と分散、標準偏差を求めるプログラムを書いてみよう。データは1行に1つの浮動小数が記されたファイルで与えられるとする。関数を利用すると、例えば、以下のようになる。
メソッドを使うと、例えば、以下のようになる。
データが1行に1つの浮動小数ではなく、1行にタブで仕切られたいろいろなデータが入っており、その中から決まった列の数値を取り出したい時にはどうすればよいのか? エクセルのファイルをテキスト形式で保存して、そのファイルを直接プログラムの入力にしたい場合は、このような状況に遭遇する。この時は文字列のメソッドを使って、必要な情報を変数に代入する。
上のプログラムでは、読み込むファイルに一行あたり2個のデータがタブ(または空白)で区切られた形式になっていることを仮定している。forループの中を見ると、まず、ファイルfから一行を文字列としてlineに読み込んでいる。次に文字列メソッドsplit()を使って、lineを空白相当文字で分割し、dataにリスト型で代入している。次に第2カラムのデータをfloat()関数で文字列から浮動小数に変換し、valに代入している。最後にリスト型のmicroにvalを追加している。これでループの1回転が終了し、ファイルに次の一行があるならば、lineに代入して同じ手続きを続けている。やや複雑な手続きのように見えるのは、工程数が多いためである。この行程を1行にまとめると次のようになる。
エクセルファイルをテキスト形式で保存したデータを読み込む方法のひとつとして、覚えておくと便利であろう。