본문 바로가기
/ 학습 / 안내서 / 데이터 처리
L1 입문 · 10분 읽기

교육 명단 대조, 조용한 오답 막기

2026.07.12 갱신 교육 대상자·이수자 명단을 대조하는 실무자
#교육관리#명단대조#검산#양방향
검토 상태: 전문 검토 전 위험도 미분류

이 안내서는 공식 절차·법령·현장 판단을 대체하지 않으며, 적용 전 소속 기관 기준과 담당자 검토를 확인하세요.

법정 교육·안전 교육이 끝나면 누가 안 들었는지 확인해야 합니다. 그런데 "대상자 45명 − 이수자 38명 = 7명"이라는 단순 빼기는 조용히 틀립니다 — 이름 뒤 공백, 팀명 띄어쓰기 차이, 대상자 명단에 없는 외부 이수자 때문입니다. 이 안내서는 양방향 대조로 그 조용한 오답을 막습니다.

🎯 이 장의 목표
  • 대상자 수와 이수자 수의 단순 차이가 틀릴 수 있는 이유를 설명할 수 있습니다.
  • 명단의 공백·표기 차이를 정규화해 비교할 수 있습니다.
  • 미이수·대상 외 이수·중복 이수를 양방향으로 식별할 수 있습니다.
  • 동명이인·전입·면제처럼 자동 확정할 수 없는 항목을 분리할 수 있습니다.

배경지식

명단 대조는 두 바구니의 물건 수를 빼는 일이 아니라, 어느 물건이 어느 바구니에 있는지 맞춰 보는 일입니다. 대상자와 이수자가 같은 수여도 사람이 서로 다르면 미이수와 대상 외 이수가 동시에 숨어 있을 수 있습니다.

대상자 전체를 하나의 집합, 이수 기록을 다른 집합이라고 생각하면 방향이 보입니다. 대상자에는 있지만 이수 기록에는 없는 값이 미이수이고, 반대 방향이 대상 외 이수입니다. 같은 이수 키가 여러 번 나타나면 중복 후보입니다. 세 결과는 원인과 후속 확인이 달라 한 숫자로 합치면 안 됩니다.

두 표의 같은 사람을 연결하는 기준이 입니다. 이름은 동명이인이 있고 소속은 바뀔 수 있으므로 안정적인 키가 아닐 수 있습니다. 승인된 교육 식별자를 로컬에서 대조하되, 원본 식별자는 공개 결과에 남기지 않습니다. 키가 없거나 충돌하면 자동 판단 대신 사람 확인 목록으로 보냅니다.

대조를 시작하기 전에는 기대 관계도 적어 둡니다. 대상자·매칭 이수·미이수 후보를 합친 수가 대상자 수와 맞는지, 이수 기록은 매칭·대상 외·중복 후보로 설명되는지 확인합니다. 합이 맞지 않으면 누군가를 통보하기 전에 키 결측과 중복 처리부터 다시 살핍니다.

왜 단순 빼기가 위험한가

가상 사례: 개수는 맞지만 사람이 다른 교육 명단

현장에서 흔히 나오는 가상 사례입니다. 대상자 45명, 이수자 38명이니 미이수자는 7명이어야 합니다. 그런데 이름만으로 비교했더니 15명이 나왔습니다.

TEXT
[비교] 정규화 없이: 15명  →  정규화 후: 7명

원인은 손입력 자료의 보이지 않는 차이였습니다. 이름 뒤에 공백('김가온 ')이 붙어 있거나, 소속이 구조1팀구조 1팀처럼 달랐습니다. 에러는 나지 않았습니다 — 그래서 더 위험합니다. 프로그램이 멈추면 우리는 무언가 잘못됐음을 알지만, 조용히 틀린 숫자는 맞는 얼굴을 하고 보고서에 실립니다. 미이수자로 잘못 분류된 8명에게 재교육 통보가 나가는 식입니다.

빼기가 위험한 더 근본적인 이유는, 개수만 보면 서로 다른 두 오류가 우연히 상쇄되어 맞아 보이기 때문입니다. 외부기관 이수자 한 명이 이수자 수를 부풀리고, 동시에 미이수자 한 명을 이름 차이로 놓치면, 45 − 38의 합은 우연히 맞아떨어집니다. 숫자는 맞는데 명단은 틀린 상태 — 이걸 잡으려면 개수가 아니라 명단 자체를 맞대야 합니다.

문자열은 눈보다 많은 것을 담는다

두 반의 출석부를 대조하는데 한 반은 "김가온", 다른 반은 "김가온 "(뒤에 공백)으로 적었다고 해 봅시다. 사람 눈에는 같은 사람이지만, 컴퓨터는 글자를 하나하나 맞춰 보기 때문에 눈에 안 보이는 공백 하나에도 "다른 사람"이라고 판정합니다. 이름 문자열에는 우리가 보는 글자 말고도 앞뒤 공백, 팀명 사이 띄어쓰기, 하이픈과 공백의 차이 같은 것이 함께 담겨 있습니다.

그래서 대조 전에 정규화로 두 명단의 줄을 먼저 맞춥니다 — 앞뒤 공백을 지우고, 팀명 사이 공백을 통일하는 식입니다. 아래는 모두 가상의 예이며, 정규화가 무엇을 맞추는지 보여 줍니다.

대상자 명단이수 기록무엇이 다른가
홍길동홍길동 이름 뒤 보이지 않는 공백 하나
구조1팀 김가온구조 1팀 김가온팀명 가운데 띄어쓰기
010-0000-0001010 0000 0001구분자가 하이픈 vs 공백

세 쌍 모두 사람 눈엔 같지만, 정규화 없이 글자를 그대로 비교하면 컴퓨터는 "다른 사람"으로 셉니다. 그래서 미이수자가 실제보다 부풀어 보입니다. 앞의 15명이 바로 이 부풀림이었습니다. 가능하면 이름 대신 교육번호_hash 같은 고유 키로 맞추면, 소속 띄어쓰기 차이는 처음부터 문제가 되지 않습니다.

양방향으로 대조한다

한 방향만 보면 놓칩니다. 세 가지를 함께 봅니다. 집합의 언어로 보면 무엇을 세는지 분명해집니다.

  • 미이수 — 대상자 중 이수 기록에 없는 사람 (대상자 − 이수자)
  • 대상 외 이수 — 이수자 중 대상자 명단에 없는 사람 (이수자 − 대상자, 외부기관 이수·오입력)
  • 중복 이수 — 같은 사람이 이수 기록에 여러 번

대상자 − 이수자 한 방향만 보면 "우리 대상자 중 안 들은 사람"은 찾지만, "대상자 명단에 없는데 이수 기록에 있는 사람"은 보이지 않습니다. 그 반대 방향이 바로 앞서 개수를 맞아 보이게 만든 상쇄의 원인입니다. 그래서 두 방향을 모두 봐야 상쇄가 드러납니다.

가상의 작은 예로 보겠습니다. 대상자는 김가온·이초롱·박두리 3명, 이수 기록은 김가온·이초롱·최봄입니다. 개수는 3 대 3이라 단순 빼기로는 "미이수 0명"처럼 보입니다. 하지만 명단을 맞대면 다릅니다 — 박두리는 대상자인데 이수 기록에 없어 미이수, 최봄은 이수했지만 대상자 명단에 없어 대상 외 이수입니다. 개수가 같아 서로 상쇄됐을 뿐, 실제로는 처리해야 할 사람이 두 명이나 숨어 있었습니다.

대조 전에 이름·소속의 공백을 제거하고, 가능하면 이름 대신 교육번호_hash 같은 고유 키로 맞춥니다. 해시로 맞추면 소속 띄어쓰기 차이는 무시됩니다.

가상 사례: 전입 직원의 입문 교육 기록 대조

다음은 실제 직원·부서·교육과 무관한 가상 사례입니다. 인사 행정 담당자는 이번 기간에 전입한 직원의 합성 대상 명단과 입문 교육 이수 기록을 대조합니다. 대상 명단에는 현재 소속이, 이수 기록에는 이전 소속이 남아 있고 같은 이름의 다른 직원도 있습니다.

이름과 소속 문자열만 붙여 비교하면 전입 직원을 미이수로 잘못 분류하거나 동명이인의 기록을 연결할 수 있습니다. 담당자는 로컬에서 승인된 교육 식별자의 해시로 먼저 대조하고, 식별자가 비거나 둘 이상 연결되는 행은 자동 통보 대상에서 뺍니다. 현재 소속은 비교 보조 정보로만 씁니다.

결과가 한 명으로 매칭돼도 이수 과정과 대상 기간이 맞는지 확인해야 합니다. 담당자는 인사 변동 기록과 교육 원장을 확인한 뒤 이수 여부를 확정합니다. 이 사례에서는 사람 수보다 신원 연결과 기준 기간이 핵심입니다.

실행과 결과

TEXT
[입력] 대상자 10명, 이수 기록 8건
[검산] 매칭 이수 7명, 미이수 3명, 대상 외 이수 1명, 중복 이수 기록 0건
[주의] 대상 외 이수자가 있어 단순 산식으로 안내하지 않습니다.
[OK] 저장: output/missing.csv
[OK] 저장: output/external_completed.csv
[OK] 저장: output/duplicate_completed.csv

결과를 세 파일로 나눠 저장하는 이유는, 각 목록의 다음 행동이 다르기 때문입니다. 미이수자는 재교육 통보 대상이고, 대상 외 이수자는 명단 정정 대상이며, 중복 기록은 이수 시스템 입력을 고칠 대상입니다. 한 숫자로 뭉뚱그리면 이 구분이 사라집니다.

검산 — 두 방향으로

결과가 맞는지 두 가지로 확인합니다.

TEXT
[검산1] 대상 45 - 이수 38 = 7명, 결과 7명 → 일치
[검산2] 대상자 명단에 없는 이수자: 0명

검산 1이 어긋나면 동명이인·외부 수강자·중복 이수자 가능성을 확인합니다. 검산 2에서 대상 외 이수자가 한 명이라도 나오면, 단순 산식이 틀렸다는 신호이므로 자동 안내를 멈춥니다. 검산 1(개수)과 검산 2(명단)를 함께 두는 것이 핵심입니다 — 개수만 맞으면 앞서 본 상쇄를 놓치고, 명단만 보면 총계 실수를 놓칩니다.

▸ 소방 활용 포인트
법정·안전·장비 교육 이수 확인에 씁니다. 외부기관 이수자나 중복이 있으면 "대상−이수" 빼기는 틀립니다 — 대상 외 이수가 1건이라도 나오면 자동 안내를 중단하고 담당자가 원자료를 확인합니다.

정규화로도 못 맞추는 것

공백을 지우고 양방향으로 대조해도, 사람이 반드시 봐야 하는 경우가 남습니다.

  • 동명이인 — "김가온"이 두 명이면 이름만으로는 누가 들었는지 알 수 없습니다. 사번·교육번호 같은 고유 키라야 갈립니다.
  • 전입·전출 — 기간 중 부서를 옮긴 사람은 대상자 명단과 이수 기록의 소속이 달라 어긋납니다.
  • 외부기관 이수·교육 면제 — 다른 기관에서 듣거나 면제 사유가 있는 사람은 우리 이수 기록에 없어도 미이수자가 아닙니다.

이런 경우 이름 대신 교육번호 같은 고유 키로 맞추면 동명이인·띄어쓰기 문제가 함께 풀립니다. 다만 실명단·사번은 민감정보이므로, 대조는 외부 챗봇이 아니라 로컬에서 하고 원본 키는 그대로 공개하지 않습니다 — 자세한 원칙은 개인정보, AI에 넣기 전에 점검하기에, 이름·소속 표기를 다듬는 일반 기법은 지저분한 출동 데이터 깔끔하게 정제하기에 정리돼 있습니다.

사람 검토 체크리스트

TEXT
- [ ] 실명단을 외부 챗봇이나 공개 저장소에 올리지 않았습니다.
- [ ] 교육번호 같은 내부 대조 키를 쓰고, 원본 사번·교육번호는 공개하지 않았습니다.
- [ ] 동명이인 가능성이 있으면 이름만으로 자동 안내하지 않았습니다.
- [ ] 대상 외 이수자 목록이 비어 있지 않으면 자동 안내를 중단했습니다.
- [ ] 적용 전 "대상 N명, 이수 M명, 미이수 N-M명"을 미리 정해 두고 결과와 대조했습니다.
- [ ] 결과 공유 전 수신자, 포함 컬럼, 보안 등급을 확인했습니다.
⚠️ 흔한 실수
이 레시피는 이수 여부 최종 확정 도구가 아니라 대조 보조 도구입니다. 동명이인·전입·전출·외부기관 이수·교육 면제는 사람이 확인하고, 실명단은 외부 AI에 넣지 말고 로컬에서만 처리하세요.

용어 한 줄 사전

용어한 줄 설명
대상자 집합해당 교육을 확인해야 하는 사람들의 기준 명단입니다.
이수자 집합교육 완료 기록에 나타난 사람들의 명단입니다.
두 명단에서 같은 사람인지 연결하는 기준값입니다.
정규화공백·하이픈·표기 형식을 비교 가능한 형태로 맞추는 작업입니다.
미이수 후보대상자에는 있지만 이수 기록에는 없어 확인이 필요한 사람입니다.
대상 외 이수이수 기록에는 있지만 대상자 명단에는 없는 확인 대상입니다.

자주 묻는 질문

Q. 대상자 수에서 이수자 수를 빼면 왜 안 되나요?

대상 외 이수와 미이수가 함께 있으면 서로 개수를 상쇄할 수 있습니다. 총계가 맞아도 사람이 다를 수 있으므로 두 방향의 명단을 직접 대조합니다.

Q. 이름과 소속을 합치면 고유 키가 되나요?

동명이인과 소속 변경이 있어 여전히 충돌할 수 있습니다. 승인된 교육 식별자를 우선 사용하고, 키가 없거나 중복되면 사람이 원장을 확인합니다.

Q. 공백을 지우면 모든 표기 차이가 해결되나요?

공백·구분자 같은 형식 차이만 줄일 수 있습니다. 개명·오타·전입·면제처럼 업무 의미가 다른 경우는 자동으로 합치지 않습니다.

Q. 미이수 후보에게 바로 안내해도 되나요?

대상 외 이수·중복·키 충돌이 없는지 보고, 전입·외부 이수·면제 기록을 사람이 확인한 뒤 안내 대상을 확정합니다.

핵심 정리

  • 명단은 개수 차이가 아니라 대상자와 이수자를 양방향으로 대조합니다.
  • 비교 전 공백과 표기 형식을 정규화하되 사람의 동일성을 추정하지 않습니다.
  • 이름 대신 승인된 고유 키를 사용하고 충돌·결측은 확인 목록으로 보냅니다.
  • 미이수 결과는 후보이며 원장과 예외 사유를 확인한 사람이 확정합니다.

다음 단계