#+TITLE: 研究室配属希望調査 解析スクリプト #+AUTHOR: Takahiro Ohkubo #+OPTIONS: toc:2 num:nil * 概要 Google Forms で実施した3年生の研究室配属希望調査について、フォーム結果 画面からコピーしたテキストを解析し、研究室ごとの希望者数および GPA の 統計量を集計する Python スクリプトです。 Google Forms の管理者権限がなくCSVファイルを直接取得できない場合でも、 結果画面に表示されたテキストをコピーしてファイルに保存することで解析で きます。 主な処理内容は以下のとおりです。 - Google Forms の結果テキストから研究室番号を抽出 - 各研究室の回答値を抽出 - 在校生と編入生を分類 - 研究室ごとの希望者数を集計 - 在校生 GPA の平均値を計算 - 在校生 GPA の標準偏差を計算 - 元データを Excel ファイルとして保存 * 必要な環境 Python 3 が必要です。 使用する Python パッケージは以下です。 - numpy - pandas - openpyxl 必要に応じて以下のようにインストールします。 #+begin_src sh condat install numpy pandas openpyxl #+end_src * 入力データ Google Forms のアンケート結果画面に表示されたテキストをコピーし、テキ ストファイルとして保存します。 例えば、 #+begin_example googleform.txt #+end_example というファイル名で保存します。入力データには、以下のような研究室ごとの 回答結果が含まれていることを想定しています。 #+begin_example 研究室10(極限環境材料科学研究室) 7 件の回答 380 288 300 375 280 310 359 #+end_example また、Google Forms の表示形式によっては、 同じ値が複数回出現する場合に以下のような 「値 / カウント」形式になることがあります。 #+begin_example 値 カウント 300 2 350 2 370 1 380 1 385 1 400 1 401 1 #+end_example この場合、カウント数に応じて値を展開します。例えば、 #+begin_example 300 2 350 2 #+end_example は内部的に、 #+begin_example 300 300 350 350 #+end_example として処理されます。 * 実行方法 #+begin_src sh ./analyze_lab_assignment_survey.py googleform.txt #+end_src * 出力 実行すると、研究室ごとの集計結果が標準出力に表示されます。 出力例: #+begin_example 研究室 在校生 編入生 GPA mean GPA std ---------------------------------------------------- 1 9 0 359.6 38.4 2 6 0 269.3 66.3 3 8 1 358.7 42.7 6 3 0 343.7 58.5 7 4 0 301.8 97.1 8 13 0 372.2 72.3 9 8 0 319.1 77.6 10 7 0 327.4 42.6 12 2 1 190.9 - #+end_example * 在校生と編入生の判定 このスクリプトでは、回答値について #+begin_src python df_["値"] > 10 #+end_src を満たす回答を在校生の GPA データとして扱います。 したがって、 - 値 > 10 : 在校生の GPA - 値 <= 10 : 編入生 として分類します。 * GPA の統計量 研究室ごとに、在校生のみを抽出して GPA の平均値と標準偏差を計算します。 平均値: #+begin_src python df__["値"].mean() #+end_src 標準偏差: #+begin_src python df__["値"].std() #+end_src * 注意事項 - 入力テキストは Google Forms の表示形式に依存します。 - Google Forms 側の HTML やコピー形式が変更された場合、正規表現の修正が必要になる可能性があります。 - 編入生の判定は「値が10以下」という運用上の仮定に基づいています。 - GPA が実際に10以下となる別形式のデータを使用する場合は、判定条件を変更してください。 - 回答値の誤入力は自動修正しません。 - 研究室番号が存在しても回答数が0件の場合、その研究室は出力から除外されます。 * ファイル構成例 #+begin_example . ├── README.org ├── analyze_lab_assignment_survey.py └── googleform.txt #+end_example 実行後: #+begin_example . ├── README.org ├── analyze_lab_assignment_survey.py └── googleform.txt #+end_example