一粒で3回おいしい
ggplot2
id:syou6162
Sunday, November 22, 2009
自己紹介
• id:syou6162
• 吉田康久
• 筑波大学の院生(M1)
• 専門は自然言語処理と機械学習
Sunday, November 22, 2009
近況
• 7月にNAISTに合格 => 来年から奈良へ
• 8月ははてなにインターン
• スパムフィルタを作った
Sunday, November 22, 2009
Rユーザー会の告知!!
• wikiを見て!
• http://www.okada.jp.org/RWiki/?R
%B7%C7%BC%A8%C8%C4#i3afa741
• Tsukuba.Rの活動のことも少し紹介させ
てもらいます
Sunday, November 22, 2009
ここから本題
Sunday, November 22, 2009
まとめ
• きれい
• 統一的なplotの考え方を与えてくれる
• 使いこなしていると、統計解析の基礎
が身についている
Sunday, November 22, 2009
graphic関係の発表
• id:wakuteka(Tsukuba.R#1)
• Happy Graphics!
• id:syou6162(Tsukuba.R#2)
• もうちょっと高度なグラフィックス特集
• id:mickey24(Tsukuba.R#5)
• Animation with R
Sunday, November 22, 2009
Rのグラフィックス
• baseパッケージにある関数群
• 高水準作図関数
• 低水準作図関数
• 対話的作図関数
• latticeパッケージ
• animationパッケージ
Sunday, November 22, 2009
高水準作図関数
Sunday, November 22, 2009
低水準作図関数
Sunday, November 22, 2009
library(base)
• 低水準、高水準ともにbaseパッケージ
• 具体的なデータでもって、この関数た
ちで遊んでみる
Sunday, November 22, 2009
library(MASS)
• quineというデータ
• オーストラリアの子供の学校の欠席日
数
• 性別、年代などなどの因子データ
Sunday, November 22, 2009
年代別でhistgram(1)
Sunday, November 22, 2009
年代別でhistgram(2)
par(mfrow=c(2,2))
hist(quine$Days[quine$Age == "F0"])
hist(quine$Days[quine$Age == "F1"])
hist(quine$Days[quine$Age == "F2"])
hist(quine$Days[quine$Age == "F3"])
Sunday, November 22, 2009
問題点
• 因子の数が増えてくると面倒
• 横軸のメモリが微妙に違うので比較が
しづらい(かもしれない)
Sunday, November 22, 2009
無理やり頑張る...
Sunday, November 22, 2009
改造後
Sunday, November 22, 2009
うーむ。。。
age <- c("F0", "F1", "F2", "F3")
for(i in 1:4) {
	 plot(density(quine$Days[quine$Age == age[i]]),
	 	 col=i, lwd=3,
	 	 xlim=c(-20, 80), ylim=c(0, 0.08),
	 	 main="", xlab="", ylab="")
	 par("new"=TRUE)
}
title("Density of days in each age")
legend(40, 0.06, age, lwd=3, col=1:4)
Sunday, November 22, 2009
そこでggplotですよ!!
Sunday, November 22, 2009
ggplotを使うと…!!
Sunday, November 22, 2009
ぷろぐらむ
透過の割合!!
library(ggplot2)
q <- ggplot(quine, aes(Days, fill = Age))
q <- q + geom_density(alpha = 0.3)
print(q)
Sunday, November 22, 2009
histgramのほうも!!
q <- ggplot(quine, aes(Days))
q <- q + geom_histogram(binwidth = 10)
q <- q + facet_grid( ~ Age)
print(q)
Sunday, November 22, 2009
改変版histgram
Sunday, November 22, 2009
条件を増やしても
Sunday, November 22, 2009
ちょっと変えるだけ
q <- ggplot(quine, aes(Days))
q <- q + geom_histogram(binwidth = 10)
q <- q + facet_grid(Sex ~ Age)
print(q)
Sunday, November 22, 2009
疑問
• たまたまそういう関数があるだけ?
• こういうのいくつも覚えないといけな
いの?
• 他のパッケージではどうなのか
• →library(lattice)
Sunday, November 22, 2009
一応書ける...
Sunday, November 22, 2009
latticeパッケージ
library(lattice)
histogram(~Days | Age, data=quine)
Sunday, November 22, 2009
統一性..
• 個々の関数はそれなりの数、用意され
ている
• やりたいことごとに調べないといけな
い→統一性、一貫性がないorz
Sunday, November 22, 2009
パッケージ間の比較
base lattice ggplot
自動的に凡例
(カテゴリなどで)条件付
けが容易
複数のデータセットを使
うのが容易
段階的にplotを完成させ
るスタイル
拡張が容易か
使用する関数の一貫性
ディフォルトのplotが魅
力的なものか
× ×/○ ○
× ○ ○
○ × ○
○ × ○
× × ○
× × ○
× × ○
Sunday, November 22, 2009
一貫性?
• ggplotの中の人は「plotするのに必要な
構成要素は何か」について考えた
Sunday, November 22, 2009
構成要素
• 各軸と実際のデータとの対応付け(aes)
• どういう統計処理を使うか(例 : 平滑化)
• データをどのようにplotするか(例 : 散布図)
• グラフをどう配置するか
ggplotのreference manualを見よう!!
Sunday, November 22, 2009
Components
• Geoms
• Statistics
• Scales
• Coordinate systems
• Faceting
• Position adujstments
• 注意→MECEになっているわけではない
Sunday, November 22, 2009
要素を構成する
• さっきの構成要素は全て”layerオブジェ
クト”を返す関数
• レイヤーという考え方でくっつけてい
く!!
Sunday, November 22, 2009
ggplotの基本 => layer
• Photoshopのレイヤーとかと似たような
もの
• レイヤー(層)を重ねていく
• “Statistics”などもlayerを返す
http://retouch-weblab.com/kennkyuu/layer/layer1.html
Sunday, November 22, 2009
layerを重ねる(1)
• q <- ggplot(mtcars, aes(qsec, wt))
• (ggplotのオブジェクトが生成されるだけ
で、plotはまだされない。)
Sunday, November 22, 2009
layerを重ねる(2)
• q <- q + stat_smooth()
• print(q)
Sunday, November 22, 2009
layerを重ねる(3)
• q <- q + geom_point()
• print(q)
• さっきのレイヤーに
dotのレイヤーを重ね
ている!
Sunday, November 22, 2009
余談
• “+”というのはどういう風に定義されている
のか?
• ggplotオブジェクトについて再定義
• "%+%" <- `+.ggplot`とか
• ggplot2/R/plot-construction.rに定義がある
Sunday, November 22, 2009
ヒストグラム
• Geom:bar
• Stat:bin
• Scale:liner
• Coordinate
system:Cartesian
http://had.co.nz/ggplot2/resources/2007-vanderbilt.pdf
Sunday, November 22, 2009
散布図
• Geom:point
• Stat:identity
• Scale:liner
• Coordinate
system:Cartesian
http://had.co.nz/ggplot2/resources/2007-vanderbilt.pdf
Sunday, November 22, 2009
さっきの例
Sunday, November 22, 2009
どのlayerを使ってい
るでしょう?
Sunday, November 22, 2009
さっきの例
q <- ggplot(mtcars,
aes(qsec, wt))
# geomsのレイヤー
q <- q + geom_point()
# statisticsのレイヤー
q <- q + stat_smooth()
print(q)
Sunday, November 22, 2009
もう少し複雑な例で
• kNN method(k近傍法)
• データを分類する方法の一つ
• 自分の周りのk個のデータの多数決で、
どのラベルか判断する
Sunday, November 22, 2009
kNN
Sunday, November 22, 2009
k = 1
Sunday, November 22, 2009
prob.c.k.given.x <- function(x,y,k,data){
	 x1 <- data$x1; x2 <- data$x2
	 o <- rank(mapply(function(X1,X2){sqrt((X1-x)^2 + (X2-
y)^2)},x1,x2))
	 k.k <- sum(data$class[seq(length(o))[o <= k]] == "r")
	 return(k.k / k)
}
s <- seq(0, 1, length.out=100)
result <- as.data.frame(expand.grid(s, s))
result <- cbind(result, apply(result, 1, function(col) {
	 x <- col[1]; y <- col[2]
	 prob.c.k.given.x(x, y, 1, d)
}))
colnames(result) <- c("x", "y", "probability")
q <- ggplot(result, aes(x = x, y = y))
q <- q + geom_tile(aes(xmin = x, xmax = x + 0.01, ymin = y, ymax
= y + 0.01,
fill = probability), alpha = 0.1)
q <- q + geom_point(data = d, size = 2,
aes(x = x1, y = x2, color = factor(class)))
q <- q + scale_fill_gradient(low="red", high="blue")
print(q)
プログラム
Sunday, November 22, 2009
point
q <- ggplot(result, aes(x = x, y = y))
# geomsのレイヤー
q <- q + geom_tile(aes(xmin = x, xmax = x + 0.01,
ymin = y, ymax = y + 0.01,
fill = probability), alpha = 0.1)
# geomsのレイヤー
q <- q + geom_point(data = d, size = 2,
aes(x = x1, y = x2, color = factor(class)))
# scalesのレイヤー
q <- q + scale_fill_gradient(low="red", high="blue")
print(q)
Sunday, November 22, 2009
kを変化させてみる
Sunday, November 22, 2009
必要なレイヤーは
どれ?
Sunday, November 22, 2009
答え => Faceting
q <- q + facet_grid(k ~ .)
Sunday, November 22, 2009
副産物
• ggplotの使い方、考え方はこんな感じ
• しかし、使っていくなかで副産物が出
てくる(ように思う)
• 統計解析の基礎!!
Sunday, November 22, 2009
まとめ
• plotにまつわる面倒なところを隠してくれる
• しかも、統一的な考え方で扱える
• 「やりたいことは構成要素のどれでできる
か?」
• レイヤーを重ねていく
• 使っているうちに統計解析の基礎が身に付く
Sunday, November 22, 2009
参考
• http://had.co.nz/ggplot2/
• http://had.co.nz/ggplot2/resources/2007-
vanderbilt.pdf
• http://en.wordpress.com/tag/ggplot2/
• http://ito-hi.blog.so-net.ne.jp/tag/ggplot2
• http://d.hatena.ne.jp/
Rion778/20091025/1256508686
Sunday, November 22, 2009
Special Thanks
• @nozmaさんに95%くらいのことは教え
てもらいました
• ありがとう!!
Sunday, November 22, 2009
ご静聴ありがとうご
ざいました
Sunday, November 22, 2009
FAQ
Sunday, November 22, 2009
重くないですか?
• かなり重いですorz
• スペックが低いマシンだと厳しいかも
しれない
Sunday, November 22, 2009
背景変えられる?
• 変えられます
• see http://groups.google.com/group/
ggplot2/browse_thread/thread/
beff7d92f05dc741
Sunday, November 22, 2009
Sunday, November 22, 2009

Tsukuba