SAS

SASのクソな部分をぶった切る!(5)proc DS2はいらない子

SASのクソな部分シリーズの第5回目です。

今回は次世代データ操作言語といわれながら全く普及しているとは思えないDS2言語のついて考察します。

結論からいいます。

既存のデータステップから乗り換えるメリットが皆無なので一切勉強する必要はありません。
その代わりにSQLと英語を勉強しましょう。

これ普及すると思って開発したのでしょうか?正直疑問です。

なのでこの記事をみてもしょうがないのですが、理由を知りたい方はお読みください。

話題に上がらない

まずはgoogleの力をつかってproc ds2に関する文献がどれくらいあるか見てみます。
とりあえずライフサイエンスのユーザー団体であるpharmaSUGのサイトでproc ds2 に関する論文がどれくらいあるのか検索しました。

執筆時点でたったの25件しかありませんでした。pdfで絞ると9件しかありません。

proc ds2が発表されたのはたしか2013年頃のはずなので、8年たってもこの程度しかないというのは、過疎っているといっても差し支えないと思います。

一応製薬以外でもSASを使うのでもしかしたら他業界では使っているのかもしれませんが・・・一番利用されているだろう製薬業界でこれだったら、多分状況は大して変わらないと思います。

DS2のメリット

過去の発表やプレゼン内容を見るとproc ds2のメリットは以下の通りですが、実際に実務でメリットがあるかどうか検証します。
今回は以下のプレゼン資料をもとに考察しました。

オブジェクト指向プログラミングができる

ds2では以下のメゾッドで構成されます。

  • initメゾッド 変数宣言、テーブルを開くなどを実行
  • runメゾッド 従来のdataステップと同等の命令
  • termメゾッド ds2プログラムの最後に一度だけ実行される命令
proc ds2; 
method init(); 
変数宣言 
end; 

method run(); 
従来のdataステップ; 
end; 

method term(); 
最後に一回だけ実行する命令; 
end; 
run; 
quit;

このメゾッドはユーザーが自由に定義することもできます。このあたりはオブジェクト指向を意識して設計されているみたいですね。
スコープは以下のプログラムを見てもらうとわかりやすいです。

proc ds2; 
declare int x; 
method init(); 
declare double d; 
end; 
run; 
quit;

変数宣言はdeclareステートメントで実施します。上記の例では変数xを整数型、dを倍精度浮動小数点型として定義しています。一般的なプログラミング言語と同等の変数型を扱えるようになっているみたいです。

xはすべてのds2内のメゾッドで参照できます。それに対してdはinitメゾッドの中だけで有効となっています。変数の有効範囲をスコープと言います。

従来のSASだとマクロ変数にスコープの定義がありましたが、ds2ではデータ操作の段階でスコープを定義できます。

このようにオブジェクト指向プログラミングの概念を取り入れているのでコードの再利用や可読性が向上している!!!と言いたいのですが、実際のところメゾッドの部分はマクロやfcmpプロシジャのユーザー定義関数で代用できるため、似たようなことはすでにできてしまうんですよね・・・

従来のデータステップだけでは確かにできないのですが、既存のプロシジャと組み合わせれば同じことは可能です。

一応一連の処理をまとめたパッケージというもの(クラスのようなもの?)をありまして、ハッシュオブジェクトやIMLのような行列計算パッケージを導入することが可能だそうで、わかりやすく記述できる点についてはDs2のメリットがあるかと思います。特に行列計算は従来のデータステップではできませんので、この点は良いかも。

既存のデータステップと同様の操作が可能

ds2のrunメゾッドは既存のデータステップのほぼ同じ命令を記述することができます。

新規で学習する内容が少ないという意味では一応メリットかな

FedSQLが使える

setステートメントでFedSQLのコードをそのまま記述、実行できるようです。まあproc FedSQLで同じことはできますがね。

マルチスレッド対応

マルチスレッド対応になったため、処理時間の削減に期待できるそうですが・・・そのような効果が期待できる事例は限られます。

以下の論文ではDS2と従来のデータステップの処理時間を比較していますが、1オブザベーション当たりの計算量が多い処理や、複雑な処理を含む場合でないと処理時間の削減効果はなかったそうです。
それ以外の場合はマルチスレッドにしてもむしろDS2のほうが遅くなっていると報告されています。

よほど複雑な計算をしない限りはds2でマルチスレッド処理にするメリットはないとみてよいでしょう。

工数をかけても従来と同じ

一番問題なのは、手間かけてDS2に乗り換えたとしても出来上がるものは従来と同じという点なのですよね・・・

DS2を担当者に習得させるのに当然時間とコストがかかりますから、本来はコストを上回るメリットを提示しないとだれも導入しません。ですが実際のメリットはデータステップで多くの処理を記述できる点くらいで、成果物の品質の向上には直接寄与しないのです。

プログラムの可読性が上がるとか処理時間が短縮されるというメリットはないわけではないですが、既存のデータステップでもできることでですし、処理時間短縮の恩恵を受けることができる事例は限られる以上、わざわざDS2を使う動機が全然ないです。

ネットの検索結果の少なさからもユーザーの興味のなさがわかるかと思います。はっきり言ってコードの美しさ程度じゃだれも乗り換えませんよ。

行列計算ができるようになるのはメリットなのは間違いないですが、IMLよりも低機能ですし、IMLというライセンスがあるため今後の機能拡張もそこまで期待できないと思います。

中の人の発言

DS2についてSASコンサルタントであるPeter Eberhardt氏はこのように述べています。

For many programmers there is not a
‘need’ to move to DS2 programming,
but the move will be worthwhile

(多くのプログラマーにとってDS2プログラミングに移行する必要はないが、価値はあるだろう。)

中の人でさえ多くのユーザーには不要だって言っちゃっているんですよね・・・

ちゃっかりDS2について本も執筆しているようですが、買った人いるのかな?
多くのユーザーにとっていらないものを提案されても困っちゃいますよ。

まあ既存のデータステップは使用できずDS2しか使えないライセンスを用意して料金を半額にするとかだったら検討の余地ありなのですが、だめですかね?

結論

DS2は最新のプログラミング要素を取り入れてはいるものの実務面ではほどんど導入メリットがありません。勉強するのは無意味なのでやめましょう。