★データ解析備忘録★

ゆる〜い技術メモ

sas7bdatファイルの作成と各種ソフトでの読み込み

sas7bdatとは何か

 sas7bdatというファイル形式があります。これは一言で言えばSASで作ったデータのファイル形式です。
このファイル形式はSASのいろいろなアウトプットを格納できて、例えば回帰分析後のパラメーター推定値や予測値、ベイズ推定のMCMCであればサンプリング結果なんかもいろいろ入れられます。しかもこの形式のファイルを作るのに必要なコマンドは一つだけなので、Rのcsv出力みたいにいちいちwrite.csv()とかやらなくても済みます。

 このファイル形式の凄さは格納できるデータサイズにあって、10億行×30カラムのデータもきちんと書き込み、読み込みでき、さすが高いソフトだなあという感じです。

sast7bdatファイルを作る(SAS

sas7bdatファイルの作り方ですが、SASにはライブラリという重要な概念があります。これは「このライブラリ名のなかでは出力を統一させますよ」といったものです。多分具体例があったほうがわかりやすいと思います。
まず、SASファイルの先頭で

libname ライブラリ名 'ディレクトリ名' ;

というふうにライブラリを指定します。これでこの後にどんな処理をしてもライブラリ名によって紐付けることができます。
具体的には例えば年収についての分析をしているのであれば 

というふうにすることでincome.sas7bdatファイルが作成されます。
つまり、ライブラリ名.でライブラリ名を紐付けることができます。
proc regであればoutput out = income.regoutとすれば回帰分析の結果がsas7bdatファイルになります。

また、proc formatproc datasetsのようにoutの引数がない場合はlibrary = incomeとすることでライブラリ名を紐付けます。

ちなみに、libname=を指定しなかった場合はworkライブラリが自動的に割り当てられます。

sas7bdatファイルを読み込む(SAS, R, Python

sas7bdatファイルを読み込みます。読み込んで他の分析をしたりすること自体は実はRやPythonでもできます。
書き出しはもちろんSASでしかできませんが。

SAS

SASでsas7bdatファイルを読み込むにはDATA STEPを使えば良くて、

とすれば読み込めます。

R

{sas7bdat}

Rでsas7bdatファイルを読み込む{sas7bdat}パッケージがCRANにあるようなのでそれを使います。
https://cran.r-project.org/web/packages/sas7bdat/sas7bdat.pdf

install.packages("sas7bdat")
library(sas7bdat)

dat <- read.sas7bdat("C:/Users/ユーザー名/Desktop/income_analysis/income.sas7bdat", debug=FALSE)

とすれば先程のincome.sas7bdatを読み込めます。

2016/5/9追記

{haven}

神Hadley製のパッケージ{haven}もSASファイルに対応しています。
上記のファイルだと、

install.packages("haven")
library(haven)

dat <- read_sas("C:/Users/ユーザー名/Desktop/income_analysis/income.sas7bdat")

で読み込めます。
ただし、{haven}はまだ不安定なようで、僕の環境で試したところ読めるものと読めないものがありました。
読めない場合、以下のエラーが出ました。

Invalid file, or file has unsupported features.

Unable to load big data files · Issue #92 · tidyverse/haven · GitHub
では解決したようになってますが、エラーでした。
改善しないかなあ。

Python

一番楽なのはpandasを使うことですね。
pandas.read_sas — pandas 0.23.4 documentation

import pandas as pd
df = pd.read_sas('income.sas7bdat')

また、sas7bdatファイルを読み込む専用モジュールもあるのでそれでもいいと思います。
Pythonの2系にも3系にも対応していて、pip installで入れられます。
sas7bdat · PyPI

pip insatll sas7bdat
from sas7bdat import SAS7BDAT
with SAS7BDAT('income.sas7bdat') as f:
    for row in f:
        print row

上のページにもありますが、pandasのDataFrameを使いたい場合は

df = f.to_data_frame()

とすればOKです。