金子邦彦研究室プログラミングRuby による Web/データベース・プログラミングRuby で rsruby を用いた散布図の作成

Ruby で rsruby を用いた散布図の作成

このページでは,rsruby を用いた散布図の作成について, 散布図内での平均と分散の図示散布図行列スケールの信頼性 の作成手順を図解で説明する

前準備

Ubuntu の場合

  1. Ubuntu で Ruby 処理系のインストール
  2. Ubuntu で R 処理系のインストール
  3. R システムでのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.
  4. Ubuntu で rsruby のインストール

Windows の場合

  1. Ruby と DevKit のインストール(Ruby インストーラ 3.1.2 を使用)(Windows 上): 別ページ »で説明している.
  2. Windows で R 処理系のインストール
  3. (オプション) R システムでのパッケージのインストールの Web ページの記述に従って,Rcmdr のインストールが済んでいること.
  4. Windows環境変数 PATH に「C:\R\R-2.14.1\bin\i386」を追加
  5. Windows で rsruby のインストール

CSVファイルを読み込み,Ruby の連想配列に格納 (Read CSV file, and store into an HashTable of Ruby)

  1. (前準備) 使用する CSV ファイルの作成

    ここでは,テスト用の CSV ファイル Book1.csv をダウンロードし, ディレクトリ C:\R\の下におくことにします.

    Ubuntu の場合は /tmp の下などに置く(要するにどこでも良い)

  2. 使用する CSV ファイルの確認

    この Web ページのプログラムでは,1行目がヘッダー.2行目以降がデータ本体になっている必要がある. CSV ファイルの1行目に,各列の属性名が書かれていることを確認する.

    テスト用の CSV ファイル Book1.csv では, 属性名として seq, date, USD, EUR, AUD の5つが 書かれている.

    [image]
  3. CSVファイルを読み込み,Ruby の連想配列に格納するプログラム (Read CSV file, and store into an HashTable of Ruby)

    まだ rsruby は使っていません.このプログラムを書き換えて,いろいろなグラフ作成に使うことします.

    require 'rubygems'
    require "csv"
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    

散布図の作成

  1. 数値による要約

    最小値,中央値,平均値,最大値などを取得

    Ubuntu の場合の実行手順例

    export R_HOME=/usr/lib/R
    irb 
    
    require 'rubygems'
    require "csv"
    require 'rsruby'
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    # 
    r = RSRuby::instance
    r.eval_R(<<-RCOMMAND)
         # create a data frame D 
         seq  <- c( #{T["seq"].join(",")} )
         date <- c( #{T["date"].join(",")} )
         USD  <- c( #{T["USD"].join(",")} )
         EUR  <- c( #{T["EUR"].join(",")} )
         AUD  <- c( #{T["AUD"].join(",")} )
         D = data.frame( cbind( seq = seq, date = date, USD = USD, EUR = EUR, AUD = AUD ) )
         a = summary(D)
    RCOMMAND
    r.a 
    

    [image]
  2. 数値による要約

    平均値,標準偏差などを取得

    Ubuntu の場合の実行手順例

    export R_HOME=/usr/lib/R
    irb 
    
    require 'rubygems'
    require "csv"
    require 'rsruby'
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    # 
    r = RSRuby::instance
    r.eval_R(<<-RCOMMAND)
         library(Rcmdr) 
         # create a data frame D 
         seq  <- c( #{T["seq"].join(",")} )
         date <- c( #{T["date"].join(",")} )
         USD  <- c( #{T["USD"].join(",")} )
         EUR  <- c( #{T["EUR"].join(",")} )
         AUD  <- c( #{T["AUD"].join(",")} )
         D = data.frame( cbind( seq = seq, date = date, USD = USD, EUR = EUR, AUD = AUD ) )
         a = numSummary( D[,c("USD", "EUR", "AUD")], statistics=c("mean", "sd", "quantiles"), quantiles=c( 0,.25,.5,.75,1 ))
    RCOMMAND
    r.a 
    

    [image]
  3. scatterplot」を用いた散布図の描画

    要点: 横軸が seq, 縦軸が USD

    Ubuntu の場合の実行手順例

    export R_HOME=/usr/lib/R
    irb 
    
    require 'rubygems'
    require "csv"
    require 'rsruby'
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    # 
    r = RSRuby::instance
    r.eval_R(<<-RCOMMAND)
         # create a data frame D 
         seq  <- c( #{T["seq"].join(",")} )
         date <- c( #{T["date"].join(",")} )
         USD  <- c( #{T["USD"].join(",")} )
         EUR  <- c( #{T["EUR"].join(",")} )
         AUD  <- c( #{T["AUD"].join(",")} )
         D = data.frame( cbind( seq = seq, date = date, USD = USD, EUR = EUR, AUD = AUD ) )
         scatterplot( USD~seq, reg.line=lm, smooth=TRUE, boxplots=FALSE, span=0.5, data=D )
    RCOMMAND
    

    [image]
  4. scatterplot」を用いた散布図の描画(分布の平均と分散も図示)

    要点: 横軸が seq, 縦軸が USD.分布の平均と分散も図示

    Ubuntu の場合の実行手順例

    export R_HOME=/usr/lib/R
    irb 
    
    require 'rubygems'
    require "csv"
    require 'rsruby'
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    # 
    r = RSRuby::instance
    r.eval_R(<<-RCOMMAND)
         # create a data frame D 
         seq  <- c( #{T["seq"].join(",")} )
         date <- c( #{T["date"].join(",")} )
         USD  <- c( #{T["USD"].join(",")} )
         EUR  <- c( #{T["EUR"].join(",")} )
         AUD  <- c( #{T["AUD"].join(",")} )
         D = data.frame( cbind( seq = seq, date = date, USD = USD, EUR = EUR, AUD = AUD ) )
         scatterplot( USD~seq, reg.line=lm, smooth=TRUE, boxplots='xy', span=0.5, data=D )
    RCOMMAND
    

    [image]
  5. 散布図行列

    Ubuntu の場合の実行手順例

    export R_HOME=/usr/lib/R
    irb 
    
    require 'rubygems'
    require "csv"
    require 'rsruby'
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    # 
    r = RSRuby::instance
    r.eval_R(<<-RCOMMAND)
         # create a data frame D 
         seq  <- c( #{T["seq"].join(",")} )
         date <- c( #{T["date"].join(",")} )
         USD  <- c( #{T["USD"].join(",")} )
         EUR  <- c( #{T["EUR"].join(",")} )
         AUD  <- c( #{T["AUD"].join(",")} )
         D = data.frame( cbind( seq = seq, date = date, USD = USD, EUR = EUR, AUD = AUD ) )
         scatterplot.matrix( ~seq+USD+EUR+AUD, reg.line=lm, smooth=TRUE, diagonal='density', span=0.5, data=D )
    RCOMMAND
    

    [image]
  6. スケールの信頼性

    export R_HOME=/usr/lib/R
    irb 
    
    require 'rubygems'
    require "csv"
    require 'rsruby'
    reader = CSV.open("/tmp/Book1.csv", "r") 
    header = reader.take(1)[0]
    T = Hash::new
    header.each do |attr|
      T[attr.strip] = []
    end
    reader.each do |row|
      i = 0
      row.each do |item|
        T[header[i].strip].push(item.strip) 
        i = i + 1
      end
    end
    # 
    r = RSRuby::instance
    r.eval_R(<<-RCOMMAND)
         # create a data frame D 
         seq  <- c( #{T["seq"].join(",")} )
         date <- c( #{T["date"].join(",")} )
         USD  <- c( #{T["USD"].join(",")} )
         EUR  <- c( #{T["EUR"].join(",")} )
         AUD  <- c( #{T["AUD"].join(",")} )
         D = data.frame( cbind( seq = seq, date = date, USD = USD, EUR = EUR, AUD = AUD ) )
        reliability( cov(D[,c("USD","EUR","AUD")], use="complete.obs") )
    RCOMMAND
    

    [image]