RAG2026-5일36차시 · 평가 실습16 / 18← 이전목차다음 →MetaContents

36차시. 평가 실습

퀴즈 2 — 그룹별 정답률과 표본 부족 표시

채점 결과 rows(각 항목에 type, difficulty, correct)를 key 값으로 묶어 그룹별 정답률 줄을 돌려주는 breakdown(rows, key, min_n=5) 를 만드세요. 표본이 min_n 건보다 적은 그룹에는 "판단 보류" 를 붙이세요.

빈칸 코드에서 시작합니다.

Python
from collections import defaultdict

def breakdown(rows, key, min_n=5):
    # key 값으로 묶고, 그룹마다 정답 수와 비율을 계산합니다
    pass
결과 보기 (예시 풀이)
Python
from collections import defaultdict

def breakdown(rows, key, min_n=5):
    """rows 를 key(예: difficulty, type) 값으로 묶어 정답률 줄을 만듭니다.
    표본이 min_n 건보다 적은 그룹에는 '판단 보류' 를 붙입니다."""
    groups = defaultdict(list)
    for r in rows:
        groups[r[key]].append(r)

    lines = []
    # 표본이 많은 그룹부터 보여 줍니다
    for name, items in sorted(groups.items(), key=lambda p: -len(p[1])):
        hit = sum(1 for i in items if i["correct"])
        rate = hit / len(items) * 100
        note = " (판단 보류: 표본 부족)" if len(items) < min_n else ""
        lines.append(f"{name:<12} {hit:>2}/{len(items):<2} {rate:5.1f}%{note}")
    return lines

# 가짜 채점 결과: 수업 자료의 type 별 결과(fact 11/11, compound 4/6, conditional 2/3)를 흉내 냅니다
rows = []
for t, ok, total in [("fact", 11, 11), ("compound", 4, 6), ("conditional", 2, 3)]:
    for k in range(total):
        rows.append({"type": t, "difficulty": "easy" if t == "fact" else "hard",
                     "correct": k < ok})

# 예시 1: 유형별. conditional 은 3건뿐이라 판단 보류가 붙어야 합니다
for line in breakdown(rows, "type"):
    print(line)
print()
# 예시 2: 난이도별. 두 그룹 모두 5건 이상이라 보류 표시가 없어야 합니다
for line in breakdown(rows, "difficulty"):
    print(line)

실행 결과

출력
fact         11/11 100.0%
compound      4/6   66.7%
conditional   2/3   66.7% (판단 보류: 표본 부족)

easy         11/11 100.0%
hard          6/9   66.7%

채점 기준: 그룹별 정답 수와 비율이 맞고, 표본이 min_n 건 미만인 그룹에만 판단 보류가 붙으면 정답입니다.

관련 교안: 36차시 「7. 결과 진단 — 무엇을 고칠까」 › 7-1) 개선 우선순위표

← 이전 절36차시 · 퀴즈 1 — Hit Rate와 MRR 직접 계산하기다음 절 →36차시 · 정리