全国学力テスト模擬データ

文科省が全国学力・学習状況調査(全国学力テスト)のパブリックユースデータ(擬似データ)を公開した。これをRで読み込んで中を調べる方法はこちらにある。これはそのPython版である。

ここでは生徒データ(Excel:3126KB)つまり中学生(中3)のデータを使う。まずはダウンロードして,Excelで開いてみよう。このような,1行目に変数名,2行目以降に値が並び,セル結合をしていない素直な長方形データは,RやPythonで簡単に扱える。

import pandas as pd

df = pd.read_excel("1404609_2_1.xlsx")

これで df という変数に生徒データが読み込まれた。

df

とだけ打ち込むと雰囲気がわかる。変数名一覧は

df.columns

だけでは全部表示されない。表示オプションを変えるか,あるいは

for x in df.columns:
    print(x)

または

for i, x in enumerate(df.columns):
    print(i, x)

とする。

詳しくはデータレイアウト(PDF:784KB)にあるが,実施年はすべて2015,地域規模は1:大都市,2:中核市,3:その他の市,4:町村,性別は1:男子,2:女子,0:不明,生徒質問紙種別はすべて欠測値(NaN)である。その次からが正答数と,100点満点に換算した正答率が続く。

国語A,国語B,数学A,数学B,理科の5科目それぞれ45分で答える。Aは基本,Bは応用である。それぞれの満点はデータの最大値に等しい。データでは理科以外に理科A,理科Bがあるが,便宜上二つに分けたようで,基本・応用という区別ではなさそうである。5科目を単純にプロットしてみる:

import seaborn as sns

sns.pairplot(df.iloc[:, 5:10])

スタイルは sns.set_style("darkgrid") などと指定できる。whitedarkwhitegriddarkgridticks から選ぶ。

ヒストグラムが凸凹なのは,ビン(階級)の取り方に問題があるからである。次の discrete=True オプションでどう変わるか試してみよう。

sns.histplot(df['正答数_国A'], discrete=True)

散布図と回帰直線を描いてみよう。

sns.regplot(x='正答数_国A', y='正答数_数A', data=df)

マーカーを小さくするにはオプション marker="." を付けます。ジッター(点が重ならないように乱数で揺らすこと)を加えるには x_jitter=0.3, y_jitter=0.3 のようにします。

箱ひげ図なども挑戦してみよう。

問題:このデータに基づいて result.csv を予測するモデルを作り,正答率を求めよ。