SAS で使うプログラムが難しい

SASUniversityEdition

SAS University Edition で使うプログラム、今調べているところです。

1. 概要

1960年代から使われている SAS は、当時流行った第4世代言語に属するコンピュータ言語で、同じ時期に生まれた SQL などと同じように記述しやすいのが特徴だそうです。もともとはIBMの大型汎用コンピュータで使われるソフトで、当時のカードリーダでも扱えるような言語仕様になっています。

今でも IBMの大型コンピュータで動作する他、1980年代から90年代にかけて流行った UNIX や、その後のLinux でも動作するし、最近は Windows 版も出ているようです。元々はテキストベースの仕組みですが、ハード側のグラフィック環境がよくなったこともあって、今ではグラフ作成機能が基本セットもについています。

2. 言語仕様

プログラム言語の仕様ですが、これがなかなかとっつきにくい。

まず、大きく分けると、data と proc の2つの部分からできています。
data で、処理に使うデータセットを作成し、proc で計算させたりグラフを書かせたりします。

(1) data でデータを取り込む

まず data ですが、card 形式でデータを1行ずつ読み込ませることもできます。ですが、データ量が多い場合は、Excel などから CSV形式して infile で読み込ませます。

どちらからというと、測定器などのデータを生成する装置から、何かのメディアを解して直接データを取り込み、このシステムで集計した結果を使う、という使い方がいいような気がします。infile は、どういったフォーマットでも適応可能なように工夫されているように思います。

ちょうど、テキストファイルを Excel に取り込むような感じのことを、プログラムします。1列分を文字数で区切ったり、「,」(コンマ)や、「 」(スペース)で区切ったりする訳です。

例えば、Excel から出力した CSV ファイルを取り込む場合は、次のように書きます。

filename = indata '{パス}/sample.csv' ;
data in;
 infile indata dlm=',' firstobs=1 dsd encoding="sjis" termstr=CRLF;
 input text_s : $CHAR50.
       size_s : 10. 
       date_s : anydtdte16.;
run;

これは、Excel で作成した3列のデータをCSVファイルに書き出して、SASで取り込むプログラムの例です。infile で取り込む際、次のオプションを使っています。

dlm=','  デリミタを「,」(コンマ)とする。(CSVファイルはコンマ区切りファイル)
firstobs=1  最初の1行を取り込み対象から除外する
dsd   「,」で区切られた単語が「"」で括られていたら、その中の「,」を単語の一部とみなす
encoding="sjis" 日本語の文字コードをシフトJISにする
termstr=CRLF  改行コードを「CR+LF」(Windows 標準)にする

次の input で、1列分のデータを定義している。CSVファイルで取り込んでも、文字列か
数値か、日付かを定義するのは Excel でテキストファイルを取り込むのと同じ感じです。

text_s : $CHAR50. 1列目を「text_s」という名称とし、文字列で最大50字取り込む
size_s : 10. 2列目を「size_s」という名称とし、最大10桁の数値として取り込む
date_s : anydtde16.  3列目を「date_s」という名称とし、16文字分の記述から SAS内部の時間デ

ータに変換する

run ; ファイル取り込みを実行する

(2) データを加工する

また、この data では、読み込んだ数値を組み合わせて新しいデータを計算させることもできます。算術演算や条件によって値を変えるなどのプログラムを、個々の数値ではなく1列分といったまとまったデータに対して行えます。

文字列を取り込んで、そこに含まれるキーワードに応じて、新しいデータを作成するこが可能で、かんたんな構造化プログラムを記述することができます。

下の例は、ファイルから取り込んだ1列分の文字列「url」に’feed’ が含まれておらず、かつ、1列分の文字列「message」に’Feed’が含まれていない場合、新しいデータの列 feed に 0 を、どちらかが含まれている場合は feed に 1 を代入する。

 fed1 = index( url, 'feed' ) ;
 fed2 = index( message, 'Feed' ) ;
 if ( fed1 = 0 ) & ( fed2 = 0 ) then feed = 0 ;
 else feed = 1 ;

(3) その他の加工

複数のデータをファイルから取り込んで、1つの表を作成したりすることできます。

他にもいろいろとやれるようですが、今のところ勉強中です。
目的に応じてプログラムを組んでいろいろと加工することができるので、ノウハウが書かれているようなものですね。

(4) 表にする

ここはまだ勉強中です。

個々の支払い情報や売り上げ情報などをピボットで集計して、月ごとの推移を計算させるというのは前職でよくやっていたので得意なのですが、Excelと同じことは結局できませんでした。

ネットで調べると多くのサンプルを使った散布図から、統計学の計算式を使ってこの分布の傾向を求めることができるようです。しかし、そういったことを前職で日常的にやってこなかったことから、このシステムの良さがイメージできませんでした。

きっと他にもうまい使い方があるのだと思います。

なお、簡単な集計表はこれだけで作成することができます。

proc means sum ;

  var bot win mac iphone android ;


run ;


この例は、集計表を作成する means プロシージャーを使った例です。
means は、var で指定する対象のデータの集計を行うます。この例は、var で指定したbot win mac iphone android の4つのデータの、sum (合計値)の表を作成する処理です。

表は、SAS University Edition の結果画面に表示されます。画像で切りとって MS Wordや、PowerPoint などのドキュメント作成にも使えそうです。

(5) グラフにする

ここはまだ勉強中です。

SAS の有償版には、グラフ作成用のパッケージが含まれており、いろいろなグラフを簡単に作成できるようです。1つの雛形を用意しておえけば、細かい設定まで使いまわしできるので、Excel でグラフ作るよりは簡単に使えるようです。

無償版の SAS University Edition には基本セットしか入っていないものの、簡単なグラフを作成することは可能です。

例えば、簡単な散布図を作るプログラムはこれだけです。

proc sgplot data = readin;
scatter x = x y = y;
run;

この例は、基本セットに含まれる sgplot を使って、散布図を scatter コマンドで作成しています。予め、 data で、「readin」というデータセットを作成しておきます。scatter では、x= と y= の変数を指定しなければなりません。

また、簡単に折れ線グラフを表示するには、こんなプログラムになります。

proc sgplot data=readin ;
  series x = x y = y ;
run ;

これは、基本セットに含まれる sgplot を使って、折れ線グラフを series コマンドで作成しています。予め、 data で、「readin」というデータセットを作成しておきます。

同じく棒グラフの例です。

proc sgplot data=readin ;
  vbox x / response = y ;
run ;

これは、基本セットに含まれる sgplot を使って、折れ線グラフを series コマンドで作成しています。予め、 data で、「readin」というデータセットを作成しておきます。

グラフは、SAS University Edition の結果画面に表示されます。画像で切りとって MS Wordや、PowerPoint などのドキュメント作成にも使えそうです。ただし、その場合は、グラフのタイトルや、X軸Y軸の説明などオプションを使って見栄えをよくする必要があります。
このオプションは、ネットで scatter、series、vbox のドキュメントを調べれます。

3.個人的な感想

いきなりここに感想を書くのは変ですが、まだ、調べている最中なので実績がありません。
なので、途中思ったことを書きます。

個人的には、Excel でできるようなことは Excel でやればいいのでは、と思うのですが、Excel は以外と同じことの繰り返しは苦手。もちろんマクロを組んで処理を自動化し、うまく雛形を使えば、SAS University Edition でやれるようなことはできると思います。マクロの組み方とは、Excel の高度な使い方を覚える必要なりますが…

ただし、過去に SAS の資産があれば別で、前に使ったコードを積極的に使っていくのなら絶対にこの SAS University Edition を使ってこのコードを使いこなせるレベルになるべきでしょう。

追加)一点残念なことが。
Webブラウザで使えるテキストエディタで、ブラウザ上でプログラムを編集できるのですが、きっと、JavaScript のキットなのでしょう。IE 11 ではエディタの表示が崩れます。Chrome や、FireFox では問題ありません。こういうの多いですね。Windows Edge では試してません。

今日はここまで。