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

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

まず、上記サイトからリンクされているファイル群を全部ダウンロードする(これはターミナルで実行するコマンドである)。以下では全部を使うわけではないので、もっと絞れるが、とりあえず。なお、--no-check-certificate は本来使いたくないが、証明書エラーで取得できなかったので、しかたなく付けた。

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

全 1255 ファイル、379M バイトを取得した。

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

import pathlib
import re

path = pathlib.Path("www.nier.go.jp/24chousakekkahoukoku/factsheet")

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

from openpyxl import load_workbook
import numpy as np

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

def f(n):
    wb = load_workbook(n, read_only=True)
    ws = wb.worksheets[0]['M26:M40']  # 国語
    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]['M24:M40']  # 算数
    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))
    return [koku, san]

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

同様に中学校も:

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

def f(n):
    wb = load_workbook(n, read_only=True)
    ws = wb.worksheets[0]['M25:M40']  # 国語
    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]['M24:M40']  # 数学
    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))
    return [koku, suu]

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("atest2024.csv", index=False,
                            encoding="utf_8_sig", lineterminator="\r\n",
                            header=["小国","小算","中国","中数"])

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

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

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

Last modified: