PISAをRで分析する際に、最初の壁になるのが、データファイルが大きすぎるという点でしょう。
すでに述べたように、PISAのデータは、(1)データが固定長のtxtファイルになっている、(2)参加国すべてのデータが1つのファイルにまとまっておりファイルサイズが大きい、という特徴があり、いきなりRに読み込むのは困難です。
比較的簡単な対処法は、PISAの分析ソフトとして推奨されているSPSSかSASでデータを取り込み、そこから国別のcsvファイルに変換してしまうことです。しかし、SPSSやSASを持っていない場合は、どうすればよいのでしょうか。
ここでは、Pythonを使い、PISAのtxtファイルを国別のcsvファイルに変換することを考えます。
前提条件
Python 3が動くLinux環境を用意できること
Pythonは比較的初心者にも扱いやすいプログラミング言語である。
最近のLinux環境であれば、インストール時にPythonが動く(あるいは簡単に動作させられるようになる)はずなので、Ubuntuなどをインストールすると良い。
WindowsやMacでもPythonは動作するので、下記のコードも動かせるはずである。ただ、動作検証はしていないので、興味のある方は自分でやってみてほしい。
文字コードの知識があること
今回紹介するコードは、UTF-8で実行することを前提につくられている。
PISAのデータファイルはUTF-8ではないことがあるため、エラーがでることもある。その時は何らかの方法でUTF-8に変更する必要がある。
Linuxであれば、nkfコマンドを使えば容易にできる。
# nkfでspsファイルをUTF-8に変換する。 nkf -w --overwrite INT_STU12_SPSS.sps
Pythonによるcsvファイルの作成
今回紹介するspss.pyは、PISAのspsファイルをもとに、txtファイルを国別のcsvファイルに変換するコードである。
なお、spsファイルおよびtxtファイルは、以下からダウンロードできる。
このページの一番下に掲載しているpythonのコードを、spss.pyという名前で、PISAのspsファイルとtxtファイルと同じフォルダ上に保存する。
その上で端末を開いて、pythonを実行する。
# PISA2003のドイツのデータを作成。ファイルは2003DEU.csvで作成される。 python spss.py Read_stuI_2003_v2.sps INT_stui_2003_v2.txt DEU 2003 # PISA2006のベルギーのデータを作成。ファイルは2006BEL.csvで作成される。 python spss.py INT_Stu06_SPSS_Dec07.sps INT_Stu06_Dec07.txt BEL 2006 # PISA2012の日本のデータを作成。ファイルは2012JPN.csvで作成される。 python spss.py INT_STU12_SPSS.sps INT_STU12_DEC03.txt JPN 2012
spss.pyのソースは次の通り。もっとよい書き方があるのだろうが、とりあえず動くことは動く。
#!/usr/bin/env/python3 # coding: utf-8 """ spss.py spsファイルを使って、PISAデータのtxtファイルを、国ごとのcsvファイルにコンバートします。 使い方 "python spss.py INT_STU12_SPSS.sps INT_STU12_DEC03.txt JPN 2012" """ import csv import sys import os.path import re argvs = sys.argv argc = len(argvs) if argc != 5: print('引数は、"spsファイル"、"txtファイル"、"CNTコード"、"ファイルの接頭語"が、この順番で必要です、') quit() if os.path.splitext(argvs[1])[1] != '.sps': print('最初の引数は、spsファイルでなくてはなりません。') quit() if os.path.splitext(argvs[2])[1] != '.txt': print('2番目の引数は、txtファイルでなくてはなりません。') quit() if len(argvs[3]) != 3: print('3番目の引数は、CNTコードでなくてはなりません。CNTコードは3桁の半角英数です。') quit() # SPSファイルから固定幅データを得る x = [] y = [] var = [] for text in open(argvs[1]): line = text.strip(' /.\n') if len(line.split()) >= 4: if line.split()[1].isdigit() and line.split()[3].isdigit(): x.append(line.split()[1]) y.append(line.split()[3]) var.append(line.split()[0]) # 書込ファイルの準備 filename = argvs[4] + argvs[3] + '.csv' w = open(filename, 'w') write = csv.writer(w) # 変数名を書込 write.writerow(var) # データを固定幅で切ってcsvで書込 for line in open(argvs[2]): if line.find(argvs[3]) >= 0: list = [] for i in range(len(x)): list.append(line[int(x[i])-1:int(y[i])]) write.writerow(list) # 後始末 w.close()
関連書籍
あまり勉強したわけではありませんが、Pythonについては、この本を参考にしました。
そのうち勉強を兼ねて、今回のプログラムのGUIをつくってみようと思います。
Linuxは、新しい情報がどんどんでてくるので、書籍を購入しても情報が古いことがあります。毎月刊行される雑誌のほうがよいかもしれません。
とくに日経Linuxは、定期的にWindowsからLinuxへ移行するための特集を組んでいます。最近では、2015年1月号に初心者向けの特集がありましたので、参考になると思います。