Rのデータフレームに対してSQLのUNIONとINTERSECTを実行する。

タイトルのまんまの問題で恐ろしくはまって自作関数をつくろうとしていたので、メモ

参考:R help - union of two data frames
http://r.789695.n4.nabble.com/union-of-two-data-frames-td848979.html

#2つの異なるデータフレームを作成する
df1 <- data.frame(a = 1:10, b = 11:20)
df2 <- data.frame(a = c(1:2,98),  b = c(11:12, 99))

#df1
# a  b
# 1   1 11
# 2   2 12
# 3   3 13
# 4   4 14
# 5   5 15
# 6   6 16
# 7   7 17
# 8   8 18
# 9   9 19
# 10 10 20

#df2
# a  b
# 1  1 11
# 2  2 12
# 3 98 99

#(1,11)(2,12)が重複している

#UNIONに相当する計算
merge(df1, df2, all = TRUE)
# a  b
# 1   1 11
# 2   2 12
# 3   3 13
# 4   4 14
# 5   5 15
# 6   6 16
# 7   7 17
# 8   8 18
# 9   9 19
# 10 10 20
# 11 98 99

#INTERSECTに相当する計算
merge(df1, df2, all = FALSE)
# a  b
# 1 1 11
# 2 2 12

アソシエーション分析可視化パッケージarulesViz

最近転職して、Rをメインで使用しています。(弊社のR使用率はなんと100%!)
今後も仕事を通じてRの普及と進歩に貢献していきたいと考えています。


今回の記事の更新はRAdventCalendar2012の一貫として更新しています。
ハッシュタグ#RAdventJPですので、こちらもぜひチェックしてみてください。


早くビールが飲みたいので、今日はアソシエーション分析の結果を可視化するパッケージのarulesVizの紹介をしてお茶を濁したいと思います。


アソシエーション分析とはなんぞやとかRでのアソシエーション分析の使い方については、Tokyo.R #22の発表資料が大変よくまとまっていてわかりやすいので、こちらをご覧になってください。これを読めばアソシエーション分析については基本を抑えることが出来ると思います。アソシエーション分析について知らない方はこの記事を読む前にこちらをご覧になってください。



aruleVizには、3つの関数が存在します。



  • abbreviate・・・アソシエーションルール用のデータを表示のために(?)名称を短縮する関数
  • plot・・・アソシエーション分析の結果を可視化するメインとなる関数
  • saveAsGraph・・・アソシエーション分析の結果をグラフ形式で保存するための関数

この記事ではメインのplot関数について解説していきます。arulesVizのplot関数は引数methodに渡す値によって、最終的に表示される図が変わります。アソシエーション分析はルールベースで結果が出力されますが、アイテム数やルール数が多い時には、ルールを全て目で追うのは煩雑であり、アソシエーション分析の各指標に対してフィルターを設ける等、探索的な解析が必要になります。この時、arulesVizにある様々なプロット関数が役に立ちます。アソシエーション分析の結果を可視化した図を活用しながら、パラメータを調整し、最終的な分析結果に辿り着くという使用方法も可能でしょうし、クライアントとのコミュニケーションにも使用出来るでしょう。



オプションを指定せずにplotすると、3次元散布図として結果が可視化されます。横軸にルールの支持度、縦軸に確信度、陰影でリフトを表しています。アソシエーション分析の結果を概観するのに使うことができると思いますが、逆にそれしか出来ないとも思います。生データを最初にアソシエーション分析したときに傾向を概観するために使用という感じでしょう。

library(arules)
library(arulesViz)
data(Groceries)
rules <- apriori(Groceries, parameter=list(support=0.001, confidence=0.5, maxlen=6))

plot(rules)

結果は以下のとおり


measure、およびshadingオプションによって縦軸、横軸、陰影で指定するアソシエーション分析の指標(サポート、リフト、確信度)を変更することができます。

plot(rules, measure=c("lift", "support"), shading="confidence")



また、指標に"order"という軸を入れるとTwo-key plotと呼ばれる図が記述できます。orderはルールアイテム長のことをさします。(arulesパッケージのapriori内でmaxlenで指定することで調整できるアレですアレ。)

plot(rules, shading="order", control=list(main = "Two-key plot"))



methodに"matrix"を指定する行列表示形式では、横軸に前提条件、縦軸に結論を記述します。measureオプションによって、アソシエーション分析の指標を指定して陰影を用いて可視化することができます。measureに2つのオプションを指定すると、陰影に加えて色を用いて2次元でアソシエーション分析の指標を評価することができます。"matrix"を用いた関数実行時に標準出力に前提条件や結論が表示されるので、これと照らし合わせながら、結果を見ることになります。めぼしいルールなんかをこれで確認するにには使えそうですが、標準出力でルールを確認するためにも入力するルールは少ないほうがいいと思います。

subrules <- rules[quality(rules)$confidence > 0.8]
plot(subrules, method="matrix", measure="lift")
plot(subrules, method="matrix", measure=c("lift", "confidence"))



ここまでしたいかという意見もありそうですが・・・


methodに"3dmatrix"を指定する3次元行列形式では行列形式と異なり陰影ではなく、高さからアソシエーション分析の指標を可視化することができます。また、reorderにTRUEを指定することで結論部でソートを行うことも可能です。

plot(subrules, method="matrix3D", measure="lift")
plot(subrules, method="matrix3D", measure="lift", control=list(reorder=TRUE))




methodに"grouped"を指定することで、グループ化されたマトリックス形式で表示することが可能です。このグラフは単にルールを見ているだけではわからない情報を把握するという意味では、オススメです。この時、マトリックスの列は複数の前提条件に対してk-meansによるクラスタリングを行ったものです。列ラベルにはグループ含まれるアイテム数に続いて、代表的なアイテムと前提条件の数が表示されています。行は結論部を表し、バルーンの大きさはアソシエーション分析の指標を前提条件で集計したものです。集計ルールはオプションとして指定可能です。複数のルールをクラスタリングするという発想も面白いと思いますし。集計尺度で中央値なんかを用いれば外れ値により把握できなかった傾向なんかも把握できるんじゃないかなという気がします。まじオヌヌメ

plot(rules, method="grouped", control=list(k=10))


methodに"grpah"を指定することで、アソシエーションルールをグラフで表示することができます。エンジンとしてigraphおよびgraphVizを指定して表示可能です。また、オプションとしてinteractive=TRUEを指定することで、igraphのtcl/tkを使ったダイナミックな可視化機能を使用することができます。実際には静的にグラフを可視化してもラベルが重なるので、interactiveを使用して調整しながら図に出力することがオススメです。前提条件に含まれるアイテム数が1のときにはいいと思いますが、下の図を見てもわかるように複数のアイテムが含まれる場合、ノードが多く煩雑だし、結果として出るグラフもノードの意味自体もなんだかよくわからないものになってしまうような気がします。

plot(subrules2, method="graph", interactive=TRUE)


methodに"paracoord"を指定することで、水平座標プロットを記述することができます。
y軸は各アイテムを表しています。x軸は前提条件と結論を表しています。一番右端の軸が結論を表しており、それ以外は前提条件のアイテムを指しています。デフォルトでは、線の太さは支持度を表していますが、色が何を表わしているかちょっとよくわかりませんでした。本来順番の情報がない前提条件にさも順番があるかのように見えてしまうあたりあまり使いたいとは思いませんが、アイテムの組み合わせレベルでアソシエーション分析のルールを可視化してくれるのはこのプロットだけなんですよね。

plot(subrules2, method="paracoord")



といったところでaruleVizを使った、ビジュアライズについてまとめてみました。arulesVizのマニュアルにも記されているが、以下の2つの文献が参考になります。



Bruzzese, D. and Davino, C. (2008), Visual Mining of Association Rules, in Visual Data Mining:
Theory, Techniques and Tools for Visual Analytics, Springer-Verlag, pp. 103

Hahsler M. and Chelluboina S. (2011), Visualizing association rules in hierarchical groups. In
42nd Symposium on the Interface: Statistical, Machine Learning, and Visualization Algorithms
(Interface 2011). The Interface Foundation of North America.



一つ目の文献はアソシエーション分析の可視化方法全般についてまとめたレビュー論文であり、二つ目の文献は"grouped"を使用した可視化方法について記されているものです。基本は一つ目を参考にして、時間があればこちらも参考にするといいかなと。どちらもググれば論文にはアクセスできます。


おまけ:abbreviateについては以下のコードを実施してみてるとどのように短縮されるかわかります。

> data(Adult)
> inspect(Adult[1])
  items                          transactionID
1 {age=Middle-aged,                           
   workclass=State-gov,                       
   education=Bachelors,                       
   marital-status=Never-married,              
   occupation=Adm-clerical,                   
   relationship=Not-in-family,                
   race=White,                                
   sex=Male,                                  
   capital-gain=Low,                          
   capital-loss=None,                         
   hours-per-week=Full-time,                  
   native-country=United-States,              
   income=small}                             1
> inspect(abbreviate(Adult, 9)[1])
  items       transactionID
1 {ag=Mddl-g,              
   wrkcls=S-,              
   edctn=Bch,              
   mrtl-s=N-,              
   occptn=A-,              
   rltns=N--,              
   race=Whit,              
   sex=Male,               
   cptl-gn=L,              
   cptl-ls=N,              
   hrs-p-=F-,              
   ntv-c=U-S,              
   incm=smll}             1

12月17日:誤字脱字など、記事を修正しました。