import os import json import matplotlib.pyplot as plt import pandas as pd import seaborn as sns output_dir = 'output' model_dirs = [d for d in os.listdir(output_dir) if os.path.isdir(os.path.join(output_dir, d)) and os.path.exists(os.path.join(output_dir, d, 'compare.json'))] model_dirs.sort() if not model_dirs: print("데이터를 찾을 수 없습니다.") exit() fig, axes = plt.subplots(len(model_dirs), 1, figsize=(15, 6 * len(model_dirs)), sharex=False) if len(model_dirs) == 1: axes = [axes] for i, model in enumerate(model_dirs): json_path = os.path.join(output_dir, model, 'compare.json') with open(json_path, 'r', encoding='utf-8') as f: data = json.load(f) df = pd.DataFrame(data.get('details', [])) # 에러 절댓값 계산 및 내림차순 정렬 df['abs_error'] = df['error'].abs() df = df.sort_values('abs_error', ascending=False).reset_index(drop=True) ax = axes[i] # y축에 abs_error를 사용하여 양수 영역만 표시 sns.scatterplot(data=df, x=df.index, y='abs_error', ax=ax, alpha=0.6, s=20, color='darkorange') ax.set_title(f'Model: {model} (Sorted by Absolute Error)', fontsize=15, fontweight='bold') ax.set_ylabel('Absolute Error (|Actual - Predicted|)', fontsize=12) ax.set_xlabel(f'Songs (Ordered by Error Magnitude)', fontsize=12) # 가이드 라인 (오차 0.2, 0.5, 1.0 단위) ax.axhline(0.2, color='green', linestyle='--', linewidth=0.8, alpha=0.5, label='Target (0.2)') ax.axhline(0.5, color='blue', linestyle='--', linewidth=0.8, alpha=0.5) ax.axhline(1.0, color='red', linestyle='--', linewidth=0.8, alpha=0.5) # y축을 0부터 시작하도록 설정 ax.set_ylim(0, 3.5) ax.set_xticks([]) # x축 라벨 제거 ax.grid(True, axis='y', alpha=0.3) plt.tight_layout() output_image = 'abs_error_analysis.png' plt.savefig(output_image) print(f"절댓값 에러 정렬 그래프가 {output_image}에 저장되었습니다.")