文科省が全国学力・学習状況調査(全国学力テスト)のパブリックユースデータ(擬似データ)を公開した。これを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")
などと指定できる。white
,dark
,whitegrid
,darkgrid
,ticks
から選ぶ。
ヒストグラムが凸凹なのは,ビン(階級)の取り方に問題があるからである。次の 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 を予測するモデルを作り,正答率を求めよ。