SAS から Python へ:実際にかかるもの

この検索結果の多くは、SAS のソースから Python を生成するツールで、その仕事をうまくこなすものもいくつかあります。このページはその一歩手前から始めます。そもそもその移行が自分のコードベースにとって正しいのか、出力の検証に何がかかるのか、そして答えが「いいえ」だったときにどうするのか。

短い答え

SAS のコードベースから出る道は二つではなく四つあります。自動ツールに渡す、手で書き直す、SAS 以外のもので SAS プログラムをそのまま実行する、そして何もしない。どれが正しいかは、ほぼ二つの問いだけで決まります。コードがどれだけあるか、そして以前の出力を誰かが再現しなければならないか。以下はそれぞれの道の費用です。

Python が正しい答えになるとき

Python のほうが良い移行先である場面は、このようなページが普段認めるより多くあります。四つの条件がそろえば答えははっきりします。コードベースが一人で一週間に読み切れる程度であること、チームが日常的に Python を書いていること、分析をどのみち作り直すこと、そして新しい数値が以前の数値と厳密に一致することを下流の誰も求めていないこと。四つそろうなら、どんな互換レイヤーよりも書き直しのほうが安く、残るのは第二の言語を抱えずにチームが保守できるコードです。

四つの道と、それぞれの費用

ここにある選択肢はどれも、誰かにとっては正しい答えです。コストなしで済むものは一つもなく、高くつくのは決して構文ではありません。

自動コンバーター

ウェブツール、ベンダーのサービス、大規模言語モデルは .sas のソースを受け取って Python を返し、たいていは DATA ステップを pandas に、よく使う手続きを statsmodels や scikit-learn に対応づけます。単純なデータ加工が数百行なら本物の近道で、読める出発点が数分で手に入ります。請求書は後から届きます。出力の一行一行を、両方の言語を知る人が読む必要があるからです。

手による書き直し

誰かが SAS プログラムを読み、何をするつもりだったのかを理解し、それを Python で書きます。立ち上がりは遅く、そして SAS の衣をまとった Python ではなく Python らしい形のコードで終わる唯一の道です。二年後に Python に満足しているチームは、たいていこの道を通っていて、数値が一致するまで古いプログラムを隣で動かし続けています。

プログラムをそのまま実行する — 100 個の手続き

比較ページが飛ばす道です。Jenner は SAS 9.4 言語のクリーンルーム実装で、Rust で書かれています。SAS7BDAT ファイルを直接読み、.sas のソースをそのまま実行するので、読み返すべき生成コードも、チームが抱える第二の言語もありません。できないのは SAS 言語のすべてを覆うことで、カバー範囲は手続き単位で公開されているため、頼る前に自分のものを確認できます。

今の場所にとどまる

何もしないことは本当の決断であり、しばしば正しい決断です。コードが安定していて、それを動かす環境が今年なくなるわけでもなく、誰も変更を求めていないなら、やらない移行がこのページで最も見返りの大きい選択です。プラットフォームの移動、監査、採用の問題がこの問いを迫ってきたら、また考えればよいのです。

変換されたコードを信じるための費用

自動変換の失敗の仕方は構文エラーではありません。構文エラーは最初の実行で表に出ます。問題は静かな数値の違いです。SAS は文字値の右側を空白で埋めますが Python は埋めません。SAS は日付を 1960 年 1 月 1 日から数え、pandas は 1970 年 1 月 1 日から数えます。そして DATA ステップの MERGE は、キーが両側で繰り返されるとき pandas の merge と同じようには動きません。どれも何も警告しません。ほとんど正しい数値が出るだけで、それが最も悪い種類の誤りです。だから本当の値段は、両方の言語に通じた人による一行ずつの読み合わせと、出力が一致するまで同じ入力で新旧を並べて動かす期間であり、その値段はコードの量に比例します。巧妙さではありません。

よくあるご質問

できますし、ツールは以前より良くなっています。ウェブコンバーターやベンダーのサービスは .sas ファイルを受け取って Python を返しますし、大規模言語モデル(LLM)もチャット画面から同じことをします。どれも構文は得意で、どれも数値がまだ合っているかは教えてくれません。出力は、あなたのデータを一度も見たことのない人が書いた初稿として扱ってください。

いいえ。このページを出しているのは Jenner で、SAS 9.4 言語の独立したクリーンルーム実装であり、Rust で書かれています。書かれたとおりに .sas プログラムを実行し、すでにお持ちの SAS7BDAT ファイルを読みます。ほかの言語で何かが出力されることはないので、誰かが読み返すべき生成ソースは存在しません。

たいていは SAS プログラム一本につき Python ファイル一本です。DATA ステップは pandas の操作として、PROC SQL は pandas の結合かデータベースドライバー経由の SQL として、統計手続きは対応するものがあれば statsmodels、scipy、scikit-learn に写されます。対応するものがないところ — マクロ機能の大部分、ODS 出力、多くのフォーマットとインフォマット — では、ツールはコメントか最善の推測を残します。レビューの時間はその隙間に消えていきます。

良いものがありますが、どれも頼る前に知っておくべき同じ限界を抱えています。チートシートは PROC MEANS を pandas の describe に、PROC FREQ を value_counts やクロス集計に、PROC SORT を sort_values に、DATA ステップを代入の連なりに対応づけます。それは構文の層で、構文は難しい部分ではありません。どんな表にも翻訳できないのはその下の意味論です。欠損値の扱い、BY グループ処理、文字比較での末尾の空白、日付の原点。静かに間違いが起きるのはそこです。

できますし、短いプログラムなら初稿までの最短経路になることが多いです。落とし穴はどのコンバーターにもあるものが、流暢さで悪化したものです。LLM は正しいかどうかに関わらず説得力のある読み味のコードを書き、知らない手続きオプションにはもっともらしい等価物を作り出します。直し方はより良いプロンプトではありません。両方の版を実行して出力を比べる手段をモデルに与え、確認を答えの自信ではなく機械的な作業にすることです。

外からは誰にも言えませんし、数字を出すページは当て推量をしています。効いてくる変数は二つ、行数と、新しい出力が古い出力と一致しなければならない要求の強さです。再現要求のない数千行なら小さなチームが終えられる案件ですが、過去の結果を再現できなければならない検証済みのコードベースなら、試験予算のついたプログラムであり、コードを書くのはその小さな部分です。

出力が古いプログラムの出したものを再現しなければならず、チームの外の誰かがそれを確かめるとき。コードベースが大きすぎて誰も全部を読んでいないとき。分析を理解している人と Python を書く人が別のとき。どれか一つでも当てはまれば、コーディングの仕事は検証の仕事に変わり、これらの案件が膨らむ原因は検証のほうです。

SAS なしで SAS プログラムを実行することです。SAS 言語の独立した実装は、すでにお持ちの .sas ソースをそのまま実行するので、読み返すべき生成コードも、部屋の中の第二の言語もありません。Jenner はその一つです。Altair SLC、かつての WPS はもう一つで、はるかに長くこれをやっています。出ていく理由が言語そのものではなくプラットフォームやライセンスであるときは、この道の見積もりを取る価値があります。

読めます。SAS7BDAT ファイルは直接読まれるので、先に CSV へ書き出す必要はありません。これは聞こえる以上に重要です。すべてのデータセットをテキストに吐き出すところから始まる移行は、コードにある違いの上に二つ目の違いの束 — 文字コード、数値精度、日付の解釈 — を積み上げ、その後は食い違いがどの層から来たのか誰にも分からなくなります。

SAS 言語のすべてではありません。それが上のすべてと天秤にかけるべき正直な限界です。実装された手続きにはそれぞれ公開のリファレンスページがあるので、特定の PROC に対応しているかどうかは、後から気づくのではなく頼る前に確認できます。珍しい手続きオプション、ODS のレイアウト、外部データベースエンジンに寄りかかったプログラムが、まず見るべきところです。実務的な試験は自分のプログラムを走らせてログを比べることで、半日で済み、このようなページのどんな主張よりもはっきり決着がつきます。

Altair SLC、かつての WPS は SAS なしで SAS 言語のプログラムを実行し、私たちよりはるかに長くそうしてきました。大きな資産の上で、誰かがすでにあなたの例外的なケースに当たって直させているなら、その歴史は本当にお金に値します。両方を自分のコードの前に置いて、ログを比べてください。答えはたいてい一日で明らかになり、それがいつも私たちだとは限りません。

それが一般的な着地点で、理にかなっています。新しい分析は Python で書かれます。チームもライブラリもすでにそこにあるからです。一方で古い検証済みのプログラムは、触る理由ができるまでそのまま動き続けます。これは、この決断の最悪の形 — 誰にも再検証の予算がないコードを一気に書き直すこと — を避けます。両者は境界、つまり互いに渡すデータのところで合っていればよく、一行ずつ合わせる必要はありません。

自分のプログラムで決着をつける

自分のコード、自分のデータ、そして並べたログ。決めるのはその比較で、誰かが代わりに走らせてくれるものではありません。

無料で試す