高度試験(プロジェクトマネージャ試験)の統計情報を可視化
2024年12月26日,応用情報技術者試験,高度試験,情報処理安全確保支援士試験の統計情報が公開された。
統計情報の Excel を Python で読み込み,chart.js に適したフォーマットに変換する。
今回は例として,プロジェクトマネージャ試験の都道府県別 一覧表を用いる。
ライブラリの読み込み
Python の openpyxl のライブラリを読み込む。
from openpyxl import load_workbook
データ抽出
for ループでデータを読み込む関数を作成する。start_raw から end_row まで step ごとに値を取得していく。
def extract_data(sheet, start_row, end_row, step, col, is_label=False):
data = []
for i in range(start_row, end_row + 1, step):
cell_value = sheet.cell(row=i, column=col).value
if is_label:
data.append(f"'{cell_value}'")
else:
data.append(cell_value)
return data
メイン関数
メイン関数を作成する。今回は都道府県別 一覧表 (Excel : 63 kB) を読み込む。プロジェクトマネージャ試験の統計情報は,2 つ目のシートにあるため,2 つ目のシートを開く。そして,5 行目 (start_raw) から 143 行目 (end_row) まで 3 行 (step_row) ごとに都道府県別の情報が記載されているので,変数として設定する(保守しやすいコードを目指しました)。
また,プロジェクトマネージャ試験の応募者,受験者,合格者は 4 列目 (col_num) に記載されている。
def main():
excel_path = './02_kenbetsu_r06a.xlsx'
workbook = load_workbook(filename=excel_path, read_only=True)
sheet = workbook[workbook.sheetnames[1]]
start_row = 5
step_row = 3
end_row = 143
col_num = 4
# ラベル
labels = extract_data(sheet, start_row, end_row, step_row, 1, is_label=True)
print(f"const kenbetsu_labels = [{', '.join(labels)}];")
print("const kenbetsuData = {")
## 応募者
spring_oubosya = extract_data(sheet, start_row - 1, end_row - 1, step_row, col_num)
print(f" oubosya : [{', '.join(map(str, spring_oubosya))}],")
## 受験者
spring_zyukensya = extract_data(sheet, start_row , end_row, step_row, col_num)
print(f" zyukensya : [{', '.join(map(str, spring_zyukensya))}],")
## 合格者
spring_gokakusya = extract_data(sheet, start_row + 1, end_row + 1, step_row, col_num)
print(f" gokakusya : [{', '.join(map(str, spring_gokakusya))}],")
print("};")
# 年度受験率,合格率
print("const kenbetsuNendoRate = {")
## 受験率
zyukenritsu = extract_data(sheet, start_row, end_row, step_row, col_num + 1)
print(f" zyukenritsu : [{', '.join(map(str, zyukenritsu))}],")
## 合格者
gokakuritsu = extract_data(sheet, start_row + 1, end_row + 1, step_row, col_num + 1)
print(f" gokakuritsu : [{', '.join(map(str, gokakuritsu))}],")
print("};")
workbook.close()
メイン関数の実行
メイン関数を実行する。
if __name__ == "__main__":
main()
出力結果
上記のコードを実行した結果は以下のとおり。chart.js でグラフ化するコードに貼り付ければ完成です。
const keikennensubetsu_labels = ['経験なし', '1年未満', '2年未満', '2年以上4年未満', '4年以上6年未満', '6年以上8年未満', '8年以上10年未満', '10年以上12年未満', '12年以上14年未満', '14年以上16年未満', '16年以上18年未満', '18年以上20年未満', '20年以上22年未満', '22年以上24年未満', '24年以上', '無記入'];
const keikennensubetsuData = {
oubosya : [5, 45, 98, 373, 558, 596, 683, 824, 628, 836, 733, 666, 913, 809, 2280, 3352],
zyukensya : [2, 31, 64, 236, 352, 350, 416, 517, 399, 534, 466, 428, 596, 543, 1556, 2091],
gokakusya : [1, 2, 17, 43, 77, 69, 77, 81, 59, 80, 78, 64, 65, 55, 124, 298],
};
const keikennensubetsuNendoRate = {
zyukenritsu : [40, 68.9, 65.3, 63.3, 63.1, 58.7, 60.9, 62.7, 63.5, 63.9, 63.6, 64.3, 65.3, 67.1, 68.2, 62.4],
gokakuritsu : [50, 6.5, 26.6, 18.2, 21.9, 19.7, 18.5, 15.7, 14.8, 15, 16.7, 15, 10.9, 10.1, 8, 14.3],
};