SAS University Edition でExcelと同じグラフを描く

・SAS 初心者が使うには

SAS University Edition は、ビッグデータの解析にも使われる SAS Studio を無料で使うことができる仕組みです。SAS Studio の入門や学習用に基本的に誰でも使用することができます。

SAS Studio で統計を使ったデータ処理をやろう、と思う人はきっと Excel を使ったことがある人が大半でしょう。じゃ、練習用に Excel と同じグラフを作ってみようか、という人もいるかもしれません。

今いる職場でそういう話になったので、作成したサンプルを基に簡単にまとめてみました。

・Excel のデータ

やることは、予め Excel で作った折れ線グラフ、棒グラフを、Excelから作ったCSVファイルを基にして、SAS University Edition で作ってみようというものです。

まず、折れ線グラフと棒グラフは、Excel のデータで同じデータを使って作りました。

Excel の表
access_sample01

折れ線グラフ
access_sample02

棒グラフ
access_sample03

グラフは、タイトルを変えたくらいで、特に編集していません。

・SAS University Edition でプログラム

SAS Universiry Edition は、フリーの仮想OSを使うソフト Virtual Box でゲストOSとして動作します。ベースは Linux のようで、Virtual Box では、Red Hat Linux として認識されてます。仮想OSの中で Web サーバーを使ったアプリケーションとして動作し、ホストOS側のWebブラウザを解して利用できます。

SASUniversityEdition

Webブラウザで接続すると SAS Studio が起動し、JavaScript を使ったプログラム用のエディタが使用できます。なお、IEでは JavaScript の仕様上の違いで、漢字などの倍角文字を使っているとエディタで文字化けすることがあるようです。

SAS_Studio_Start

なお SAS Studio のエディタは、コントロールキー+C、コントロールキー+Vといったショートカットキーを使って、テキストなどからコピペが可能です。Webブラウザで調べた SAS Studio でも使えるプログラムを、コピペして利用することができます。

・グラフを描くプログラム

SAS University Edition でグラフを描く前に、Excel で作ったCSVファイルを取り込みます。CSVファイルは、ファイル形式をCSVにしてセーブするだけなので、やりかたは割愛します。SAS のプログラムでは、下記のようなコードでいけそうです。

filename IN '/folders/myfolders/sample/アクセス数推移.csv';
data readin ;
infile IN dlm=',' firstobs=1 dsd encoding="sjis" termstr=CRLF;
input date : anydtdte10.
	bot feed win mac ipon ando other subtotal ;
run ;

まず、SAS のプログラムは、データを作る「data (データセット) ;」 と、表やグラフを描く「proc sgplot data=(データセット) ;」の2つのパートに分かれています。CSVファイルの取り込みでは、まず、ファイル名を定義し、そのファイルから、フォーマットに合わせてデータを取得します。

順番に説明すると…
filename は、CSVファイルの定義。ファイ名名に倍角文字も使用できます。
data readin; は、「readin」というデータセットを定義する宣言です。
infile は、ファイルのフォーマットを定義しています。
CSVなので、デリミタが「,」とか、firstobsでデータ以外の行数が何行あるか指定し(ここでは1行のみ)、SJIS でエンコードして、改行コードが「CRLF」など。
dsd は、「,」で区切られた単語が「”」で括られていたら、その中の「,」を単語の一部とみなす意味だそうです。

input は、CSVに格納された数値などを、どの変数に格納するかで、数値の場合は変数名のみでOKですが、文字列などは定義が必要です。ここでは、1列目が日付なので、「(変数名) : anydtdte10.」で SAS の日付データとして取り込んでいます。
最後の run; は、データの取り込み実行の指示です。

続いて、グラフを描きます。
1つの変数、例えば botをY軸に、日付を date で折れ線グラフを描くには、こんなコードでもOKです。

proc sgplot  data=readin ;
series x=date y=bot ;

ただ、これではX軸がSASの内部で使われる時間の数字だし、何のグラフかわかりません。
こんな感じに整形してやります。

title "1週間に機種毎の累積アクセス数の推移(2016/6/12-6/19)";
proc sgplot  data=readin ;
series x=date y=bot /legendlabel="検索エンジンからアクセス数";
format date date. ;
xaxis labet="日付" grid;
yaxis label="アクセス数" ; 
run ;

title は、グラフのタイトルで倍角の漢字も使えます。
折れ線グラフを描く命令 series のオプション「 /legendlabel=」で線の名称を指定します。
なお、「/」は、ここからオプション、という意味でのようで、この右側に他のオプションも追加できます。
format は、date 変数の表示を、SAS の内部の日付を表す数値から「date.」で日付表示に変える命令です。
そして、xaxis と yaxis はX軸、Y軸の名称を指定し、X軸にグリッドを追加しています。
各軸の名称には、倍角の漢字も指摘できます。
最後の run で、描画を行います。

なお、Excel では、累積の折れ線グラフを作成したので、data で累積値を作り、次のようにプログラムを作成してみました。

filename IN '/folders/myfolders/sample/アクセス数推移.csv';
data readin ; 
	infile IN dlm=',' firstobs=1 dsd encoding="sjis" termstr=CRLF;
	input date : anydtdte10.
		bot feed win mac ipon ando other subtotal ;
	a1 = bot;
	a2 = bot + feed ;
	a3 = bot + feed + win ;
	a4 = bot + feed + win + mac ;
	a5 = bot + feed + win + mac + ipon ;
	a6 = bot + feed + win + mac + ipon + ando ;
	a7 = bot + feed + win + mac + ipon + ando + other ;
	run ;

title "1週間に機種毎の累積アクセス数の推移(2016/6/12-6/19)";
proc sgplot  data=readin ;
	series x=date y=a1 /legendlabel="bot";
	series x=date y=a2 /legendlabel="feed";
	series x=date y=a3 /legendlabel="Windows";
	series x=date y=a4 /legendlabel="MacOS/X";
	series x=date y=a5 /legendlabel="iPhone";
	series x=date y=a6 /legendlabel="Android";
	series x=date y=subtotal /legendlabel="その他";
	format date date. ;
	xaxis labet="日付" grid;
	yaxis label="アクセス数" ; 	
	run ;
 

同じ要領で棒グラフを作成するための SAS プログラムも作成します。棒グラフを、描く命令は「vbar」です。基本は次のとおり。

proc sgplot   data=readin  pctlevel=graph;
vbar date / response=bot;

基本は、「vbar (X軸の変数) / respose=(Y軸の変数)」です。なお、proc の「pctlevel=」の「graph」に代えて別のキーワードを指定すると、パーセンテージの棒グラフにもできるそうです。

折れ線グラフを同じように、累積の棒グラフを作成する SAS プログラムは次のとおりです。

filename IN '/folders/myfolders/sample/アクセス数推移.csv';
data readin ; 
	infile IN dlm=',' firstobs=1 dsd encoding="sjis" termstr=CRLF;
	input date : anydtdte10.
		bot feed win mac ipon ando other subtotal ;
	a1 = bot;
	a2 = bot + feed ;
	a3 = bot + feed + win ;
	a4 = bot + feed + win + mac ;
	a5 = bot + feed + win + mac + ipon ;
	a6 = bot + feed + win + mac + ipon + ando ;
	a7 = bot + feed + win + mac + ipon + ando + other ;
	run ;

title "1週間の機種毎の累積アクセス数の推移(2016/6/12-6/19)";
proc sgplot   data=readin   pctlevel=graph;
	vbar date / response=a7  legendlabel='その他' ;
	vbar date / response=a6  legendlabel='Android';
	vbar date / response=a5  legendlabel='iPhone';
	vbar date / response=a4  legendlabel='MacOS/X';
	vbar date / response=a3  legendlabel='Windows';
	vbar date / response=a2  legendlabel='Feed';
	vbar date / response=a1  legendlabel='Bot';
	format date date. ;
	xaxis labet="日付" grid;
	yaxis label="アクセス数" ; 
	run ;

後ろから長い棒グラフを描いて、順番に手前に短い棒グラフを描き、累積が見えるようにしています。そのため、a1 から a7 の変数を作り、それぞれにラベルをつけました。

・あとがき

実は、もっと簡単に累積のグラフも書けるのでは、探してみたのですが見つけられませんでした。Excel で簡単に作れる方が特殊だったのかな、と思っています。まあ、プログラムで簡単にデータが作れるので、そっちでやってくれ、ということでしょうか。

今日はここまで…