2019年11月1日金曜日

話題の食べログの話

食べログの星が3.6と3.8の間に壁がある話を聞いたので,試しにサクッとグラフにした話です.スクレイピングで星を取得してヒストグラム書いてみました.なかなか普段スクレイピングなんてやらないのでだいぶ苦戦しましたがまあ何とか形にはなりました.以下のグラフ見てもらえればわかりますが,私がやった感じだとあんまり壁みたいなのはなかった気がします.下のグラフはx軸は星数,y軸が件数ですね.軸の設定がめんどくさかったのでラベルがV_VALになっていますが,そこに各店舗の星の数が格納されています.
今回は京都のお店を対象にしています.大阪と東京では既にグラフがありますので…
星3.6と3.8で数に大きな差はありますが,グラフはそこまで不自然な形はしてない気がします.もちろんこんなものはデータの抽出の仕方次第でいくらでも結果を変えれるので,これだけを見て食べログがどうとかこうとか言うつもりはありません.特に今回は食べログの口コミ数順に上位1200件を取ってきただけです.どの順番でデータを取るかにもよりますしね.

スクレイピングの方法をありのままに書くことはちょっとよろしくない気がするのであんまり書きませんが,proc httpでwebページをテキスト化して取得→要る部分だけデータセット化→sgplotでヒストグラムです.sgplotのヒストグラムとtextステートメントが同時に使えなかったので,グラフ内の3.6とかの文字列はsgannoでやっていますがたぶん他に手はあると思います.

/*
以下が実際にグラフを書いた時のプログラムです
V_OUTに星の数が,V_ANNOにグラフ内の文字列が入っています.
*/

%sganno ;   *--アノテート使う準備;

data V_ANNO ;
   
    %SGTEXT(label="↓3.6", x1=3.6, y1=215, drawspace="DATAVALUE") ;
    %SGTEXT(label="↓3.8", x1=3.8, y1=27 , drawspace="DATAVALUE", anchor="left") ;

run ;

title "京都のお店1200件 口コミ数順" ;
proc sgplot data=V_OUT sganno=V_ANNO ;
  histogram V_VAL / scale=count nbins=40;
  
  xaxis grid
        values=(3.0 to 5.0 by 0.2)
        offsetmin=0.05
        offsetmax=0.05
  ;
  yaxis offsetmax=0.05 ;
run ;

2019年10月25日金曜日

PharmaSUG SDE Tokyo 2019に参加した話


PharmaSUG SDE tokyoに参加した.何やら台風が来ているが無事雨もなく開催となった.傘持つだけで荷物が増えるので持たないとなると荷物が減って楽である.この時は後の雨の悲劇のことなんて知らずにのんきなもんである.六本木なんてオサレタウンに来ることなどないので来るだけで面白い.テレビドラマの広告がこんなにあるなんてなかなか見られない.というか世間にはこんなにドラマがやっていたのか.
前日は簡単な準備と確認.こんなものはおまけなのでさっさと済ませて飲み会へ.私の英語力がなさ過ぎてなんとyesとthank youくらいしか言えることがなくコミュニケーションに支障しかない.すごく気を遣ってくださったのがひしひしと感じるが英語力がついていかない.結局会話の半分くらいしかわからずほうほうの体で飲み会を終えホテルに戻る.めっちゃゆっくりしゃべってくれたことと,適宜話を振ってくださったことに感謝の気持ちしかないほんとありがとうございます.
当日は早めに会場入りをする.普段会社行くより早い時間に起きるとは思いもしなかったが普段が遅すぎるだけか.当日私にできることなんて非常に限られているので隅っこのほうでバタバタと動くしかない.途中でお茶をポロリしたが決して遊んでいるわけではなく大まじめです.ドリフやってんじゃねえのになんで落ちるかな.午後からもパラパラと来場されたので受付が追い付かない部分もあったが大崩れすることもなくまあまあで終われたと思いたい.今年のノベルティはもうちょっとひねれたんじゃないかと反省するが,考えたときにはあれがbestだったので致し方ない.思う存分栓を抜いてください.来年のノベルティがどうなるかは全く未定ですが,ハードルは極めて低いと思いますので是非来年はいいものを誰か考えてくださいね.
会の後は車屋に隣接したオサレ店にて飲み会.会場近くにあんなお店あるとかやはり東京は店の数が違うと実感.ポテト一つとっても美味しかったし何より乾杯がスパークリングワイン.どうせビールと高を括っていたところに運ばれてくるワイングラスは通常の3倍くらい趣があった.いとおかし.sas社の人も参加されていたのでここぞとばかりにviyaの話を聞いてみるが,やはり会社に導入しているbaseSASを置き換えるくらいの規模感で導入しないとお値段がお値段してそうな感じか.機能を絞った相談とかもいけそうな感じがあったが,機械学習系を積まないとviyaの良さがないよなあ.guiでの操作は強いがそこだけならイマイチ感ありますあります.そして機械学習系を積むとお値段がお値段すると...飲み終わりにすげー雨に降られてびしょびしょでホテルに戻ったが今年のPharmaSUGはこれにて終了.皆様ありがとうございました.帰りの新幹線で前日準備の際に頂いたblood orangeのチョコをよばれる.やっぱりチョコのおいしさは共通だね.オレンジがほんのり効いてて甘すぎず,酒が飲めない分茶が進む進む.やっば新幹線で書いてたら気分悪くなってきた

2019年10月1日火曜日

グラフの背景にgrid線を入れる話

グラフをsgplotで書く時に,軸のメモリごとの格子線を背景に入れるオプションの紹介です.英語だとbackgroundgridですかね.これが見つからなくてちょっと時間かかったんですよね...意外とこの手の微妙なオプションがなかなか紹介されていなくて辛い.

yaxis/xaxisステートメントにgridオプションを指定すると目的の格子線が入ります.
例えば以下の画像だとy軸のメモリごとにうっすら格子線が入っています.通常だとこんな線はなく背景は真っ白ですね

/*-以下プログラム-*/
data HOGE ;
    do i = 1 to 5 ;
        X = i ;
        Y = x ;
        output ;
    end ;
run ;
   
proc sgplot data = HOGE;
    series x = X y = Y ;
   
    xaxis
        offsetmax=0.05
        offsetmin=0.05
    ;
    yaxis
        grid  /*これがgridを出すオプション--xaxisにも同じ指定が可能*/
        offsetmax=0.05
        offsetmin=0.05
    ;
       
run ;

2019年9月15日日曜日

sasユーザー会2019に行ってきました


SASユーザー会2019に行ってきた
去年の台風が思い起こされるも今年は無事晴れ,雨の無い移動はなんと楽なんだろうか.会場が例年と違って赤坂見附とわれても会場の最寄り駅までは何とかなるので大した違いがない.問題は駅から会場までの間である.東京駅から地下鉄に乗っ1本,非常にアクセスがよい赤坂見附.会場は大学のキャンパスのようだがこれがまた田舎者には気後れするほどのオサレ会場.惜しむらくは建物内にご飯食べるところがあるにも関わらず「館内イベントのため休業」せっかくのカフェテリアが泣いてるぞ.私の初日のお昼は天下一品になりました.
今年のユーザー会の目玉は何といってもods excelとマクロクォーティングか.マクロクォーティングなんて正直関数を適当に当てはめて意図通りに行ってればokみたいなとこあるので,あれだけきれいにまとまった資料を見ると浅はかな自分が悲しくなる.あんないい感じの資料を公開してくれるのはありがたい話である.
ods excelも気になる.excel2016でddeが怪しいという噂を幾つか聞くので,新しいexcel操作方法は大変気になるところ.実際に使う使わないは別にしてもしもに備えるためにも知るくらいはしといたほうが良いんじゃなかろうか.word2016でデフォルトフォントが変わったおかげでrtf出力でゴタゴタしたと思ったら今度はexcel.officeの更新は影響範囲がとても大きい.
1日目がスムーズに終わったのでホテルに帰って発表練習.日頃から30分も話すことなんてないので口が回らないがなんとか話し終えれるくらいには準備して2日目の発表に備えて早めにお休みする.当日は30分枠のうち25分ほど使って話してしまう.ちょっとギリギリまで話しすぎたせいで質問が中途半端になった.次の機会には少し控えめに構成してみようか.なにせ30分発表なぞこれまでの中でやったことがあまりないので機微がわからない.こればかりは慣れかなあ...
今年のユーザー会も無事終わって何より.来年のめどが何も立っていないが果たして来年はどうなるか,ネタがまにあうのだろうか.

2019年9月1日日曜日

streamプロシジャでマクロ変数を出力する

最近proc streamに凝っていますが、なかなか思うように扱えないですね。悲しい。
引っかかって解決したところを時々こうやって取り上げていければと思います。

今回はstreamプロシジャでマクロ変数を出力する話です。普通に書けばそのマクロ変数は展開されてしまいますが、クォートすれば展開させずにマクロ変数そのものを出力できます。


たとえば以下のように実行すると、マクロ変数hogeを展開して_outに出力します。当然マクロ変数hogeを作っていないと展開できない旨のerrorが返ります。

filename _out hogehoge\piyo.sas ;
proc stream outfile=_out resetdelim="rd" noabsscmt ;
begin
&hoge
;;;;


以下のように&をクオートするとマクロ変数hogeは展開されず、&hogeという文字列が_outに出力できます。あくまで文字列としてマクロ変数名を出すだけなのでマクロ変数hogeを事前に作っていなくてもerrorは返りません。

filename _out hogehoge\piyo.sas ;
proc stream outfile=_out resetdelim="rd" noabsscmt ;
begin
%str(&)hoge
;;;;

よく考えるとクオートすればいい話なのですがだいぶと難儀しました。まだまだstreamプロシジャと良い関係になれません。

2019年8月1日木曜日

今実行しているプログラムのパスを取得する話

プログラムの保存場所を取得する話はあっちこっちで見かけます。
いちいちパスを変更しなくて良くなるので事故が減るのは良い事ですね。
何度パスを変え忘れがあって意図しないところに出力したかわかりません。

sysinから取ったりSAS_EXECFILEPATHから持ってきたりと色んな手がありますね。
sysinはバッチモードで取れてくるんでしたっけ、私は専らSAS_EXECFILEPATHを使っているので詳しくわかりませんが。以下の2行を実行すると、プログラムの現在のパスとファイル名が取れます。

%let _fullpath = %sysget(SAS_EXECFILEPATH);
%put &=_fullpath ;

ここまではよくあるのですが、先日プログラムのパスの一個上の階層を取りたい時がありました。
他の人のプログラムをパクリに行くと以下のような記述があって、".."の意味がさっぱりわからなかったんです。後で調べると".."はSASじゃなくてコマンドプロンプトの書き方のようでした。

x "cd パスの名前";
filename xxpath "..";
%let _rootdir=%sysfunc(pathname(xxpath));

xコマンド使っているところを見落としていたんですね・・・CDでパスに移動して、その一個上を".."で取得しています。
取得したパスをxxpathで格納して、それをマクロ変数に回収している書き方ですね。CMDでの書き方なので、filename xxpath "..\..\.."; と書けば3個上が取れたり、
filename xxpath "..\hoge"; とすると「1個上のパスのhogeフォルダ」までのパスが取れたりと割と柔軟に指定出来ますね。

あんまりやりすぎるとプログラムが複雑になりますが、変更忘れを防ぐには自動取得がいいかもです

2019年7月1日月曜日

2群の幾何平均の群間比の信頼区間の話

2群の幾何平均の群間比とその信頼区間を出力したい時は,PROC TTESTが使えますという話です.

幾何平均自体はほかのプロシジャでも出せますが,幾何平均の群間の比が出せるのはttestくらいかなと思っています.ほかでも出せたら是非教えてください.単なる群の幾何平均の信頼区間はsurveymeansでも出せますが.

ttestプロシジャにdist=lognormalを指定すると幾何平均が出せます.出力の中のConfLimitsをデータセットにすると,その中に群間の幾何平均の比の信頼区間が入っています.

proc ttest data=sashelp.class dist=lognormal alpha=0.05 ;
    class sex ;
    var weight ;

    ods output ConfLimits = CL ;
run ;

取得したデータセットのうち,Geomeansが幾何平均,LowerCLとUpperCLが幾何平均の信頼区間です.このほかにもCVで変動係数やその信頼区間が取得できますが,今回は載せていません.

この内のClassが"Raito(1/2)"となっているのが群間の比です. そのまんまですね.見た通り1/2,今回で言うところのF/Mしか出せません.M/Fが欲しいときはMを1,Fを2にした別変数作って,その変数をclassに指定してください.Format作ってorder=formattedを指定しても行けますが,私はいつも別変数作っちゃいますね...

またMethodがPooledは2群の分散が等しい場合,Satterthwaiteは分散が等しくない場合です.welchのほうが聞き馴染みがありますが...大体の場合はPooledですかね?

今回はalphaを明示していますが,指定しないと0.05 が当たります.つまり95%信頼区間ですね.alphaに0.1を指定すると90%信頼区間を出してくれます.データセットではなく結果ウィンドウの表示を見ると何%の信頼区間が出ているかを表示してくれています.本来はデフォルトの0.05をあえて指定する必要はあまりないんですが,書かないとピンとこないと言う説があるのも確かです.