主に自分のメモ用途。

自分のためのメモ帳です。

savファイルをRとPythonで開く。

savファイルというSPSS由来の形式のデータを
(有料の)SPSSではなく、(無料の)RかPythonで開きたいなと思った。

R

まずは、Rで開く方法を示す。

開く対象であるサンプルデータ(savファイル)は、以下。
NECO data
このページにある、6areaeng.savを開く。

Rで開くには、foreignパッケージがいいみたい。参考ページは以下。
Rを使って,SPSSデータをcsvファイルに変換する方法 | Sunny side up!

library(foreign)
foreign01 <- read.spss("6areaeng.sav", to.data.frame=TRUE)
write.csv(foreign01,"foreign01.csv",row.names=FALSE)


他には、havenパッケージというのもあるんだけど、foreignパッケージと比べて情報量が落ちているので、
havenパッケージを使うのはどうなんだろう?とは思う。
そもそも、SPSSで開いて確認していないので、foreignパッケージで開いたものが情報量が落ちていないかという確認もしてないんだけど。
一応、havenパッケージでの開き方のコードも以下に書いとく。開き方が2種類ある。

library(haven)

haven01 <- read_sav("6areaeng.sav")
write.csv(haven01,"haven01.csv",row.names=FALSE)

haven02 <- read_spss("6areaeng.sav")
write.csv(haven02,"haven02.csv",row.names=FALSE)



2018.5.20追記。
Mizumoto Lablog | SPSSが入っていないMacでsavファイルを変換する方法
上記のリンクで、PSPPというのがあるのを知った。SPSSの機能を限定的に備えているらしい。savファイルを開くのは問題なくできるみたい。
PSPP - GNU Project - Free Software Foundation
PSPPでsavファイルを開いてみた。savファイルには、数値にカテゴリカルデータを対応させて保存するようだ。foreignパッケージではカテゴリカルデータの側面で出力し、havenパッケージでは数値の側面で出力するようだ。
ひょっとしたら、これらのパッケージ、オプションをちゃんと指定すれば、数値、カテゴリカルデータのどちらの側面を抽出するか決められるのかな?ちゃんと調べてないけど。
あと、havenパッケージにはwrite_sav()関数があって、savファイルで保存することもできるというのを知った。
https://cran.r-project.org/web/packages/haven/haven.pdf


Python

savファイルを開く方法として、scipy.io.readsav()で開くというのがあるが、
上手くいかなかったので、「Rで開いて、Pythonで取得する。」という方法でやることに。代替手段ということです。
ただし、Python側だけでコード処理したい。(RのIDEを開いて、PythonIDEを開いて・・・みたいなことはしたくない。)
PythonからRを操作するライブラリとして、pyperというものがある。今回はこれを使う。
コードは以下。

from pyper import R
r = R()

#以下が、Rで行う内容。データフレームをそのまま取得できないみたいなので、一旦CSVファイルにしている。
r('''
library(foreign)
foreign01 <- read.spss("6areaeng.sav", to.data.frame=TRUE)
write.csv(foreign01,"foreign01_pyper.csv",row.names=FALSE)
''')

#Rで出力されたCSVファイルを読み込む。
import pandas as pd
df01 = pd.read_csv("foreign01_pyper.csv")

#Rで行ったことを取得するにはgetメソッドがあるが、1変数なら行けるけど、データフレームはダメなようだ。
x = r['foreign01[1,1]'] #1変数(データフレームの1つのセル)なら行ける。
x = r['foreign01'] #データフレームすべての取得はできないようだ。カラで返ってくる。