SAS University Edition で散布図を描く

・Excelでも散布図は書けます

正直言うと、これまでの社会人生活でExcelで散布図を書いたことはありません。
以前、同じ会社のQC活動をやっていた人とか、品質管理を仕事にしていた人たちはよく使っていたので、目にする機会はありました。Excel の標準機能ですし、使えないことはありません。

試しに作ってみたのたのがこれです。ただ、手元にデータが無いので、ネットで見つけた数値をそのまま使いました。

SAS_sanpu_table

SAS_sanpu_fihure

それと知らなかったのですが、簡単に近似直線も引いてくれます。簡単に作ろうと
思えば、それほど手間ではありません。

SAS_sanpu_fihure2

・SAS University Edition で散布図を描く

散布図は SAS University Edition でも作成できます。
なお、ネットで調べると、散布図を書いただけでは解析したことにはならないそうです。散布図作成に利用した2つの系列のデータに関係性があるかどうかを判断し、関係があるならどれだけ密接かも加味し、2つの系列のデータの相関関係を導きだし、そのうえで、使った数値が使えるかどうかを判断するのだそうです。そして、使えると判断したら、その2つの系列のデータを基にした施策を行うのだそうです。

昔のQC活動とか品質管理の教育でもそんな話があったのでしょうが、それ以前に、現状把握と原因追求の考え方が重要と習ったので、こういうのは覚えてませんでした。

さて、SASでのプログラムの話です。
SAS には、統計で使う標準偏差のような数値を算出する機能があります。もちろん同じものはExcel でも標準で用意された関数で計算できます。まず、その数値を表で出します。そして続いて、散布図のグラフを描きます。

(1) CSV取り込み

Excel の表で準備した数値は、CSVファイルで取り込みます。
取り込み方法は、折れ線グラフや棒グラフで使ったものと同じです。


filename readin '/folders/myfolders/sample/SASで散布図を作成する.csv';
data enshuu;
	infile readin dlm=',' dsd firstobs=1 encoding="sjis" termstr=CRLF;
	input No e_x e_y;
	run;

filename でCSVファイルのファイル名を指定します。このとき、CSVファイル名には
倍角の漢字なども使用できます。
次に、data でデータセットを定義します。
infile は、ファイルからデリミタ「,」や1行目がコメントで、「SJIS」でエンコード
されており、改行コードが「CRLF」で、「”」で囲まれた「,」は文字の一部と扱うなどの
仕様で読み込みします。
また、input で指定した順で、数値として読み込みます。

(2) 表を描く

次に、標準偏差などの数値を表で表示します。
これには、「proc corr data=(データセット)」を使います。

proc corr data=enshuu;
	var e_x e_y;
	run;

データセットは、CSVファイルから読み込んだものを使い、3つのデータのうち、「var 」コマンドで「e_x」と「e_y」の2つのデータを使うよう指定しています。run は、表を描くための命令です。

(3) 散布図を描く

そして、散布図を描きます。
散布図を描く命令は、「proc sgplot data=(データセット)」です。

proc sgplot data=enshuu;
	scatter x=e_x y=e_y;
	xaxis min=10 max=30 label="X軸" grid;
	yaxis min=0 max=100 label="Y軸" grid;
	reg X=e_x y=e_y / clm cli ;
	run;

データセットは、CSVファイルから読み込んだものを使います。「scatter」が散布図を描く命令です。X軸の変数とY軸の変数を指定します。
xaxis と yaxis で、X軸とY軸の範囲や、ラベルを指定しています。ここでは、さらにX軸とY軸の両方でグリッドを使うように指定しています。
reg コマンドは回帰直線で近似線を引くコマンドです。回帰直線とは何か、というのはネットで調べてみてください。統計の基本みたいです。ここでは「/」以降にオプションとして、「clm cli」を指定しています。これは、信頼区間と予測区間をいっしょに表示するオプションです。
最後に、run でグラフを描きます。
なお、「proc 」で指定した表と散布図は同じ画面に表示されます。

SAS_sanpu_fihure3

とりあえず、ここまで。

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 で簡単に作れる方が特殊だったのかな、と思っています。まあ、プログラムで簡単にデータが作れるので、そっちでやってくれ、ということでしょうか。

今日はここまで…