インターネット計測とデータ解析 課題1

課題1 「線形回帰計算と結果のプロット」

 与えられたデータを用いて最小二乗法による線形回帰を計算し、グラフ化しなさい。
その際、最小二乗法の計算は、プログラミング言語を用いて自分で計算すること。
また、グラフ化ツールには、gnuplot等の描画ツールを用いること(ExcelやMatlab, Mathmatica等の統計処理ツールは使ってはいけない)。
プログラミング言語は好きなものを利用して構わない。本講義ではRubyによる環境セットアップ方法とサンプルコードを示す。

使用データ

こちらからダウンロード。
データは、2008年10月18日に計測した、日本国内にあるサーバから世界中の対象IPアドレスに向けてtracerouteを行って収集したRTT値と、対象IPアドレスまでのおおよその直線距離である。
1列目が対象IPアドレスまでの距離(Km)、2列目がRTT(ms)を表す。

提出方法

締切りは、11月10日

提出物は、

を、SFC-SFSから提出すること。

セットアップ(Windows)

■ Rubyのインストール

http://www.artonx.org/data/asr/ActiveRuby.msi をダウンロードして、インストールを開始する。

インストーラ途中の選択しで、"Just me"を選択する。

インストーラ終了後、rubyのショートカットがデスクトップに作成されるので起動する。


■ gnuplotのインストール

http://www.tatsuromatsuoka.com/gnuplot/Eng/winbin/gp45-winbin.zip をダウンロードする

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 // 保存を実行

参考リンク

    回帰分析 関係
  1. 第4回講義資料(リンク先PDF)
  2. 最小二乗法 - Wikipedia
  3. Ruby 関係
  4. オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル
  5. Gnuplot 関係
  6. gnuplot homepage
  7. 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