採点基準が非公開な国家試験の採点基準を自然言語処理で解析して、論述問題を採点できる問題集サービス化につなげる挑戦中

この記事はNTTテクノクロス Advent Calendar 2020の12/3の記事です。
https://qiita.com/advent-calendar/2020/ntt-tx

<!-- 

こんにちは、NTTテクノクロスの江島と申します。
普段は、研究開発向けの試作、アジャイル開発の普及活動、AIや機械学習の社内研修などをしています。


この記事に記載の内容は個人的な取り組みの内容であり、所属する組織とは関係ありません。


# タイトルにある「中小企業診断士」ってなに？

中小企業診断士という、中小企業のコンサルタントの国家試験があります。
中小企業庁が実施しています。

# どんな試験制度か？

その試験の科目で、企業経営の事例を書いた3,4ページの記述を読み、100字程度を解答する問題が5問くらい出題されます。

たとえば、2020/10/25に実施された中小企業診断士２次試験事例Iという科目は、このような問題です。
　https://www.j-smeca.jp/attach/test/shikenmondai/2ji2020/a2ji2020.pdf


# 解決したいことはなに？
#### この試験、試験結果について非公開のものが多くて、不合格者にとってハードモードなのです。

* 公開されていること
    * 合格基準は、4科目（企業経営、マーケティング、生産管理、財務会計をテーマとした事例）の平均が60点以上、1科目も40点以下の科目がないこと
    * 不合格者には、ABCDのランクだけ書いたはがきが届く（合格者にはABCDはなく合格とだけ通知）

* 非公開なこと
    * 正解
    * 採点基準
    * 得点（ただし、合格発表後に書留を送って1ヶ月位まつという得点開示という手続きをした受験生だけ、4科目それぞれの得点100点満点中何点だったかわかる。それでも科目中の各問題ごとの得点は非公開）


#### これって、なかなか受験生に酷な制度。なので、なにか手助けしたい！
不合格で来年再受験する人は、自分の解答のダメだった箇所がいまいちはっきりしないまま勉強を続けることになる。

これはなんとかしないと（使命感）

とはいえ、

* この試験制度で15年以上続けている国家試験なので、やむなくこうなっているのだろうと思った。
* ぼやく前に、中小企業診断士で自然言語処理を少しいじれるエンジニアとして、やれることをやってみようと思った。

というわけで、タイトルの通りの挑戦をしています。
以下、その過程を書きます。

受験生に役立つものを作りたいので、こうすればよいのでは、などアドバイスいただけますと幸いです。


# Step1:試験後に、自分が書いた解答を共有して類似の解答を可視化するアプリを作った（ここまで実施済み）
11/28時点で、だいたい類似する解答だったり、資格試験の予備校が公開している解答例（公式の正解は公開されてないので、あくまでその予備校が適切と考えている解答例）との類似が可視化できた😉



![banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319751/4435c9e2-7cb3-2b74-a1a4-a3ff7fc2c81e.png)
アプリのURL　https://app.zu-de.com/m/201020111/false/false/none


![類似再現答案アプリ事例1-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319751/3cfffef6-ba86-b613-5f14-1bf3519e7b64.gif)


#### 使い方：

* 上記アプリのURLにあるブログの下の方に、アプリを表示しています
* 「再現答案の分布を見る」のボタンを押すと、答案の分布が見れます。
* 上記のGIF動画のように、任意の文字を入力して自分の解答を入力することもできます※

※受験生が使っているので、記入後は空欄にしてから、「再現答案の分布を見る」のボタンを押して、データ消去しておいていただきますようお願いします

### 今の状況
受験者が約１０００名なのですが、公開してみたところ、思ったより多い７０名くらいの受験生に答案を入力していただけました。

Twitterで、
https://twitter.com/zude_com
コツコツ受験生に協力のお願いをしていたら、答案の入力や拡散に協力してもらえました。ありがたいことです。

なんせ合格までの勉強時間が平均１０００時間とも言われる試験の答案です。（ちなみに私は平均より時間かかりました）
受験生以外にはピンとこないかもしれませんが、答案は日々の勉強が詰まったものです。血と汗の結晶とさえ言えるかもしれません。

グラフ上の黒いバツ１つが、受験生の解答一人分に該当します。

### 処理の流れ
IonicAngular→REST→Cloud9→Flask→自然言語処理※→PCA→グラフデータ返す

* ※
    * 解答を分かち書きして、Bug Of Wordsにして、ベクトル化。
    * ベクトルをPCAで2次元に圧縮
    * 2次元データを、グラフデータ（JSON)で、RESTの応答として返す
    * Ionic（Angular）上のplotly.jsでグラフ表示する


# Step2：グラフ上の点に、合否を表示する（現在機能追加作業中）

2020/12/11が合格発表です。
なので、11/28のStep1の時点では、
正誤わからないが、こんなことを書いている人が多い／少ないという事は可視化できた状態。

例えると、高校生クイズのマルバツクイズの発表前のような状態。


これから合否の情報を入力してもらって、グラフ上に表示する機能を追加する予定。
なぜなら、グラフの特定の座標に、合格が集まるハズ（仮説）だから。

# Step3：採点基準の推定に使用する、学習データの準備

採点基準になると思われる記述内容をこちらでいくつか作ってみる。（現在作業中）

解答が採点基準（候補）を満たすかどうかは、機械学習で判定。
ただ、大した精度でないので、自己採点で補正する機能をつける。
こうすれば、精度の高い学習データを自分が全部作らなくても受験生と一緒に作っていける。

# Step4：採点基準の推定その１。合否データにもとづいて。2020/12/11以降

採点基準（候補）を特徴量にして、PCAにして可視化。本当に得点になる採点基準が見えてくるハズ（仮説）
合格者は4科目平均60点以上という程度の曖昧な情報なので、この時点で採点基準わかる可能性はあまり期待していない。

Step3の特徴量を説明変数Xとして、合否を目的変数Yとして、
f(X)=Y
が成立する配点を、機械学習で解かせる。

# Step5：採点基準の推定その2。ABCDにもとづいて。12/25頃

ABCDも、採点基準を明らかにするための目的変数Yとして曖昧ではあるが、合否だけよりはまだくわしい。

目安は、下記のようにされています。

* A：60％以上（得点ではなくあくまでパーセント）
* B：50～60％
* C：40～50％
* D：40％未満

---
#### 12/30追記
色々あって、試験の振り返りツールとして進化しました。

* 採点基準を目視で設定
* 採点基準ごとに目視で記述有無を判断し教師データ作成し、記述有無を機械判定する判別モデルを作成
* 記述有無をベクトルとして、ベクトルの類似度に応じて、合格者やA評価のような良い解答との類似度を算出
* 類似度に応じてランキング表示
* 記述がなかった採点基準のうち、合格者やA評価の回答に多く書かれていたものは、振り返りや改善策の検討を促すようアニメーション表示

![順位判定、多数派解答のグラフ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319751/cc49d574-9f8d-556a-aff0-cc06a8267a50.gif)
---

# Step6：採点基準の推定その3。得点開示にもとづいて。2021/1以降

現状、目的変数に設定できる値としては、現状ではこの特典開示（事例ごとの得点を中小企業士協会が公式に開示したもの）が最も精度が高いデータなので期待できる。
もし、得点開示と比べて精度が高いアプリにできれば、採点基準がわかって、文章問題の解答を採点できるアプリになります。

# 補足：技術以外の大事なところ

機械学習としての難しさもさることながら、ユーザー体験としてデリケートな内容を扱うサービスであることは、忘れてはいけないと思いながら作っています。

自分がこの資格の受験生だったころや、不合格だった時の心境を考えると、答案の情報は自分の努力の結果なので、とても大事なものです。
精神論かもしれませんが、技術以前にユーザーである受験生への敬意を欠くと、この開発は失敗すると思います。
なので、受験生との距離感や敬意といったものを大事にしながら、今後も開発を続けようと思っています。

## 開発や検討状況は、今後随時この記事に更新しようと思います。


明日は、@etctaroによるJetpack Composeに関する記事です。引き続き、NTTテクノクロス Advent Calendar 2020をお楽しみください。
-->