モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Rでグループをわけた3D分散グラフの出し方

Rを使ってデータ分析をしている時、3D分散グラフを条件によりA群B群のようにグループ分けして、そのグループごとにフィットさせたグラフを表示させたい時があります。

その時にグループ分けしてフィットしたグラフを書かせたいと思っても、なかなか参考になる情報が見つけられなくて苦労したので方法をまとめておきます。


まず、基本的な3D分散グラフの出し方です。
データフレームが data1 で x, y のパラメータから d が決まってくるような3Dグラフを、scatter3dというコマンドを使って描くことができます。

scatter3d( d ~ x + y, data=data1 )

この辺は最初 library(Rcmdr) を使ってGUIからやるとお手軽です。


例えば上記のグラフの場合、よく見ると右と左のデータ群では傾向が違うことがわかると思います。


まずグループ分けするための項目を追加します。
それには transform というコマンドを利用します。

元となるデータフレーム data1 に追加する項目を group とし、例えば y <= 180 の条件を A群、それ以外をB群とするようグループを作り、それを data2 のデータフレームに作る場合、下記コマンドで行うことができます。

data2 <- transform( data1, group=ifelse( data1$y <= 180, "A", "B" ) )

グループごとにわけてフィットさせたグラフを表示したい場合「|」でグループにわけるための項目を指定してやります。

scatter3d( d ~ x + y | group, data=data2 )


紫がA群のデータ、緑がB群のデータにフィットした面になります。
しかしこれだけだと全部の面が平行になってしまいます。
これはデフォルトだと「parallel=TRUE」というパラメータが効いてしまうためです。
なのでこのパラメータをオフにしてやります。

scatter3d( d ~ x + y | group, data=data2, parallel=FALSE )


これで目的とするグラフを描かせることが出来ました。