最近,機械学習の勉強会でRをいじる機会がありました.
Rは機械学習や統計に関するパッケーが充実しているのは大変魅力的です.
そして,ggplot2という強力なグラフの描画用のパッケーがすごいです.
Excelではこんな見栄えのよいグラフを作れないよなと感動してしまいます.
今日はそんなRのggplot2で基本的な図の描画をしてみます.
まずggplot2をインストールしていない場合は,以下の用なコードでインストールしてください.
コードを入力するとCRAN mirrorというウィンドウが現れるので,Japanあたりのミラーを指定してください.
install.packages("ggplot2", dependencies = TRUE)
package ‘ggplot2’ successfully unpacked and MD5 sums checked
というメッセージがでればインストール成功です.
インストールが無事終わったら,以下のようにライブラリをロードします.
library('ggplot2')
まずは,データフレームを作ります.
set.seed(1)
x.1 <- rnorm(1000)
y.1 <- rnorm(1000)
label.1 <- ifelse(rbinom(1000, size = 1, prob = 0.5), TRUE, FALSE)
data.1 <- data.frame(X = x.1, Y = y.1, L = label.1)
x.1とy.1には正規分布に従う乱数を1000個ずつ生成して格納します.
label.1には,二項分布に従う乱数を生成し,1ならTRUE,0ならFALSEを格納します.
これらのベクトルからデータフレーム data.1を作成します.
データフレームの準備が出来たので,まずはXを0.4ずつに区切ってヒストグラムを描画します.
ggplot()にデータフレームと使用するデータのラベルを指定し,描画する環境を設定します.
その環境にgeom_histogram()で生成したヒストグラムを重ねることで,グラフを描画します.
hist.1 <- ggplot(data.1, aes(x = X)) + geom_histogram(binwidth = 0.4)
hist.1
次に,geom_density()を使って確率密度関数を描画します.
dens.1 <- ggplot(data.1, aes(x = X)) + geom_density()
dens.1
最後に,散布図を描画します.
x軸にラベルXのデータを,y軸にラベルYのデータ,各点の色にラベルLのデータを使用します.
散布図はgeom_point()関数で描画できます.
scatter.1 <- ggplot(data.1, aes(x = X, y = Y, color = L)) + geom_point()
scatter.1
ラベルごとに色が変わっており,さらに凡例もしっかりとついています.
軸のラベルや凡例のラベルを変更するには以下のように,labs()を使用します.
scatter.1 <- scatter.1 + labs(color = 'Label')
このように,よくあるグラフを簡単に,しかも見栄え良く描画することができます.
今度は,別のデータフレームを使って,任意の関数の描画方法を見てみましょう.
x.2 = runif(1000)
y.2 <- x.2 + rnorm(1000, sd = 0.05)
data.2 <- data.frame(X = x.2, Y = y.2)
y = xの1次関数に従うデータを生成します.
x.2には一様乱数を1000個生成して格納しています.
y.2にはx.2の値に標準偏差0.05,平均0のガウスノイズを加えたデータを格納しています.
まずは,このデータの散布図を描画します.
scatter.2 <- ggplot(data.2, aes(x = X, y = Y, color = L)) + geom_point()
scatter.2
次に,任意の関数をこの散布図に重ねてみます.
描画するのは,このデータの回帰直線を描画します.
回帰直線はlm()を使って以下のように簡単に求めることが出来ます.
fit <- with(data.2, lm(Y ~ X))
intercept <- coef(fit)[1]
slope <- coef(fit)[2]
この回帰直線をstat_function()関数の引数funに,ラムダ式を使って回帰直線の1次関数の計算式を与えます.
先ほどの散布図に重ねるには,この直線をscatter.2に足し合わせることで重ねることが出来ます.
scatter.2 <- scatter.2 +
stat_function(colour = "orange", fun = function(x) slope * x + intercept, size = 1)
scatter.2
この回帰直線はy = xの関数にノイズを加えたものなので,回帰直線はy = xに近いことがわかります.
最後に,scatter.2を画像ファイルに保存します.
ggsave(plot = scatter.2, filename = "scatter_2.png", height = 8, width = 8)
以上のように,簡単に見栄えのするグラフが描画できました.
正直,ggplot2だけでもRを使う価値があると思います.
三次元のグラフのように見栄えのするグラフも描画できるようですので,みなさんも是非使ってみてください.
参考文献:
Drew Conwayら 『入門 機械学習』オライリージャパン (2012/12/22)
「乱数Tips大全」『RjpWiki』
(2015/02/09アクセス)
コメント
コメントを投稿