diff --git a/journey/plans/251223_bayesian_seminar_presentation_plan.md b/journey/plans/251223_bayesian_seminar_presentation_plan.md index 2ab1479..95f8356 100644 --- a/journey/plans/251223_bayesian_seminar_presentation_plan.md +++ b/journey/plans/251223_bayesian_seminar_presentation_plan.md @@ -77,3 +77,14 @@ - 백엔드: FastAPI - 엔드포인트: 참가자 등록, 공 꺼내기, IR 정보 업데이트, 결과 조회 +## 구현 완료 (2025-12-23) + +### BallQuiz 페이지 베이지안 업데이트 로직 +- **누적 odds 변환**: 각 회차마다 입력한 확률(%)을 odds로 변환하여 이전 alpha, beta에 누적 + - 초기 50% → alpha=1, beta=1 → 1회차 60% → alpha=2.5, beta=2 → 2회차 65% → alpha=4.36, beta=3 + - 5회차까지 진행 시 alpha + beta > 10 +- **그래프 색상 점진적 변화**: 초기 연보라에서 5회차 진한 보라로 점진적 변화 +- **5회차 피크 값 표시**: Beta 분포 피크 공식으로 계산하여 그래프 하단에 표시 +- **종합 행 회차별 값 표시**: 각 회차별 참가자들의 평균 확률 계산하여 확률(%)과 odds(x:1) 형식으로 표시 +- **상세 내용**: `journey/troubleshooting/251216_bayesian_presentation_ballquiz_redesign.md` 참조 + diff --git a/journey/troubleshooting/251216_bayesian_presentation_ballquiz_redesign.md b/journey/troubleshooting/251216_bayesian_presentation_ballquiz_redesign.md index 801d3b9..6140159 100644 --- a/journey/troubleshooting/251216_bayesian_presentation_ballquiz_redesign.md +++ b/journey/troubleshooting/251216_bayesian_presentation_ballquiz_redesign.md @@ -33,6 +33,13 @@ - **입력 중 덮어쓰기**: 입력 중 서버 `state_update`가 오면 아직 저장되지 않은 입력값이 사라짐 - **리셋 버튼 미작동**: 리셋 후에도 테이블의 입력값이 그대로 남아있어 초기화되지 않음 +### 6. 베이지안 업데이트 로직 문제 (2025-12-23 추가) +- **독립적 확률 변환**: 각 회차마다 확률(%)을 독립적으로 베타분포로 변환하여 이전 회차 정보가 누적되지 않음 +- **그래프 색상 구분 부족**: 초기와 회차별 그래프 색상이 동일하여 변화 추이 파악 어려움 +- **피크 값 미표시**: 5회차까지 입력 완료 후 최종 확률 추정값(피크)이 표시되지 않음 +- **하이라이트 테두리 과도**: 공을 꺼낸 후 활성화된 셀의 테두리가 과도하게 강조됨 +- **종합 행 미표시**: 종합 행의 회차별 값이 "-"로만 표시되어 평균 확률을 확인할 수 없음 + --- ## 해결 방안 @@ -63,6 +70,17 @@ - **자동 저장**: `BallQuizPage.tsx:94-120` - `useEffect` + debounce(300ms)로 입력값 자동 저장 - **리셋 시 로컬 상태 초기화**: `BallQuizPage.tsx:26-29` - `estimates`가 빈 객체일 때 `participantInputs`도 빈 객체로 초기화 +### 베이지안 업데이트 로직 개선 (2025-12-23) +- **누적 odds 변환**: 각 회차마다 입력한 확률(%)을 odds로 변환하여 이전 alpha, beta에 누적 + - 예: 초기 50% → alpha=1, beta=1 → 1회차 60% → alpha=2.5, beta=2 → 2회차 65% → alpha=4.36, beta=3 + - 5회차까지 진행 시 alpha + beta > 10 +- **그래프 색상 점진적 변화**: 초기 연보라(`rgba(200, 180, 255, 0.8)`)에서 5회차 진한 보라(`rgba(92, 0, 230, 0.9)`)로 점진적 변화 +- **5회차 피크 값 표시**: 5회차까지 입력 완료 시 Beta 분포 피크 공식 `(alpha - 1) / (alpha + beta - 2)`로 계산하여 그래프 하단에 표시 +- **하이라이트 테두리 제거**: 활성화된 셀의 테두리 제거, 배경색(`bg-primary/5`)과 그림자(`shadow-sm`)만 유지 +- **종합 행 회차별 값 표시**: 각 회차별 참가자들의 평균 확률 계산하여 확률(%)과 odds(x:1) 형식으로 표시 +- **초기 그래프 항상 표시**: 초기값이 없어도 기본값 50%로 그래프 표시 +- **입력하지 않은 회차 그래프 미표시**: 해당 회차에 입력이 없으면 그래프를 그리지 않음 + --- ## 구현 완료 @@ -76,6 +94,14 @@ - 입력 중 서버 업데이트로 덮어쓰기 방지 - 자동 저장으로 입력값 유실 방지 - 리셋 버튼 정상 작동 +- 베이지안 업데이트 로직 개선 완료 (2025-12-23) + - 누적 odds 변환으로 이전 회차 정보 누적 + - 그래프 색상 점진적 변화 (연보라 → 진한 보라) + - 5회차 피크 값 표시 (그래프 하단) + - 하이라이트 테두리 제거 + - 종합 행 회차별 평균 확률 표시 + - 초기 그래프 항상 표시 (기본값 50%) + - 입력하지 않은 회차 그래프 미표시 --- @@ -117,3 +143,12 @@ - `useEffect`에서 early return 전에 빈 객체 체크 후 로컬 상태 초기화 로직 추가 - **원칙**: `313_React_구조_원칙.md:100-104` - 프론트엔드/백엔드 상태 동기화 +### 베이지안 업데이트는 누적 방식으로 구현 +- **원인**: 각 회차마다 확률을 독립적으로 베타분포로 변환하여 이전 회차 정보가 누적되지 않음 +- **교훈**: + - 베이지안 업데이트는 이전 정보를 누적하는 방식이므로, 각 회차 입력값을 odds로 변환하여 alpha, beta에 누적 + - 확률(%)을 odds로 변환: `odds = prob / (100 - prob)`, `alpha = odds`, `beta = 1` + - 누적: `cumulativeAlpha += odds.alpha`, `cumulativeBeta += odds.beta` + - 5회차까지 진행 시 alpha + beta > 10이 되어 그래프가 더 뾰족해짐 +- **원칙**: 베이지안 추론의 본질은 사전 정보와 관찰 정보를 결합하는 것 +