SAS_GTL

SAS PlotterでRaincloud plotを作図する

「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。
このページではSAS Plotter(ver 1.1) でRaincloud plotを作成する方法を解説します。

2023/11/1 ver1.1に更新

https://picolabs.jp/sasplotter_usage

Raincloud plotとは

Raincloud plotは密度プロット(half-violin plot), 箱ひげ図、ストリッププロットを
同時に表示する作図方法です。密度プロットはカーネル密度推定を用いて作成します。
ストリッププロットはカテゴリ軸方向に揺らぎを与えることで各マーカーが重ならないようにした散布です。

Raincloud plotだけで分布形状、記述統計量、個別データの可視化を同時に実現できます。
棒グラフ+エラーバーのような従来の可視化方法は分布形状の情報やRAWデータの情報が欠落している欠点がありますが、
Raincloud plotは多峰性の分布があっても正確に可視化できます。

Raincloud plotの詳細はMicah Allen氏の資料が参考になると思います。

Input data

key変数変数タイプ
1カテゴリ変数数値または文字列
2群変数数値または文字列
応答変数数値

群変数は任意です。群変数とカテゴリ変数は文字列型でも動作しますが、その場合はテキストの昇順でグループの表示順を決定します。
順番を定義したい場合はフォーマットを適用した数値変数を使用することを推奨します。

文法

ods graphics / < graphics option >  ;
ods listing gpath=< output path > ;
%RainCloud(
data=,
x=,
y=,
group=None,
yticks=,
xlabel=x,
ylabel=y,
cat_iv=2.5,
element_iv=0.02,
scale=area,
trim=True,
connect=false,
gridsize=401,
bw_method=sjpi,
bw_adjust=1,
orient=v,
legend=false,
jitterwidth=0.1,
outlinewidth=1,
palette=sns  );

パラメータ

data : (必須)

入力データ。keep, rename, whereオプションを併用できます。

x : (必須)

カテゴリ変数

y : (必須)

応答変数

group : (任意)

群変数。xオプションと同じ変数を指定すると、各グループはそれぞれ別の色で塗り分けられます。指定しない場合はすべてのオブジェクトは同じ色になります。デフォルト=None

xlabel : (任意)

カテゴリ軸のラベル。デフォルトは「x」。以下のように設定するとラベルは非表示となります。xlabel=,

ylabel : (任意)

応答変数軸のラベル。デフォルトは「y」。以下のように設定するとラベルは非表示となります。ylabel=,

yticks : (必須)

応答変数軸の目盛りを指定できます。半角スペースで区切られた数値リストを指定してください。数値は昇順で指定する必要があります。(例)yticks = 10 20 30 40,

cat_iv : (任意)

各カテゴリの間隔。デフォルトは2.5。

element_iv : (任意)

密度プロット、箱ひげ図、ストリッププロットの間隔。デフォルトは0.02。

scale: (任意)

密度プロットの高さの調整方法を指定します。
“area”にすると密度プロットの曲線下面積はすべて同じになるように調整されます。
“width”にすると各密度プロットの高さは同じになります。
デフォルトは”area”。

trim (任意)

Trueに設定すると観測データの範囲外の密度は非表示となります。
デフォルトはTrue。

connect: (任意)

Trueに設定すると箱ひげ図の平均値をグループごとに線でつなぎます。
デフォルトはFalse。

gridsize : (任意)

KDEのグリッド数。デフォルトは401(proc kdeのデフォルト値)

bw_method : (任意)

KDEのバンド幅推定方法を指定します。デフォルトはsjpi(proc kdeのデフォルト値)。利用可能な推定方法は以下の通りです。

  • sjpi (Sheather-Jones plug-in)
  • snr (simple normal reference)
  • snrq (simple normal reference that uses the interquartile
    range)
  • srot (Silverman\’s rule of thumb)
  • os (oversmoothed)

bw_adjust : (任意)

バンド幅のファクター。この値を大きくすると密度はより滑らかになります。デフォルトは1。

legend : (任意)

Trueを指定すると凡例を表示します。groupオプションを”None”を指定するとこの引数は無視されます。 デフォルトはFalse。

orient : (任意)

作図の方向を指定します。v=垂直方向 h=水平方向。
デフォルトはv。平均値の推移に注目している場合はv、分布形状の比較に注目している場合はhを選択するとよいと思います。

jitterwidth : (任意)

ストリッププロットの揺らぎ幅を指定します。0~1の範囲の数値を指定し、値が大きくなると揺らぎが大きくなります。
値が大きすぎると箱ひげ図と重なるかもしれません。デフォルトは0.05。

outlinewidth : (任意)

密度プロットと箱ひげ図の枠線の太さを数値で指定します。
デフォルトは1。

pallete : キーワード (オプション)

塗り、ライン、マーカーのカラーパレット、以下のパレットが利用可能です。デフォルトはSNS(seabornのデフォルトパレット)

  • SAS
  • SNS (Seaborn)
  • STATA
  • TABLEAU

作図例

シンプルなプロット

pythonのグラフパッケージSeabornに含まれるテストデータ「Tips」を利用して作図します。

datasets (tips)

変数名詳細
dayThur, Fri, Sat, Sun
total_bill料金の額、数値
smoke喫煙者 1=yes 2=no
time時間帯、1=昼食 2=夕食

code :

ods graphics /reset=all height=15cm width=25cm imagename="rain_simple" imagefmt=svg;
ods listing  gpath="/home/user/sasuser.v94/image" style=sns_default ;
%RainCloud(data=import,
x=day,
y=total_bill,
group=day,
cat_iv=2.5,
element_iv=0.5,
xlabel=day,
ylabel=Total bill(USD),
yticks=%str(0 20 40 60),
bw_method=srot
);

output

orientパラメータをhにするとプロットは水平方向に変更されます。
(x軸=応答変数, y軸=カテゴリ)

水平方向表示

グループ毎に表示

code :

ods graphics /reset=all height=15cm width=25cm imagename="rain_simple" imagefmt=svg;
ods listing  gpath="/home/user/sasuser.v94/image" style=sns_default ;
%RainCloud(data=import,
x=day,
y=total_bill,
group=smoker,
cat_iv=2.5,
element_iv=0.5,
xlabel=day,
ylabel=Total bill(USD),
yticks=%str(0 20 40 60),
bw_method=srot
orient=h,
legend=True
);
output

平均値をラインで結ぶ場合はconnectパラメータをTrueにしてください。

平均値をラインで結ぶ

Trim パラメータ

TrimパラメータをFalseに設定すると、密度プロットはすべての範囲で表示されます。
ただし観測データの範囲外の密度はあまり正確ではない点には注意してください。

ods graphics /reset=all height=15cm width=25cm imagename="rain_simple" imagefmt=svg;
ods listing  gpath="/home/user/sasuser.v94/image" style=sns_default ;
%RainCloud(data=import,
x=day,
y=total_bill,
group=smoker,
cat_iv=2.5,
element_iv=0.5,
xlabel=day,
ylabel=Total bill(USD),
yticks=%str(-20 0 20 40 60),
trim=False,
bw_method=srot
orient=h,
legend=True
);
Trim=false

Scale パラメータ

scaleパラメータを”area”に指定すると、すべての密度プロットの曲線下面積は同じになるように設定されます。
以下の例ではscale=areaに設定してirisデータセットを可視化しています。

vesiocolorとverginicaは幅広の分布を示しているため、分布のピークが小さく表示されます。

ods graphics /reset=all height=15cm width=25cm imagename="rain_area" imagefmt=svg;
ods listing  gpath="/home/user/sasuser.v94/image" style=sns_default ;
%RainCloud(data=sashelp.iris,
x=species,
y=petalwidth,
group=species,
xlabel=Species,
ylabel=Petal Width (cm),
yticks=0 10 20 30 40,
cat_iv=1.5,
element_iv=0.3,
trim=false,
scale=area,
bw_method=srot
);
scale=area

scaleパラメータを”width”にすると、すべての密度プロットは同じ高さになるように設定されます。
先ほどの作図でscale=”width”に設定し再出力すると以下のようになります。

vesiocolorとverginicaは拡大され分布のピークが視認しやすくなります。

ods graphics /reset=all height=15cm width=25cm imagename="rain_width" imagefmt=svg;
ods listing  gpath="/home/user/sasuser.v94/image" style=sns_default ;
%RainCloud(data=sashelp.iris,
x=species,
y=petalwidth,
group=species,
xlabel=Species,
ylabel=Petal Width (cm),
cat_iv=1.5,
element_iv=0.3,
trim=false,
scale=width,
gridsize=401,
bw_method=srot,
yticks=0 10 20 30 40
);
scale=width

KDEを用いた密度プロットは定量的ではない点には注意が必要です。基本的に分布の形状および
同条件で推定したグループ間の相対的な比較以外には利用できないと考えたほうが良いでしょう。

さらにwidthを指定した場合は相対的な比較もできなくなります。分布形状に関する情報にしか興味はなく、
各グループの分布形状が大きく異なる場合はwidthを利用したほうが便利なケースもあるでしょう。