Compare commits

..

7 Commits

Author SHA1 Message Date
takahiro 5de1073bd5 Merge branch 'review-kayano' 2026-07-11 19:35:56 +09:00
takahiro 730b21f73d Review and fix placement survey analysis 2026-07-11 19:35:40 +09:00
Ryuki Kayano 1dce5c8ac0 kayano commit 2026-07-09 13:04:47 +09:00
Ryuki Kayano 906afbc53d update readme 2026-07-09 13:02:39 +09:00
Ryuki Kayano 4d6a836cbf readme update 2026-07-09 13:01:36 +09:00
Ryuki Kayano eb43379ce4 update readme 2026-07-09 12:59:50 +09:00
Ryuki Kayano 83ce11279f Update analysis script 2026-07-09 12:57:48 +09:00
4 changed files with 31 additions and 7 deletions
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

+18
View File
@@ -272,6 +272,24 @@ Excel ファイルには以下のシートを作成します。
- 「値 / カウント」表 - 「値 / カウント」表
- Google Forms のグラフ由来の連結数字列 - Google Forms のグラフ由来の連結数字列
* 可視化例
解析スクリプトでは、研究室ごとの GP 分布や、特定研究室の希望者が全体の中で
どの位置にいるかを確認できます。
以下は出力図の例です。
#+CAPTION: GP 分布と第10研究室希望者の位置を示した可視化例
#+NAME: fig:gp-distribution
[[file:hoge.png]]
上段では、研究室ごとの GP 分布を箱ひげ図として示しています。
各研究室の希望者の GP のばらつきや中央値を比較できます。
下段では、全回答者の GP 分布をヒストグラムとして示しています。
第10研究室希望者の GP は縦線として重ねて表示しており、
第10研究室希望者が全体分布の中でどの程度の位置にいるかを確認できます。
* 注意事項 * 注意事項
- 入力テキストは Google Forms の表示形式に依存します。 - 入力テキストは Google Forms の表示形式に依存します。
+13 -7
View File
@@ -31,10 +31,11 @@ def extract_values_from_body(body):
m = re.search(r"^値\s+カウント\s*$", body, flags=re.MULTILINE) m = re.search(r"^値\s+カウント\s*$", body, flags=re.MULTILINE)
if m: if m:
table_part = body[m.end() :] table_part = body[m.end():]
count_rows = re.findall( count_rows = re.findall(
r"^\s*(-?\d+(?:\.\d+)?)\s+(\d+)\s*$", table_part, flags=re.MULTILINE r"^\s*(-?\d+(?:\.\d+)?)\s+(\d+)\s*$", table_part,
flags=re.MULTILINE
) )
values = [] values = []
@@ -103,7 +104,7 @@ def parse_google_form_results(text):
if not m: if not m:
raise ValueError("個別研究室ブロックが見つかりません") raise ValueError("個別研究室ブロックが見つかりません")
text = text[m.start() :] text = text[m.start():]
# 各研究室ブロックを取得 # 各研究室ブロックを取得
pattern = re.compile( pattern = re.compile(
@@ -378,7 +379,8 @@ def annotate_target_values(ax, target_values, color):
rotation=90, rotation=90,
color=color, color=color,
fontsize=9, fontsize=9,
bbox={"facecolor": "white", "edgecolor": "none", "alpha": 0.75, "pad": 1.2}, bbox={"facecolor": "white", "edgecolor": "none",
"alpha": 0.75, "pad": 1.2},
) )
@@ -444,7 +446,8 @@ def plot_data(data, lower=10, upper=None, target_lab=10, bin_width=10):
df = filter_plot_data(df, lower=lower, upper=upper) df = filter_plot_data(df, lower=lower, upper=upper)
labs = sorted(df["研究室番号"].unique()) labs = sorted(df["研究室番号"].unique())
target_values = df.loc[df["研究室番号"] == target_lab, ""].to_numpy(dtype=float) target_values = df.loc[df["研究室番号"] ==
target_lab, ""].to_numpy(dtype=float)
apply_plot_style() apply_plot_style()
colors = plt.get_cmap("tab10").colors colors = plt.get_cmap("tab10").colors
@@ -459,7 +462,8 @@ def plot_data(data, lower=10, upper=None, target_lab=10, bin_width=10):
) )
draw_lab_boxplot(axs[0], df, labs, colors[0], rng) draw_lab_boxplot(axs[0], df, labs, colors[0], rng)
draw_gp_histogram(axs[1], df, target_values, bin_width, colors[0], colors[3]) draw_gp_histogram(axs[1], df, target_values,
bin_width, colors[0], colors[3])
for ax in axs: for ax in axs:
style_axis(ax) style_axis(ax)
@@ -467,6 +471,7 @@ def plot_data(data, lower=10, upper=None, target_lab=10, bin_width=10):
plt.show() plt.show()
return fig, axs return fig, axs
def main(): def main():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Google Forms のコピペ結果から研究室別GPを集計する" description="Google Forms のコピペ結果から研究室別GPを集計する"
@@ -491,7 +496,8 @@ def main():
text = f.read() text = f.read()
df = parse_google_form_results(text) df = parse_google_form_results(text)
df_r = summarize_by_lab(df).sort_values(by="GP mean", ascending=False) # df_r = summarize_by_lab(df).sort_values(by="GP mean", ascending=False)
df_r = summarize_by_lab(df)
print_summary(df, df_r) print_summary(df, df_r)
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB