なぜ今現場がSAS言語に戻るのか?オープンソース全盛時代におけるSAS言語の価値

過去10年間で、Pythonはデータサイエンスの代名詞となりました。現在では、すべてのデータサイエンティストがPythonでプログラミングできることが、ほぼ当然のように期待されます。それ以前は、SASやRと言った言語が主流でした。

本記事では、Pythonの代わりとしてではなく、補完する形でSAS言語を使用することを、データサイエンティストのみなさんに提案します。SAS言語が提供する利点について説明し、すでに運用中のSASコードをPythonに置き換えることが現実的かどうかについても考察していきます。

SAS言語の長所は?

SASが昔も今も、多くの領域でアナリティクスの言語である理由はたくさんあります。

1.言語の単純さ

噂や誤解に反して、SASプログラミングは簡単です。ほかのプログラミング言語とは異なるいくつかの概念を学ぶ必要はありますが、言語構造は非常にシンプルで、標準的な文法からの多少の逸脱にも寛容です。

実際、SAS言語は3つの基本要素で構成されています。データステップ、PROC(プロシジャ)、そしてマクロです。

図1:SAS言語の主な要素

グローバルステートメント、システムオプション、プリファレンスなどの追加要素もありますが、上記の3つの主要要素に比べれば些細な機能です。

データステップでは、データの読み取り、書き込み、処理を行います。PROCは、統計モデルと機械学習モデルをカプセル化したプロシジャです。マクロ言語は、スクリプト自体を作成可能にすることで、自動化を実現するSAS言語の手法です。

SAS言語でのプログラミング経験がない読者の方に、SAS言語がどれほど寛容であるかをイメージしていただくために、以下に1つの例を示します。proc printは、出力デバイス(画面など)にデータを一覧表示(または印刷)するために使用されます。通常、すべてのPROC文は、対応するrun文によって閉じられたときに実行されると考えられています。したがって、次のような簡単なコードで、データセット”MyData”の内容を表示できます。

proc print data=Mydata;
run;

データセット名を引用符で囲んでいないことと、すべての文がセミコロンで終わっていることに注目してください。最後の”run“文を省略しても、コードは問題なく実行され、次に進むことができます。他の言語ではこうは行きません。また、runの前に空白を入れていることにも注目してください。繰り返しますが、Pythonのコードに空白を入れるとどうなるか、皆さんご存知でしょう。SAS言語は空白を気にしないのです。

SAS言語がサポートするデータ型は「数値」と「文字」の2種類のみです。データは、整数、日付、日時型など、他の多くのデータ型としてフォーマットすることができます。しかし、それらはすべて数値変数か文字変数として格納され、処理されます。

2.完全なSQLエンジンを搭載

SAS言語には、proc sqlによるSQLが完全に実装されています。すべてのSQL構文はproc sqlサポートされています。多数のテーブルに対する操作や、そこからの行の抽出などを含むデータ準備のコードを書く際、アナリストやデータサイエンティストは、SQLで考える方が簡単だと感じることがよくあります。

SASでSQLを使用する場合、SQLブロックの最初に proc sql ステートメントを記述する以外は、SQLコードに一切変更を加える必要はありません。

さらに、SAS言語はほぼすべてのリレーショナルデータベースへの接続機能を備えているため、SAS言語内からSQLを使うことで、それぞれのデータベース専用のSQL実行ユーティリティを使わなくても、これらのデータベースに格納されたデータへ簡単にアクセス・操作できます。

3.性能

SASプログラムは実行時にインタプリタによって解釈されるため、「インタプリタ言語」として動作が遅くなると思うかもしれませんが、実際はそうではありません。SASの実行環境は、コンパイル済みのプログラムと同等、あるいはそれ以上のパフォーマンスを発揮できるように設計されています。

たとえば、大規模なデータセットではソート処理に時間がかかるのが一般的です。しかし、標準的なビジネス用ノートパソコンでも、100列・1,000万行のデータセットを proc sort を使って数秒でソートすることが可能です。

SAS言語が高いパフォーマンスを発揮するもう一つの理由は、データの扱い方にあります。SASはすべてのデータを一括でメモリに読み込むのではなく、チャンク(塊)単位でデータを読み込み、処理を行い、ストレージに書き戻します。そのため、一般的なノートパソコンでも、何百万件ものレコードに対して、新しい変数の生成、条件文の実行、フィールドの結合といった処理を数秒で行うことができます。

最近、同僚の一人から、数億件ものデータを含むことが多い数値流体力学(CFD)シミュレーションの出力データを処理する最適なツールについて相談を受けました。その課題は、非常に大きなデータファイルを読み込み、CFD計算の結果に対して特別な後処理を行う必要がある一方で、高価な計算リソースは使いたくないというものでした。私は「Altair Analytics Workbench を使って、SASスクリプトを実行してください」と、アドバイスしました。

4.信頼

SAS言語には50年以上の歴史があります。この長い歴史の中で、SASはデータサイエンティストやアナリストのあらゆるニーズに応える多くの機能やモデルを提供してきました。

Pythonでは、必要な関数を実行するパッケージをいつでも見つけることができます。SAS言語にも同じことが言えます。必要なことを行うための言語要素やPROCをいつでも見つけることができます。新しい機能を開発したい場合でも、SAS言語ではマクロと同様に拡張機能を書くことができます。

5.特定産業における優位性

SAS言語は、長年にわたって最も優れた分析言語として使われてきた実績があり、現在でも銀行、金融、保険、製薬など、多くの業界において主要な分析プラットフォームと見なされています。

たとえば、ほとんどの信用リスクスコアカードモデルに必要なデータ準備は、SASで行われています。そのため、多くの銀行や金融機関では、SASをミッションクリティカル(業務遂行に不可欠)なツールと位置づけています。

6.長寿命コード

Pythonがバージョン2.xから3.xへと進化する際に、ほぼ新しい言語になったことはご存じだと思います。バージョン3は意図的に後方互換性がないように設計されています。SASは違います。過去50年間、SAS言語は常に下位互換性を保ってきました。1970年代に書かれたSASコードは、現在でも実行することができます。つまり、私たちが今日SAS言語で書いたコードは、私たちよりも長生きする可能性が高いのです!

SAS言語コードをPythonに変換してはどうでしょうか?

多くの組織でミッションクリティカルなSAS言語コードが大量に存在するため、最近、このコードのすべて(あるいは一部)をPythonに変換しようとする動きが見られます。このような動きの背景には、主に2つの動機があります。

第一の動機は、Pythonおよびそのライブラリがオープンソースであるため、ライセンス費用を削減できるという点です。第二の動機は、多くのデータサイエンティストやアナリストが、職場に来る前にPythonでの教育を受けているという点です。そのため、現在のSASコード資産を維持するには、従業員にSAS言語のトレーニングを施す必要があります。

コード変換の方法には、単純にコードを手書きで書き換える方法、自動変換ソフトウェアを使用する方法、あるいはその両方を組み合わせる方法があります。ですが、私の正直な意見としては、こうしたアプローチでは期待されている成果は得られないと思います。成功事例は、SASコードが非常に単純な処理――たとえばデータベースからのデータ取得や、異なるソースからのテーブル結合など――を行っているケースに限定されるでしょう。

一方で、SASコードが詳細なデータ準備や複雑なモデリングを行っている場合、自動変換では失敗する可能性が高く、手作業での書き換えは、既存コードを維持するよりも高くつく可能性があります。

これらの変換戦略が直面するもう一つの課題は、SAS言語の分析機能の多くがPythonには存在しない、あるいは存在していてもまったく異なる記法や用語で提供されているという点です。そのため、単純な翻訳や書き換え作業がさらに困難になります。

誰しも経験があると思いますが、他人が書いた複雑なコードをデバッグしようとしたとき、まず必要なのは「そのコードが何をしようとしているのか」を理解することです。SASコードをPythonに変換する作業も同様で、まずコードの意図を理解し、その機能をPythonで再実装する必要があります。しかし、自動変換ツールで生成されるコードは、可読性や保守性に乏しいものが多いのが現実です。こうしたツールの目的は、あくまでも「動くコード」を生成することにあり、効率的に動作することが重視されます。変数名の選定や、コードスタイル、書き方のパターンなどは後回しにされ、出力結果が同じであることの方が重要とされがちです。

SASからPythonへの変換におけるさらなる課題として、SAS言語の文法が厳密にフォーマット化されていない点が挙げられます。先ほども触れたように、「run;」ステートメントは多くのケースで省略可能です。さらに、procステートメントのブロックは通常「run;」で終了させますが、前後の文脈や手続きの内容によっては「quit;」を使う必要がある場合もあります。おそらく、SAS言語をPythonに翻訳する際に最も難しいのは、マクロ言語の扱いです。マクロ言語はコードを生成し、実行する性質を持つため、自動での変換は非常に困難であり、場合によっては不可能に近いと言えるでしょう。

SASとPythonの両方を使うのはどうでしょう?

これこそが、データサイエンティストやアナリストが真剣に検討すべき最良の選択肢だと考えています。それぞれに素晴らしい機能があり、互いに補完し合うことができます。重要なのは、2つのコードを異なる環境で実行する必要がないという点です。SAS言語にはproc pythonというプロシジャが用意されており、SASコードの中でPythonコードを実行できます。また、SAS環境内でSASコードを実行することも可能です。

Altair® RapidMiner®Altair® Knowledge Studio®など、多くの機械学習・データサイエンスソフトウェアは、SAS、Python、Rといった各言語のコードをシームレスに実行できる「コードノード」が用意されており、ビジュアルワークフロー内での統合的な実行が容易に行えます。

したがって、もはや「データサイエンスの言語戦争は終わった」と言うことができます。アルテアは平和と共存の方程式を編み出したのです。

まとめ

SAS言語をPython(およびR)に置き換えたり、補強したりするために使用する正当な理由は数え切れません。現在のSAS言語およびPythonの機能により、これらの言語で記述されたコード同士の連携は非常に容易になっています。さらに、アルテアのようなソフトウェア企業は、これらの言語で書かれたコードの実行や統合を「ポイント&クリック」で直感的に行えるビジュアルワークフロープラットフォームAltair SLCを提供しています。

*本記事は、米国本社で分析・IoT開発部門でチーフデータサイエンティストを務めるMamdouh Refaatが執筆した「Back to Programming in SAS!」を翻訳したものです。

 

5 1 vote
Article Rating

カテゴリー: Altair Global Blog, データアナリティクス

Subscribe
Notify of
0 Comments
Oldest
Newest