"""
실험 ID: 014
실험명: 전체 KIND 목록 섹터 분류 커버리지 측정

목적:
- DartWings 전체 매핑 테이블(MANUAL_OVERRIDES ~100, KSIC ~220, KEYWORDS 10카테고리)을
  KIND 전체 2663종목에 적용했을 때 분류 커버리지 측정
- 미분류(unknown) 비율과 원인 분석

가설:
1. override + 키워드 + KSIC 3단계로 80% 이상 커버 가능
2. 미매핑 KIND 업종명을 추가하면 95%+ 도달 가능

방법:
1. DartWings 전체 매핑 데이터 적용
2. KIND 전체 종목 일괄 분류
3. 소스별/섹터별 분포 분석
4. 미분류 종목의 업종명 패턴 분석 → 추가 매핑 제안

결과 (실험 후 작성):
- 분류 성공률: 99.6% (2652/2663)
- 소스별: KSIC 75.7%, 키워드 16.1%, override_partial 3.9%, override 3.8%, unknown 0.4%
- 미분류 11종목, 5개 KIND 업종명 추가하면 100%
  - 자동차 부품 및 내장품 판매업 (4) → 경기관련소비재/소매(유통)
  - 자동차 판매업 (3) → 경기관련소비재/소매(유통)
  - 기타 생활용품 소매업 (2) → 필수소비재/가정용품과개인용품
  - 초등 교육기관 (1) → 경기관련소비재/소비자서비스
  - 음·식료품 및 담배 소매업 (1) → 필수소비재/식품,음료,담배
- 섹터 분포: IT 21.6%, 산업재 18.3%, 소재 17.9%, 건강관리 13.6%
- 신뢰도: 91.5%가 0.7(KSIC), 8.1%가 0.9+(override/keyword)

결론:
- 채택. DartWings 매핑 테이블을 그대로 사용하면 99.6% 커버리지 달성
- 가설1(80% 이상) 크게 초과, 가설2(95%+) 이미 달성
- 5개 업종 추가 매핑으로 100% 가능 → 015에서 패키지용 정리

실험일: 2026-03-09
"""

import sys
sys.path.insert(0, "src")

from dartlab.core.kindList import getKindList
import polars as pl

MANUAL_OVERRIDES = {
    "SK하이닉스": ("IT", "반도체와반도체장비"),
    "삼성전자": ("IT", "반도체와반도체장비"),
    "DB하이텍": ("IT", "반도체와반도체장비"),
    "리노공업": ("IT", "반도체와반도체장비"),
    "한미반도체": ("IT", "반도체와반도체장비"),
    "HPSP": ("IT", "반도체와반도체장비"),
    "주성엔지니어링": ("IT", "반도체와반도체장비"),
    "원익IPS": ("IT", "반도체와반도체장비"),
    "피에스케이": ("IT", "반도체와반도체장비"),
    "테스": ("IT", "반도체와반도체장비"),
    "유진테크": ("IT", "반도체와반도체장비"),
    "이오테크닉스": ("IT", "반도체와반도체장비"),
    "LG디스플레이": ("IT", "디스플레이"),
    "삼성SDI": ("소재", "화학"),
    "LG에너지솔루션": ("소재", "화학"),
    "삼성디스플레이": ("IT", "디스플레이"),
    "카카오": ("커뮤니케이션서비스", "인터넷과카탈로그소매"),
    "네이버": ("커뮤니케이션서비스", "인터넷과카탈로그소매"),
    "NAVER": ("커뮤니케이션서비스", "인터넷과카탈로그소매"),
    "카카오페이": ("금융", "다각화된금융"),
    "카카오뱅크": ("금융", "은행"),
    "토스": ("금융", "다각화된금융"),
    "크래프톤": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "넷마블": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "엔씨소프트": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "펄어비스": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "카카오게임즈": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "컴투스": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "위메이드": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "데브시스터즈": ("커뮤니케이션서비스", "게임엔터테인먼트"),
    "하이브": ("커뮤니케이션서비스", "미디어"),
    "SM": ("커뮤니케이션서비스", "미디어"),
    "JYP Ent.": ("커뮤니케이션서비스", "미디어"),
    "YG엔터테인먼트": ("커뮤니케이션서비스", "미디어"),
    "CJ ENM": ("커뮤니케이션서비스", "미디어"),
    "스튜디오드래곤": ("커뮤니케이션서비스", "미디어"),
    "삼성바이오로직스": ("건강관리", "제약과바이오"),
    "셀트리온": ("건강관리", "제약과바이오"),
    "셀트리온헬스케어": ("건강관리", "건강관리장비와서비스"),
    "SK바이오팜": ("건강관리", "제약과바이오"),
    "SK바이오사이언스": ("건강관리", "제약과바이오"),
    "유한양행": ("건강관리", "제약과바이오"),
    "한미약품": ("건강관리", "제약과바이오"),
    "녹십자": ("건강관리", "제약과바이오"),
    "대웅제약": ("건강관리", "제약과바이오"),
    "종근당": ("건강관리", "제약과바이오"),
    "현대자동차": ("경기관련소비재", "자동차와부품"),
    "기아": ("경기관련소비재", "자동차와부품"),
    "현대모비스": ("경기관련소비재", "자동차와부품"),
    "현대위아": ("경기관련소비재", "자동차와부품"),
    "만도": ("경기관련소비재", "자동차와부품"),
    "한온시스템": ("경기관련소비재", "자동차와부품"),
    "HL만도": ("경기관련소비재", "자동차와부품"),
    "POSCO홀딩스": ("소재", "금속과광물"),
    "포스코": ("소재", "금속과광물"),
    "현대제철": ("소재", "금속과광물"),
    "동국제강": ("소재", "금속과광물"),
    "LG화학": ("소재", "화학"),
    "롯데케미칼": ("소재", "화학"),
    "금호석유화학": ("소재", "화학"),
    "한화솔루션": ("소재", "화학"),
    "SK이노베이션": ("에너지", "석유와가스"),
    "S-Oil": ("에너지", "석유와가스"),
    "에쓰오일": ("에너지", "석유와가스"),
    "HD현대오일뱅크": ("에너지", "석유와가스"),
    "HD한국조선해양": ("산업재", "조선"),
    "삼성중공업": ("산업재", "조선"),
    "한화오션": ("산업재", "조선"),
    "HD현대중공업": ("산업재", "조선"),
    "삼성물산": ("산업재", "건설"),
    "현대건설": ("산업재", "건설"),
    "GS건설": ("산업재", "건설"),
    "DL이앤씨": ("산업재", "건설"),
    "KB금융": ("금융", "은행"),
    "신한지주": ("금융", "은행"),
    "하나금융지주": ("금융", "은행"),
    "우리금융지주": ("금융", "은행"),
    "기업은행": ("금융", "은행"),
    "삼성증권": ("금융", "다각화된금융"),
    "미래에셋증권": ("금융", "다각화된금융"),
    "NH투자증권": ("금융", "다각화된금융"),
    "키움증권": ("금융", "다각화된금융"),
    "삼성화재": ("금융", "보험"),
    "삼성생명": ("금융", "보험"),
    "DB손해보험": ("금융", "보험"),
    "현대해상": ("금융", "보험"),
    "신세계": ("경기관련소비재", "소매(유통)"),
    "이마트": ("경기관련소비재", "소매(유통)"),
    "BGF리테일": ("경기관련소비재", "소매(유통)"),
    "GS리테일": ("경기관련소비재", "소매(유통)"),
    "CJ제일제당": ("필수소비재", "식품,음료,담배"),
    "오리온": ("필수소비재", "식품,음료,담배"),
    "농심": ("필수소비재", "식품,음료,담배"),
    "삼양식품": ("필수소비재", "식품,음료,담배"),
    "하이트진로": ("필수소비재", "식품,음료,담배"),
    "오뚜기": ("필수소비재", "식품,음료,담배"),
    "SK텔레콤": ("커뮤니케이션서비스", "전기통신서비스"),
    "KT": ("커뮤니케이션서비스", "전기통신서비스"),
    "LG유플러스": ("커뮤니케이션서비스", "전기통신서비스"),
    "한국전력": ("유틸리티", "전력"),
    "한국가스공사": ("유틸리티", "가스"),
    "한화에어로스페이스": ("산업재", "항공우주와국방"),
    "LIG넥스원": ("산업재", "항공우주와국방"),
    "한국항공우주": ("산업재", "항공우주와국방"),
    "대한항공": ("산업재", "운송"),
    "SK": ("IT", "IT서비스"),
    "LG": ("IT", "기술하드웨어와장비"),
    "CJ": ("필수소비재", "식품,음료,담배"),
    "GS": ("에너지", "석유와가스"),
    "HD현대": ("산업재", "조선"),
    "LS": ("산업재", "기계"),
    "한화": ("산업재", "항공우주와국방"),
    "두산": ("산업재", "기계"),
    "효성": ("소재", "화학"),
    "에코프로": ("소재", "화학"),
    "LG전자": ("IT", "기술하드웨어와장비"),
}

KSIC_TO_SECTOR = {
    "반도체 제조업": ("IT", "반도체와반도체장비"),
    "전자부품 제조업": ("IT", "반도체와반도체장비"),
    "마그네틱 및 광학 매체 제조업": ("IT", "기술하드웨어와장비"),
    "컴퓨터 및 주변장치 제조업": ("IT", "기술하드웨어와장비"),
    "영상 및 음향기기 제조업": ("IT", "기술하드웨어와장비"),
    "통신 및 방송 장비 제조업": ("IT", "기술하드웨어와장비"),
    "소프트웨어 개발 및 공급업": ("IT", "소프트웨어와서비스"),
    "컴퓨터 프로그래밍, 시스템 통합 및 관리업": ("IT", "IT서비스"),
    "자료처리, 호스팅, 포털 및 기타 인터넷 정보매개 서비스업": ("커뮤니케이션서비스", "인터넷과카탈로그소매"),
    "기타 정보 서비스업": ("IT", "IT서비스"),
    "의약품 제조업": ("건강관리", "제약과바이오"),
    "기초 의약물질 제조업": ("건강관리", "제약과바이오"),
    "의료용 기기 제조업": ("건강관리", "건강관리장비와서비스"),
    "의료용품 및 기타 의약 관련제품 제조업": ("건강관리", "건강관리장비와서비스"),
    "자연과학 및 공학 연구개발업": ("건강관리", "제약과바이오"),
    "은행 및 저축기관": ("금융", "은행"),
    "신탁업 및 집합투자업": ("금융", "다각화된금융"),
    "금융 지원 서비스업": ("금융", "다각화된금융"),
    "기타 금융업": ("금융", "다각화된금융"),
    "보험업": ("금융", "보험"),
    "보험 및 연금관련 서비스업": ("금융", "보험"),
    "재 보험업": ("금융", "보험"),
    "자동차용 엔진 및 자동차 제조업": ("경기관련소비재", "자동차와부품"),
    "자동차 신품 부품 제조업": ("경기관련소비재", "자동차와부품"),
    "자동차 재제조 부품 제조업": ("경기관련소비재", "자동차와부품"),
    "자동차 차체나 트레일러 제조업": ("경기관련소비재", "자동차와부품"),
    "1차 철강 제조업": ("소재", "금속과광물"),
    "1차 비철금속 제조업": ("소재", "금속과광물"),
    "금속 주조업": ("소재", "금속과광물"),
    "구조용 금속제품, 탱크 및 증기발생기 제조업": ("소재", "금속과광물"),
    "기타 금속 가공제품 제조업": ("소재", "금속과광물"),
    "기초 화학물질 제조업": ("소재", "화학"),
    "합성고무 및 플라스틱 물질 제조업": ("소재", "화학"),
    "비료, 농약 및 살균, 살충제 제조업": ("소재", "화학"),
    "기타 화학제품 제조업": ("소재", "화학"),
    "화학섬유 제조업": ("소재", "화학"),
    "플라스틱제품 제조업": ("소재", "화학"),
    "고무제품 제조업": ("소재", "화학"),
    "석유 정제품 제조업": ("에너지", "석유와가스"),
    "연료용 가스 제조 및 배관공급업": ("유틸리티", "가스"),
    "전기업": ("유틸리티", "전력"),
    "증기, 냉·온수 및 공기조절 공급업": ("유틸리티", "가스"),
    "건물 건설업": ("산업재", "건설"),
    "토목 건설업": ("산업재", "건설"),
    "기반조성 및 시설물 축조관련 전문공사업": ("산업재", "건설"),
    "건물설비 설치 공사업": ("산업재", "건설"),
    "전기 및 통신 공사업": ("산업재", "건설"),
    "실내건축 및 건축마무리 공사업": ("산업재", "건설"),
    "일반 목적용 기계 제조업": ("산업재", "기계"),
    "특수 목적용 기계 제조업": ("산업재", "기계"),
    "전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업": ("산업재", "기계"),
    "기타 전기장비 제조업": ("산업재", "기계"),
    "전구 및 조명장치 제조업": ("산업재", "기계"),
    "일차전지 및 이차전지 제조업": ("소재", "화학"),
    "절연선 및 케이블 제조업": ("산업재", "기계"),
    "선박 및 보트 건조업": ("산업재", "조선"),
    "철도장비 제조업": ("산업재", "운송"),
    "항공기,우주선 및 부품 제조업": ("산업재", "항공우주와국방"),
    "무기 및 총포탄 제조업": ("산업재", "항공우주와국방"),
    "해상 운송업": ("산업재", "운송"),
    "항공 여객 운송업": ("산업재", "운송"),
    "육상 여객 운송업": ("산업재", "운송"),
    "도로 화물 운송업": ("산업재", "운송"),
    "기타 운송관련 서비스업": ("산업재", "운송"),
    "전기 통신업": ("커뮤니케이션서비스", "전기통신서비스"),
    "텔레비전 방송업": ("커뮤니케이션서비스", "미디어"),
    "영화, 비디오물, 방송프로그램 제작 및 배급업": ("커뮤니케이션서비스", "미디어"),
    "영상·오디오물 제공 서비스업": ("커뮤니케이션서비스", "미디어"),
    "오디오물 출판 및 원판 녹음업": ("커뮤니케이션서비스", "미디어"),
    "광고업": ("커뮤니케이션서비스", "미디어"),
    "창작 및 예술관련 서비스업": ("커뮤니케이션서비스", "미디어"),
    "종합 소매업": ("경기관련소비재", "소매(유통)"),
    "무점포 소매업": ("경기관련소비재", "소매(유통)"),
    "상품 종합 도매업": ("경기관련소비재", "소매(유통)"),
    "기타 상품 전문 소매업": ("경기관련소비재", "소매(유통)"),
    "섬유, 의복, 신발 및 가죽제품 소매업": ("경기관련소비재", "소매(유통)"),
    "가전제품 및 정보통신장비 소매업": ("경기관련소비재", "소매(유통)"),
    "연료 소매업": ("경기관련소비재", "소매(유통)"),
    "기타 식품 제조업": ("필수소비재", "식품,음료,담배"),
    "과실, 채소 가공 및 저장 처리업": ("필수소비재", "식품,음료,담배"),
    "도축, 육류 가공 및 저장 처리업": ("필수소비재", "식품,음료,담배"),
    "수산물 가공 및 저장 처리업": ("필수소비재", "식품,음료,담배"),
    "동·식물성 유지 및 낙농제품 제조업": ("필수소비재", "식품,음료,담배"),
    "곡물가공품, 전분 및 전분제품 제조업": ("필수소비재", "식품,음료,담배"),
    "떡, 빵 및 과자류 제조업": ("필수소비재", "식품,음료,담배"),
    "알코올음료 제조업": ("필수소비재", "식품,음료,담배"),
    "비알코올음료 및 얼음 제조업": ("필수소비재", "식품,음료,담배"),
    "동물용 사료 및 조제식품 제조업": ("필수소비재", "식품,음료,담배"),
    "도시락 및 식사용 조리식품 제조업": ("필수소비재", "식품,음료,담배"),
    "담배 제조업": ("필수소비재", "식품,음료,담배"),
    "음·식료품 및 담배 도매업": ("필수소비재", "식품,음료,담배"),
    "봉제의복 제조업": ("경기관련소비재", "내구소비재와의류"),
    "편조의복 제조업": ("경기관련소비재", "내구소비재와의류"),
    "의복 액세서리 제조업": ("경기관련소비재", "내구소비재와의류"),
    "신발 및 신발 부분품 제조업": ("경기관련소비재", "내구소비재와의류"),
    "가죽, 가방 및 유사제품 제조업": ("경기관련소비재", "내구소비재와의류"),
    "귀금속 및 장신용품 제조업": ("경기관련소비재", "내구소비재와의류"),
    "가정용 기기 제조업": ("필수소비재", "가정용품과개인용품"),
    "생활용품 도매업": ("필수소비재", "가정용품과개인용품"),
    "부동산 임대 및 공급업": ("부동산", "부동산"),
    "부동산 관련 서비스업": ("부동산", "부동산"),
    "일반 및 생활 숙박시설 운영업": ("경기관련소비재", "호텔,레스토랑,레저"),
    "유원지 및 기타 오락관련 서비스업": ("경기관련소비재", "호텔,레스토랑,레저"),
    "스포츠 서비스업": ("경기관련소비재", "호텔,레스토랑,레저"),
    "여행사 및 기타 여행보조 서비스업": ("경기관련소비재", "호텔,레스토랑,레저"),
    "음식점업": ("경기관련소비재", "호텔,레스토랑,레저"),
    "일반 교습 학원": ("경기관련소비재", "소비자서비스"),
    "기타 교육기관": ("경기관련소비재", "소비자서비스"),
    "교육지원 서비스업": ("경기관련소비재", "소비자서비스"),
    "건축기술, 엔지니어링 및 관련 기술 서비스업": ("산업재", "상업서비스와공급품"),
    "기타 과학기술 서비스업": ("산업재", "상업서비스와공급품"),
    "회사 본부 및 경영 컨설팅 서비스업": ("산업재", "상업서비스와공급품"),
    "기타 전문 서비스업": ("산업재", "상업서비스와공급품"),
    "전문디자인업": ("산업재", "상업서비스와공급품"),
    "시장조사 및 여론조사업": ("산업재", "상업서비스와공급품"),
    "측정, 시험, 항해, 제어 및 기타 정밀기기 제조업; 광학기기 제외": ("산업재", "기계"),
    "사진장비 및 광학기기 제조업": ("산업재", "기계"),
    "가구 제조업": ("경기관련소비재", "내구소비재와의류"),
    "운동 및 경기용구 제조업": ("경기관련소비재", "내구소비재와의류"),
    "그외 기타 제품 제조업": ("산업재", "기계"),
    "펄프, 종이 및 판지 제조업": ("소재", "종이와목재"),
    "골판지, 종이 상자 및 종이용기 제조업": ("소재", "용기와포장"),
    "기타 종이 및 판지 제품 제조업": ("소재", "종이와목재"),
    "인쇄 및 인쇄관련 산업": ("산업재", "상업서비스와공급품"),
    "서적, 잡지 및 기타 인쇄물 출판업": ("커뮤니케이션서비스", "미디어"),
    "기록매체 복제업": ("커뮤니케이션서비스", "미디어"),
    "방적 및 가공사 제조업": ("경기관련소비재", "내구소비재와의류"),
    "직물직조 및 직물제품 제조업": ("경기관련소비재", "내구소비재와의류"),
    "편조원단 제조업": ("경기관련소비재", "내구소비재와의류"),
    "섬유제품 염색, 정리 및 마무리 가공업": ("경기관련소비재", "내구소비재와의류"),
    "기타 섬유제품 제조업": ("경기관련소비재", "내구소비재와의류"),
    "유리 및 유리제품 제조업": ("소재", "건설자재"),
    "시멘트, 석회, 플라스터 및 그 제품 제조업": ("소재", "건설자재"),
    "내화, 비내화 요업제품 제조업": ("소재", "건설자재"),
    "기타 비금속 광물제품 제조업": ("소재", "건설자재"),
    "제재 및 목재 가공업": ("소재", "종이와목재"),
    "나무제품 제조업": ("소재", "종이와목재"),
    "폐기물 처리업": ("유틸리티", "유틸리티"),
    "해체, 선별 및 원료 재생업": ("유틸리티", "유틸리티"),
    "작물 재배업": ("필수소비재", "식품,음료,담배"),
    "어로 어업": ("필수소비재", "식품,음료,담배"),
    "사업시설 유지·관리 서비스업": ("산업재", "상업서비스와공급품"),
    "기타 사업지원 서비스업": ("산업재", "상업서비스와공급품"),
    "경비, 경호 및 탐정업": ("산업재", "상업서비스와공급품"),
    "개인 및 가정용품 수리업": ("경기관련소비재", "소비자서비스"),
    "개인 및 가정용품 임대업": ("경기관련소비재", "소비자서비스"),
    "산업용 기계 및 장비 임대업": ("산업재", "기계"),
    "운송장비 임대업": ("산업재", "운송"),
    "그외 기타 개인 서비스업": ("경기관련소비재", "소비자서비스"),
    "그외 기타 운송장비 제조업": ("산업재", "운송"),
    "그외 기타 전문, 과학 및 기술 서비스업": ("산업재", "상업서비스와공급품"),
    "산업용 농·축산물 및 동·식물 도매업": ("필수소비재", "식품과기본식료품소매"),
    "건축자재, 철물 및 난방장치 도매업": ("산업재", "자본재"),
    "기계장비 및 관련 물품 도매업": ("산업재", "자본재"),
    "기타 전문 도매업": ("산업재", "자본재"),
    "상품 중개업": ("산업재", "상업서비스와공급품"),
    "악기 제조업": ("경기관련소비재", "내구소비재와의류"),
}

PRODUCT_KEYWORDS = {
    ("IT", "반도체와반도체장비"): [
        "DRAM", "NAND", "메모리반도체", "파운드리", "SoC", "DDR",
        "웨이퍼", "CPU", "GPU", "HBM", "반도체장비", "반도체 장비",
        "CVD", "식각장비", "에칭", "증착장비", "세정장비",
        "반도체검사", "반도체테스트", "반도체패키징", "프로브카드", "본더",
    ],
    ("IT", "디스플레이"): [
        "디스플레이패널", "OLED패널", "LCD패널", "터치스크린", "LED디스플레이",
    ],
    ("커뮤니케이션서비스", "게임엔터테인먼트"): [
        "게임", "모바일게임", "온라인게임", "MMORPG", "RPG",
        "리니지", "배틀그라운드", "메이플", "던전", "로스트아크",
    ],
    ("건강관리", "제약과바이오"): [
        "바이오", "항체", "세포치료", "CMO", "CDMO", "바이오시밀러",
        "항암제", "백신", "mRNA", "의약품", "제약", "신약",
    ],
    ("소재", "화학"): [
        "2차전지", "이차전지", "배터리", "리튬", "양극재", "음극재",
        "분리막", "전해질", "ESS", "전기차배터리",
    ],
    ("커뮤니케이션서비스", "인터넷과카탈로그소매"): [
        "인터넷플랫폼", "포털", "검색엔진", "온라인광고", "이커머스",
        "SNS", "메신저", "OTT", "스트리밍서비스",
    ],
    ("커뮤니케이션서비스", "미디어"): [
        "엔터테인먼트", "K-POP", "아이돌", "매니지먼트", "기획사",
        "음반", "공연", "콘서트", "OTT", "스트리밍", "방송",
    ],
    ("IT", "소프트웨어와서비스"): [
        "AI", "인공지능", "머신러닝", "딥러닝", "SaaS", "클라우드",
        "빅데이터", "RPA", "자동화",
    ],
    ("산업재", "항공우주와국방"): [
        "방산", "국방", "미사일", "레이더", "전투기", "무기체계",
        "K방산", "항공우주",
    ],
    ("에너지", "에너지장비및서비스"): [
        "태양광", "풍력", "수소", "연료전지", "신재생",
        "태양전지", "그린에너지",
    ],
}


def classify(companyName, kindIndustry, mainProducts):
    if companyName in MANUAL_OVERRIDES:
        sector, group = MANUAL_OVERRIDES[companyName]
        return sector, group, 1.0, "override"

    for name, (sector, group) in MANUAL_OVERRIDES.items():
        if len(name) >= 2 and (name in companyName or companyName in name):
            return sector, group, 0.95, "override_partial"

    if mainProducts:
        isHolding = "지주회사" in mainProducts or "지주사업" in mainProducts
        if not isHolding:
            bestMatch = None
            bestScore = 0
            for (s, g), keywords in PRODUCT_KEYWORDS.items():
                score = sum(1 for kw in keywords if kw.lower() in mainProducts.lower())
                if score > bestScore:
                    bestScore = score
                    bestMatch = (s, g)
            if bestMatch and bestScore >= 1:
                confidence = min(0.9, 0.6 + bestScore * 0.1)
                return bestMatch[0], bestMatch[1], confidence, "keyword"

    if kindIndustry and kindIndustry in KSIC_TO_SECTOR:
        sector, group = KSIC_TO_SECTOR[kindIndustry]
        return sector, group, 0.7, "ksic"

    return "기타", "기타", 0.0, "unknown"


if __name__ == "__main__":
    print("=" * 80)
    print("014: 전체 KIND 목록 섹터 분류 커버리지")
    print("=" * 80)

    df = getKindList()
    print(f"\n총 {df.height}개 종목 대상\n")

    results = []
    for row in df.iter_rows(named=True):
        name = row["회사명"]
        industry = row.get("업종", "")
        products = row.get("주요제품", "")
        code = row["종목코드"]

        sector, group, conf, source = classify(name, industry, products)
        results.append({
            "종목코드": code,
            "회사명": name,
            "KIND업종": industry,
            "sector": sector,
            "industryGroup": group,
            "confidence": conf,
            "source": source,
        })

    resultDf = pl.DataFrame(results)

    print("[소스별 분포]")
    sourceCounts = resultDf.group_by("source").agg(pl.count().alias("count")).sort("count", descending=True)
    for row in sourceCounts.iter_rows(named=True):
        pct = row["count"] / len(results) * 100
        print(f"  {row['source']:>18}: {row['count']:>5} ({pct:.1f}%)")

    classified = resultDf.filter(pl.col("source") != "unknown").height
    print(f"\n  분류 성공: {classified}/{len(results)} ({classified/len(results)*100:.1f}%)")
    print(f"  미분류:    {len(results)-classified}/{len(results)} ({(len(results)-classified)/len(results)*100:.1f}%)")

    print("\n[섹터별 분포]")
    sectorCounts = resultDf.group_by("sector").agg(pl.count().alias("count")).sort("count", descending=True)
    for row in sectorCounts.iter_rows(named=True):
        pct = row["count"] / len(results) * 100
        print(f"  {row['sector']:>16}: {row['count']:>5} ({pct:.1f}%)")

    print("\n[미분류 종목의 KIND 업종명]")
    unknowns = resultDf.filter(pl.col("source") == "unknown")
    if unknowns.height > 0:
        unknownIndustries = unknowns.group_by("KIND업종").agg(pl.count().alias("count")).sort("count", descending=True)
        for row in unknownIndustries.iter_rows(named=True):
            print(f"  {row['KIND업종']:>40}: {row['count']:>3}개")
    else:
        print("  없음!")

    print("\n[신뢰도 분포]")
    bins = [
        ("1.0 (override)", resultDf.filter(pl.col("confidence") == 1.0).height),
        ("0.9+ (partial/keyword)", resultDf.filter((pl.col("confidence") >= 0.9) & (pl.col("confidence") < 1.0)).height),
        ("0.7+ (ksic)", resultDf.filter((pl.col("confidence") >= 0.7) & (pl.col("confidence") < 0.9)).height),
        ("0.6+ (keyword weak)", resultDf.filter((pl.col("confidence") >= 0.6) & (pl.col("confidence") < 0.7)).height),
        ("0.0 (unknown)", resultDf.filter(pl.col("confidence") == 0.0).height),
    ]
    for label, cnt in bins:
        pct = cnt / len(results) * 100
        print(f"  {label:>24}: {cnt:>5} ({pct:.1f}%)")
