ワードクラウドを作ってみる話

ワードクラウドっていう表現方法があります

ざっくりいうと、なんかしらの頻度を文字の大きさで表現する方法で、だいたいWebページのキーワードの出現頻度なんかを表現する方法ですね。

SAS Visual Analytics だと簡単にできますみたいな情報をよく聞くんですが、そんなもん持ってないんで、SAS Baseの機能でできないかなと思って調べると面白いPaperがありました。

http://analytics.ncsu.edu/sesug/2008/SIB-096.pdf

おおっ、SAS忘備録で取り上げらているRWI (http://sas-boubi.blogspot.jp/2014/10/rwi1.html)を使ってるのか!RWIやってみたいと思っていたのでちょうどいいや!

データは、本来、テキストマイニング的なデータをよく使うんですが、頻度であればなんでも表現できるはずなので

data Q1;
input brand $ count;
cards;
Apple 754
Sharp 53
Fujitsu 23
DoCoMo 76
Samsung 54
Sony 45
HTC 22
Google 20
SonyEricsson 23
LG 13
Microsoft 12
Kyocera 9
Motorola 6
KDDI 5
Lenovo 3
NEC 3
Panasonic 4
Asus 2
Acer 2
Oppo 2
BlackBerry 1
Huawei 1
Pantech 1
;
run;




























と、これは1年間で僕のブログに携帯端末でアクセスしたユーザーが、どこのブランドの端末を使っているかの人数データです。

あ、でも明らかにApple多すぎて、これだけでかい字になっちゃいそうだなぁ。
もう面倒なので、Apple製品以外の携帯端末アクセスユーザーという趣旨で作ります!

これを論文に従って

proc freq data=Q1 noprint;
 where brand^='Apple';
 tables brand / out=OUT_1;
 weight count;
run;























こうして

%let lowPt=10;
%let highPt=40;

フォントの大きさの範囲を最低10、最大40に設定して

proc sql noprint;
 create table OUT_2 as
 select *
  ,(percent-min(percent))
  /(max(percent)-min(percent))
  *(&highPt-&lowPt)
  +&lowPt as size
 from OUT_1;
quit;






















出現頻度を文字の大きさ(size)に反映して


後は

ods escapechar='^';
ods pdf file='/folders/myfolders/wordcloud.pdf';

options orientation=landscape;
data _null_;
 length render $32760;
 do until (last_tag);
  set OUT_2 end=last_tag;
  link = catt ( " ^S={URL='#" , brand , "' font_size=" , size , 'pt linkcolor=RED}' , brand, '^S={}' );
  render = catt (render, link);
 end;
 declare odsout cloud();
  cloud.layout_absolute();
   cloud.region(width:"6in");
    cloud.table_start();
     cloud.row_start();
      cloud.format_cell(text:render);
    cloud.row_end();
   cloud.table_end();
 cloud.layout_end();
 run;

 ods pdf close;

とすると
(すみません、コードについて、詳細まで理解できていないので解説は論文をみてください)
なんかよくわかんないWarningでたりするけど、無視して、

結果は
















おおっ!なんかそれっぽい!

満足。


0 件のコメント:

コメントを投稿