import argparse import pandas as pd def main( input_csv: str, out_counts: str = "num_raters_per_video.csv", out_stats_all: str = "video_stats_all.csv", out_stats_filtered: str = "video_stats_filtered.csv", min_raters: int = 2, ): # 1) 데이터 로드 df = pd.read_csv(input_csv) # 숫자형 보장 (문자/빈칸 섞였을 때 대비) for col in ["action_consistency", "physical_plausibility"]: if col in df.columns: df[col] = pd.to_numeric(df[col], errors="coerce") # 2) 비디오별 고유 평가자 수 counts = ( df.groupby("video_id")["participant_id"] .nunique() .reset_index(name="num_raters") ) counts.to_csv(out_counts, index=False) # 3) 비디오별 통계 (평균/표준편차/표본수) agg_map = { "participant_id": pd.Series.nunique, # 고유 평가자 수 "action_consistency": ["mean", "std", "count"], "physical_plausibility": ["mean", "std", "count"], } stats = df.groupby("video_id").agg(agg_map) # 컬럼 평탄화 stats.columns = [ "num_raters", "action_mean", "action_std", "action_count", "physical_mean", "physical_std", "physical_count", ] stats = stats.reset_index() # 3-1) (선택) 변동계수(CV)도 참고용으로 추가 stats["action_cv"] = stats["action_std"] / stats["action_mean"] stats["physical_cv"] = stats["physical_std"] / stats["physical_mean"] # 저장 (모든 비디오) stats.to_csv(out_stats_all, index=False) # 4) 최소 평가자 수 이상만 필터링 stats_filtered = stats[stats["num_raters"] >= min_raters].copy() stats_filtered.to_csv(out_stats_filtered, index=False) # 5) 요약 프린트 print("✅ 저장 완료") print(f"- 비디오별 평가자 수: {out_counts}") print(f"- 비디오별 통계(전체): {out_stats_all}") print(f"- 비디오별 통계(평가자 {min_raters}명 이상): {out_stats_filtered}") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Human eval 분석 스크립트") parser.add_argument("--input_csv", type=str, required=True, help="원본 CSV 경로") parser.add_argument("--out_counts", type=str, default="num_raters_per_video.csv") parser.add_argument("--out_stats_all", type=str, default="video_stats_all.csv") parser.add_argument("--out_stats_filtered", type=str, default="video_stats_filtered.csv") parser.add_argument("--min_raters", type=int, default=2, help="최소 평가자 수 기준") args = parser.parse_args() main( input_csv=args.input_csv, out_counts=args.out_counts, out_stats_all=args.out_stats_all, out_stats_filtered=args.out_stats_filtered, min_raters=args.min_raters, )