데이터 역할과 분할¶
데이터 규약(data contract)은 모델 평가에 사용할 데이터의 구조와 범위를 정하는 규칙입니다. 이 규칙은 원본 값을 보기 좋게 손질하는 절차가 아니라, 서로 다른 실행에서 같은 입력을 만들고 비교 결과를 같은 의미로 해석하기 위한 기준입니다. 이 장에서는 -1이라는 결측 표식, 일정하지 않은 측정 간격, 기록(record)마다 다른 측정 항목이 보이더라도 그것만으로 데이터 오류라고 판단하지 않습니다.
이 문서에서 먼저 확인할 것
- 원본 관측 행, 가공한 특성, 교육용 정답, 데이터 분할은 서로 다른 역할을 합니다.
- 구조 검증 성공은 모델 승인이 아니라 평가 입력의 범위를 확인한 결과입니다.
- 운영용
operational자료에는 정답이 없으므로 새 재현율이나 정밀도를 계산하지 않습니다.
원본 관측값과 모델 입력¶
원본 관측값(raw observation) 한 행은 곧바로 모델 입력 한 행이 되지 않습니다. 원본 기록은 Time, Parameter, Value를 가진 여러 관측 행으로 이루어져 있으며, 가공 과정에서는 같은 기록 안의 고정값과 시간에 따라 반복된 값을 모아 개별 기록 단위의 특성 표 한 행으로 만듭니다.
한 번의 원본 행만 보고 특성 값을 정하거나 데이터 규칙 위반이라고 판단하면 평가 범위를 잘못 해석할 수 있습니다. 아래 예시는 실제 기록 132539의 구조를 단순화해 보여 줍니다. Height=-1은 키가 음수라는 뜻이 아니라 값이 없다는 표식입니다. HR=73 한 번만으로 heart_rate__mean을 정할 수는 없으며, 평균, 마지막 값, 관측 횟수, 결측 여부는 같은 기록의 관련 행을 모두 모아 계산합니다.
평가에 사용하는 target은 오프라인 평가에서 최종 예측과 비교할 교육용 정답입니다. API 요청과 운영용 입력에는 이 정답을 넣지 않습니다. 따라서 운영 중에는 점수와 예측은 볼 수 있어도 새로운 정밀도나 재현율을 계산할 수 없습니다.
원본에서 평가 지표까지의 순서
- 원본 관측 행을 같은 기록으로 묶습니다.
- 고정값·반복 관측·결측 표식을 특성 한 행으로 바꿉니다.
- 교육용
target을 최종 평가에서만 예측과 비교합니다. - 점수와 임계값으로 최종 예측을 만들고, 정답이 있는 자료에서만 품질 지표를 계산합니다.
원본 값은 가공 단계마다 특성이나 평가 요소로 바뀝니다. 각 단계에서 결측·식별자·정답의 경계가 유지되는지 확인합니다.
| 처리 단계 | 실제 예시 | 가공 뒤의 의미 | 확인할 점 |
|---|---|---|---|
| 원본 행 | 00:00 / RecordID / 132539 |
어느 기록에서 나온 관측인지 연결합니다. | 식별자 형식이 정해 둔 규칙과 맞는지 |
| 고정값 관측 | 00:00 / Age / 54 |
age=54, age__missing=false |
값과 결측 여부가 함께 남는지 |
| 결측 표식 | 00:00 / Height / -1 |
height=null, height__missing=true |
-1이 실제 측정값처럼 계산되지 않는지 |
| 시간별 관측 | 00:07 / HR / 73 |
heart_rate__min/max/mean/last/count 계열 |
한 행이 아니라 관찰 구간 전체를 모아 계산했는지 |
| 정답 연결 | target |
최종 평가에서 예측과 비교할 정답 | 운영용 입력과 분리되어 있는지 |
이 변환의 적절성은 결측값이 적다는 사실만으로 판단하지 않습니다. 데이터 규칙은 열 이름과 형식, 관찰 시간, target의 경계, 결측 여부 표시를 확인합니다. 품질 지표를 보기 전에는 모델 입력이 같은 규칙으로 만들어졌는지부터 확인해야 합니다.
원본 데이터와 가공 데이터의 규칙¶
PhysioNet Set A의 원본 기록은 시간에 따라 수집한 Time, Parameter, Value 행으로 이루어집니다. 원본 데이터 규칙은 4,000개 기록, 48시간 이내의 시각, RecordID, 교육용 정답과 제외된 결과 열의 범위를 정합니다. 원본의 -1은 측정값이 아니라 결측 표식이므로, 이 값이 있다는 사실은 확인할 대상이지 자동 실패 조건이 아닙니다.
개별 기록 단위의 특성 표는 원본 행을 그대로 모델 입력으로 쓰지 않습니다. 집계 계획이 고정값과 시간별 특성을 정하고, 가공한 표는 4,000행과 모델 입력에 사용하는 특성 133개를 유지합니다. 결측값은 학습 데이터에 맞춰 설정한 전처리 절차에 따라 처리하며, __missing 열에는 원래 측정값이 없었다는 사실을 남깁니다.
원본·가공 데이터의 이상은 모두 같은 실패가 아닙니다. 즉시 중단할 규칙 위반과 더 조사할 신호, 구조 검증 성공을 구분합니다.
| 확인한 상황 또는 규칙 | 예시 | 해석하는 방법 |
|---|---|---|
| 원본 관측값 | 기록마다 관측 행과 측정 항목 수가 다름 | 데이터가 수집된 방식을 살펴볼 단서입니다. |
| 원본 결측 표식 | Height=-1, Weight=-1 |
결측 상태를 조사할 신호입니다. 자동 실패는 아닙니다. |
| 원본 데이터 규칙 위반 | 기록 수, 식별자, 관찰 시간 위반 | 원본 적재 범위가 깨졌으므로 모델 비교를 멈추고 데이터 담당자에게 알립니다. |
| 가공 데이터 규칙 위반 | 열 구조, target, 결측 표시값 위반 |
모델 입력 규칙이 깨졌으므로 기존 품질 지표로 현재 상황을 설명하지 않습니다. |
| 검증 성공 | Great Expectations(GE)를 이용한 원본 데이터와 가공 데이터 점검 성공 | 확인한 구조가 규칙을 통과했다는 뜻입니다. 배포 가능 여부를 말해 주지는 않습니다. |
결측값, 이상치, 라벨과 클래스 구성 확인¶
데이터 품질 문제는 발견 즉시 행이나 열을 삭제하라는 지시가 아닙니다. 먼저 어떤 규칙에서 벗어났는지, 실제 오류인지 수집 특성인지, 모델 평가에 어떤 영향을 줄 수 있는지를 나누어 확인해야 합니다.
위험을 확인하는 목록
- 결측값은
-1표식과__missing열에서 추적합니다. 결측이 있다는 사실만으로 실패로 결정하지 않습니다. - 이상치 후보는 관측 행 수의 IQR로 찾습니다. 범위 밖이라는 사실은 원본 오류나 삭제 대상으로 확정됐다는 뜻이 아닙니다.
- 라벨 구조는
target의 결측, 허용하지 않은 값, 중복record_id를 점검합니다. - 클래스 구성은
low_risk3,446건과high_risk554건을 함께 기록해 정확도 단독 해석을 막습니다.
현재 가공 데이터에서 라벨 결측, 허용값 위반, 중복 식별자는 각각 0건입니다. 이는 정답 연결 구조가 규칙에 맞는다는 뜻이지, 모든 정답의 현실적 타당성을 검증했다는 뜻은 아닙니다.
현재 확인값을 판단 기준과 대조한 뒤, 다음 단계에서 무엇을 더 확인할지 정합니다.
| 확인 항목 | 현재 실습에서 보는 값 | 판단 기준 | 다음 단계에 미치는 영향 |
|---|---|---|---|
| 결측값 | -1 표식과 특성별 __missing 비율 |
처리 규칙과 결측 표시가 일관되는가 | 실제 API 입력도 같은 방식인지 확인 |
| 이상치 후보 | 기록별 관측 행 수의 IQR 탐색 범위와 범위 밖 기록 수 | 원본 수집 특성인지 규칙 위반인지 구분했는가 | 자동 삭제하지 않고 원본 확인 후보로 기록 |
| 라벨 구조 | 결측, 허용하지 않은 값, 중복 식별자 수 | 모두 0건이며 target이 0 또는 1인가 |
혼동 행렬을 계산할 최소 구조 확인 |
| 클래스 구성 | low_risk 3,446건, high_risk 554건 |
관심 클래스 표본 수를 지표와 함께 기록했는가 | 정확도 단독 해석을 피하고 FP/FN 확인 |
클래스 구성이 치우쳐 있으므로 2장에서는 정확도만으로 후보를 고르지 않습니다. 정밀도, 재현율, FP와 FN을 함께 보고, 각 후보가 놓침을 줄이는 대신 불필요한 알림을 얼마나 늘리는지 배포 기준과 대조합니다.
한 관측이 모델 입력이 되는 과정¶
원본의 숫자는 레코드, 시간, 항목과 묶어야 의미가 생깁니다. 00:07 / HR / 73은 해당 레코드에서 7분 시점에 기록된 심박 측정값입니다. Value 열의 숫자만 모으면 심박과 다른 항목이 섞이므로 평균을 계산해도 같은 물리량의 평균이 되지 않습니다. 4,000개 레코드와 시간별 관측 1,753,980행은 다른 분모이며, 반복 관측을 독립된 사람 수로 세지 않습니다.
결측 표식을 실측값처럼 계산하면 통계량부터 달라집니다. 이 데이터 계약의 -1.0은 측정되지 않았음을 표시하므로, 유효값을 집계하기 전에 결측으로 해석합니다. 이후 같은 레코드와 항목의 유효한 여러 시점 값을 최소, 최대, 평균, 마지막 값, 관측 수 등 정해진 규칙으로 요약합니다. 항목에 따라 합계도 사용하므로 집계 규칙을 함께 확인합니다. 0~2,880분은 첫 48시간의 관찰 범위로서 모델 성능 합격선이 아닙니다.
결측 보존과 결측 대치는 다른 단계입니다. 가공 특성에서 height__missing과 같은 표시는 원래 값이 없었다는 사실을 남깁니다. 모델 학습 파이프라인은 수치형 결측을 train에서 구한 중앙값 등으로 채우고, valid와 test에는 학습해 둔 변환만 적용합니다. 채워진 값이 같아도 실제로 관측한 값인지 대치한 값인지 구분할 수 있어야 하며, 대치 규칙을 바꾸면 모델 입력과 재현 조건도 바뀝니다.
정답 연결은 값의 유효성 검사와 별도로 확인해야 합니다. 올바른 값끼리라도 다른 레코드의 target을 붙이면 모델은 존재하지 않는 관계를 배우고 평가도 잘못된 답으로 채점합니다. ID의 누락, 중복, 조인 전후 행 수와 연결되지 않은 행을 검사합니다. 형식 검사를 통과했다고 정답의 의미적 정확성까지 증명되는 것은 아니므로, 값 검사와 관계 검사를 구분해 남깁니다.
이상치 기준은 조사 대상을 고르는 기준이며 자동 삭제 지시가 아닙니다. 사분위범위(IQR)는 Q3 - Q1, 즉 가운데 50%의 범위입니다. 보통 Q1 - 1.5 × IQR 아래와 Q3 + 1.5 × IQR 위를 후보로 찾지만, 극단적인 실측값과 단위 오류는 다르게 처리해야 합니다. 이 과정의 노트북은 레코드별 관측 행 수의 IQR을 확인합니다. 그 경계를 모든 생체신호 측정값의 허용 범위로 사용하지 않습니다.
데이터 분할의 역할과 개정 이력¶
이전 분할의 역할별 건수는 2,400 / 600 / 600 / 400입니다. 공식 배포 판단에서는 이 분할 정보를 최종 평가에 다시 쓰지 않고 별도 개정본을 만들었습니다. 새 test 400건은 과거 operational 대상 집합에서 왔고, operational 100건은 정답 없이 API를 점검할 입력입니다.
이 변경은 새 분할이 더 좋은 데이터라는 뜻이 아닙니다. 최종 평가 데이터는 이 개정본에서 한 번만 사용하고, 운영용 입력은 정답 없이 API 규칙을 확인하도록 역할을 나눈 것입니다. 따라서 이 장의 노트북에서는 현재 분할 정보를 기준으로 해석합니다.
자주 섞이는 해석은 다음과 같이 바로잡아 기록합니다.
| 혼동하기 쉬운 해석 | 문제가 되는 이유 | 보고서 문장 예시 |
|---|---|---|
이전 test 600건의 결과를 현재 품질 지표라고 해석 |
공식 테스트는 400건으로 구성된 별도 개정본입니다. | “공식 모델 평가는 현재 분할의 최종 평가 데이터 400건을 사용했다.” |
operational 입력으로 새 품질 지표를 계산 |
operational 100건에는 target이 없습니다. |
“운영 신호는 실행 환경과 입력 상태를 조사하는 자료이며, 정답 기반 모델 지표는 아니다.” |
| 데이터 검증 성공을 모델 승인으로 씀 | GE는 원본과 가공 데이터의 구조만 점검합니다. | “데이터 검증은 평가에 쓸 데이터 범위를 확인하며, 모델 승인은 2장의 사전 기준으로 판단한다.” |
데이터 검증 결과의 해석 범위¶
데이터 구조 검증 성공은 평가에 쓸 입력 범위가 규칙과 맞는지 보여 줄 뿐, 최종 평가나 모델 승인 근거가 되지는 않습니다. 이 교재에서 제공하는 실행 환경에서 labs/run/validate_data.py는 원본 적재 8개, 가공 데이터 준비 57개의 검증 항목을 모두 성공으로 기록했습니다. 이 숫자는 원본 데이터와 가공 데이터의 구조를 점검한 결과이며, V2 분할 역할은 docs/evidence/data-v2/split-revision.json에서 따로 확인합니다. 이 명령으로 최종 평가 데이터를 사용했거나 모델 정책을 다시 계산했다고 해석해서는 안 됩니다.
노트북의 대표 값은 데이터 규칙이 지켜진 범위와 아직 모르는 것을 가르는 근거입니다. 각 값에서 확인한 사실과 아직 모르는 것을 구분합니다.
| 확인한 값 | 확인한 사실 | 아직 모르는 것 |
|---|---|---|
4,000행 / 특성 133개 / 교육용 target 554건 |
원본에서 가공 데이터로 만든 대상 집합의 구성이 규칙과 맞는지 | 교육용 위험도 분류 예시가 실제 서비스 판단에 충분히 정확한지 |
height__missing 47.35%, lactate__missing 45.43% |
결측 상태를 실제 API 입력 상태와 따로 살펴볼 필요가 있는지 | 해당 특성을 즉시 삭제해야 하는지 |
| 최대 시각 48시간 | 원본 관찰 시간이 규칙과 맞는지 | 이후 실제 서비스 요청도 같은 시간 범위를 쓰는지 |
보고서에 기록할 내용¶
보고서의 데이터 품질 근거에는 모델 비교에 쓴 범위와 운영에서 아직 모르는 범위를 함께 남겨야 합니다.
- 확인한 사실: 실행한 분할 정보, 4,000/133/554 구성, GE 원본·가공 데이터 검증 결과를 적습니다.
- 확인한 범위: Candidate A와 Candidate B를 비교한 데이터 범위를 적습니다.
- 아직 모르는 것: 실제 API 입력 상태, 품질 지표 변화의 원인, 대상 환경의 모델 식별정보를 적습니다.
- 다음 장으로 넘길 것: 같은 분할과 최종 평가 데이터 범위에서 후보 모델의 보호 기준을 확인합니다.
6교시에 확인할 후보별 APPROVE 또는 HOLD 판단도 이 범위 안에서만 설명할 수 있습니다. 다음 장에서는 이 데이터를 그대로 전제로 모델 승인 판단을 기록합니다.