feat: 경량 분석 riskScore 해상도 개선 + vessel_type 매핑 + 중국 그리드 정합성 #65

병합
htlee feature/risk-scoring-vessel-type 에서 develop 로 3 commits 를 머지했습니다 2026-04-16 15:23:38 +09:00
소유자

변경 사항

변경 (feat)

  • feat(prediction) 6fb0b04 — 경량 분석 compute_lightweight_risk_score 산출식 재구성. dark_suspicion_score(패턴 기반 0~100) / dist_from_baseline_nm(12·24NM 차등) / dark_history_24h 를 입력에 추가하고 허가·반복 이중계산 방지. vessel_type_mapping.py 신설 (fishery_code → VesselType). scheduler 경량 경로에서 vessel_type='UNKNOWN' 하드코딩 제거 및 등록선 매핑 적용. VesselType 값에 GILLNET / CARGO 2종 추가
  • feat(frontend) 524df19shared/constants/vesselTypes.ts 신설 (저인망/선망/유자망/연승/통발/운반선/미분류 한글 카탈로그) + catalogRegistry 등록. RealVesselAnalysis Props 에 mmsiPrefix / minRiskScore / size 추가. RealAllVessels 편의 export 를 mmsiPrefix='412' 로 고정 + 제목 "중국 선박 전체 분석 결과 (실시간)" 로 변경. 선박 유형 컬럼/뱃지 한글 렌더
  • docs 3372d06 — 릴리즈 노트 [Unreleased] 업데이트

해결하는 문제

릴리즈 2026-04-16.6 직후 실사용 검증에서 드러난 세 가지 품질 이슈:

  1. riskScore 45점 고정 수렴 — 경량 경로 60.8% 가 정확히 45점 (위치 EEZ 외 0 + dark 25 + 허가 20 포화). features 에 저장되던 dark_suspicion_score 가 산출에 미연결이라 해상도 없음
  2. 상단 '전체 분석 결과' 그리드 vs 하단 '특이운항' 기준 불일치 — 상단은 전 세계, 하단은 중국+40점 → 페이지(중국 감시) 성격과 맞지 않고 55점 건이 상단에만 보이는 혼선
  3. vessel_type 전체 UNKNOWN — 경량 경로 7.7k 척 하드코딩. fleet_vessels 의 fishery_code 매핑 미활용

배포 + 운영 검증 (redis-211 15:15 사이클)

  • risk_score 분포: 45점 60.8% → 0% (top20 분포에서 사라짐. 11/12/15/16/17/18/20/22/30/35/40 범위로 고르게 분산)
  • vessel_type: UNKNOWN 98.6% → 89.1% (886척이 구체 유형으로 전환)
    • TRAWL 518 / LONGLINE 171 / TRAP 78 / PURSE 73 / GILLNET 38 / CARGO 8
  • 412354335 샘플: 45 MEDIUM 고정 → 20 LOW (dark_suspicion_score=40 × 0.3 + 축소 허가 8 = 20)

테스트

  • python3 ast.parse 문법 검증 성공 (risk.py / scheduler.py / vessel_type_mapping.py)
  • npx tsc --noEmit 0 errors
  • npx eslint 4 파일 0 errors / 0 warnings
  • prediction 재배포 후 첫 사이클 upsert 8127건 정상
  • DB 실측 분포 SQL (riskScore / risk_level × zone / vessel_type) 기대치 부합

운영 상태

  • redis-211 prediction: 이미 배포됨 (15:01 restart, 15:15 첫 사이클 성공)
  • rocky-211 frontend: Gitea Actions CI/CD 자동 배포 대상 (본 MR 머지 후)

후속 작업 (본 PR 범위 외)

  • spoofing_score 산출 로직 재설계 — 중국 MID 412 선박 전원이 0 으로 수렴. BD-09 필터 + teleport 25kn 임계 재검토 필요. 별도 PR
## 변경 사항 ### 변경 (feat) - **`feat(prediction)` 6fb0b04** — 경량 분석 `compute_lightweight_risk_score` 산출식 재구성. `dark_suspicion_score`(패턴 기반 0~100) / `dist_from_baseline_nm`(12·24NM 차등) / `dark_history_24h` 를 입력에 추가하고 허가·반복 이중계산 방지. `vessel_type_mapping.py` 신설 (fishery_code → VesselType). scheduler 경량 경로에서 `vessel_type='UNKNOWN'` 하드코딩 제거 및 등록선 매핑 적용. VesselType 값에 GILLNET / CARGO 2종 추가 - **`feat(frontend)` 524df19** — `shared/constants/vesselTypes.ts` 신설 (저인망/선망/유자망/연승/통발/운반선/미분류 한글 카탈로그) + `catalogRegistry` 등록. `RealVesselAnalysis` Props 에 `mmsiPrefix / minRiskScore / size` 추가. `RealAllVessels` 편의 export 를 `mmsiPrefix='412'` 로 고정 + 제목 "중국 선박 전체 분석 결과 (실시간)" 로 변경. 선박 유형 컬럼/뱃지 한글 렌더 - **`docs` 3372d06** — 릴리즈 노트 [Unreleased] 업데이트 ## 해결하는 문제 릴리즈 2026-04-16.6 직후 실사용 검증에서 드러난 세 가지 품질 이슈: 1. **riskScore 45점 고정 수렴** — 경량 경로 60.8% 가 정확히 45점 (위치 EEZ 외 0 + dark 25 + 허가 20 포화). features 에 저장되던 `dark_suspicion_score` 가 산출에 미연결이라 해상도 없음 2. **상단 '전체 분석 결과' 그리드 vs 하단 '특이운항' 기준 불일치** — 상단은 전 세계, 하단은 중국+40점 → 페이지(중국 감시) 성격과 맞지 않고 55점 건이 상단에만 보이는 혼선 3. **vessel_type 전체 UNKNOWN** — 경량 경로 7.7k 척 하드코딩. fleet_vessels 의 `fishery_code` 매핑 미활용 ## 배포 + 운영 검증 (redis-211 15:15 사이클) - **risk_score 분포**: 45점 **60.8% → 0%** (top20 분포에서 사라짐. 11/12/15/16/17/18/20/22/30/35/40 범위로 고르게 분산) - **vessel_type**: UNKNOWN **98.6% → 89.1%** (886척이 구체 유형으로 전환) - TRAWL 518 / LONGLINE 171 / TRAP 78 / PURSE 73 / GILLNET 38 / CARGO 8 - **412354335 샘플**: 45 MEDIUM 고정 → **20 LOW** (dark_suspicion_score=40 × 0.3 + 축소 허가 8 = 20) ## 테스트 - [x] `python3 ast.parse` 문법 검증 성공 (risk.py / scheduler.py / vessel_type_mapping.py) - [x] `npx tsc --noEmit` 0 errors - [x] `npx eslint` 4 파일 0 errors / 0 warnings - [x] prediction 재배포 후 첫 사이클 upsert 8127건 정상 - [x] DB 실측 분포 SQL (riskScore / risk_level × zone / vessel_type) 기대치 부합 ## 운영 상태 - **redis-211 prediction**: 이미 배포됨 (15:01 restart, 15:15 첫 사이클 성공) - **rocky-211 frontend**: Gitea Actions CI/CD 자동 배포 대상 (본 MR 머지 후) ## 후속 작업 (본 PR 범위 외) - **spoofing_score 산출 로직 재설계** — 중국 MID 412 선박 전원이 0 으로 수렴. BD-09 필터 + teleport 25kn 임계 재검토 필요. 별도 PR
htlee added 3 commits 2026-04-16 15:23:29 +09:00
경량 경로 선박 60.8%가 45점 고정으로 수렴하고 98.6%가 vessel_type
UNKNOWN 으로만 기록되던 문제를 해결한다.

riskScore (compute_lightweight_risk_score)
- dark_suspicion_score(0~100) 직접 반영: min(30, score*0.3)
- EEZ_OR_BEYOND 기선 근접도 가산 (12NM 내 +15, 24NM 내 +8)
- dark_history_24h 가산 (dark_suspicion_score 미반영 케이스만)
- 허가 이력 +20 → +8/+15 차등 (dark_suspicion_score 있을 때 이중계산 방지)
- gap_duration_min 4구간 차등 (fallback: 720m/180m/60m/30m)

vessel_type (신규 vessel_type_mapping.py)
- fleet_vessels fishery_code → VesselType 매핑:
  PT/PT-S/OT → TRAWL, GN → GILLNET, PS → PURSE, FC → CARGO
- GILLNET / CARGO 2개 값 신규 추가 (기존 TRAWL/PURSE/LONGLINE/TRAP/UNKNOWN)
- scheduler.py 경량 경로에서 등록선은 매핑, 미등록선은 UNKNOWN 유지

배포 후 검증 (redis-211 15:15 사이클)
- risk_score 분포: 45점 60.8% → 0% (11~40 범위 고르게 분산)
- vessel_type: UNKNOWN 98.6% → 89.1% (886척이 구체 유형으로 전환,
  TRAWL 518 / LONGLINE 171 / TRAP 78 / PURSE 73 / GILLNET 38 / CARGO 8)
- 412354335 샘플: 45 MEDIUM 고정 → 20 LOW (dss=40 × 0.3 + 축소 허가)
vessel_type 카탈로그
- shared/constants/vesselTypes.ts 신규 — TRAWL/PURSE/GILLNET/LONGLINE/
  TRAP/CARGO/UNKNOWN 7종 + getVesselTypeLabel / getVesselTypeIntent
  헬퍼. 기존 alertLevels 카탈로그 패턴 답습
- catalogRegistry 에 VESSEL_TYPES 등록 — design-system 쇼케이스에 자동
  노출

RealVesselAnalysis 필터 props 확장
- Props 에 mmsiPrefix / minRiskScore / size 추가 (all·spoofing mode)
- 선박 유형 컬럼을 한글 라벨로 렌더
- RealAllVessels 편의 export 를 mmsiPrefix='412' 로 고정 + 제목을
  '중국 선박 전체 분석 결과 (실시간)' 로 변경

효과
- Tab 1 상단 그리드가 중국 선박만 표시해 페이지 성격과 일치
- 선박 유형 '저인망/선망/유자망/연승/통발/운반선/미분류' 한글 표시
- 55점 HIGH 같은 중국 선박이 상단/하단 양쪽에 일관되게 노출
claude-bot 이 변경사항을 승인하였습니다. 2026-04-16 15:23:37 +09:00
claude-bot left a comment
멤버

MR 승인 (via /mr skill) — 운영 배포 + 분포 검증 완료

MR 승인 (via /mr skill) — 운영 배포 + 분포 검증 완료
htlee merged commit 65b98c53be into develop 2026-04-16 15:23:38 +09:00
htlee 삭제된 브랜치 feature/risk-scoring-vessel-type 2026-04-16 15:23:38 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

의존성

No dependencies set.

Reference: gc/kcg-ai-monitoring#65
No description provided.