37차시. 루브릭 설계
퀴즈 2 — 두 채점자의 일치도 재기
두 채점자가 같은 답변들에 매긴 총점 딕셔너리 두 개를 받아 평균 차이, 완전 일치 개수, 차이가 0.3 이상인 답변 목록, 그리고 일치도 해석(0.1 이하 매우 일치, 0.3 이하 수용 가능, 그 위는 루브릭 수정 필요)을 돌려주는 agreement(scores_a, scores_b) 를 만드세요.
빈칸 코드에서 시작합니다.
def agreement(scores_a, scores_b, flag=0.3):
# 답변마다 두 점수의 차이를 구해 평균, 완전 일치 수, 불일치 목록을 냅니다
pass
결과 보기 (예시 풀이)
def agreement(scores_a, scores_b, flag=0.3):
"""두 채점자의 점수 딕셔너리를 견주어 평균 차이, 완전 일치 수, 불일치 목록을 냅니다."""
diffs = {}
for qid in scores_a:
# 같은 답변에 매긴 두 점수의 차이(절댓값)
diffs[qid] = round(abs(scores_a[qid] - scores_b[qid]), 2)
avg = sum(diffs.values()) / len(diffs)
same = sum(1 for d in diffs.values() if d == 0)
# 차이가 flag 이상인 답변은 기준이 모호했던 곳이라 다시 봅니다
disagree = [q for q, d in diffs.items() if d >= flag]
# 수업 자료의 일치도 목표표로 해석을 붙입니다
if avg <= 0.1:
verdict = "매우 일치"
elif avg <= 0.3:
verdict = "수용 가능"
else:
verdict = "루브릭 수정 필요"
return round(avg, 2), same, disagree, verdict
# 예시 1: 수업 자료의 두 채점자 표 (Q002, Q005 에서 갈림)
A = {"Q001": 2.00, "Q002": 1.15, "Q003": 0.75, "Q004": 1.70, "Q005": 1.30}
B = {"Q001": 2.00, "Q002": 1.45, "Q003": 0.75, "Q004": 1.70, "Q005": 0.95}
avg, same, disagree, verdict = agreement(A, B)
print(f"평균 차이 {avg} · 완전 일치 {same}/{len(A)} · 불일치 {disagree} · {verdict}")
# 예시 2: 기준이 흐려 거의 모든 답변에서 크게 갈린 경우
C = {"Q001": 2.00, "Q002": 0.80, "Q003": 1.60}
D = {"Q001": 1.40, "Q002": 1.50, "Q003": 1.00}
print(agreement(C, D)) # 평균 차이가 0.3 을 넘어 수정 필요가 나와야 합니다
실행 결과
평균 차이 0.13 · 완전 일치 3/5 · 불일치 ['Q002', 'Q005'] · 수용 가능
(0.63, 0, ['Q001', 'Q002', 'Q003'], '루브릭 수정 필요')채점 기준: 수업 자료의 표로 평균 차이 0.13, 완전 일치 3개, 불일치 Q002·Q005 가 나오고 해석이 기준표와 맞으면 정답입니다.