2009年3月 4日

R言語: 統計モデル全然理解できね

[ R プログラミング言語 ]

お小遣い帳を分析しようとしたとしましょう。Rでxtabsを使うと、こんな風に、どの月にどのくらい何をつかっていたかが簡単に集計できてたいへん便利です(データは架空ですよ)。

> df <- read.csv("test.csv")
> df
   月度   品名   費目  費用
1     2 送別会   外食  4500
2     2  R入門   書籍  3000
3     2 飲み会   外食  8000
4     2   天ぷら   外食  9500
5     2   余市   酒手  1550
6     3   塊魂   娯楽   900
7     3 ビール   酒手  5880
8     4 ビール   酒手  5880
9     4 ワイン   酒手  2100
10    4   定期 交通費 12000
> xtabs(費用 ~ 費目 + 月度, df)
        月度
費目       2     3     4
  外食   22000     0     0
  娯楽       0   900     0
  書籍    3000     0     0
  酒手    1550  5880  7980
  交通費     0     0 12000
>

...って意味わかんね! xtabsの第一引数は、「統計モデル」だそうで、~の左が目的変数・右が説明変数、かんぜんにちんぷんかんぷんです。勉強したおぼえもない。統計学はたいへん苦手な科目だったんですが、分かると世界がひろがりそうだから、勉強しなおそうかなあ...

2009年3月 3日

R言語入門: Rはベクトル操作がすごい

[ R プログラミング言語 ]

Rの基礎とプログラミング技法『Rの基礎とプログラミング技法』を読みながら、R言語の勉強中です。遠い昔にS-PLUSを使えたこともあったので、「再」入門かな。

この本はコンパクトにまとまっていて、なかなかよい本です。Rに関する多くの本は「統計解析」に重きがおかれていますが、この本は「言語の説明」に重点があります。

今回は基礎の習得の部分から「ベクトル操作がすごい」ことについて書きます。

Rの基本的なデータ型は「ベクトル」です。そしてベクトル同士の演算処理がいろいろ用意されています。

たとえば、"apple", "pear", "orange"のそれぞれが、3,2,1個あるとき、こんな表を作ります。excelでつくってcsvではいてもいいですね。

test.txt

product,amount
apple,3
pear,2
orange,1

で、これを読み込みます。そして、apple/pear/orangeをそれぞれ、その個数繰り返したベクタを作ります。

> l <- read.table("/Users/skoji/test.txt", sep=",", header=TRUE) # 読み込みます
> l
  product amount
1   apple      3
2    pear      2
3  orange      1
> rep(l$product, l$amount) # ベクタproductの要素を、それぞれamount回くりかえします
[1] apple  apple  apple  pear   pear   orange
Levels: apple orange pear

この、repでの指定の仕方がRですね。ベクタにたいして、ベクタで指定した回数だけ何かをする、ってパターンがよくあります。定型的なデータ処理ならループ構文いらず。

さっき読み込んだ表にたいしても、いろんなことができます。この例だと単純すぎるけど、データベース的なことできるんですよね。

> subset(l, product %in% c("apple","pear")) # productがappleまたはpearであるもの
  product amount
1   apple      3
2    pear      2
> subset(l, amount > 2) # amountが2より大きいもの
  product amount
1   apple      3

このデータ型は「データフレーム」というそうです(この本読むまで知らなかった)。

単純な一次元ベクトルについても、添え字でいろいろな操作ができます。できすぎです。

> x <- c(5,3,1,-1,9,100,10)
> x[3] # 3番目の要素
[1] 1
> x[c(5,1)] # 5番目と1番目の要素を、その順番で
[1] 9 5
> x[-c(5,1)] # 5番目と1番目の要素を除いたもの
[1]   3   1  -1 100  10
> x[c(TRUE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE)] # TRUEのところだけ
[1] 5 9
> x[x < 4] # 4未満のものだけ
[1]  3  1 -1
> x[1:3] <- c(4,3,2) # 1,2,3番目の要素を4,3,2で置き換える
> x
[1]   4   3   2  -1   9 100  10
> x[x>8] <- 0 # 8より大きい要素は0にする
> x
[1]  4  3  2 -1  0  0  0
> 

2006年1月 8日

R言語

[ R ]

前のエントリでグラフ作るのをいったんあきらめましたが、それもつまらないので簡単にグラフ作ってみました。(クリックで拡大します)。

縦軸が1日にdel.icio.usにポストしたブックマーク数、横軸が日付で、期間は昨年1/18日から今日(1/8)までです。横方向に間隔があいているときはdel.icio.usにポストしていない日があることを意味しています。使いはじめてから3日は面白がって遊び、夏ごろは飽きていて、昨年末ぐらいからまた激しく使っている、という感じでしょうか。

グラフつくるのにはR言語をつかってみました。エクセル使ってもいいんだけど、それじゃつまらない。

R言語は統計用言語といわれるS言語のクローンです。学生のとき統計の授業でS言語習ってからは、レポートのグラフはなんでもかんでもSを使って作ってたのですが、もうすっかり言語を忘れてしまっていました。あんなに使ってたのにな。

いろいろググったりして思い出しつつ、なんとかかいたのが次のコード。

d <- read.table("c:\\tmp\m.txt", colClasses=c("Date", "integer"))
plot(d, xlab="date", ylab="count")
lines(d, col="blue")
title("skoji's del.icio.us bookmark count")

m.txtの中身はこのrubyスクリプトの出力です。さっき書いたやつで月ごとに集計しないだけ。

require 'rubygems'
require 'date'
require_gem 'Rubilicious'

user = 'skoji'
pass = 'xxxx'

r = Rubilicious.new(user, pass)
e = r.dates
h = Hash.new
e.sort.each { | date, count |
  puts "#{date}, #{count}"
}

かっこ悪いグラフですけど、4行のコードでここまでできちゃうのがR便利です。Rは統計処理の関数が大量にあるだけじゃなくて、プログラミング言語的にも確かおもしろい特徴があったようなかすかな記憶があります。R勉強しなおして、会社でもグラフ書きにつかってみたりしようかな。

そういえばRで直接webサービスを叩く方法あるのでしょうか。どなたか知っていたらおしえてください。