감염 전파 사슬 : 그래프 분석을 사용하여 연결 파악
감염 전파 사슬/연결고리 (체인) : 그래프 분석을 사용하여 연결 파악
Amanda Morris
블로그, 그래프 데이터베이스, 의료
Simon Sinek의 WHY, HOW, WHAT골든 서클을 소개합니다.
이 프레임워크에 대해 더 자세히 알아보려면 그의 웹사이트를 확인하세요.
WHY로 시작하기: 동기와 목적
이 문서에서는 접촉 추적 분석의 이유를 다루지 않지만, 39분의 시간이 있다면 Tomas Peueyo가 코로나 바이러스에 대해 쓴 기사(테스트 및 접촉 추적을 수행하는 방법)를 읽어보시길 강력히 권장합니다.
"코로나바이러스 : 테스트 및 접촉 추적을 수행하는 방법"에 대한 요약: 대부분의 국가는 COVID-19에 대한 정확한 대응을 제공하는 능력이 제한적이기 때문에 COVID-19의 확산을 늦추기 위해 ‘해머’ 접근 방식을 취해야 합니다(본질적으로 모든 사람을 집에 가두고 여행을 제한하는 것). 하지만 이것은 지속 가능한 솔루션이 아닙니다.
우리는 무엇을 할 수 있을까요? 우리는 전략, 기술 및 사람의 개입을 결합하여 이 문제를 해결할 수 있습니다. 이 기사에서 우리는 궁극적으로 경제가 안정되고 반등할 수 있는 효과적인 해결책인 WHAT으로 이어질 기술적 접근 방식에 대해 논의할 것입니다.
방법 탐색(프로세스, 취해야 할 특정 조치)
HOW를 볼 때 한국보다 더 멀리 볼 필요가 없습니다. 몇 주 만에 한국은 Tomas Peueyo의 표현대로 ‘댄스(Dance)’ 단계에 들어갈 수 있었습니다 (WHY글에서 사용된 내부 용어). 본질적으로 한국은 HOW를 규정함으로써 감염자 수를 줄일 수 있었습니다.
HOW는 세 부분으로 나눌 수 있습니다.
파트 1 : 데이터 수집 – 데이터 수집 방법
파트 2 : 데이터 모델링 – 데이터를 실행 가능하게 만드는 방법
파트 3 : 데이터 분석 – 데이터에 대한 통찰력을 도출하는 방법
1부 데이터 수집
한국은 CCTV, 신용카드 거래, 대중교통 카드 이용, 출입국 및 건강 기록 등의 데이터를 이용했습니다. 이 데이터가 수집되면 의료, 정부 및 공공 소비를 위해 배포하였습니다.
이미지 출처: 한국의 코로나19 대응을 위한 정보 기술 기반 추적 전략
한국은 데이터를 모델링하고 데이터에 대한 그래프 분석을 실행할 때 일어나는 마법을 보여주기 위해 풍부한 데이터를 제공합니다.
이용 가능한 가장 가까운 ‘오픈 소스’ 데이터 세트(KCDC 데이터)는 질병관리본부에서 제공한 것으로 김지후님이 발표했습니다.
탐색할 데이터 파일은 다음과 같습니다.
- PatientInfo.csv - 개별 환자에 대한 기록(이에 국한되지 않음)으로 patient_id, sex, birth_year, symptom_onset_date, confirmed_date, released_date, diseasem city, provience, country, infected_by, & case 등을 포함합니다.
- PatientRoute.csv – 개인의 이동 경로에 대한 기록(이게 국한되지 않음)으로 patient_id, latitude, longitude, location_type 등을 포함합니다.
- Case.csv – 연결된 개인 정보를 포함합니다.
이제 검토할 데이터가 있으므로 인사이트(Insight)를 찾을 수 있도록 해당 데이터를 모델링하는 방법을 살펴보겠습니다.
2부 데이터 모델링
데이터 모델링을 할 때 두 가지를 살펴보고자 합니다.
- 첫 번째는 데이터 자체를 살펴보는 것입니다. 이것의 주요 목적은 기본적인 이해를 얻고 데이터로 할 수 있는 것과 할 수 없는 것이 무엇인지 스스로에게 질문해 보기 시작하는 것입니다.
- 두 번째는 데이터를 특정 방식으로 배열함으로써 도출될 수 있는 질문을 생각해 보는 것입니다.
첫 번째 부분은 1부에서 살펴보았지만 두 번째 부분 에서는 눈에 띄는 두 가지 요소가 있었습니다.
요소 1
가장 눈에 띄는 특정 데이터는 INFECTED_BY였습니다. 이것은 한국 당국이 누가 누구를 감염 시켰는지 추적하고 확인했다는 것을 의미합니다. 이것은 ‘감염 연결고리’를 생성합니다. 간단히 말해서 바이러스가 숙주를 감염시키는 경로를 만듭니다.
요소 2
눈에 띄는 다른 흥미로운 데이터 요소는 개인이 이동한 기록의 네 가지 요소(INDIVIDUAL, TIMESTAMP, LATITUDE, LONGITUDE)가 있는 PatientRoute 데이터였습니다.
그래서 저는 이런 생각을 하게 되었습니다.
한국 정부가 다른 사람들을 감염시킨 사람들을 추적한 것은 알지만, 아직 발견되지 않은 감염연결고리가 있을까요?
그렇다면 이러한 인사이트(Insight)을 얻기 위해 데이터를 모델링 하는 방법은 무엇일까요?
이를 모델링 하는 방법의 중요한 부분을 자세히 살펴보겠습니다.
그러나 계속 진행하기 전에 그래프 데이터베이스에서 여러분들이 들어 본 적이 없는 몇 가지 용어가 있습니다.
스키마 : 데이터가 내부적으로 어떻게 연관되어 있는지를 설명합니다. 이 스키마의 또 다른 중요한 요소는 그래프가 데이터를 로딩할 때 모든 요소가 조인된다는 ‘우선 조인’ 접근 방식을 취한다는 것입니다. 이것은 NO JOINS를 의미합니다. 스키마는 데이터를 찾기 위해 따라야 할 MAP으로 생각하십시오.
속성(Attribute) : 롤업(roll up)되는 객체를 정의하는 요소입니다. 빨간색의 사과가 좋은 예 입니다. 이 예제에서 사과의 색상(속성)은 빨간색(값) 입니다.
엣지(Edge) : ‘관계’라고도 하며 사물이 서로 어떻게 관련되어 있는지를 설명합니다. 그래프에서 일부 관계는 많은 특성이나 속성을 가질 수 있습니다. 이 경우 그래프는 속성 그래프가 됩니다.
버텍스(Vertex) : 때때로 ‘노드’라고도 하는데, 다른 데이터 객체와 여러 관계를 갖는 객체입니다. 이러한 데이터 객체는 여러 속성을 보유할 수도 있습니다.
이제 다시 그래프 모델링 이야기로 돌아가 보겠습니다.
환자 - (INFECTED_BY) -> 환자
그래프에서 데이터를 모델링 하는 것은 생각보다 간단합니다. 여기 아래에 ‘환자’(버텍스)가 있고 ‘환자’(버텍스)에 연결된 ‘INFECTED_BY’라는 ‘엣지’가 있습니다.
이 연결은 단순히 환자가 다른 환자와 관계를 가질 수 있으며 이 관계는 해당 환자가 감염되었음을 나타냅니다.
자세히 보면 ‘INFECTED_BY’ 엣지가 다음과 같습니다.
또 다른 측면은 버텍스, 바로 ‘환자’입니다. 위에서 버텍스는 속성을 가질 수 있다고 이야기 하였습니다. 이것은 다음과 같은 예를 보여줍니다.
환자 – (PATIENT_TRAVELED) – TravelEvent
위에서 우리가 스키마에 나타낼 데이터 요소 즉, INDIVIDUAL, TIMESTAMP, LATITUDE, LONGITUDE를 어떻게 보았는지를 떠올리세요. 우리는 양자의 존재를 완전히 이해하지 못하기 때문에 한 사람이 동시에 두 장소에 있을 수 없다고 가정해 봅시다.
이러한 가정을 통해 위도 + 경도 + 날짜 속성을 사용하여 TravelEvent로 고유한 ID를 만들 수 있습니다.
그런 다음 해당 고유ID를 환자ID로 사용하고, ‘PATIENT_TRAVLED’라는 엣지를 할당해 보겠습니다. 스키마와 관련하여 다음과 같이 보일 것입니다.
또한 TravelEvent라는 버텍스의 실제 속성을 추가하는 것을 잊지 마십시오.
환자 – (BELONGS_TO) – InfectionCase
알 수 없는 환자와의 연결을 발견하게 할 수 있는 또 다른 요소는 감염 사례 데이터를 기록하는 것입니다. 이 데이터는 유치원, 교회, 헬스장, 콜 센터 등 알려진 핫스팟에 표시됩니다. 우리는 이미 환자를 모델링 했으므로 이 마지막 부분은 환자와 알려진 ‘InfectionCase’ 간의 연결을 추가하는 것입니다.
다시, 우리는 InfectionCase에 할당된 이름을 포함하는 infection_case와 같은 몇 가지 속성을 추가하고자 합니다.
이 모든 것을 종합하면, 아래와 같은 스키마를 얻을 수 있습니다. 저는 이 데이터에 time-tree, Day, Month, Year, City, location-tree, Province, Country와 같은 몇 가지 항목을 자유롭게 추가하였습니다.
3부 데이터 분석
이 시점에서 우리는 사용 사례와 관련된 데이터를 찾고 탐색했습니다.
그리고 이 데이터를 어떻게 사용하고 싶은지 생각해봤으며, 그리고 데이터 모델링을 수행 했습니다. 이제는 데이터를 이해하려고 합니다. 우리가 계획한 작업을 수행하고 알 수 없는 연결을 발견해 낼 수 있을까요? 대답은 Yes입니다.
미적 감각으로 바라보지는 말아 주시고요. 우리는 우리가 탐구하고 싶은 영역과 관련된 패턴을 뽑아 내는 일을 하는 것이고 그것을 아래와 같이 해냈습니다. 다음은 데이터 조감도입니다.
쿼리 1 edgeCrawl
정확한 쿼리를 알고 싶다면 방법을 보여 드리겠습니다. 위에서 언급한 엣지를 선택하고 Accumulator에 추가하는 것은 매우 간단합니다. Accumulator를 고유한 기능을 수행할 수 있는 것들의 모음 정도로 생각하십시오.
CREATE QUERY edgeCrawl()FOR GRAPH MyGraph {
/**************************************
* S1 = 환자가 감염시킨 모든 환자 찾아내기
* S2 = 알려진 사례에 해당하는 모든 환자 찾아내기
* S3 = 같은 시간에 같은 장소에 있던 모든 환자 찾아내기
*
* Return all EDGEs
***************************************/
ListAccum<EDGE> @@edgeList;
seed = {Patient.*};
S1 = SELECT s
FROM seed:s -(INFECTED_BY:e)-> :t
ACCUM @@edgeList += e;
S2 = SELECT s
FROM seed:s -(BELONGS_TO_CASE:e)- :t
WHERE t.id NOT IN ("etc", "contact with patient", "overseas inflow")
ACCUM @@edgeList += e;
S3 = SELECT s
FROM seed:s -(PATIENT_TRAVELED:e)- :t
WHERE t.outdegree("PATIENT_TRAVELED") > 1
ACCUM @@edgeList += e;
PRINT @@edgeList;
}
우리가 찾던 답이 바로 보입니다!
다른 사람과 같은 장소, 같은 시간에 함께 있는 사람을 기반으로 연결을 찾을 수 있나요? 보이나요? 누가 환자 1000000069를 감염시켰나요?
나는 여러분이 이 질문의 정답을 찾을 수 있다는 것을 알고 있기 때문에 직접 답을 말할 필요가 없다는 것을 알고 있습니다.
대규모 감염 연결고리
다음으로 증상 시작 일자(symptom_onset_date)의 datetime 속성을 사용하는 쿼리를 작성해 보겠습니다. 이것이 흥미로운 점은 무엇일까요? 그것은 사람들이 처음 증상이 나타났을 때이고 우리는 개인의 잠복기를 계산할 수 있습니다.
이를 통해 우리는 주어진 환자를 탐색하고, 그 사람들이 감염되어 증상이 있는 기간 동안 다른 곳으로 이동한 모든 사람들을 찾을 것입니다.
모든 사람들에 대해서 증상 발병에 따라 이 프로세스를 반복하고 위에서 언급 한 기준에 맞는 사람들을 모두 처리할 때까지 프로세스를 계속 반복합니다.
이것은 바이러스가 이동했을 수 있는 감염 연결고리를 제공하는 것입니다.
환자 4100000006을 입력하면 다음과 같은 결과를 얻을 수 있습니다.
데이터 요소 간의 모든 관계를 파악하는 것은 분명 너무 어렵습니다. 그래서 조금 확대해 보았습니다.
이제 무엇이 보이나요? 우리 눈앞에 같은 시간에 같은 곳으로 이동한 수많은 환자들의 사례가 보입니다.
환자 4100000036, 4100000043, 4100000006
감염된 환자 4100000056, 4100000038, 4100000007
한국의 질병관리본부는 이를 확인된 감염 사례로 추적하지 않았음에도 불구하고, 이는 사실일 가능성이 높다는 것은 분명합니다.
WHAT에 대한 결론
이제 WHY와 HOW, WHAT이 무엇인지 알게 되었습니다.
이제 내가 아는 것을 알게 된 여러분은 무엇을 할 것인가요?
여러분의 의견을 알려주세요. 여러분의 생각을 듣고 싶습니다!
그래프 보기 탐색
더 확대하면 모든 데이터가 살아나는 것을 볼 수 있고 한 개인에서 다른 개인으로의 연결이 보이기 시작합니다. 여기서 흥미로운 데이터의 포인트는 한 환자가 헬스장1에 갔다가 헬스장2로 갔다는 것을 볼 수 있다는 것입니다.
한 헬스장에서 감염되어 다른 날 다른 헬스장으로 옮긴 걸까요?
제가 현재 보고 있는 이것을 ‘그래프 탐색’이라고 하며 흥미로운 데이터를 찾을 수 있는 매우 유용한 기능입니다.
시도할 수 있는 한 가지는 유사한 패턴을 가진 다른 모든 환자를 찾는 것입니다.
이 키트(Kit)는 tgcloud.io 에 게시되었으며 누구나 자신의 인사이트를 발견하고, 쿼리를 작성하고, 자신의 데이터를 추가할 수 있습니다. 무료 인스턴스의 하드 드라이브 여유 공간이 부족할 때까지 무한하게 시도해 볼 수 있습니다.
출처
한국의 코로나19 대응을 위한 정보 기술 기반 추적 전략
자료 출처 한국 질병관리본부
다음 단계
지금이 TigerGraph를 시작하기에 이상적인 시기입니다. 매주 열리는 라이브 데모 중 하나에 참석하거나, 여러분의 비즈니스에 맞춤형 데모를 요청할 수 있습니다.
라이브 데모 참석: https://www.tigergraph.com/live-demo/
맞춤형 데모 요청: https://www.tigergraph.com/request-a-demo/
https://www.tigergraph.com/blog/infection-chains-discovering-the-unknown-using-graph-analytics/