데이터 · 2024

의료 데이터 품질 평가 데스크톱 프로그램

연구자별로 개발된 17종의 품질 분석 모듈을 하나의 Windows 앱으로 통합

연구자들이 각자 개발한 임상 데이터 품질 분석 모듈 17종을, 입력 형식과 실행 방식과 결과 표시를 통일한 하나의 데스크톱 프로그램으로 묶어 개발자가 아닌 사람도 CSV 두 개로 전 지표를 돌릴 수 있게 했습니다.

고객
연세대학교
분야
데이터
변수별 이상치 비율과 전체 분포를 보여 주는 범위 유효성 패널

개요

LYDUS는 임상 데이터를 연구나 분석에 쓰기 전에 그 데이터가 쓸 만한 상태인지 점검하는 Windows 데스크톱 프로그램입니다. 정형 데이터 13종과 비정형 텍스트 4종, 모두 17종의 품질 지표를 계산하고 결과를 화면과 파일로 내놓습니다.

지표를 계산하는 분석 로직은 연구자들이 각자 개발한 것입니다. 지표마다 담당자가 다르고, 통계 계산부터 머신러닝 모델, 언어 모델 판정까지 접근 방식도 서로 다릅니다. 이 프로젝트는 그렇게 따로 만들어진 모듈들을 입력 형식과 실행 절차, 결과 표시 방식이 하나로 맞춰진 응용 프로그램으로 묶는 작업이었습니다.

통합의 기준이 된 것은 두 개의 입력 테이블입니다. QUIQ 테이블은 관측값 하나가 한 행이 되는 긴 형식으로, 환자 번호, 변수 이름, 값, 기록 시각, 단위, 기록자, 정답값 등 16개 열이 고정되어 있습니다. VIA 테이블은 각 변수가 무엇을 뜻하는지 설명하는 사전입니다. 원본 테이블 구조가 기관마다 달라도 이 두 형식으로 변환해 넣으면 17개 모듈이 모두 같은 데이터를 받습니다.

21개 지표의 평가 결과를 한 화면에 모아 보여 주는 Overview 패널
Overview 패널

과제

모듈들은 각자 독립적으로 쓰여, 하나로 묶으려 할 때 맞지 않는 지점이 여러 곳이었습니다.

  • 반환 형태가 모두 다릅니다. 어떤 모듈은 DataFrame 하나를 돌려주고, 어떤 모듈은 DataFrame 두 개와 가중 평균 다섯 개가 든 튜플을 돌려주며, 변수 이름을 키로 하는 사전을 함께 내놓는 모듈도 있습니다. 공통 결과 타입이 없습니다.
  • 같은 입력을 다른 이름으로 봅니다. 일부 모듈은 받은 테이블의 열 이름을 자기 코드가 기대하는 이름으로 바꾼 뒤 계산합니다. 같은 열을 모듈에 따라 다르게 부릅니다.
  • 진행 상황을 각자의 방식으로 알립니다. 표준 출력에 직접 찍는 모듈, 진행률 표시줄을 쓰는 모듈, 아무것도 알리지 않는 모듈이 섞여 있습니다.
  • 중단을 고려하지 않았습니다. 분석 스크립트로 쓰일 때는 끝까지 돌리면 되므로, 중간에 멈추는 경로가 없습니다.
  • 실행 시간과 실패 조건이 다릅니다. 통계 지표는 수만 행을 바로 처리하지만, 언어 모델을 쓰는 지표는 레코드마다 API를 호출하므로 수 분이 걸리고 네트워크나 키 문제로 실패할 수 있습니다.

그리고 이 모듈들을 실행하려면 파이썬 환경을 갖추고 각 스크립트의 인자와 실행 순서를 알아야 했습니다. 데이터 품질을 확인해야 하는 사람과 모듈을 만든 사람이 같지 않다는 것이 통합의 이유였습니다.

해결 방법

모듈을 고쳐 쓰는 대신, 모듈은 계산에 집중하게 두고 그 위에 공통 실행기와 결과 화면을 올렸습니다.

메뉴에서 평가를 시작하면 설정 창이 열립니다. 여기서 QUIQ·VIA 파일과 OpenAI API 키를 지정하고, 지표별 파라미터를 조정합니다. 흩어져 있던 각 모듈의 인자를 한 화면에 모아 지표 이름으로 묶었습니다. 논리적 정확성의 대상 변수와 추천 변수 개수, 혼동 행렬의 최대 클래스 수, 범위 유효성의 박스플롯 개수, 시계열 변화점 탐지의 임계 배수와 최소 백분위수, 텍스트 다양성의 상위 N개 등이며, 비워 두면 기본값이 쓰입니다. 파일을 읽을 때 열 구성이 정해진 형식과 다르면 평가를 시작하기 전에 알려 줍니다.

QUIQ·VIA 파일과 지표별 파라미터를 지정하는 평가 설정 창
평가 설정 창

실행은 한 번입니다. 17개 모듈이 차례로 돌고, 각 모듈이 돌려준 서로 다른 형태의 결과는 지표별 패널이 자기 몫만 꺼내 씁니다. 패널은 전체 가중 평균, 분포를 보여 주는 차트, 변수 단위 표라는 같은 구성을 따르고, 표에는 검색이 붙어 있습니다. 모듈마다 다르던 출력이 화면에서는 같은 모양으로 보입니다.

변수별 이상치 비율과 전체 분포를 보여 주는 범위 유효성 패널
범위 유효성 패널

범위 유효성처럼 개별 값까지 확인해야 하는 지표는 변수를 선택하면 상한·하한 이상치 목록과 해당 변수의 분포를 따로 띄웁니다. 정답값이 있는 변수에는 정확도, 정밀도, 재현율, F1, AUROC를 함께 계산해 변수별로 비교할 수 있습니다.

정답값이 있는 변수들의 분류 지표를 비교하는 패널
분류 지표 패널

구현

통합 작업의 대부분은 모듈들의 차이를 응용 프로그램 쪽에서 흡수하는 일이었습니다.

서로 다른 반환값 다루기

지표 이름을 키로 결과를 받아 두고, 그 결과를 푸는 코드는 해당 지표의 패널과 저장 루틴에만 둡니다. 모듈이 돌려주는 튜플의 길이나 구성이 달라도 그 지식이 한곳에만 있으므로, 모듈이 바뀔 때 고칠 자리가 분명합니다. 저장 루틴은 지표별로 결과를 풀어 CSV와 차트 PNG를 하위 폴더에 쓰고, 어느 지표에서 어떤 파일이 나오는지를 한 파일에서 볼 수 있게 했습니다.

진행 표시와 중단

평가는 작업 스레드에서 돌고 UI 스레드는 계속 응답합니다. 진행 창은 17개 지표의 상태를 각각 회색·주황·초록·빨강 점으로 표시합니다. 모듈마다 제각각이던 출력은 표준 출력과 표준 에러를 창 안의 로그로 돌려 한자리에 모았습니다. 모듈을 고치지 않고도 각 모듈이 내부에서 찍는 진행 상황이 그대로 보입니다.

중단은 공유 Event 하나로 처리합니다. 모듈의 긴 반복문 안에 이 이벤트를 확인하는 호출을 넣어, 사용자가 중단을 누르면 다음 확인 지점에서 예외가 올라와 계산이 멈춥니다. 반복문 밖에서 강제로 스레드를 죽이지 않으므로 중간 상태가 깨지지 않습니다.

지표별 진행 상태와 실행 로그를 보여 주는 평가 진행 창
평가 진행 창

부분 실패 허용

모듈 하나하나를 try로 감싸, 실패한 지표는 빨간 점과 로그에 남은 트레이스백으로 표시하고 다음 지표로 넘어갑니다. 언어 모델을 쓰는 지표가 키나 네트워크 문제로 실패해도 통계 기반 지표의 결과는 그대로 남습니다. 결과 저장도 같은 방식이라, 일부 지표의 저장이 실패하면 나머지는 저장하고 실패 내역만 모아 한 창에 보여 줍니다.

모듈이 쓰는 기법

통합한 모듈들이 실제로 무엇을 계산하는지는 다음과 같습니다.

  • 범위 유효성은 IQR 기준으로 상·하한 이상치를 나눠 세고, 정밀성은 값의 끝자리 분포에 지니-심슨 지수를 적용해 실제 기록 단위를 추정합니다.
  • 클래스 다양성과 인스턴스 다양성도 지니-심슨 지수를 쓰되, 범주 변수와 환자 단위 반복에 각각 적용합니다.
  • 시계열 일관성은 연도별 값을 ARIMA로 한 걸음씩 예측하면서 예측 오차를 쌓고, 양옆 평균의 배수와 최소 백분위수 조건을 함께 만족하는 지점을 변화점으로 잡습니다.
  • 논리적 정확성은 대상 변수와 상관이 높은 변수를 언어 모델로 추천받고, 그래디언트 부스팅 분위 회귀와 분위 회귀로 정상 범위를 잡은 뒤 오토인코더 재구성 오차를 더해 벗어난 레코드를 찾습니다.
  • 정답값이 있는 변수에는 scikit-learn의 분류 지표와 ROC 곡선을 적용하고, 변수별 표본 수로 가중 평균을 냅니다.
  • 비정형 텍스트는 문서 종류별 서식 템플릿을 두고, 기록이 그 템플릿의 항목을 채우고 있는지 언어 모델로 판정합니다. 문장·어휘 다양성은 NLTK 토큰화와 품사 태깅으로 동사 구문과 명사를 뽑아 집계합니다.
변수별 심슨 다양성 지수와 범주 수를 보여 주는 클래스 다양성 패널
클래스 다양성 패널

배포

PyInstaller로 콘솔 창 없는 단일 배포 폴더로 묶었습니다. 파이썬 환경을 갖추지 않아도 실행할 수 있습니다. 모듈들이 끌어오는 오픈소스 라이선스 전문은 앱 안에서 바로 열어 볼 수 있게 메뉴에 넣었습니다.

결과

흩어져 있던 분석 모듈들이 하나의 프로그램에서 같은 절차로 돌아갑니다. 지표마다 스크립트를 열어 인자와 실행 순서를 맞출 필요가 없고, 어떤 설정으로 돌린 결과인지가 설정 패널에 그대로 남습니다.

모듈을 만든 사람이 아니어도 데이터 품질을 확인할 수 있게 되었습니다. CSV 두 개를 고르고 평가를 누르면 되고, 결과는 전체 요약에서 변수 단위, 다시 개별 이상치까지 좁혀 가며 볼 수 있습니다.

계산 모듈과 화면이 분리되어 있어, 지표를 더하거나 계산 방식을 바꿀 때 손댈 자리가 모듈과 해당 패널로 한정됩니다. 모든 지표의 계산 결과와 차트가 파일로 함께 저장되므로 평가 결과를 보고서나 후속 분석에 그대로 가져갈 수 있습니다.

사용 기술

  • Python
  • wxPython
  • pandas
  • scikit-learn
  • PyTorch
  • statsmodels
  • matplotlib
  • OpenAI API

화면

진행하려는 프로젝트가 있으신가요?

해결하려는 문제와 지금 상황을 알려 주시면, 어떤 방식이 맞을지 함께 검토합니다.

프로젝트 문의하기