SAS

SAS Plotterでマルチヒストグラムを作図する

「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。
このページではSAS Plotter Version 1.3でマルチヒストグラムを作成する方法を解説します。

version 1.3からインストール方法が変更になりました。詳細は以下のページをご参照ください。

SAS Plotterの使用方法「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。 このページではSAS Plotter Ver...

マルチヒストグラムとは

マルチヒストグラムとは、群別に表示したヒストグラムのことで、頻度分布の群間比較に適したグラフです。

従来のヒストグラムでも群別に表示することはできましたが、重ね合わせで表示するか積み上げ棒グラフの体裁で表示することくらいで群間比較がしにくいという欠点があります。マルチセルレイアウトを用意しヒストグラムを表示する方法もありますが、プログラムが複雑になり軸の表示スペースが必要になりますので表示スペースがより多く必要になります。

各カテゴリを連続変数と見なして箱ひげ図等で要約統計量を表示する方法もありますが、それが使えるのはカテゴリ変数が間隔尺度と見なせる場合のみであり、最頻値の情報が欠落するため、結局のところ仮定が必要のないヒストグラムでの表示のほうが望ましいケースもあるでしょう。

マルチヒストグラムは一つのプロットエリア内に複数のヒストグラムを配置できるため、少ない表示面積で多くの頻度分布の情報を表示することが可能です。

SASPlotterでは多群別のヒストグラムを作成することに加え、二値変数(例えば性別や被験薬と対照薬など)の表示にも対応しております。

以下の論文に掲載されているグラフを作成する方法について相談をうけ、今回SASPlottterのパッケージに追加いたしました。

Input data

あらかじめ集計したデータが必要となります。データの集計はproc univariateやproc freqを使用して作成してください。入力データセットの構造は以下の通りです。

category、pairおよびlevelについてはフォーマットを適用してください。

key変数変数型
1category数値
2pair数値
3level数値
response数値

文法

ods graphics / < graphics option > ;
ods listing gpath=< output path >;

%multihistogram(
   data=,
   group=,
   pair=none,
   level=,
   levelfmt=,
   response=,
   cattitle=#,
   leveltitle=#,
   pairtitle=#,
   leveltitle=level,
   responsetxt=false,
   orient=v,
   pairsplit=false,
   pairtitle=pair,
   legend=true,
   palette=sns,
   note=,
   deletedata=True
   );

パラメータ

data : データセット(必須)

入力データセット名。whereオプションおよびrenameオプションが使用できます。

category : 変数 (必須)

群変数。この変数は軸変数となります。

pair : 変数 (オプション)

二値変数(Yes/No、男性/女性など)。デフォルトはNone(設定しない)。

level : 変数名 (必須)

水準変数。この変数が軸変数となります。

levelfmt : フォーマット名(必須)

水準変数に適用するフォーマット名。フォーマットは事前に作成してください。

response : 変数名 (必須)

応答変数。例えば頻度や割合を格納した変数。

cattitle: テキスト(オプション)

カテゴリ軸の軸ラベル。デフォルトはカテゴリ変数のラベル。

leveltitle : テキスト(オプション)

水準軸の軸ラベル。デフォルトは水準変数のラベル。

pairtitle : テキスト(オプション)

ペア変数の凡例タイトル。legendパラメータをFalseに設定している場合、この設定は無視されます。デフォルトはペア変数のラベル。

responsetxt : 真偽値(オプション)

Trueの場合は応答変数の値が表示されます。デフォルトはFalse。

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

グラフの向き(垂直方向(v)または水平方向(h))を指定します。デフォルトはv。

pairsplit : 真偽値(オプション)

Trueの場合はpair変数に基づいてヒストグラムを分割します。pair変数を指定している場合、このパラメータを有効にすると表示面積を節約できます。デフォルトはFalse。

legend : 真偽値(オプション)

Trueifに設定するとpair変数の凡例を表示します。pairパラメータがNoneの場合このパラメータは無視されます。デフォルトはTrue。

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

塗り、ライン、マーカーで使用するカラーパレットを指定します。以下のパレットが使用できます。デフォルトは”SNS”(seabornのデフォルトパレット)。

  • SAS
  • SNS (Seaborn)
  • STATA
  • TABLEAU

note: ステートメント(オプション)

グラフテンプレートにentryステートメントを挿入し、グラフタイトルまたはフットノートを表示します。デフォルトは””(表示しない)

deletedata: 真偽値(オプション)

マクロが作成した一時データを削除します。デフォルトはTrue(一時データを削除する)。

作図例

作図例はgithubのexample内にsasプログラムを格納しています。filenameステートメントを使えばすぐに実行できます。

ods listing gpath=<your output path>; 
filename exam url "https://github.com/Superman-jp/SAS_Plotter/raw/main/example/multihistogram_example.sas" encoding="UTF-8"; 

%include exam;

 

基本的なマルチヒストグラム

髪の毛別の集計をした結果を2つの地域および目の色別に可視化してみます。本マクロを使用する場合はあらかじめ集計する必要があります。

proc format;
value regionf
   1="Region 1"
   2="Region 2"
   ;
value eyecolorf
   1="blue"
   2="brown"
   3="green"
   ;
value haircolorf
   1="black"
   2="dark"
   3="fair"
   4="medium"
   5="red";
run;

data Color;
format region regionf. eyes eyecolorf. hair haircolorf.;
input Region Eyes Hair Count @@;
label Eyes  ='Eye Color'
      Hair  ='Hair Color'
      Region='Geographic Region';

datalines;
1 1 3 23  1 1 5 7   1 1 4 24
1 1 2 11  1 3 3 19  1 3 5 7
1 3 4 18  1 3 2 14  1 2 3 34
1 2 5 5   1 2 4 41  1 2 2 40
1 2 1 3   2 1 3 46  2 1 5 21
2 1 4 44  2 1 2 40  2 1 1 6
2 3 3 50  2 3 5 31  2 3 4 37
2 3 2 23  2 2 3 56  2 2 5 42
2 2 4 53  2 2 2 54  2 2 1 13
;
proc sort; by region eyes hair;
run;

data dummy;
do region =1 to 2;
do eyes = 1 to 3;
do hair = 1 to 5;
output;
end;
end;
end;
run;

data freq;
merge dummy color;
by region eyes hair;
if count=. then count=0;
run;

基本的なマルチヒストグラム

まずは単純なヒストグラムを作成してましょう。noteパラメータを使用することでタイトルとフットノートを挿入できます。

ods graphics / height=15cm width=15cm imagefmt=png imagename="multihisto_basic_v" ;
title "basic multiple histogram(vertical)";

%multihistogram(
   data=freq(where=(region=1)),
   category=eyes,
   level=hair,
   response=count,
   levelfmt =haircolorf,
   note=%nrstr(entrytitle 'your title here';
            entryfootnote halign=left 'your footnote here';
            entryfootnote halign=left 'your footnote here 2';)
);

 

基本的なマルチヒストグラム(垂直方向)

グラフの向き

orientパラメータでグラフの向きを指定できます。hを指定すると通常のヒストグラムと同じ向きに表示されます。

ods graphics / height=15cm width=15cm imagefmt=png imagename="multihisto_basic_h" ;
title "basic multiple histogram(horizontal)";

%multihistogram(
   data=freq(where=(region=1)),
   category=eyes,
   level=hair,
   response=count,
   orient=h,
   levelfmt =haircolorf
);
基本的なマルチヒストグラム(水平方向)

pairパラメータ

pairパラメータはオプションです。pairパラメータを指定しない場合はヒストグラムはカテゴリ別に塗分けされます。

ods graphics / height=15cm width=15cm imagefmt=png imagename="multihisto_pair" ;
title " multiple histogram using pair variable";

%multihistogram(
   data=freq,
   category=eyes,
   pair=region,
   level=hair,
   response=count,
   levelfmt =haircolorf
);
pairパラメータを適用

スプリットモード

pairパラメータを指定しないノーマルモードの場合、カテゴリ変数およびペア変数ごとに独立したヒストグラムを作成します。pairsplitパラメータをTrueに設定するとスプリットモードが有効になり、一つのヒストグラムはペア変数に従い左右または上下に分割されます。つまり反転ヒストグラムと同様の表示となります。こちらのほうが必要とするスペースが少なくなります。

ods graphics / height=15cm width=15cm imagefmt=png imagename="multihisto_split" ;
title "multiple histogram (split mode)";
%multihistogram(
    data=freq,
    category=eyes,
    pair=region,
    level=hair,
    response=count,
    pairsplit=true,
    levelfmt =haircolorf 
);

 

スプリットモードを有効にした場合

応答変数の表示

マルチヒストグラムは応答変数軸が存在しないため、応答変数の値をグラフから読み取ることは難しいです。responsetxtパラメータをTrueに設定すると、応答変数の値がグラフ上に表示されます。通常は別途集計結果を別途表に表示していない場合はこのパラメータは有効かもしれません。

ods graphics / height=15cm width=15cm imagefmt=png imagename="multihisto_restxt" ;
title "basic multiple histogram with response value";
%multihistogram(
   data=freq,
   category=eyes,
   pair=region,
   level=hair,
   response=count,
   responsetxt=true,
   levelfmt =haircolorf
);
応答変数の表示