# QA 검수 로그 — ObesityEnrollFunnelOps-Kor

- 검수일: 2026-05-31
- 환경: macOS (Darwin 25.5.0), Python 3.9.6
- 설치 현황: streamlit 1.50.0, pandas 2.3.3, numpy 2.0.2, scipy 1.13.1 (설치됨) / plotly (미설치)

## 1. app.py 구문 검사
명령: `python3 -c "import ast; ast.parse(open('app.py').read())"`
결과: ✅ OK (funnel_logic.py 도 추가 검사 ✅ OK)

## 2. 데모 데이터 생성
명령: `python3 data/generate_demo_data.py`
결과: ✅ 5개 CSV 생성
- enrollment_funnel.csv (576, 5)
- screen_fail_reasons.csv (34, 6)
- site_enrollment.csv (6, 5)
- demographics.csv (122, 6)
- retention_visits.csv (30, 5)
(seed 고정 RNG=20260531 → 재현 가능)

## 3. 합성 CSV pandas 로드
명령: `python3 -c "import pandas as pd; print(pd.read_csv('data/<file>.csv').shape)"`
결과: ✅ 5개 CSV 모두 정상 로드 (위 shape 와 일치)

## 4. requirements.txt import 가능성
- streamlit / pandas / numpy / scipy: ✅ import OK (설치됨)
- plotly: ⚠️ 미설치. 제약(전역 설치 금지)에 따라 설치하지 않고 requirements.txt 에 `plotly==5.24.1` 로 명시만 함.
  app.py 는 plotly 를 시각화에 사용하므로 실행 시 `pip install -r requirements.txt` 필요.
  단, 모든 *계산 로직*은 plotly 비의존 모듈(funnel_logic.py)로 분리되어 plotly 없이도 검증 가능.

## 5. 순수 로직 단위 테스트
명령: `python3 test_logic.py`
결과: ✅ 27 passed, 0 failed
검증 범위:
- funnel: 단조감소, 통과율∈[0,1], 병목=최저통과율, site×stage 매트릭스 컬럼
- screen-fail: pct 합=1, 내림차순 정렬, 회피가능+불가피=총합, 편차 비음수
- Bayesian: 사후평균 CI 내 위치, 결정적 케이스 (11/11=1.0), 등록↑→rate↑,
  remaining 계산, 낙관≤평균≤비관 주차, 목표달성시 remaining=0/주차=0, sites_needed 산식
- retention: 잔류율 시작 1.0, 단조비증가, 편향 baseline=0
- representativeness: 각 차원 enrolled/reference pct 합=1, age_band 분류기

## 종합 판정: ✅ PASS
- 핵심 5개 기능 모두 구현 및 로직 검증 완료.
- 제약 준수: 외부 네트워크/API 없음, 유료 API 없음, 전역 패키지 설치 안 함(명시만), 디스클레이머 app.py UI 상단 + README 포함.
- 유일한 운영 전제: plotly 미설치 환경이므로 실제 UI 실행 전 `pip install -r requirements.txt` 필요(예상된 정상 절차). 비차단 ⚠️.

## 재시도 이력
- 1회차: test_logic.py 실행 시 pandas FutureWarning(groupby.apply grouping columns) 발생 → 기능 영향 없음.
  funnel_logic.early_responder_bias 를 include_groups=False(구버전 fallback 포함)로 수정하여 경고 제거. 이후 27/27 통과.
