# ESCO–O\*NET 직결표 v1 — 원천·처리·대조

> v1 · 2026-09-27 · 수치는 운영 DB 와 원천 파일에서 잰 값입니다. 이용 조건과 출처는 `LICENSE`.
> 재생성: `data/n3-base-unit/esco/build_public.py build` · 대조: `… check` (AI Changing Work 저장소)

## 1. 무엇인가

O\*NET-SOC 직업과 ESCO 직업 개념의 연결 4,053행입니다. **연결과 대응 유형은 전부 ESCO-O\*NET Crosswalk 의 것**이며 AI Changing Work 가 새로 맺은 연결은 없습니다. AI Changing Work 가 한 일은 세 가지입니다.

1. ESCO 명칭을 크로스워크 파일의 명칭 열이 아니라 **ESCO API 가 돌려준 명칭**으로 실었습니다(§2).
2. 크로스워크 작성 이후 ESCO 명칭·설명이 바뀐 연결은 그 변화가 직업의 범위를 바꾸는지 판단했고, 바꾼다고 판단했거나 판단이 갈린 연결을 뺐습니다(§4–§6). 이 판단은 AI 모델이 했습니다.
3. 대응 유형을 AI Changing Work 어휘(`relation`)로 옮겨, 원래 값(`crosswalk_match_type`) 옆에 두었습니다.

## 2. 원천과 판본

| 층        | 자료                                                                                                                                                                                                                                                                                                            | 판본 표기                                                                | 이 표에서 쓴 것                      |
| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------ |
| 연결      | ESCO-O\*NET Crosswalk — European Commission (ESCO Secretariat) · U.S. Department of Labor, Employment and Training Administration. https://esco.ec.europa.eu/en/use-esco/other-crosswalks (파일 `ONET_(Occupations)_0_updated.csv`, SHA-256 `82179a0a3340da97b63df90134d8d941ec3c2c478334d855b69e4dd57a91b620`) | version 1 (September 2022), which pairs O\*NET-SOC 2019 with ESCO v1.1.0 | O\*NET Id · ESCO URI · Type of Match |
| ESCO 명칭 | ESCO API (https://esco.ec.europa.eu/en/use-esco/use-esco-services-api)                                                                                                                                                                                                                                          | ESCO API, retrieved 2026-08-08                                           | 영문 선호 명칭                       |
| O\*NET    | O\*NET® 31.0 Database (https://www.onetcenter.org/database.html)                                                                                                                                                                                                                                                | O\*NET® 31.0 Database                                                    | O\*NET-SOC 코드·직업명               |

크로스워크 파일 4,253행 = ESCO 직업 개념 대상 4,210 + ISCO-08 4자리 그룹 대상(`exactISCO`) 43. 대응 유형은 broadMatch 2,053 · closeMatch 1,432 · exactMatch 498 · narrowMatch 227 · exactISCO 43 이고 `related` 는 파일에 없습니다.

| 이 표에 없는 행                                                |  행 | 사유                                                          |
| -------------------------------------------------------------- | --: | ------------------------------------------------------------- |
| ISCO-08 그룹 대상                                              |  43 | 대상이 ESCO 직업 개념이 아님                                  |
| AI Changing Work 가 받은 ESCO 레코드에 없는 개념               |  78 | 붙일 ESCO 명칭이 없음 (75행은 ESCO API 가 404 를 돌려준 개념) |
| 텍스트가 바뀐 뒤 범위가 바뀌었다고 판단했거나 판단이 갈린 연결 |  79 | §5                                                            |

4,210 − 78 − 79 = **4,053**.

대응 유형과 `relation` (방향은 O\*NET-SOC 기준, 크로스워크 기술보고서 p.9 정의): `exactMatch → exact` · `narrowMatch → onet_narrower`(O\*NET 직업이 ESCO 개념보다 좁다) · `broadMatch → onet_broader`(O\*NET 직업이 더 넓다) · `closeMatch → close`. 이 방향은 SKOS 관례와 반대로 읽어야 맞으며, 적재기가 보고서 예시 1건과 파일 표본 3건으로 실행 때마다 대조합니다.

## 3. 키: ESCO UUID

- ESCO `code`(예 `2512.4`)는 개념 식별자가 아닙니다. ESCO 판 사이에 같은 코드가 다른 직업에 다시 쓰입니다 — O\*NET Resource Center 의 `ESCO_to_ONET-SOC.xlsx`(ESCO code 키)를 크로스워크 파일과 대조하니 같은 코드가 다른 직업을 가리키는 경우가 17건이었습니다(예 `2529.7` = 크로스워크 작성 판의 「ICT security engineer」 ↔ 뒤 판의 「cyber incident responder」).
- 크로스워크 파일 자체가 ESCO 쪽을 **개념 URI** 로 적습니다. 모든 행이 `http://data.europa.eu/esco/occupation/` + UUID 형태이므로 `esco_uri` = 접두 + `esco_uuid` 는 손실이 없습니다.
- 그래서 이 표는 ESCO code 를 싣지 않습니다.

## 4. 텍스트 차이 규칙

크로스워크 작성자는 ESCO v1.1.0 의 명칭·설명을 보고 대응을 정했습니다. 이 표의 ESCO 명칭은 그 뒤 ESCO API 가 돌려준 값입니다. 텍스트가 바뀌었으면 대응이 지금 텍스트에도 맞는지 알 수 없습니다.

- **차이 행** = ESCO API 가 돌려준 명칭 **또는** 설명이 크로스워크 파일의 텍스트와 다른 연결(소문자화·공백 정리·NBSP 를 공백으로 본 뒤 비교). 4,132 연결 중 457행.
- 차이 행은 «같은 범위» 판단 기록이 있고, 그 기록에 적힌 명칭·설명의 SHA-256 이 현재 텍스트와 같을 때만 싣습니다. 기록이 없거나, 범위가 바뀌었다는 판단이거나, 텍스트가 그 뒤 또 바뀌었으면 싣지 않습니다.
- 차이 없는 행 3,675 = `review_basis = source_text_unchanged`.

### 규칙 W-0: 단어 변화 0

차이 행 중 크로스워크 텍스트와 ESCO API 텍스트의 **단어 열이 명칭·설명 모두 같은** 행은 판단자 없이 규칙으로 싣습니다(`word_change_zero`, 106행).

- 단어 = `[^\W_]` 의 최대 연속, 대소문자 구분. 문장부호와 공백은 단어가 아닙니다(`hoist-way` ↔ `hoistway` 는 단어 변화).
- 단어를 셀 때만, cp1252 로 보인 UTF-8 바이트 묶음(모지바케)을 기계적으로 역변환해 비교합니다: C1 문자·`Â[ -¿]`·`Ã[\u0080-¿]`·`â€` 가 든 묶음이 UTF-8 로 디코드될 때만, 최대 3회. 한 글자 치환은 하지 않습니다(`l'âge`·`SÃO`·`ÂMBITO` 불변). **이 역변환은 비교에만 쓰며, 이 표에 실린 명칭은 ESCO API 가 돌려준 값 그대로입니다.**
- 적재기는 실행 때마다 W-0 기록 전부를 이 규칙으로 다시 계산하고, 하나라도 어긋나면 멈춥니다.

## 5. AI 판단

W-0 뒤에 남은 차이 행과 그 앞 명칭 변경 검토의 대상은 AI 모델이 판단했습니다. 판단 질문은 «크로스워크 작성자가 본 직업과 지금 ESCO API 가 보여 주는 직업이 같은 범위인가» 하나입니다. **대응 유형 자체는 다시 판단하지 않았습니다.**

| 단계               |    대상 | 판단자                                                                         | 같은 범위 | 싣지 않음 |
| ------------------ | ------: | ------------------------------------------------------------------------------ | --------: | --------: |
| 명칭 변경 검토 1차 |      11 | Anthropic Claude (AI Changing Work data-agent)                                 |         6 |         5 |
| 명칭 변경 검토 2차 |      36 | 같음                                                                           |        21 |        15 |
| A + X              |     304 | 판단자 A = Anthropic Claude · 판단자 X = OpenAI Codex, 서로의 판단을 보지 않음 |       245 |        59 |
| **계**             | **351** |                                                                                |   **272** |    **79** |

A + X 합의 (둘 다 «같은 범위»일 때만 싣는다):

| A         | X         |  행 | 결과                      |
| --------- | --------- | --: | ------------------------- |
| 같은 범위 | 같은 범위 | 245 | 실음, `judged_same_scope` |
| 범위 바뀜 | 범위 바뀜 |  50 | 싣지 않음                 |
| 같은 범위 | 범위 바뀜 |   9 | 싣지 않음                 |

A 가 «범위 바뀜», X 가 «같은 범위»인 행은 0 이었습니다.

판단 원장은 행마다 텍스트의 SHA-256 과 판단자의 근거 문장을 담습니다. 해시는 재수집 감지용 내부 값이라 싣지 않았습니다. 판단의 결과는 `review_basis` 에 있습니다. **`review_basis` 는 크로스워크의 대응이 맞는지를 따진 값이 아닙니다.**

## 6. 결과

| 항목                                                               |                        값 |
| ------------------------------------------------------------------ | ------------------------: |
| 연결                                                               |                     4,053 |
| `exact` / `onet_narrower` / `onet_broader` / `close`               | 478 / 220 / 1,984 / 1,371 |
| `source_text_unchanged` / `word_change_zero` / `judged_same_scope` |         3,675 / 106 / 272 |
| O\*NET-SOC 직업                                                    |                       931 |
| ESCO 직업 개념                                                     |                     2,504 |

- 연결 중 `exact` 가 2개 이상인 O\*NET 직업은 크로스워크 파일에서 온 그대로입니다.
- 연결이 전부 빠져 이 표에 없는 O\*NET 직업이 4개 있습니다(크로스워크에는 있음). 원본 전체는 https://esco.ec.europa.eu/en/use-esco/other-crosswalks 에서 받을 수 있습니다.

## 7. 공개 전환

- 연결은 2026-09-27 에 비공개 상태로 DB 에 적재했고, 모든 차이 행의 판단이 끝나고 사이트의 EU 탭이 «싣지 않음» 행을 거르도록 배포된 뒤 **2026-09-27 13:50:01 KST** 에 사이트 표시를 켰습니다. ISCO-08 그룹 대상 43행은 꺼진 채입니다.
- 이 표는 켜져 있는 연결 중 사이트가 표시하는 행만 담습니다. 사이트 EU 탭(영어)이 표시하는 연결 집합·대응·명칭과 이 표는 행 단위로 같습니다(§8).

## 8. 재생성과 대조

- `build`: DB(읽기 전용 계정)에서 사이트가 표시하는 EU/ESCO 연결을 읽어 CSV 와 `CHECKSUMS.sha256`(CSV·README·METHODOLOGY·LICENSE) 를 씁니다.
- `check`: 빌더와 다른 경로로 다시 셉니다.
  - DB 집계 SQL 과 행 수·(O\*NET, UUID, relation) 키 집합 일치, 판단 원장에서 다시 유도한 `review_basis` 일치
  - 사이트 EU 탭 SQL 을 전 직업에 돌린 결과(사이트 표시 경로의 TypeScript 함수를 거친 명칭)와 차이 0
  - 크로스워크 파일·O\*NET 31.0 `Occupation Data.txt`·ESCO API 수집본과 대조: 대응 유형 원래 값 일치, O\*NET 직업명 일치, ESCO 명칭 바이트 일치
  - 파일 목록·체크섬·정렬·문자 부호화, 문안에 쓴 열 이름과 CSV 머리행의 일치, 금지 표현·판본·URL
- 2026-09-27 결과: 4,053행, 사이트 표시와 다른 행 0.
