This commit is contained in:
agomizi1cm committed 2026-08-09 21:41:44 +09:00
commit c5bcb95d74
172 files changed
+9487

No files matched your search

+22
View File
@@ -0,0 +1,22 @@
"""Build a cautious pilot-session summary from Phase 8 outputs."""
from __future__ import annotations
import csv
from datetime import datetime
from pathlib import Path
from .models import LogQualityIssue,PilotSessionReport
class PilotSessionReporter:
def build_report(self,analysis_dir:Path,quality_issues:list[LogQualityIssue]|None=None)->PilotSessionReport:
rows=[];path=analysis_dir/"condition_summary.csv"
if path.exists():
with path.open(encoding="utf-8-sig",newline="") as f:rows=list(csv.DictReader(f))
by={r.get("condition"):r for r in rows};p=by.get("prompt",{});c=by.get("control",{})
def integer(d,k):return int(float(d.get(k) or 0))
def number(d,k):return float(d[k]) if d.get(k) not in {None,""} else None
pr,cr=number(p,"response_rate"),number(c,"response_rate")
total=integer(p,"total_records")+integer(c,"total_records");valid=integer(p,"valid_voice_analysis_count")+integer(c,"valid_voice_analysis_count")
issues=quality_issues or [];quality="; ".join(i.message for i in issues) or "重大な品質Issueは記録されていません"
finding="Prompt/Controlの記述的比較。因果関係は判定しない。" if rows else "解析データなし。テンプレートとして生成。"
return PilotSessionReport(f"pilot_{datetime.now():%Y%m%d_%H%M%S}",datetime.now().astimezone().isoformat(timespec="seconds"),str(analysis_dir),str(analysis_dir),0,0,0,total,valid,valid/total if total else None,pr,cr,(pr-cr) if pr is not None and cr is not None else None,number(p,"mean_reaction_time_sec"),number(c,"mean_reaction_time_sec"),finding,quality,"有効解析人数を増やし、カメラ位置とPrompt/Control条件を固定して再確認する")
def export_markdown(self,report:PilotSessionReport,output_path:Path)->Path:
output_path.parent.mkdir(parents=True,exist_ok=True);lines=["# パイロット実験レポート","",f"生成日時: {report.generated_at}","","## 記述的結果",f"- 総track数: {report.total_tracks}",f"- 有効音声解析track数: {report.valid_voice_analysis_tracks}",f"- Prompt反応率: {report.response_rate_prompt}",f"- Control反応率: {report.response_rate_control}",f"- 反応率差: {report.rate_difference}",f"- Prompt平均反応時間: {report.mean_reaction_time_prompt}",f"- Control平均反応時間: {report.mean_reaction_time_control}","","## 品質",report.quality_notes,"","## 次の対応",report.recommended_next_actions,"","## 注意","これは予備実験の記述的要約であり、統計的有意差や因果関係を断定しない。"]
output_path.write_text("\n".join(lines)+"\n",encoding="utf-8");return output_path