全国学力テストの都道府県別平均正答率(2022年版)

令和4年度 全国学力・学習状況調査 報告書・調査結果資料から求めた都道府県ごとの正答率を求めてCSV形式にした。公式資料と異なり、小数点以下を丸めていない。

まず、上記サイトからリンクされているファイル群を全部ダウンロードする(これはターミナルで実行するコマンドである)。以下では全部を使うわけではないので、もっと絞れるが、とりあえず:

wget --timestamping --recursive --no-parent --wait=1 \
     https://www.nier.go.jp/22chousakekkahoukoku/

全 1283 ファイル、516M バイトを取得した。

必要なファイル名のリストを得るには pathlib と正規表現ライブラリ re を使う:

import pathlib
import re

path = pathlib.Path("www.nier.go.jp/22chousakekkahoukoku/factsheet")
names = sorted([p for p in path.glob("**/*.xlsx") if re.search(r"/\d\dp_22r\.xlsx$", str(p))])

まず小学校についてExcelファイルを読んで平均正答率を計算する:

from openpyxl import load_workbook
import numpy as np

def f(n):
    wb = load_workbook(n, read_only=True)
    ws = wb.worksheets[0]['AE8:AE22']  # 国語
    n = len(ws)
    x = np.array([ws[i][0].value for i in range(n)])
    koku = (x @ np.arange(n)[::-1]) / np.sum(x) * (100 / (n-1))
    ws = wb.worksheets[1]['AE8:AE24']  # 算数
    n = len(ws)
    x = np.array([ws[i][0].value for i in range(n)])
    san = (x @ np.arange(n)[::-1]) / np.sum(x) * (100 / (n-1))
    ws = wb.worksheets[2]['AE8:AE25']  # 理科
    n = len(ws)
    x = np.array([ws[i][0].value for i in range(n)])
    ri = (x @ np.arange(n)[::-1]) / np.sum(x) * (100 / (n-1))
    return [koku, san, ri]

sho = np.array([f(n) for n in names])

同様に中学校も:

names = sorted([p for p in path.glob("**/*.xlsx") if re.search(r"/\d\dm_22r\.xlsx$", str(p))])

def f(n):
    wb = load_workbook(n, read_only=True)
    ws = wb.worksheets[0]['AE8:AE22']  # 国語
    n = len(ws)
    x = np.array([ws[i][0].value for i in range(n)])
    koku = (x @ np.arange(n)[::-1]) / np.sum(x) * (100 / (n-1))
    ws = wb.worksheets[1]['AE8:AE22']  # 数学
    n = len(ws)
    x = np.array([ws[i][0].value for i in range(n)])
    suu = (x @ np.arange(n)[::-1]) / np.sum(x) * (100 / (n-1))
    ws = wb.worksheets[2]['AE8:AE29']  # 理科
    n = len(ws)
    x = np.array([ws[i][0].value for i in range(n)])
    ri = (x @ np.arange(n)[::-1]) / np.sum(x) * (100 / (n-1))
    return [koku, suu, ri]

chu = np.array([f(n) for n in names])

水平方向に結合する:

shochu = np.hstack((sho, chu))

CSV形式で保存(Excelや「メモ帳」で文字化けしないようにBOM付きUTF-8、行末CRLF):

import pandas as pd

pd.DataFrame(shochu).to_csv("atest2022.csv", index=False,
                            encoding="utf_8_sig", line_terminator="\r\n",
                            header=["小国","小算","小理","中国","中数","中理"])

結果は atest2022.csv として置いておく。

都道府県名は特に付けていない。必要なら次のリストを使う:

kenmei = ["北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県",
  "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都",
  "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県",
  "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
  "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県",
  "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県",
  "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"]

Last modified: