[連載]フリーソフトによるデータ解析・マイニング 5回

Rでのデータの視覚化(2)


 

 

6 散布図

 散布図は変数間の関係を考察するために、個体を23次元空間に配置したグラフである。

 

6.1 2次元散布図

2次元散布図というのは、一つの変数を横軸、もう一つの変数を縦軸として2次元平面に個体のデータを配置したグラフを指す。Rで散布図の作成はplotという関数を用いる。例えば、irisデータの第1列を横軸、第3列を縦軸とし、関数plotを用いてコマンド

 

>plot(iris[,1],iris[,3])

 

を実行すると、図11のような散布図が作成される。

 

11 ラベルなしの散布図      図12 個体番号が付いた散布図

 

 このような散布図はラベルがないので、どの個体がどの位置に配置されているかに関する情報が読み取れない。次のように2行のコマンドを実行すると個体の番号が付けられた図12のような散布図が返される。

 

>plot(iris[,1],iris[,3],type="n")

>text(iris[,1],iris[,3])

 

 関数plotに用いたtypeは散布図のマークの種類を指定する引数で、type=”n”は散布図のマークを描かない。関数textは散布図のラベルなどを加える関数で、plotの引数type=”n”text(x,y)の組み合わせで、データの番号をラベルとして付ける。

 データの番号ではなく、好きなラベルを各個体につけることも可能である。好きなラベルを付けるためには、ラベルを表す文字列ベクトルを事前に準備しておくと便利である。

 用いたirisデータの第5列はラベルのデータであるが、その表記が長いので、それを用いると散布図が非常に見にくくなる。そこで新たにラベルを作成することにする。ラベルデータの作成は、一つ一つのラベルをキーボードで入力することが最も素朴な方法である。しかし、irisの個体数は150もあり、すべてをキーボードで入力することはやや面倒であるので、repという関数を用いて作成する。repを用いた次のコマンドを実行すると、はじめの50のラベルはS51から100までのラベルはC101から150までのラベルはVであるラベルベクトルがiris.labelという名前で作成される。

 

>iris.label<-rep(c(“S”,”C”,”V”),rep(50,3))

 

次の2行のコマンドにより作成された散布図を図13に示す。

 

>plot(iris[,1],iris[,3],type="n")

>text(iris[,1],iris[,3],iris.label)

13 ラベルが付いた散布図

 

13から三種類のアヤメにおける各種類の特徴が読み取られる。花弁の長さ(縦軸)が最も短いのはsetosaで、その次がversicolorvirginicaの順で、花弁の長さでその品種がある程度識別できる。例えば、花弁の長さが2を超えなければその品種はsetosaであるなど。

関数plotの書き式と主な引数及びその機能を表3に示す。

 

3 関数plotの書き式と主な引数

plot(x, y, xlim=range(x), ylim=range(y), type="p", main, xlab, ylab……)
x
横軸のデータ
y
縦軸のデータ
xlim
横軸の範囲
ylim
縦軸の範囲
type
"p" は、点を描く
 
"l" は、 点を通過する線のみを描く
 
"b" は、点を描き、線で点を連結 
 
"c" は、点を飛ばして線を描く
 
"h" は、各点から横軸までの垂直線を描く
 
"n" 、枠()のみを描く
main
散布図の上部にタイトルを付ける
xlab
x(横軸)の名前を付ける
ylab
y(縦軸)の名前を付ける
cex
点のサイズ、指定しない場合は1、
 
3の引数を組み合わせた次のコマンドを実行すると図14のような図が作成される。
 
>plot(iris[,1],iris[,3],type="p",xlab="Length of Sepal", ylab="Length of Petal",cex=2, col=”red”)
 

4はどの点がどの種類であるかを識別することができない。次のようにirisの種類別に色付けすることもできる。次のコマンドを実行すると、図15 のような色が付いた散布図が作成される。

 

>plot(iris[,1],iris[,3],pch = 21, cex=2,bg = c(2, 3, 4)[unclass(iris$Species)])

 

ここの引数pch = 21は、円形マークを色で塗りつぶすこと、bg = c(2, 3, 4)はマークを3種類(赤、緑、青)の色で塗りつぶすこと、[unclass(iris$Species)]は、塗りつぶす色はデータirisの中Species列の品種の順であることの指定である。Irisデータは3種類であるので、個体1〜50setosa品種は色コード2の赤色(red)51100versicolor品種は色コード3の緑色(green)101150virginica品種は色コード4の青色(blue)で塗りつぶす。

軸の文字、ラベル、軸の名前の文字サイズを同時にコントロールするのには、plotを実行する前に関数parに引数cexを次のように用いる。

 

>par(cex=0.8)

 

引数cexのパラメータ0.8は標準サイズの0.8倍の大きさで文字を表示することを意味する。このパラメータは自由に調整することが可能である。関数parはグラフ画面の設定を行う関数で、数十個の引数がある。その主な引数を表4に示す。

 

 

14 複数の引数を用いた散布図の例    図15 種類ごと着色した散布図

 


4 parの書き式と主な引数

 

par(cex=,pch=, mfrow=, col=,……    )

cex=

文字、あるいはマークのサイズを指定する。初期値は1である。

pch=n

数値でマーク(絵記号)を指定。0は□、1は○など図16を参照。

pch=“文字”

“”で囲まれた文字を点の変わりにプロットする。

mfrow=c(m,n)

一つの画面にmn列の図を行順に描く、初期値はc(1,1)である。

mfcol=c(m,n)

一つの画面にmn列の図を列順に描く、初期値はc(1,1)である。

bg=

マークなどを塗りつぶすのに使用するの色を指定する。

col=

軸とマークの色を指定する。色の表記は表1を参照。文字列で色を示す場合は“”で囲むが、数値で示す場合は“”で囲まない。例えば、赤で散布図を作成する場合は、col=red”、あるいはcol=2。初期値は1()である。

lty=

線のタイプを指定する。1は実線、2は点線など

lwd=

線の太さを指定する。初期値は1。数値が大きくなると線が太くなる。


 

図16に引数pchの数値とマークの対応関係を示す。例えば、pch=1の時は○となる。

16 引数pchの数値とマークの対応関係

 

 

6.2 対散布図(散布図行列)

 用いる変数が2以上で、かつ変数がそれほど多くない量的データ場合は、本格的な解析を行う前に、すべての変数を組み合わせた散布図について考察を行うことで、データ間の関連性を視覚的に把握することができる。1つの画面に複数の変数を組み合わせた散布図を対散布図、あるいは散布図行列という。対散布図の作成は、関数pairsを用いる。irisのデータを用いて対散布図の作成について説明する。irisデータの四つの変数を用いた最もシンプルな対散布図は次のコマンドで作成できる。

 
>pairs(iris[1:4])
 

このコマンドで作成された散布図では、品種を区別することができない。コマンド

 
>pairs(iris[1:4], pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])

17 irisデータの対散布図

 
で種類ごとに色付けされた対散布図が作成される。pch = 21は円形マーク、bg = c("red", "green3", "blue")は色の指定、[unclass(iris$Species)]は、色付けはirisデータのSpeciesで示された順に行うことを指定している。
 

7. 3次元グラフ

3つの変数を用いて、3次元空間でデータを配置した3次元散布図の作成について説明する。パッケージを用いると図18に示すような3次元グラフを作成することができる。

 

  

18 3次元グラフのサンプル

 

パッケージlatticescatterplot3dには3次元散布図を描く関数が含まれている。

Packageメニューからlatticeを選択し、[OK]をクリックするか、コンソールからlibrary(lattice)と入力し、[Enter]キーを押すか、いずれかの方法でパッケージlatticeR読み込む。

latticeを読み込むと3次元散布図作成の関数cloudの作業環境が整ったことになる。その次に必要となるのはデータである。説明の便利のためここでもirisデータを用いる。次のコマンドを実行すると図19のような図が返される。

 

>library(lattice)

>cloud(iris[,1]~iris[,2]*iris[,3],col=”blue”,pch=19,data = iris)

 

19 iris3次元散布図1

 

cloudの最も簡潔な書き式はcloud(formula, data)である。formuladataのなかのどの変数をどの軸に対応させるかを指定する引数である。その書き式はz ~ x * yである。zは縦軸、x,yは両横軸である。”~”はチルタと呼ぶ。用いるデータの列の名前が付いている場合は、列の名前で次のように指定してもよい。次のコマンドを実行すると図20のような品種別に色分けした散布図が得られる。

 

>cloud(Sepal.Length ~ Petal.Length * Petal.Width, data = iris, groups = Species)

 

引数groups は自動的に色付けを行う際に、グループに関するベクトルを指定するのに用いる。図20と同じにするのには上記のコマンドに引数pch=c(16,17,18),col=c(1,2,4)を付け加え、マークの種類と色を指定する必要がある。

 

  

20 iris3次元散布図2     21 irisの3次元散布図3

 

3次元の回転角度は引数screen = list(z =, x=,y = )を用いて調整することが可能である。上記のコマンドに引数screen = list(z = 0, x=10,y =-15 )を付け加えると21のように回転した3次元散布図が作成される。

 パッケージgraphicsの中の関数perspを用いて3次元のグラフを作成することもできる。次のコマンドでの馬鞍形の3次元グラフが作成される。

 

>x <- seq(-5, 5, length=50)

>y <- x

>f <- function(x,y) {r <- (y^2)-(x^2)}

>z <- outer(x, y, f)

>persp(x, y, z,theta = 60,phi = 25,expand = 0.8,shade=.01,col = "lightblue")

 

22 馬鞍形の3次元グラフ

 

RにはニュージーランドのオークランドのMaunga Whau 火山のデータvolcanoがある。このデータセットは 10m×10m 格子ごとのMaunga Whau の標高地形データ情報で、87行61列のマトリックスで、北から南の方向の格子は行に、西から東の方向の格子は列に対応している。このデータと関数persp用いて次のコマンドで図23に示す3次元グラフを作成することができる。

 

>data(volcano)

>z <- 5 * volcano               # 見やすくするため高さを5倍に誇張

>x <- 10 * (1:nrow(z))        # 南北方向の10メートルの格子の辺

>y <- 10 * (1:ncol(z))         # 東西方向の10 メートルの格子の辺

>par(bg = "skyblue")     #背景の色設定

>persp(x, y, z, theta = 115, phi = 20, col = "lightgreen", scale = FALSE,ltheta = -120, shade = 0.75, border = NA, box = FALSE)

 

23 volcanoデータの3次元グラフ

 

7. 等高線グラフ

パッケージgraphicsには関数contourfilled.contour image、パッケージlatticeの中の関数levelplotなどで等高線のグラフを作成することができる。次にニュージーランドMaunga Whau 火山のデータvolcanoを用いた等高線のグラフ作成の例を示す。

 

>contour(volcano,main="contour(volcano)の等高線グラフ")

>image(volcano,main="image(volcano)の等高線グラフ")

 

 

 

24 contour(volcano)によるグラフ   図25 image(volcano)によるグラフ

 

 

>image(volcano,main="image(volcano)\n contour(volcano,add=T)\nを組み合わせた等高線グラフ")

>contour(volcano,add=T)

26 関数imagecontourによるグラフ

 

>filled.contour(volcano, color = terrain.colors)

>levelplot(volcano,main="levelplot(volcano)\nの等高線グラフ")

 

 

 

27 関数filled.contourによるグラフ    図28 関数levelplotによるグラフ