Bayesian Network으로 해상사고 데이터를 분석해보자.

글쓴이 Inforience 날짜

클릭 >> Hello, world !! (from ShadowEgo)

들어가 보자.

딥러닝 기반의 모델들이 주목을 받기 전에는 Support Vector Machine, Decision Tree (Random Forest), Bayesian Networks 등과 같은 모델 또는 여러 모델들을 묶어서 활용하는 ensemble 방법론들이 기계학습 분야의 주전 멤버 역할을 했었다. 이러한 방법들 중에서, Graphical model 중의 하나인 Bayesian Networks은 classifier의 역할을 수행할 수 있을 뿐만 아니라, 데이터에 포함된 변수들 사이의 causal relationship을 파악할 수 있게 하고, 특정 변수들의 값이 확정(evidence)되었을 때 이것을 바탕으로 나머지 변수의 값을 inference(추론)할 수 있게 한다는 특징을 가지고 있다.

Bayesian network?

그림 1. 가상의 기계 동작 Bayesian network

그림 1은 기계가 동작하는 상황에서 측정할 수 있는 값들을 활용하여 학습한 가상의 Bayesian network을 나타낸다. 그림의 각 노드는 random variable이며, 고유의 hypothesis 및 그 hypothesis를 진실이라고 믿게 될 확률을 parameter로 담는다. 노드와 노드 사이를 연결하는 화살표(arc)는 hypothesis들 사이의 dependency를 나타내며, 직접 연결된 노드들과 간접적으로 연결된 노드들이 존재할 수 있다. 다른 노드로부터 화살표를 받지 않는 노드(그림 1의 ‘움직임’ 노드)는 prior probability를 parameter로 가지며, 다른 노드로부터 화살표를 받는 노드는 conditional probability를 parameter로 가지게 된다.

이 Bayesian network이 제대로 만들어진 거라면, 우리는 이것을 통해서 상황을 파악, 추론하는 것과 관련된 여러가지 작업을 수행할 수 있다. 예를 들어, 기계가 내는 소리에 대한 정보를 알면 기계의 수행기능을 추론할 수 있게 되고, 현재의 수행기능을 파악하게 되면 기계가 어떤 진동을 내고 있을 지 추론할 수 있게 되는 것이다. 재미있는 것은 소리 노드와 진동 노드 사이에는 직접적인 화살표(arc)가 없지만, 기계가 현재 내고 있는 소리에 대한 정보를 알게 되면 진동에 대한 정보를 추론할 수 있다는 점이다.

Inference?

Bayesian network의 구조는 도메인 지식을 가진 사람이 직접 만들 수도 있고, 수집된 데이터가 충분할 경우에는 structure learning을 통해 만들 수 있다. 또한 각 노드의 parameter들도 데이터로부터 학습할 수 있다. Bayesian network의 structure learning과 parameter learning에 대해서는 추후에 알아보기로 하고, 이번 포스트에서는 이미 학습이 완료된 Bayesian network에 inference 과정을 적용하면 무엇을 할 수 있을 지 알아보자.

Bayesian network에서의 inference는 특정 노드들에 해당하는 데이터가 확인되면 (evidence) 확인되지 않은 나머지 노드들의 값들을 추론해 내는 과정인데, 크게 나누어 Causal(Top-Down) inference와 diagnostic(bottom-up) inference로 구성된다. 노드와 노드 사이의 화살표 방향대로 inference를 하게 되면 – 그림 1에서 수행기능 정보를 바탕으로 진동 정보를 추론하는 경우 – 데이터가 확인되지 않은 노드의 값에 대한 belief를 casual inference를 통해 얻어내는 것에 해당하고, 화살표를 거슬러 올라가는 방향으로 inference를 하게 되면 – 그림 1에서 진동 정보를 바탕으로 수행기능 정보를 추론하는 경우 – 데이터가 확인되지 않은 노드의 값에 대한 belief를 diagnostic inference를 거쳐 얻어내는 것에 해당한다.

그림 2. Evidence 와 belief

그림 2는 evidence와 belief의 개념을 간단히 보여주고 있다. 만약 총 6개의 변수(V1 ~ V6)가 들어있어야 할 데이터에서 V1과 V5의 데이터 값만 확인된 상황이고, structure와 parameter가 모두 잘 학습된 Bayesian network가 수중에 있다면, 그림 2에서처럼 V3의 값에 대한 추론결과(belief)도 얻을 수 있는 것이다. (물론 V2, V4, V6도 얻을 수 있다.) 이러한 과정을 belief propagation이라고 표현하기도 하는데, 확인된 특정 노드의 정보(evidence)가 Bayesian network의 structure와 parameter를 타고 흘러 다른 노드의 belief를 얻게 하고, 이 belief가 또 다시 흘러 나머지 노드들의 belief를 얻게 한다는 의미에서 붙여진 것이다. 만약 V6가 classification 문제의 target value라면, 이러한 inference 과정은 Bayesian network를 classification 문제에 적용하는 것이 된다.

해상사고 데이터

표 1. 해상사고 데이터의 각 세부 항목의 내용

그럼 이제부터는 실제 데이터를 바탕으로 학습된 Bayesian network를 활용하여 Bayesian network의 inference 과정이 어떻게 응용될 수 있을 지 느껴보자. 본 포스트에서는 공공데이터포털[1]에서 다운로드한 8년(2011년 ~ 2018년) 동안의 해상조난사고 상세데이터를 사용한다. 8년 동안 수집된 사고 케이스는 모두 16,000여 건이며 각 사고 데이터에는 발생일시, 관할해경서, 발생해역, 발생유형, 발생원인, 기상특보, 사고선박수, 구조인원, 부상인원, 사망인원, 실종인원, 사고위치, 위도, 경도, 선종, 톤수 등의 세부 내용들이 포함되어 있다. 이번 포스트는 Bayesian network의 inference 과정에 대해 느껴보는 것을 목적으로 하므로, 이들 중에서 7개 항목만 선택해서 활용한다. (표 1 참조)

학습된 모델 및 활용

그림 3. 7가지 세부 항목의 해상 사고 데이터로 학습된 Bayesian network 모델들

그림 3은 우리가 선택한 데이터를 학습한 2가지 종류의 Bayesian network을 보여준다. Bayesian network의 structure와 parameter를 학습시키기 위한 방법론에는 여러가지가 있는데, 동일한 데이터를 바탕으로 학습해도 방법론에 따라 structure와 parameter의 구성이 달라지게 된다. 이번에는 모델 #2의 Bayesian network으로 inference 과정을 수행해 보자.

표 2. ‘발생유형’ 항목에 대한 inference 결과의 예시

표 2는 발생일시, 관할해경서, 발생해역, 발생원인, 기상특보, 선종 정보의 6개 데이터를 알게 되었을 때 (evidence) 사고의 발생유형을 inference한 결과의 일부를 보여준다. 표 2의 6번 결과에 따르면, 학습된 Bayesian network는 날씨가 양호한 6월에 제주 근방의 영해에서 모터보트가 부주의한 운항을 하게 되면 전복사고를 겪을 수 있다는 정확한 inference 결과를 출력했음을 알 수 있다. 또한 표 2의 2번 결과에 따르면, 날씨가 양호한 12월에 울산의 영해-EEZ에서 관리가 소홀한 어선이 겪게 될 사고의 유형은 ‘침수’일 것이라는 inference 결과를 출력하였는데, 실제 데이터에 나타난 사고의 유형은 ‘화재’였다는 것을 알 수 있다. 즉, inference 결과가 틀린 셈이다.

재미있는 것은, 해상사고 데이터에 대한 배경지식의 부족으로 인해 기관손상과 추진기손상의 차이점을 모르는 상황에서는, 8번째 결과에서 inference 결과로 얻은 ‘기관손상’과, 실제 데이터에 해당하는 ‘추진기손상’이 서로 다르다는 것을 어떻게 해석해야 할 지 모호하다는 사실이다.

정리하자면…

이번 포스트에서는 Bayesian network의 개념에 대한 기초적인 내용을 소개하고, 해상사고 데이터를 예시로 하여 Bayesian network의 inference 과정의 개념을 소개하였다. 위에서 소개한 inference의 전체적인 정확도를 분석해 보거나, 동일한 과정을 다른 데이터에 적용해 보면 더욱 흥미로울 것이다.

그리고…

사실, 이와 비슷한 기초적인 분석작업을 2014년에도 수행한 적이 있다. 세월호 사고가 너무나 가슴을 아프게 했기 때문이다. 이번 포스트를 위한 데이터를 준비하는 과정에서도, 세월호 사고가 계속 머리 속을 맴돌았다.

그림 4. 해상사고에서의 사망인원 수 그래프 (2011 ~ 2018)

그림 4는 이번 포스트에서 활용한 16,000여 건의 사고 데이터의 사망인원 수를 그래프화한 것이다. 한 데이터의 사망인원 수가 다른 데이터에 비해 유독 많은 것을 알 수 있는데, 해당 데이터의 세부내용은 다음과 같다.

  • 발생일시 : 2014-04-16 08:58
  • 관할해경서 : 목포
  • 발생해역 : 협수로
  • 발생유형 : 침몰
  • 발생원인 : 운항부주의
  • 기상특보 : 양호
  • 사고선박수 : 1
  • 구조인원 : 172
  • 사망인원 : 295
  • 실종인원 : 9
  • 사고위치 : 전남 진도군 조도면 병풍도 북방 1.5해리
  • 선종 : 여객선

공공데이터 포털에서 획득한 데이터는 세월호 사고를 이와 같이 담담하게 기록하고 있다. 다른 해상사고에서 유명을 달리하신 모든 분들, 그리고 세월호 사고로 인해 우리의 곁을 떠난 모든 분들의 명복을 빈다. 그리고 유족 분들의 마음에도 평화가 찾아오기를 바라는 마음이다.

데이터 분석과 기계학습 기술이 계속 발전하면, 언젠가, 이런 사고들을 미연에 방지할 수 있도록 하는 방법이 구현될 수 있을까? 인포리언스는 꿈을 꿔 보기로 했다. 미약하나마 도움이 될 수 있도록 노력해 보기로 했다.

Reference

[1] https://www.data.go.kr/