★ 최종 프로젝트 - FDA 이상반응 데이터 활용한★

[QA/QC_5기] 94일차 - 최종 프로젝트 +21 : 중간 결과물 피드백 - 튜터 | 대시보드 Ⅲ - 수정

qc-standard 2026. 7. 28. 22:04

2026/07/22. WED

 중간 결과물 피드백 - 튜터
   └ 튜터님 피드백 개선 및 점검
 대시보드
   └ 머신러닝 사용 여부 논의
   └ 대시보드 수정


 최종 프로젝트 - 프로젝트 전반 개선 및 점검

0. 전날 진행 상황

     튜터님 면담 후 대시보드 수정아세트아미노펜 계열 시각화+통계분석+인사이트

    ○ n8n 워크 플로우 수정

    ○ 머신러닝 사용 여부 논의 예고


1.  중간 결과물 피드백 - 프로젝트 전반 개선 및 점검

피드백

  1. 종합 피드백
    • (TO-BE) 일반의약품 정보 격차 해소 시스템 제공
      • 일반 의약품의 이상사례 보고를 바탕으로 맞춤형 일반 의약품 안정정보를 제공하는 시스템 구축
        • Input: 연령/성별/복용 중 일반의약품 정보
          →큰 개념을 어떻게 입력 받겠다는 건지 명확하지 않음
          • 일반 의약품 정보: A, B, C
        • Output: 부작용 정보복용 주의사항
          →큰 개념을 어떻게 입력 받겠다는 건지 명확하지 않음
      • 일반의약품의 ATC 분류, 성분, 제형별 분석
        →분석을 통해 어떤 인사이트를 도출하겠다는 건지 불명확 / ATC 분류, 성분, 제형별을 어떤 방식으로 분석하겠다는 건지 분석 방향에 대한 내용이 보고서에 명시되어 있지 않음
        • 가설/주제: A, B, C
      • 연령/성별/체중/병용약물에 따른 이상반응 차이 확인
      • 소비자와 유사한 조건의 이상반응주의 요인 도출
        →유사하다는 것을 어떻게 정의할 것이며 / 주의 요인을 어떻게 제공할 것인지 방법이 보고서에 없음 / 유사성을 나눌 수 있는 바식으로 어떤 걸 선택했는지에 대한 과정의 고민이 없음
        • 소비자의 유사성을 산출하기 위한 접근 방법 A, B, C
      • 의약품 안전정보 제공
        →소비자의 유사성을 산출하는 방법론을 구체적으로 세우고 뻗어나가는 게 보고서 상에 없음 / 프로젝트 수행 과정에 대한 내용이 없으며 / 분석 예시로 모든 걸 가려버림 / 큰 개념을 어떻게 입력 받겠다는 건지 명확하지 않음
    • (AS-IS) 기존 '내가 먹는 약 한눈에' 서비스와 본 정보 격차 해소 시스템 간의 차별점 및 경쟁 우위를 구체적으로 비교 분석해야 함
    • 특히 ‘이상반응 차이 확인’, ‘유사한 조건의 이상반응’, ‘주의 요인 도출’, ‘안전정보 제공’ 등 추상적으로 기술된 핵심 키워드를 사용자 시나리오나 데이터 기반의 명확한 기능 정의로 구체화하여 보완 필요

개선 : 왜? 어떻게? 중심으로 생각하기

💬소비자와 유사한 조건의 이상 반응과 주의 요인 도출 방법 + 안전 정보 제공 방법

○ 각 의약품 그룹별 시각화 분석 인사이트 정리
일반의약품 / WHO ATC 코드 / 각 코드 내 의약품 그룹화 → 3단계로 나누어진 인사이트를 JSON 파일로 정리
소비자의 input (나이, 성별, 의약품명(브랜드)) 를 받고,
그에 관련된 시각화 인사이트 분석 결과를 JSON 파일에서 찾아 주는 형식
n8n 워크플로우를 활용하여 openai api 연결 및 사용 → 자연스러운 주의 사항 설명 가능

유사한 조건의 이상반응

  • 유사한 그룹의 의미
    • 동일 의약품 또는 동일 약물군 내에서 소비자의 연령 · 성별조건과 대응되는 분석 집단 (사전에 정의된 범주 간 조건 일치도를 의미)
    • 연령 유사성 기준

  • 연령 유사성 기준
    연령 유사성은 입력 나이의 절대적인 숫자 차이가 아니라, 사전 시각화 분석에서 사용한 동일 연령 구간(사용자의 연령이 26,동일한 연령이 없을 경우 20대로)에 포함되는지를 기준으로 판단
  • 성별 유사성 기준
    동일값 일치를 기준
    • 여성 입력 → 여성 분석 인사이트
    • 남성 입력 → 남성 분석 인사이트
    다만 성별에 따른 차이가 실제 분석에서 확인된 경우에만 해당 인사이트를 사용. 성별 분석 결과가 없거나 차이가 미미하면 성별을 무시하고 해당 의약품의 전체 결과를 제공
  • 유사 조건 판단 방법
    유사도 점수를 계산하지 않고 다음과 같은 규칙기반 계층적 검색 방식을 사용
    : 추후 수정될 수 있음
    • 매칭 1순위: 동일 성분 + 동일 연령대 + 동일 성별
    • 매칭 2순위: 동일 성분 + 동일 연령대
    • 매칭 3순위: 동일 성분 + 동일 성별
    • 매칭 4순위: 동일 성분 또는 동일 세부 의약품군
      인구학적 차이가 없거나 관련 분석이 없는 경우 해당 의약품의 공통 인사이트를 제공
    • 매칭 5순위: 동일 WHO ATC 대분류
      성분 단위의 분석이 없을 경우 상위 약물계통의 인사이트를 사용
    • 매칭 6순위: 보편적인 복용 주의사항
      해당 의약품 또는 그룹에 특별한 시각화 인사이트가 없는 경우 openFDA 기반 복용 주의사항만 제공
    • 매칭 실패 : 입력한 의약품이 데이터 또는 참조표에 존재하지 않는 경우
      유사한 약이라고 임의로 추정하지 않고 다음과 같이 고지.
      입력하신 의약품은 현재 분석 데이터에 포함되어 있지 않아 이상사례 기반 맞춤정보를 제공하기 어렵습니다. 제품 포장이나 공식 의약품 정보를 확인하고 약사에게 문의해 주세요.

n8n 워크플로우

소비자의 입력을 받아 관련 데이터를 찾고 여러 근거를 조합하는 역할
  1. 가장 먼저 의약품에 맞는 인사이트 파악 및 참조
  2. 나이 / 성별에 따른 차이가 있었다면, (시각화 과정에서 유의미한 차이를 발견했더라면) 이에 따른 인사이트 참조
  3. csv 파일의 보편적으로 알려진 일반 복용 주의사항을 함께 참조하여 소비자에게 전달할 정보 취합 (일반적인 경우, 여기까지)
  4. 만약 해당 그룹에 특별한 시각화 인사이트가 없다고 한다면, (해당 의약품 분석 당시 소비자에게 설명해 줄 인사이트가 없었을 경우)
    보편적으로 알려진 복용 주의사항 출력
  5. 가지고 있는 데이터에 없는 의약품이 입력되었을 경우, 데이터의 한계를 인정하고 소비자에게 고지

왜 openai api를 활용했는지?

→ 나이 / 성별 / 의약품 명에 따른 모든 인사이트를, 소비자에게 전달해 줄 수 있는 형식으로 변경하여 정리하기에는 무리가 있음.
(+ 항상 같은 대답이 나온다면 경직되어 보일 수 있음)

input이 들어오면, 해당 정보와 관련 있는 인사이트를 JSON 파일에서 찾아낸 후
이를 소비자에게 전달하는 형식으로 바꾸는 것이 합리적

전체 처리 과정 요약

소비자 Input: 나이 + 성별 + 의약품명
            ↓
의약품명 표준화: 브랜드 → 성분 → ATC → 세부 약물군
            ↓
JSON에서 가장 구체적인 의약품 인사이트 검색
            ↓
해당 연령대 인사이트 존재 여부 확인
            ↓
해당 성별 인사이트 존재 여부 확인
            ↓
인사이트 선택
            ↓
openFDA 기반 일반 복용 주의사항 참조
            ↓
OpenAI API가 소비자용 문장으로 재구성
            ↓
소비자 카드 + 상세 설명 출력

💬 일반 복용 주의사항 도출 방법

  • openFDA API로 58개 성분 중 54개는 실제 OTC 제품 라벨을 실시간 조회, 4개는 대표 라벨이 없어 일반지식으로 요약해 참조표를 만들었다.
  • otc_fda_filtered_ATC.csv는 ATC코드(또는 코드 없는 행은 영문성분명)를 기준으로 참조표와 매칭해 20,355행 전부 붙였다.
  • FDA_adverse_events_final.csv는 WHO_ATC가 첫 글자만 있어 바로 매칭이 안 돼서, suspect_drug 텍스트를 기존 정규식 규칙으로 재분류해 전체 ATC 코드(도출_ATC코드)를 새로 만들었다.
  • 이 도출_ATC코드로 참조표를 조인해 18,273행 전부(100%) 매칭시켰다.

💬 분석을 통한 결과 도출 방식 및 결과

각 ATC 계열에 해당하는 의약품들을 성분별로 세부 분할,
시각화와 통계를 통한 유의미한 인사이트를 도출하고 추가적인 논문/기사로 뒷받침

ex ) 신경계(ATC N 코드) - 아스피린/아세틸살리실산 단일제 : 해당 성분은 항혈소판제
→ 출혈 발생의 경우 , 지혈을 방해하고 과다출혈로 이어짐 → 해당 성분의 의약품의 부작용 반응의 75.6%가 출혈 관련 증상

→ 나이를 고려하여 해당 부작용들과 비교한 결과 , 고령일수록 해당 부작용들의 보고 건수가 많으므로 주의 요망
→ 시스템을 사용하는 사람이 해당 성분을 섭취하는 고령이라면, 이러한 인사이트를 제공하는 방식 사용

💬 소비자의 입력 및 출력 시스템 내용

<Input>
  • 약품명 또는 증상
  • 오타("타이레놀" → "타이레놀정", "타레놀"), 별칭, 성분명/제품명 혼용에 취약할 것으로 생각되어
    임베딩 기반 유사도 검색(예: 한국어 문장 임베딩 + 코사인 유사도)을 넣어 오타·유사 표현도 잡아내는 형식으로 진행 예정
  • 나이 : 나이는 일반의약품의 사용 가능 여부와 주의사항을 바꿀수 있는 변수, 연령에 맞는 확인사항의 우선순위를 조정하는 용도로 사용가능
  • 성별 : 성별은 모든 결과를 다르게 만드는 절대적인 기준은 아니지만 임신가능성 등과 같은 특정한 필요 상황에서 추가 경고를 보여주기 위한 보조 정보로 사용 가능
<Output>
  • 입력조건 확인 카드
    • ex.) 24세 여성·50kg·판콜 복용 예정
    • 만든 이유: 소비자가 결과가 어떤 입력을 기반으로 만들어졌는지 확인하고 잘못된 값이 있다면 수정하도록 하기 위해서 생성
  • 소비자 카드 : n8n 기반 맞춤형 이상사례 요약
    • ex.) 24세 여성의 판콜 관련 이상사례에서는 졸림, 어지러움 및 위장 불편 관련 반응이 우선적으로 확인됐습니다. 다른 감기약이나 해열진통제를 함께 복용할 경우 동일 성분의 중복 여부를 확인하세요.
    • 만든 이유: 전체 소비자에게 동일한 부작용 목록을 보여주는 대신, 소비자가 입력한 연령·성별·의약품 조건을 n8n으로 전달하여 해당 조건에 맞는 결과를 반환받기 위해서 생성

 


2. 머신러닝 사용 여부 논의

지금 "챗봇"과 검색 기능은 전부 규칙 기반이에요.
가장 아쉬운 지점은 두 곳입니다.
첫째, parseDrugsAnswer가 사용자가 입력한 약 이름을 DRUG_INDEX와 단순 문자열 포함(includes) 매칭만 해요. 오타("타이레놀" → "타이레놀정", "타레놀"), 별칭, 성분명/제품명 혼용에 취약합니다. 여기에 임베딩 기반 유사도 검색(예: 한국어 문장 임베딩 + 코사인 유사도)을 넣으면 오타·유사 표현도 잡아낼 수 있어요.
둘째, parseAgeAnswer/parseSexAnswer/answerFreeform이 전부 정규식 키워드 매칭이에요("부작용|이상반응", "임산부|임신" 같은 패턴). 사용자가 패턴에서 벗어난 표현으로 물으면 "이해 못함" 상태가 됩니다. 이 자유 발화 처리 부분을 소형 의도분류(intent classification) 모델이나 LLM 기반 파싱으로 바꾸면 훨씬 자연스러운 대화가 가능해요.
그 외에 추가하면 좋을 기능들:
증상 설명을 자유 텍스트로 받아서 관련 약 카테고리를 추천하는 기능 — 지금은 정해진 증상 카드(피부 가려움, 두통 등)만 클릭하게 되어 있는데, "속이 더부룩하고 자꾸 트림이 나요" 같은 문장을 텍스트 분류/유사도 매칭으로 증상 카테고리에 연결할 수 있어요.
약 사진으로 검색 — 사용자가 알약이나 약 포장 사진을 찍어 올리면 OCR + 이미지 분류로 제품명을 자동 인식하는 기능. 실물 약통을 안 알아보는 사용자에게 특히 유용할 것 같아요.
병용 위험도 스코어링 — 지금은 성분표 기반 규칙(표에 있으면 경고)인데, 나이·성별·복용 약 개수 등을 입력으로 받는 간단한 위험도 스코어(로지스틱 회귀 정도로 충분) 모델을 추가하면 "위험/주의/안전" 딱지보다 더 세밀한 개인화된 안내가 가능해요.
뉴스 자동 태깅/요약 — 지금 뉴스 리스트가 수동 큐레이션으로 보이는데, 텍스트 분류로 관련 성분·질환 태그를 자동으로 붙이거나 요약을 생성하면 유지보수 부담이 줄어요.

💬 머신러닝

K-Nearest Neighbors
사용자와 가장 가까운 K개의 이상사례 보고를 찾는 방식
예를 들어 다음과 같이 구성
입력 사용자 70세 남성, 디펜히드라민, 경구제, 복용약 4개 ↓ 유사도 계산 ↓ 가장 가까운 보고 사례 100건 선택 ↓ 상위 이상반응·심각 보고 비율·회복 확인 비율 집계
→ 의약품명과 성별은 유사도를 계산하는게 아니라 정해진 값과 일대일 대응이 되야하므로 굳이 필요없을듯, 원래의 방식 유지

일단 NO 머신러닝 →추후 좀 더 고민해보기


3. 대시보드 수정

   전체적인 대시보드 디자인 수정

     약 정보 수치 : % 말고 수치로 수정

    ○ 챗봇 프롬프트 수정(입력이 이상한 경우 - 답변 처리)

    ○ 폰트 수정

     마스코트 남발로 인한 웹페이지 무거워지는거 예방

 

   챗봇 기능

     의약품명 입력 후 다른 조작 막기

 

   약품명으로 검색하기 기능

     소비자들은 판콜, 챔프 - 브랜드명(상품이름)을 검색하지 슈도에페드린 - 성분명으로 검색하진 않음

    현 상황 : 타이레놀, 판콜만 잡아줌

       └ 수정 필요해 보임

     수정 방향 : 의약품 검색 리스트 생성 & 인사이트 성분과 연결하여 검색 가능하도록 & 의약품명 추가

       └ 의약품 안전 나라 + csv 파일 내 브랜드명 open ai - api 사용

       └ https://nedrug.mfds.go.kr/searchDrug?sort=&sortOrder=false&searchYn=true&ExcelRowdata=&page=1&searchDivision=detail&itemName=&itemEngName=&entpName=&entpEngName=&ingrName1=&ingrName2=&ingrName3=&ingrEngName=&itemSeq=&stdrCodeName=&atcCodeName=&indutyClassCode=&sClassNo=&narcoticKindCode=&cancelCode=&etcOtcCode=01&makeMaterialGb=&searchConEe=AND&eeDocData=&searchConUd=AND&udDocData=&searchConNb=AND&nbDocData=&startPermitDate=&endPermitDate=일반 의약품 브랜드명 파일 형태