Tsukuba

5,401 views

Published on

1 Comment
16 Likes
Statistics
Notes
No Downloads
Views
Total views
5,401
On SlideShare
0
From Embeds
0
Number of Embeds
295
Actions
Shares
0
Downloads
71
Comments
1
Likes
16
Embeds 0
No embeds

No notes for slide

Tsukuba

  1. 1. 一粒で3回おいしい ggplot2 id:syou6162 Sunday, November 22, 2009
  2. 2. 自己紹介 • id:syou6162 • 吉田康久 • 筑波大学の院生(M1) • 専門は自然言語処理と機械学習 Sunday, November 22, 2009
  3. 3. 近況 • 7月にNAISTに合格 => 来年から奈良へ • 8月ははてなにインターン • スパムフィルタを作った Sunday, November 22, 2009
  4. 4. Rユーザー会の告知!! • wikiを見て! • http://www.okada.jp.org/RWiki/?R %B7%C7%BC%A8%C8%C4#i3afa741 • Tsukuba.Rの活動のことも少し紹介させ てもらいます Sunday, November 22, 2009
  5. 5. ここから本題 Sunday, November 22, 2009
  6. 6. まとめ • きれい • 統一的なplotの考え方を与えてくれる • 使いこなしていると、統計解析の基礎 が身についている Sunday, November 22, 2009
  7. 7. 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
  8. 8. Rのグラフィックス • baseパッケージにある関数群 • 高水準作図関数 • 低水準作図関数 • 対話的作図関数 • latticeパッケージ • animationパッケージ Sunday, November 22, 2009
  9. 9. 高水準作図関数 Sunday, November 22, 2009
  10. 10. 低水準作図関数 Sunday, November 22, 2009
  11. 11. library(base) • 低水準、高水準ともにbaseパッケージ • 具体的なデータでもって、この関数た ちで遊んでみる Sunday, November 22, 2009
  12. 12. library(MASS) • quineというデータ • オーストラリアの子供の学校の欠席日 数 • 性別、年代などなどの因子データ Sunday, November 22, 2009
  13. 13. 年代別でhistgram(1) Sunday, November 22, 2009
  14. 14. 年代別で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
  15. 15. 問題点 • 因子の数が増えてくると面倒 • 横軸のメモリが微妙に違うので比較が しづらい(かもしれない) Sunday, November 22, 2009
  16. 16. 無理やり頑張る... Sunday, November 22, 2009
  17. 17. 改造後 Sunday, November 22, 2009
  18. 18. うーむ。。。 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
  19. 19. そこでggplotですよ!! Sunday, November 22, 2009
  20. 20. ggplotを使うと…!! Sunday, November 22, 2009
  21. 21. ぷろぐらむ 透過の割合!! library(ggplot2) q <- ggplot(quine, aes(Days, fill = Age)) q <- q + geom_density(alpha = 0.3) print(q) Sunday, November 22, 2009
  22. 22. histgramのほうも!! q <- ggplot(quine, aes(Days)) q <- q + geom_histogram(binwidth = 10) q <- q + facet_grid( ~ Age) print(q) Sunday, November 22, 2009
  23. 23. 改変版histgram Sunday, November 22, 2009
  24. 24. 条件を増やしても Sunday, November 22, 2009
  25. 25. ちょっと変えるだけ q <- ggplot(quine, aes(Days)) q <- q + geom_histogram(binwidth = 10) q <- q + facet_grid(Sex ~ Age) print(q) Sunday, November 22, 2009
  26. 26. 疑問 • たまたまそういう関数があるだけ? • こういうのいくつも覚えないといけな いの? • 他のパッケージではどうなのか • →library(lattice) Sunday, November 22, 2009
  27. 27. 一応書ける... Sunday, November 22, 2009
  28. 28. latticeパッケージ library(lattice) histogram(~Days | Age, data=quine) Sunday, November 22, 2009
  29. 29. 統一性.. • 個々の関数はそれなりの数、用意され ている • やりたいことごとに調べないといけな い→統一性、一貫性がないorz Sunday, November 22, 2009
  30. 30. パッケージ間の比較 base lattice ggplot 自動的に凡例 (カテゴリなどで)条件付 けが容易 複数のデータセットを使 うのが容易 段階的にplotを完成させ るスタイル 拡張が容易か 使用する関数の一貫性 ディフォルトのplotが魅 力的なものか × ×/○ ○ × ○ ○ ○ × ○ ○ × ○ × × ○ × × ○ × × ○ Sunday, November 22, 2009
  31. 31. 一貫性? • ggplotの中の人は「plotするのに必要な 構成要素は何か」について考えた Sunday, November 22, 2009
  32. 32. 構成要素 • 各軸と実際のデータとの対応付け(aes) • どういう統計処理を使うか(例 : 平滑化) • データをどのようにplotするか(例 : 散布図) • グラフをどう配置するか ggplotのreference manualを見よう!! Sunday, November 22, 2009
  33. 33. Components • Geoms • Statistics • Scales • Coordinate systems • Faceting • Position adujstments • 注意→MECEになっているわけではない Sunday, November 22, 2009
  34. 34. 要素を構成する • さっきの構成要素は全て”layerオブジェ クト”を返す関数 • レイヤーという考え方でくっつけてい く!! Sunday, November 22, 2009
  35. 35. ggplotの基本 => layer • Photoshopのレイヤーとかと似たような もの • レイヤー(層)を重ねていく • “Statistics”などもlayerを返す http://retouch-weblab.com/kennkyuu/layer/layer1.html Sunday, November 22, 2009
  36. 36. layerを重ねる(1) • q <- ggplot(mtcars, aes(qsec, wt)) • (ggplotのオブジェクトが生成されるだけ で、plotはまだされない。) Sunday, November 22, 2009
  37. 37. layerを重ねる(2) • q <- q + stat_smooth() • print(q) Sunday, November 22, 2009
  38. 38. layerを重ねる(3) • q <- q + geom_point() • print(q) • さっきのレイヤーに dotのレイヤーを重ね ている! Sunday, November 22, 2009
  39. 39. 余談 • “+”というのはどういう風に定義されている のか? • ggplotオブジェクトについて再定義 • "%+%" <- `+.ggplot`とか • ggplot2/R/plot-construction.rに定義がある Sunday, November 22, 2009
  40. 40. ヒストグラム • Geom:bar • Stat:bin • Scale:liner • Coordinate system:Cartesian http://had.co.nz/ggplot2/resources/2007-vanderbilt.pdf Sunday, November 22, 2009
  41. 41. 散布図 • Geom:point • Stat:identity • Scale:liner • Coordinate system:Cartesian http://had.co.nz/ggplot2/resources/2007-vanderbilt.pdf Sunday, November 22, 2009
  42. 42. さっきの例 Sunday, November 22, 2009
  43. 43. どのlayerを使ってい るでしょう? Sunday, November 22, 2009
  44. 44. さっきの例 q <- ggplot(mtcars, aes(qsec, wt)) # geomsのレイヤー q <- q + geom_point() # statisticsのレイヤー q <- q + stat_smooth() print(q) Sunday, November 22, 2009
  45. 45. もう少し複雑な例で • kNN method(k近傍法) • データを分類する方法の一つ • 自分の周りのk個のデータの多数決で、 どのラベルか判断する Sunday, November 22, 2009
  46. 46. kNN Sunday, November 22, 2009
  47. 47. k = 1 Sunday, November 22, 2009
  48. 48. 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
  49. 49. 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
  50. 50. kを変化させてみる Sunday, November 22, 2009
  51. 51. 必要なレイヤーは どれ? Sunday, November 22, 2009
  52. 52. 答え => Faceting q <- q + facet_grid(k ~ .) Sunday, November 22, 2009
  53. 53. 副産物 • ggplotの使い方、考え方はこんな感じ • しかし、使っていくなかで副産物が出 てくる(ように思う) • 統計解析の基礎!! Sunday, November 22, 2009
  54. 54. まとめ • plotにまつわる面倒なところを隠してくれる • しかも、統一的な考え方で扱える • 「やりたいことは構成要素のどれでできる か?」 • レイヤーを重ねていく • 使っているうちに統計解析の基礎が身に付く Sunday, November 22, 2009
  55. 55. 参考 • 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
  56. 56. Special Thanks • @nozmaさんに95%くらいのことは教え てもらいました • ありがとう!! Sunday, November 22, 2009
  57. 57. ご静聴ありがとうご ざいました Sunday, November 22, 2009
  58. 58. FAQ Sunday, November 22, 2009
  59. 59. 重くないですか? • かなり重いですorz • スペックが低いマシンだと厳しいかも しれない Sunday, November 22, 2009
  60. 60. 背景変えられる? • 変えられます • see http://groups.google.com/group/ ggplot2/browse_thread/thread/ beff7d92f05dc741 Sunday, November 22, 2009
  61. 61. Sunday, November 22, 2009

×