うずまき2017 powered by Jun-Systems

耳管開放症, SAS, 統計解析, 人工知能, プログラミングそれに思考

*

SASのPROC HTTPでe-statのAPIを叩く(叩くだけ)

   

PROC HTTPまたの名を「無限の可能性を秘めたクッソ使いづらいプロシージャ」をどこまでも追究していきます。ブログを差別化しようとするとこういう役に立たない上に大してPVの稼げないネタしか思いつかなくて悲しい。
まあ正直なところMachine Readabilityの低い政府公開のオープンデータを直接引っ張ってきて生データ食わせたところでゴミデータセットができあがるだけなんですが,まあ手法としてのPROC HTTPを使ったダウンロード的な部分でのウェブへの知識の蓄積に貢献したいと思います。
(元のタイトルは「e-statから直接データをインポートする」だったんですが,SASのXML Mapが全然うまくいかないのでインポートはやめて,API叩いてローカルに保存するところまでにします。すいません。)
 

Machine-Readableであるということ

ちなみにMachine Readability(機械可読性)については,Open Data Handbookによれば
 

Machine-Readable
機械可読なフォーマットとは、コンピュータプログラムで簡単に取り出せるようなフォーマットを指す。PDFドキュメントは機械可読だとはいえない。コンピュータできれいにテキストを表示させることはできても、そのテキストにまつわるコンテキストをプログラムが理解するのは極めて難しい。
(用語集 — Open Data Handbook)

 
簡単にいえば,たとえExcelのxlsx形式で保存されているデータでも,奇怪で怪奇なセル分割/結合がしてあったり,ひとつのデータに表がいくつもあったりすると,そのままデータをソフトウェアに食わせてもデータの解釈ができない(つまりMachine-Readableではない)。従って必然的に人間が一旦介在してデータの整形をしなければならないわけであります。
ビッグデータ時代(笑)だし整形も時間かかるんだしめんどくせーじゃん?ということで,データ利用促進のためにもなるべく機械に優しく,そのまま読めるようにしとこうよという流れがあるわけであります。
 

本題

政府公開のオープンデータをSASでそのまま読み込むのは,方法としてはSASのPROC HTTPを使って政府統計(e-stat)のAPIを直接叩く形を取ります。e-statとdata goの違いは何なんだ。
 
1 利用登録
事前に実名+勤務先的な利用登録が必要です。
政府統計の総合窓口(e-Stat)−API機能 | 政府統計の総合窓口(e-Stat)で提供している統計データ等を機械判読可能な形式で取得できるAPI機能を提供します
登録できたら今度はAPI利用登録 a.k.a. アプリケーションIDの取得を行います。
アプリケーションIDの取得 | 政府統計の総合窓口(e-Stat)−API機能
 
2 めぼしいデータを探す
今回はAPIの使い方 | 政府統計の総合窓口(e-Stat)−API機能の「以下のリクエストを実行することにより、東京の老年人口割合[65歳以上人口]を取得することが可能です」をSASでやってみます。
 
結局のところのミソはこのへんの設定すべきパラメータをPROC HTTP上でどうやって指定すればいいのかというところだけで,それがわかれば色々と応用が効くはずです。(とはいったものの,かなりそのままなんですけど)
 
URL指定の際のミソとして,今回はグローバルマクロ変数(正式名称はよく存じ上げません)でAppIdとデータセットのIDなどを指定してあげているので,ちゃんとエスケープをしてあげましょう。特に%の扱いが面倒なので気をつけてくだちい。
 
APIはごちゃごちゃ言わずに2.0を使えばいいんで,XMLで取得したい場合は”http://api.e-stat.go.jp/rest/2.0/app/getStatsData”にパラメータを指定すればいいわけです。
 
以下実ソース。

%macro tempFile( fname );
  %if %superq(SYSSCPL) eq %str(z/OS) or %superq(SYSSCPL) eq %str(OS/ 390) %then
    %let recfm=recfm=vb;
  %else
    %let recfm=;
  filename &fname TEMP lrecl=2048 &recfm;
%mend;

%tempFile (outdat)

%LET appId=<ENTER_YOUR_APP_ID>;
%LET statsId=C0020050213000;
%LET figureId= %STR(%%)23A03503;
%LET target = "http://api.e-stat.go.jp/rest/2.0/app/getStatsData?appId=&appId%NRSTR(&)statsDataId=&statsId%NRSTR(&)cdCat01=&figureId";

 PROC HTTP method="get"
   out=outdat
   url=&target
   ct="charset=UTF-8";
 run;

前半のマクロは前回のtwitterのやつの使い回しです。
SASで直接twitterを検索してTLをインポート(PROC HTTP/Twitter OAuth) | うずまき(3rd Gen) Jun-Systems
何をしているかというと,PROC HTTPでデータをローカルに落とす際に指定するファイルというのがあるんですが(プログラムでいうout=outdatのとこ),無から有を創造しようとするとSASたんは「ERROR: ***は存在しません」とか怒るので,あらかじめダミーデータをSAS上から作っておくためのものです。メンがヘラったソフト相手でもイラつかずに優しく対処してあげないといけません。
ぼくの場合はC:¥/Users/[Username]/AppData/Local/Temp/SAS Temporary Files/[うにゃうにゃ]/#LN*******みたいなところに吐き出されます。
もし場所がよくわからなかったら,一旦上のプログラムを走らせた上で

DATA _NULL_;
  FILE outdat;
run;

とかを走らせると,外部ファイルを上書きするのあたってログに
「ファイル名:C:¥/Users/[Username]/AppData/Local/Temp/SAS Temporary Files/[うにゃうにゃ]/#LN*******, レコードフォーマット=云々」
みたいなのが吐き出されるので,それで確認してもらえばいいと思います。ちなみにこれを走らせると普通に空のデータセットでoutdatが上書きされるので,もう一回元のプログラムを走らせないとダメです。
あと一時ファイルなので実行するたびにファイル名が変わったり,SASの立ち上げのたびにフォルダ名が微妙に変わったりしますが,outdatというマクロ変数的なアレ自体は変わらないのでまあ別にいいんじゃないですかね(適当)
 
これで,outdatをメモ帳なりで開くとXMLがぎっちり書き込まれていますのであとは各自ご活用ください。ちなみにわたくしには活用の術はありませんでした。
 
 


 - SAS Programming, ビッグデータ , , , , , ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
SASでHHI(ハフィンダール指数)を計算するマクロを作った
【忘備録】SASで巨大データセットから先頭100Obsを抽出
no image
ビッグデータ分析の話
no image
ITの未来について考えてみた
SASで変数リスト内の全変数に順番に同じ処理をかけていくマクロ
SASでランダムサンプリングしてグループ分けするマクロ
no image
2014年IT関連まとめ
no image
SASで条件分岐を使いこなす
no image
SASで横方向の合計を出すには PROC SQL part2
no image
SASのPROC SQLで一括操作(変数名の変更 / ダミー変数操作など)