3.1K Views
March 29, 24
スライド概要
[第8回大阪sas勉強会] 増村一穂
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
これまで経験した SASグラフについて 大阪大学医学部附属病院 増村 一穂
自己紹介 ・名前:増村 一穂(マスムラ カズホ) ・出身:千葉県野田市 ・所属:大阪大学医学部附属病院 未来医療開発部 データセンター ・SAS経験年数:約5年 ・他業務:EDC構築、その他業務に関わるツールの作成等(VBAマクロ等) ・趣味:旅行、写真撮影(風景、動物など)
SASによる統計解析業務で主に実施するもの ・様々な統計解析手法による解析結果の作成 ・グラフによるデータ、結果の可視化 ・データ一覧表の作成 グラフ 目的 SASプロシージャ 棒グラフ データの大きさを比較する sgplot vbar(縦) hbar(横) 積み上げ棒グラフ 累積データから内訳を比較する sgplot vbar(縦) hbar(横) 折れ線グラフ 時系列での変化をみる sgplot series 面グラフ 時系列での変化を面的に解釈する gplot 箱ひげ図 データのばらつき具合を示す sgplot vbox(縦) hbox(横) 散布図 2つのデータの相関関係をみる sgplot scatter グラフの表現方法は多岐にわたるため、色々な要望が発生する
棒グラフ
要望
① 群分けをしてほしい → group
② 群の色を指定したい
→ dattrmapを使用してグループ毎にグラフの色分けを指定
③ グラフ上にデータ数を記載してほしい → datalabel
④ グリッド線を入れてほしい → yaxis に grid
⑤ 凡例とX軸ラベルの間をもう少し空けてほしい
→ ラベルに改行コードを入れて空白を作った
③
data GROUP_TMP;
input ID:$10. VALUE:$10. FILLCOLOR:$10. LINECOLOR:$10. ;
cards;
GRAPH_ID ○○ VLIGB BLACK
GRAPH_ID △△ PAPK BLACK
GRAPH_ID ×× VLIBG BLACK;
run;
proc sgplot data=BarData dattrmap=GROUP_TMP;
vbar AGE / response=FREQ
barwidth=0.8
group=AGEGROUP groupdisplay=CLUSTER attrid=GRAPH_ID
datalabel
datalabelattrs=(Color=RED Family=“Times New Roman” Size=9
Style=NORMAL Weight=BOLD )
datalabelpos=DATA
;
④
①②
⑤
* X軸;
xaxis label = " (*ESC*){unicode '000a'x}年齢(歳)(*ESC*){unicode '000a'x}"
labelattrs=( size=16 ) valueattrs=( size=16 )
;
* Y軸;
yaxis label = "XXX科における累計受診回数(回)"
values = (0 to 2000 by 500) labelattrs=( size=16 ) valueattrs=( size=16 )
grid
;
* 凡例;
keylegend / location=outside position=bottom title = "群"
titleattrs=(size=16) valueattrs=(size=16)
;
run;
棒グラフ 要望 ⑥ 領域毎に群分けしてほしい → proc sgpanel proc sgpanel data=BarData dattrmap=GROUP_TMP; panelby AGEGROUP / columns=3 novarname; ⑥ vbar AGE / response=FREQ group=AGEGROUP groupdisplay=CLUSTER attrid=GRAPH_ID datalabel datalabelattrs=(Color=RED Family="Times New Roman" Size=9 Style=NORMAL Weight=BOLD ) datalabelfitpolicy=NONE ; * X軸; colaxis label = "年齢(歳)" labelattrs=( size=10 ) valueattrs=( size=10 ) fitpolicy=STACKEDALWAYS ; * Y軸; rowaxis label = "XXX科における累計受診回数(回)" values = (0 to 2000 by 500) labelattrs=( size=16 ) valueattrs=( size=16 ) grid ; * 凡例; keylegend / position=bottom title = "群" titleattrs=(size=16) valueattrs=(size=16) ; run;
積み上げ棒グラフ 要望 ① 内訳はグラフ内に表示してほしい → seglabel proc sgplot data=StackBarData dattrmap=GROUP_TMP; vbar AGE / response=FREQ barwidth=0.8 group=AGEGROUP groupdisplay=STACK attrid=GRAPH_ID datalabel datalabelattrs=(Color=RED Family="Times New Roman" Size=9 Style=NORMAL Weight=BOLD ) datalabelpos=DATA seglabel seglabelattrs=(Color=BLACK Family="Times New Roman" Size=9 Style=NORMAL Weight=BOLD ) seglabelfitpolicy=NONE ; ※領域が狭すぎると内訳が表示されない → seglabelfitpolicy=NONE ① * X軸; xaxis label = " (*ESC*){unicode '000a'x}年齢(歳)(*ESC*){unicode '000a'x}" labelattrs=( size=16 ) valueattrs=( size=16 ) ; ※ * Y軸; yaxis label = "XXX科における累計受診回数(回)" values = (0 to 6000 by 1000) labelattrs=( size=16 ) valueattrs=( size=16 ) grid ; * 凡例; keylegend / location=outside position=bottom title = "群" titleattrs=(size=16) valueattrs=(size=16) ; run;
積み上げ棒グラフ StackBarData 要望 ② 積み上げデータを割合にしてほしい → 年齢毎の総数に対し割合を算出する ② Proc sgplot data=StackBarData dattrmap=GROUP_TMP; vbar AGE / response=PERCENT barwidth=0.8 group=AGEGROUP groupdisplay=STACK attrid=GRAPH_ID seglabel seglabelattrs=(Color=BLACK Family="Times New Roman" Size=9 Style=NORMAL Weight=BOLD ) ; ・・・ * Y軸; yaxis label = "XXX科における累計受診回数(割合)" values = (0 to 100 by 10) labelattrs=( size=16 ) valueattrs=( size=16 ) grid ; ・・・ run;
積み上げ棒グラフ StackBarData 要望 ③ 割合のグラフだが、ラベルは度数にしてほしい → ・割合(PERCENT)と度数(FREQ)のデータより フォーマットを作成する proc format cntlinオプション FMTNAME:フォーマット名 START:フォーマット対象 LABEL:ラベル ・上記をフォーマットをラベルに当てる seglabelformat proc format lib=work cntlin=StackBarData; run; ③ proc sgplot data=StackBarData dattrmap=GROUP_TMP; vbar AGE / response=PERCENT barwidth=0.8 group=AGEGROUP groupdisplay=STACK attrid=GRAPH_ID seglabel seglabelattrs=(Color=BLACK Family="Times New Roman" Size=9 Style=NORMAL Weight=BOLD ) seglabelformat=FREQ. ; ・・・ run;
折れ線グラフ 要望 ① 欠損値があったら途切れるようにしてほしい → break ② 線をつなぐ点は表示する → markers ③ グループ毎に色を指定、また一部のグループは強調してほしい → dattrmapを使用してグループ毎にグラフの色分けや 線の太さを指定 ④ 領域を色分けしてほしい → band ② ④ ③ data GROUP_TMP_LINE; input ID:$10. VALUE:$10. MarkerSize:8. MarkerSymbol:$20. MarkerColor:$10. LinePattern:$10. LineColor:$10. LineThickness:8. ; cards; GRAPH_ID 0~10 8 circlefilled SALMON solid SALMON 2 GRAPH_ID 11~20 8 circlefilled GRAY solid GRAY 2 GRAPH_ID 21~30 8 circlefilled BLUE solid BLUE 2 GRAPH_ID 31~40 14 circlefilled RED solid LILAC 6 GRAPH_ID 41~50 8 circlefilled MAROON solid MAROON 2 GRAPH_ID 51~60 8 circlefilled CHARCOAL solid CHARCOAL 2 GRAPH_ID 61~70 8 circlefilled CYAN solid CYAN 2 GRAPH_ID 71~80 8 circlefilled OLIVE solid OLIVE 2 GRAPH_ID 81~ 8 circlefilled GOLD solid GOLD 2; run; proc sgplot data=LineData dattrmap=GROUP_TMP_LINE; series x=TERM y=FREQ / break markers group=AGE attrid=GRAPH_ID; xaxis label = "期間“ VALUES = (1 to 4 by 1) labelattrs=( size=16 ) valueattrs=( size=16 ); yaxis label = "受診回数“ VALUES = (0 to 500 by 100) labelattrs=( size=16 ) valueattrs=( size=16 ) ; ① band x=FREQ upper=150 lower=0 / FILLATTRS=(color=green transparency=0.9 ) legendlabel='低頻度'; band x=FREQ upper=500 lower=350 / FILLATTRS=(color=red transparency=0.9 ) legendlabel='高頻度'; keylegend / title = "年齢(歳)“ location=OUTSIDE position=RIGHT titleattrs=(size=16) valueattrs=(size=16) ; run;
面グラフ 要望 積み上げデータを作成してほしい。ただし棒グラフではなく、時系 列で面グラフとして表記してほしい → 積み上げデータを作成し、gplotにて表現 AreaData * 色; goptions colors= ( PINK GREEN CYAN MAGENTA OLIVE YELLOW BLUE LIME RED); * グラフサイズ指定; goptions hsize = 8 in; goptions vsize = 6 in; * グラフX軸Y軸設定; axis1 label=("月") offset=(0,0); axis2 label=(angle=90 "受診回数") order = (0 to 1000 by 100) offset = (0,0); * シンボル設定:データを線で結び下部を着色; symbol1 interpol=join; * 凡例設定; legend label=('年齢') frame shape=bar(6,1); * 積み上げ面グラフ描画; proc gplot data=AreaData; plot FREQ_SUM*TERM=AGE / areas=9 legend=legend1 haxis=axis1 vaxis=axis2 ; run; quit;
ご清聴ありがとうございました