課題1 「線形回帰計算と結果のプロット」
与えられたデータを用いて最小二乗法による線形回帰を計算し、グラフ化しなさい。
その際、最小二乗法の計算は、プログラミング言語を用いて自分で計算すること。
また、グラフ化ツールには、gnuplot等の描画ツールを用いること(ExcelやMatlab, Mathmatica等の統計処理ツールは使ってはいけない)。
プログラミング言語は好きなものを利用して構わない。本講義ではRubyによる環境セットアップ方法とサンプルコードを示す。
使用データ
こちらからダウンロード。
データは、2008年10月18日に計測した、日本国内にあるサーバから世界中の対象IPアドレスに向けてtracerouteを行って収集したRTT値と、対象IPアドレスまでのおおよその直線距離である。
1列目が対象IPアドレスまでの距離(Km)、2列目がRTT(ms)を表す。
提出方法
締切りは、11月10日
提出物は、
- 最小二乗法を計算したプログラムのソースコード
- 結果をプロットしたグラフ(gif, jpg, pngなどの画像形式)
を、SFC-SFSから提出すること。
セットアップ(Windows)
■ Rubyのインストール
インストーラ途中の選択しで、"Just me"を選択する。
インストーラ終了後、rubyのショートカットがデスクトップに作成されるので起動する。
■ gnuplotのインストール
gnuplotを解凍したフォルダから、gp45-winbin/gnuplot/binary/wgnuplot.exe を起動する。
もしフォントが潰れて文字が読めない場合は、以下の手順でフォントの変更を行う。
gnuplotのウインドウ内を右クリックして、"Choose Font.."を選択する。
"@MS ゴシック"を選択してOKする。
再びウインドウ内を右クリックして、'Update XXX\wgnuplot.ini'を選択する。
グラフ描画に時間がかかる場合は、set terminal windowsする。
セットアップ(MacOSX)
■ rubyのインストール
OSにデフォルトでインストールされている。
■ gnuplotのインストール
MacPorts, fink, homebrew などのパッケージ管理ツールを利用している場合は、それらを使ってgnuplotをインストールする。
または、http://www.muskmelon.jp/macosx/から、gnuplot.appをダウンロードし、Applicationsディレクトリに移動する。
起動は、通常のアプリケーションと同じく、gnuplot.appをダブルクリックする。
プログラムのサンプル
プログラミング言語rubyによる平均を計算するサンプルコードを示す。
#!/usr/bin/env ruby
# データファイルを読み込み、平均値を計算、出力
n = 0
sum_data = 0
# コマンドの引数で指定したデータファイルを読み込む
file = open(ARGV.shift, 'r')
# データファイルを1行ずつ読み込み、処理する
while line = file.gets
# 測定値数をカウントアップ
n += 1
# 読み込んだ行を数値ごとに分割して、変数rttに代入する
rtt = line.to_f
# 総和を求める
sum_data += rtt
end
# 総和を使って平均を計算
ave = sum_data / n
# aとbを小数点第2位で四捨五入して出力
printf("average = %.6f\n", ave)
file.close
よく利用するgnuplotのコマンドを示す。
gnuplot> pwd // 今いるディレクトリを確認
gnuplot> cd 'Desktop/tmp' // ディレクトリの移動
gnuplot> set xlabel 'RTT IPv4 (ms)' // x軸のラベル名を付ける
gnuplot> set ylabel 'RTT IPv6 (ms)' // y軸のラベル名を付ける
gnuplot> set title 'ping data' // グラフのタイトルを指定
gnuplot> a = 1.03; b = 9.28 // 変数に値を代入
gnuplot> plot 'rttv4v6.txt' // カレントディレクトリにあるrttv4v6.txtをプロットする
gnuplot> plot 'rttv4v6.txt', a + b*x // rttv4v6.txtとf(x)=a+b*xをプロットする
gnuplot> set xrange [0:1000] // グラフに表示するx軸の最小値と最大値を指定する
gnuplot> set yrange [0:1000] // グラフに表示するy軸の最小値と最大値を指定する
gnuplot> replot // 再度グラフを描写
gnuplot> set terminal png // グラフをpng形式で保存する
gnuplot> set output 'kadai1.png' // 保存するファイル名を指定する。現在いるカレントディレクトリに保存
gnuplot> replot // 保存を実行
参考リンク
- 回帰分析 関係
-
- 第4回講義資料(リンク先PDF)
- 最小二乗法 - Wikipedia
- Ruby 関係
-
- オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル
- Gnuplot 関係
-
- gnuplot homepage
- gnuplot tips (not so Frequently Asked Questions)
課題1 解答例
以下に、最小二乗法を計算するスクリプト例を示す
#!/usr/bin/env ruby
# 最小二乗法の計算
# 一次方程式 y = ax + b のaとbを求める
# コマンドの引数で指定したデータファイルを読み込む
file = open(ARGV.shift, 'r')
n = 0
sum_x = sum_y = sum_xy = sum_x2 = 0.0
# データファイルを1行ずつ読み込み、処理する
while line = file.gets
# 測定値数をカウントアップ
n += 1
# 読み込んだ行を数値ごとに分割して、変数に代入する
rttv4, rttv6 = line.split
rttv4 = rttv4.to_f
rttv6 = rttv6.to_f
# 最小二乗法で用いる総和を計算
sum_xy += rttv4 * rttv6
sum_x += rttv4
sum_y += rttv6
sum_x2 += rttv4 ** 2
end
# aとbを計算
a = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)
b = (sum_x2 * sum_y - sum_xy * sum_x) / (n * sum_x2 - sum_x ** 2)
# 出力
printf("a = %.2f; b = %.2f\n", a, b)
file.close