ラベル ods escapechar の投稿を表示しています。 すべての投稿を表示
ラベル ods escapechar の投稿を表示しています。 すべての投稿を表示

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

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

ざっくりいうと、なんかしらの頻度を文字の大きさで表現する方法で、だいたい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でたりするけど、無視して、

結果は
















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

満足。


ods escapechar=で、Unicodeの特殊文字を使ったり、文字を修飾したりする話

深夜にカイジのアニメ(再放送)がやっていて、それを見ていると、無性にSASで星マークをprintしたくなりました。

さて、まずSASで特殊文字をアウトプットに出力したい場合、unicodeで対応する文字を検索します
(例は:http://www.decodeunicode.org/で探しました)

































そこで、出力したい文字を見つけたら、上の星でいうと「2605」という文字列に注目します。

そしたら、今回の大事な呪文

ods escapechar='^';

を実行します。これによって^はエスケープ文字となります。
ここで指定したエスケープ文字に様々な表現を足すことで、拡張的な文字表現ができます。

で、以下のようにして

data Q1;
X="^{style [color=yellow] ^{unicode '2605'x}}";
KAIJI=repeat(X,2);
run;

proc print data=Q1;
 var KAIJI;
run;

実行すると









みたいな感じです。
※追記:html出力がデフォでない場合はods rtf;やods html;、ods pdf;と、対応するods html close;やods rtf close; ods pdf close;でプロシジャ部分を囲んで出力ファイル形式を指定ください。通常のlistingアウトプットでは展開されません


例えば、

data Q2;
X="^{unicode '2721'x}";output;
X="^{unicode '2603'x}";output;
X="^{unicode '263A'x}";output;
run;

は、データセットの中身は当然









って感じで、意味不明なんですが、ひとたび出力するとunicodeが解釈されて

proc print data=Q2;
run;














絵文字みたいな感じでかわいいですね。


最後に真面目な話
ods escapecharを実務で使う場合は、

data Q3;
X=cats('χ','^{super 2}');output;
X=cats('H','^{sub 2}','O');output;
run;

proc print data=Q3;
run;











みたいに上付き文字とか下付き文字とかを入れたい場合ですかね?
主にタイトルとかフットノートとか、ラベルで使うことが多いと思います。
(やり方は同じです)

あ、最後に、ちょっと帰省等、用事があって、しばらく更新止まります。

また今まで書いた記事で、最近ちゃんとラベルの設定してなかったんですけど
その辺をちょっと、ちゃんと整理していきます。