日々の記録簿

日々のできごとの記録

PISA

RによるPISAの分析(データの準備)

投稿日:

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月号に初心者向けの特集がありましたので、参考になると思います。

スポンサーリンク

スポンサーリンク

-PISA

執筆者:


comment

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

関連記事

RによるPISA Data Analysis Manualの再現(第9章: Proficiency Levels/習熟度の計算)

第7章(標準誤差の推定)、第8章(PVs)に引き続き、PISA Data Analysis Manual SPSS 2nd Editionの分析を、Rで再現してみます。 今回は、習熟度(Profici …

RによるPISAの分析(データの準備:続報)

三重大の奥村晴彦氏のホームページにて、RでPISAデータを読み込む方法(PISAデータを読む)が公開されていました。 こちらは、Rubyで読み込んでいるようです(ちなみに私はRubyはサッパリです・・ …

RによるPISA Data Analysis Manualの再現(第10章: 学校の変数を扱う)

第7章(標準誤差の推定)、第8章(PVs)、第9章(習熟度)に引き続き、PISA Data Analysis Manual SPSS 2nd Editionの分析を、Rで再現してみます。 今回は、学校 …

RによるPISAの分析(データの準備その2)

RによるPISAの分析(データの準備)で公開したpythonコードですが、その後、PISA2000のspsファイルに対応していなかったとか、すべての国のデータをまとめて変換したほうが便利だとか、ファイ …

RによるPISA Data Analysis Manualの再現(第7章: 標準誤差の推定)

学力調査の基本を勉強する上で大変参考になる、PISA Data Analysis Manual SPSS 2nd Editionの分析を、Rで再現してみます。 今回は、標準誤差の推定に関わる第7章を扱 …