Skip to content
This repository was archived by the owner on Sep 24, 2026. It is now read-only.

[위험도] 신뢰도가 재는 것과 시민이 읽는 것을 맞춘다 - #93

Merged
RosieOh merged 3 commits into
releasefrom
fix/honest-data-confidence
Sep 22, 2026
Merged

RosieOh merged 3 commits into
releasefrom
fix/honest-data-confidence

Conversation

@RosieOh

@RosieOh RosieOh commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Closes #92

문제

deriveConfidence(missingCount, observationAgeMinutes)   // 입력이 둘뿐

이름은 "데이터 신뢰도" 인데 재는 것은 입력 완전성 × 신선도다. 그리고 그 값이 PublicBeachRiskResponse 로 시민에게 나간다.

⚠️ 안전 + 신뢰도 높음 을 본 사람은 물에 들어간다. 그 "높음" 이 실제로 보장하는 것은 10km 안의 부이에서 3시간 안에 값이 들어왔다 는 것뿐이다.

① 수온이 통째로 없어도 medium 이었다

수온이 없으면 TEMP_UP + TEMP_7D_AVG 가 함께 빠져 개수가 2 — low 기준 3에 걸리지 않는다.

무게로 바꿨다. 수온 두 요인의 합을 3으로 맞춰 수온이 없으면 그 자체로 low 다.

예전 지금
수온 없음 medium low
유속만 없음 medium medium
부차 요인 셋 low low

② 거리를 아예 보지 않았다

40km 떨어진 관측소의 값이라도 high 가 나왔다. 10km 초과 한 단계, 30km 초과 두 단계.

10km 는 이 저장소가 이미 같은 질문에 내놓은 답이다 — 정답 데이터에서 출현을 해변에 붙이는 반경이고, 근거는 "이보다 넓으면 해변별 차이가 사라진다" 였다. 관측값도 같은 질문을 받는다: 이 값이 이 해변의 것인가. 30km 는 엔진이 "인근 출현" 으로 치는 반경이다.

거리는 실제로 값을 준 해양 관측소의 것이다 — 대표가 낡으면 더 먼 곳이 선택되고, 그때 값은 더 멀리서 온 것이다.

⚠️ 기상 관측소 거리는 쓰지 않는다. 제주 전체에 둘뿐이라(대표 평균 22.6km, 최대 35.5km) 벌점을 주면 모든 해변이 함께 내려갈 뿐이고 운영자가 고칠 방법이 없다. 신뢰도는 고칠 수 있는 것을 가리켜야 한다.

③ 시민에게 '신뢰도' 라고 말하지 않는다

값과 필드 이름은 그대로 두고(프론트가 쓴다) dataConfidenceLabel 을 추가했다:

high   관측 자료 충분
medium 관측 자료 일부 없음
low    관측 자료 많이 부족

low 를 '부족' 이 아니라 '많이 부족' 으로 한 이유 — '부족' 은 "조금 모자라다" 로 읽힌다. low 는 수온을 한 값도 못 받았거나 관측이 하루 넘게 끊긴 상태다.

실측 (제주 12곳, 실데이터)

중문색달  1.1km  결측없음         → high
곽지과물 10.1km  CURRENT_INFLOW   → low      ← 거리 경계를 0.1km 넘는다
나머지 10곳     CURRENT_INFLOW   → medium

⚠️ 선을 15km 로 옮기면 곽지가 안 걸린다. 그건 숫자를 결과에 맞춘 것이지 근거가 아니다. 곽지의 최근접 해양관측소가 실제로 경계에 있다는 사실이 드러나는 편이 낫다.

검증

lint 0 · unit 1377 (신규 17) · e2e 65 · 실 DB 스모크 168 · build OK
git rebase --exec 'npx tsc --noEmit'  → 3 커밋 전부 단독 통과

세 수정을 각각 되돌려 깨지는 것을 확인했다 — 무게→개수 1건, 거리 벌점 제거 3건, 라벨에 '신뢰도' 사용 2건.

남는 것

⚠️ 백테스트는 관측소 거리 기록이 없어 null 을 넣는다. 거리 벌점이 붙지 않으므로 과거 신뢰도를 실제보다 후하게 본다 — 지표를 비교할 때 이 차이를 기억해야 한다.

그리고 이 PR 은 여전히 정확도를 재지 않는다. dataConfidence 는 자료가 충분한지만 답한다. 예측이 맞는지는 정답 데이터가 쌓여야 알 수 있다(#81, #83).

⚠️ **수온을 한 값도 못 받은 해변이 'medium' 으로 나오고 있었다.**

예전 판정은 결측 **개수**만 셌고 low 기준이 3이었다. 그런데 수온이 없으면 TEMP_UP 과
TEMP_7D_AVG 가 함께 빠져 개수가 **2** 였다. 입력의 절반이 없는데 "보통" 이라고 답한 셈이다.

해파리 위험도에서 수온은 핵심 동인인데, 개수로 세면 수온을 못 보는 상태와 부차 요인 셋을
못 보는 상태가 같은 등급이 된다. 그래서 수온 두 요인의 무게 합을 3으로 맞췄다 — 수온이
없으면 그 자체로 low 다. 나머지는 1이고 셋이 겹쳐야 low 가 된다.

⚠️ **거리를 아예 보지 않았다.** 40km 떨어진 관측소의 수온이라도 값이 다 있고 신선하면
'high' 였다. 10km 를 넘으면 한 단계, 30km 를 넘으면 두 단계 내린다.

10km 는 이 저장소가 이미 같은 질문에 내놓은 답이다 — 정답 데이터에서 출현을 해변에 붙일
때 쓰는 반경이고, 근거는 "이보다 넓으면 해변별 차이가 사라진다" 였다. 관측값도 같은 질문을
받는다: 이 값이 이 해변의 것인가. 30km 는 엔진이 "인근 출현" 으로 치는 반경이다.

거리는 **실제로 값을 준 해양 관측소**의 것이다. 대표가 낡으면 더 먼 관측소가 선택되는데,
그때 값은 더 멀리서 온 것이다. 기상 관측소 거리는 쓰지 않는다 — 제주 전체에 둘뿐이라
(대표 평균 22.6km) 벌점을 주면 모든 해변이 함께 내려갈 뿐이고 **운영자가 고칠 방법이 없다.**
신뢰도는 고칠 수 있는 것을 가리켜야 한다.

실측(제주 12곳):
  중문색달 1.1km 결측없음  → high
  곽지과물 10.1km CURRENT  → low    (거리 경계를 0.1km 넘는다)
  나머지 10곳 CURRENT      → medium

⚠️ 선을 15km 로 옮기면 곽지가 안 걸린다. 그건 숫자를 결과에 맞춘 것이지 근거가 아니다.
곽지의 최근접 해양관측소가 실제로 경계에 있다는 사실이 드러나는 편이 낫다.

백테스트에는 관측소 거리 기록이 없어 null 을 넣는다 — 거리 벌점이 붙지 않으므로
**과거 신뢰도를 실제보다 후하게** 본다. 지표를 비교할 때 이 차이를 기억해야 한다.
공개 응답에 dataConfidenceLabel 추가. 값(high/medium/low)과 필드 이름은 그대로 둔다 —
프론트가 쓰고 있어서 바꾸면 깨진다. 바뀌는 것은 **시민에게 보이는 말**이다.

  high   관측 자료 충분
  medium 관측 자료 일부 없음
  low    관측 자료 많이 부족

⚠️ "신뢰도 높음" 은 *"이 예측을 믿어도 된다"* 로 읽힌다. 그건 우리가 **측정한 적 없는
주장**이다 — 해변별 예측 정확도 표본은 현재 0건이고, 전체 정확도조차 시군구 단위 정답으로
거칠게 잰 값이다.

deriveConfidence 가 실제로 답하는 질문은 하나다: **이 판정을 뒷받침할 관측 자료가 충분한가.**
입력이 완벽해도 룰이 틀렸으면 예측은 틀리고, 이 값은 그것을 보지 않는다.

이 서비스에서는 그 차이가 위험한 방향으로 어긋난다. `안전` + `신뢰도 높음` 을 본 사람은
물에 들어간다. 그런데 그 "높음" 이 실제로 보장하는 것은 **10km 안의 부이에서 3시간 안에
값이 다 들어왔다** 는 것뿐이다.

low 를 '부족' 이 아니라 '많이 부족' 으로 한 이유 — '부족' 은 "조금 모자라다" 로 읽힌다.
low 는 수온을 한 값도 못 받았거나 관측이 하루 넘게 끊긴 상태다.
세 수정을 각각 되돌려 깨지는 것을 확인했다.

  무게를 개수로 되돌림   → 1건 실패 (수온 결측이 medium 으로 돌아간다)
  거리 벌점 제거         → 3건 실패
  라벨에 '신뢰도' 사용   → 2건 실패

라벨 테스트가 문구에 '신뢰' 가 들어가지 않는지를 직접 본다. 문구는 나중에 누구든 고치기
쉬운 자리이고, 고치면서 **왜 그렇게 썼는지는 잊히기 때문**이다.

언어별로 실제 다른 문구가 나오는지도 본다 — ko 로 폴백되면 외국인에게 한국어가 나간다.
@RosieOh
RosieOh merged commit 751c696 into release Sep 22, 2026
2 checks passed
@RosieOh
RosieOh deleted the fix/honest-data-confidence branch September 22, 2026 07:01
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant