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

Rによるカテゴリカルデータの視覚化

1.分割表の度数と割合の図示

(1) 気球グラフ

 パッケージgplotsには分割表のセルの度数を気球の大きさで示す関数balloonplotがある。パッケージgplotsはCRANミラーサイトからダウンロードできる。balloonplotが扱うオブジェクトはtable形式である。気球の形状、色は、それぞれ引数dotchart, dotcolorで指定することができる。気球グラフは周辺度数も表示する。分割表の気球グラフの例を次に示す。データはArthritisを用いることにする。

> library(gplots);
> library(vcd);data(Arthritis)
> ArtTI <- xtabs(~ Treatment + Improved, data = Arthritis)
> balloonplot(t(ArtTI)) #グラフの作成


図1 分割表の気球グラフ

図1 分割表の気球グラフ

(2) 帯グラフ

 アンケート調査結果のような単純集計を行う際の分割表の図示方法として、帯グラフが多く用いられている。Rでは、分割表の帯グラフは関数barplotを用いて作成することができる(図2)。

> x<-round(prop.table(ArtTI,2),3)
> barplot(x,horiz=T,xlab="Improved(Placebo Treated)")

 作成した帯グラフに数値を表示するためには次のような若干の工夫が必要である。

> for(i in 1:3)text(cumsum(x[,i])-x[,i]/2,i*1.2-0.5,t(x[,i]),cex=1.2)


図2 分割表の帯グラフ

図2 分割表の帯グラフ

2.モザイクグラフ

 帯グラフは2元分割表の行、あるいは列における割合をグラフ化することが可能であるが、行と列の交互作用を考察するのに、また3元以上分の割表を図示するのにも不便である。多元分割表の図示方法としてモザイク(mosaic)グラフがある。モザイクグラフは長方形の面積で分割表のセルの値を図示する。
 モザイクグラフを作成する関数としては、パッケージgraphics の中にmosaicplot、パッケージvcdの中にmosaic, strucplotがある。関数mosaicplotに関しては本欄第7回(2004年2月号)で簡単に紹介した。本稿では、関数mosaicを用いて説明する。
 まず関数mosaicを用いてデータArtTIのモザイクグラフを作成するコマンドを次に示し、その結果を図3に示す。

> mosaic(ArtTI)


図3 モザイクグラフ

図3 モザイクグラフ

 セルの値を長方形に図示するための縦・横の辺の長さの決定方法について、2元分割表を例に説明する。
 分割表の第ij列のセルの度数をnij、第i行の合計をni+、第j列の合計をn+j、総合計をn++とすると、第ij列のセルの度数が全体の中に占める比率はpij=nij/n++であり、第i行の合計が全体の中に占める比率はpi=ni+/n++である。第i行におけるj列のセルの比率はpj|i=nij/ni+であるため、各セル値の確率は各セル値の確率である。従って、pijを長方形で図示すると、縦・横辺の長さはそれぞれpi=ni+/n++pj|i=nij/ni+になる。モザイクグラフは、このようにしてそれぞれのセルの値を長方形で図示する。
 モザイクグラフでは、分割表のピアソン残差の値の符号(正、負)とその大小を用いてそのグラフを着色することができる。
 関数mosaicに引数shad=TRUEを加えると残差値に基づいて着色されたモザイクグラフが返される。着色を行うデフォルト値は、残差が2以下はグレイー、2から4までの負の値は赤、正の値はブルーになっている。
 データArtTIの残差が-2~2以内であるため、次のように引数shad=TRUEを加えてもモザイクグラフの色はグレイー1色である。

> mosaic(ArtTI,shad=TRUE)
<グラフは省略>

 関数mosaicでは分割表の残差の最大値を基準として着色する引数gp = shading_maxがある。その例を次に示す。

> mosaic(ArtTI,gp = shading_max)


図4 着色されたモザイクグラフ

図4 着色されたモザイクグラフ

 図の右側の残差目盛棒の右側には残差と色との対応、下にはカイ2乗統計量に対応する確率値が返される。このような図は、分割表の各セルの値とその色から視覚的に独立性の分析を行う際に有効である。
 多元分割表のモザイクグラフも関数mosaicで簡単に作成することができる。データArtTISを用いた3元分割表のモザイクグラフを作成する例を次に示す。

> mosaic(ArtTIS,shad=T)


図5 3元分割表のモザイクグラフ

図5 3元分割表のモザイクグラフ

 関数mosaicは条件付きのモザイクグラフを作成することもできる。3元分割表ArtTISの性別を条件としたモザイクグラフを作成するコマンドを次に示し、その結果を図6に示す。

> mosaic(Treatment ~ Improved|Sex , data = Arthritis)


図6 条件付きモザイクグラフ

図6 条件付きモザイクグラフ

 対散布図のように、多元分割表は2元分割表を組み合わせた対モザイクグラフを作成することができる。パッケージvcdには対モザイクグラフを作成する関数pairs_assoc(略してpairs)がある。3元分割表ArtTISを用いた例を次に示す。

> pairs(ArtTIS, gp = shading_max)


図7 モザイク・マトリックス

図7 モザイク・マトリックス

3.網グラフ

 分割表の期待度数を図示するモザイクグラフの上にセルの度数に比例する網目模様を示すグラフを篩い(sieve)グラフと呼ぶが、本稿では網グラフと呼ぶことにする。
 パッケージvcdには網グラフを作成する関数sieveがある。分割表ArtTIを用いたコマンドを次に示し、その結果を図8に示す。図8から分かるように、網の目は分割表のセルの度数に比例する。すなわち、値が大きいほどそのセルに対応する網の目が細かく、その逆であれば網の目が粗い。

> sieve(ArtTI,shade=TRUE)


図8 網グラフ

図8 網グラフ

 関数labeling_cellsを用いると、作成したモザイクグラフ、網グラフにセルの度数を表示することができる。セルの度数を表示するためには、関数mosaic, sieveに引数pop=FALSEを指定することが必要である。そのコマンドの例を次に示す。

> sieve(ArtTI,shade=TRUE,pop=FALSE)
> labeling_cells(text = ArtTI)(ArtTI)
<図は省略>

セルの度数の文字フォントとサイズは、関数labeling_cellsに引数gp_text=gpar()を用いて自由に指定することができる。gparはグラフのパラメータを指定する関数である。文字サイズを50に、文字フォントをitalic(「3」で代替できる)にした例を次に示す(図9)

> sieve(ArtTI,shade=TRUE,pop=FALSE)
> labeling_cells(text = ArtTI,gp_text = gpar(fontsize = 50,fontface = 3))(ArtTI)


図9 セル度数を表示した網グラフ

図9 セル度数を表示した網グラフ

4.アソシエーショングラフ

 アソシエーション(association)グラフは図10のように、残差を長方形で図示するグラフである。長方形の高さは残差、幅は期待度数の平方根、面積は観測度数と期待度数の差に比例する。各長方形はゼロをベースラインとし、残差が正の場合は場合はベースラインの上方、その逆であればベースラインの下方に配置する。また、モザイクグラフと同様、色で残差の大小、正負を表すことができる。

> assoc(ArtTIS,shade=T)


図10 アソシエーショングラフ

図10 アソシエーショングラフ

5.四分グラフ

 2×2の分割表(四分表)の各セルの度数を1/4の円に対応付けるように工夫した一種の円グラフ(図11)を四分ディスプレイ(fourfold display)と呼ぶが、本稿では四分グラフと呼ぶことにする。2×2×kの分割表はk個の2×2の分割表に分けて図示する。四分グラフの各セルに対応する円弧の直径は√nijに比例する。
 四分グラフの作成関数としては、パッケージgraphicsにfourfoldplot、パッケージvcdにfourfoldがある。
 Rの中のデータセットUCBAdmissionsを用いて、四分グラフを作成する例を示す。データUCBAdmissionsは、1973年のUCバークレーの主な6つの学科から大学院への希望者をアドミッション(admission)の結果、性別に分けた2×2×6の分割表である。 6つの学科ごとに分割されたデータをすべて次のようにまとめ、セルの最大値を基準とした図示の例を示す。

>x<-apply(UCBAdmissions, c(2, 1), sum)
> fourfoldplot(x,std ="all.max")


図11 UCBAdmissionsの四分グラフ1

図11 UCBAdmissionsの四分グラフ1

 四分グラフは、何らかの基準で分割表を標準化して円グラフを作成する。データの標準化には、引数stdに"margins", "ind.max", "all.max"の中から1つを選んで指定する。"ind.max"の場合は、それぞれの2×2分割表の中の最大値を基準とし、 "all.max"の場合は2×2×kの中の最大値を基準として同時に標準化する。デフォルトはstd="margins"になっている。"margins"の場合は、それぞれの2×2分割表はオッズ比によって標準化される。
 四分グラフの主な目的は、オッズ比オッズ比を図示することにある。2×2の分割表の確率値確率値のオッズ比はオッズ比であるので、確率pの推測値は確率の推測値で求めることができる。オッズ比によって推定される確率の四分グラフは引数stdのデフォルト値のままで作成できる。

> fourfoldplot(x)


図12 UCBAdmissionsの四分グラフ2

図12 UCBAdmissionsの四分グラフ2

 引数conf.levelでは、信頼区間を指定する。デフォルトは95%になっている。オッズ比の信頼区間は四分グラフの円弧の帯域で示す。2×2の分割表のオッズ比の信頼区間はexp(2×2の分割表のオッズ比の信頼区間)、標準誤差は標準誤差で求める。
 図の色は引数colorを用いて指定する。分割表の行・列を基準とした四分グラフは引数marginで指定する。margin=1は行の合計を、margin=2は列の合計を基準としたグラフを作成する。

5.三角グラフ

 三角グラフは、3次元データの図示方法である。分割表の表側、あるいは表頭のどちらかが3項目の場合は、三角グラフで図示することができる。誌面の都合上、グラフの例のみを示す。
 パッケージvcdには三角グラフ関数ternaryplotが用意されている。関数ternaryplotでは、各次元を示すラベルを置く場所、グラフの中のマークの種類、サイズ、色、バックグラウンドの色、目盛などを指定する引数が用意されている。データArthritisのTreatment と Sexをクロスさせた分割表の三角グラフを作成する例を示す。ただし、マークの種類、色、サイズ以外はデフォルト値を用いた。

>tab <- as.table(xtabs(~ I(Sex:Treatment)+ Improved, data = Arthritis))
> col <- c("red", "red", "blue", "blue")
> pch <- c(1, 19, 1, 19)
> ternaryplot(tab, col = col, pch = pch,prop_size = TRUE,main = "Arthritis Treatment Data")
>grid_legend(0.8,0.7,pch,col, rownames(tab))


図13 三角グラフ

図13 三角グラフ

 三角グラフに関しては、パッケージade4には関数triangle.biplot、triangle.plot、triangle.classなどがあり、パッケージZelig にも関数ternaryplotがある。

6. その他のグラフ

 カテゴリカルデータを量的データに変換して密度を推定し、図示する方法がある。パッケージvcdにその機能を実装した関数cd_plotがある。その例を次に示す。目的変数Improvedはカテゴリカルデータであり、説明変数Ageは量的データである(図14)。

> cd_plot(Improved ~ Age, data = Arthritis)


図14 カテゴリカルデータの密度分布

図14 カテゴリカルデータの密度分布

 データがk×kの混同行列(confusion matrix)の場合、黒、灰、白の色の長方形を用いて図15のように表す方法がある。このようなグラフを一致プロット(agreement plot)と呼ぶ。黒の正方形の辺の長さは観測データの主対角線の値niiに比例する。白の長方形の縦と横の辺はそれぞれ白の長方形の縦の辺白の長方形の横の辺に比例する。灰色の長方形の縦の辺は灰色の長方形の縦の辺、横の辺は灰色の長方形の横の辺に比例する。
 パッケージvcdには、一致プロットを作成する関数agreementplotがある。データSexualFunを用いた例を次に示す。

> data(SexualFun)
data(SexualFun)の結果
>agreementplot(t(SexualFun))


図15 一致プロット

図15 一致プロット