통계학, 머신러닝 등 이론 공부 및 코딩 공부를 시작한 뒤로 나의 실력을 검증하고, 또 경험을 쌓을 기회가 필요하다고 생각해왔다. 그래서 참여할 공모전이나 프로젝트를 알아보던 중에 위 대회를 알게 되었다. 평소 스마트시티와 관련된 비전을 갖고있던 나에게는 도시데이터를 활용한 공모전이라는 점이 매우 매력적으로 다가왔고, 현재 직업의 특성을 살려보고자 교통안전을 필두로 한 주제로 대학 동기들과 함께 참여해보기로 했다.
다행히 사전에 제출한 분석 계획서가 예선에 통과를 해 본선에 진출할 수 있었으며, 본선은 해커톤답게 무박 2일 오프라인으로 진행되었다. 상당히 피곤한 일정이었고, 특히 분석이 예상대로 흘러가지 못해 중간에 포기하고 싶은 생각도 잠깐 들었지만, 그래도 팀장으로서 마무리를 어쨌든 하고 싶었기에 주제를 중간에 급선회하는 일도 발생했다. 결과적으로 3위(장려상)라는 결과를 얻었지만, 그보다 참가 과정에서 더 값진 경험을 얻은 것 같아 매우 만족스러운 결과였다고 생각한다😊.
주제 : S-DoT 데이터를 활용한 개인형이동장치(PM)의 사고심각도 요인 분석
초기 분석계획은 위 주제에서 더 나아가 사고 자체의 발생 여부를 예측하고, 위험지역을 발굴하는 모델 구축이 목표였다. 이를 위해 Multivariate LSTM-FCN 등 시계열 분류 모형도 공부하고, 공간통계학도 일부 공부했지만 데이터 전처리 과정에서 데이터셋이 너무 커지고(600만개 행), 그에 따라 정해진 해커톤 시간에 비해 전처리 시간이 과도하게 지체되는 경향이 있어 대회 중간에 급히 주제를 변경하였다.
이번 프로젝트에서 분석하고자 하는 타겟 데이터셋은 TAAS(교통사고분석시스템)에 존재하는 2021년도의 서울시 개인형이동장치 사고 약 400건이다. 데이터셋의 각 행은 개별 사고단위이며, 사고의 발생일자 및 시간, 발생장소(좌표)에 따라 변수들을 추가하여 데이터셋을 구성하였다. 다만, TAAS 시스템의 경우 구체적인 사고좌표를 제공하지 않는다. 따라서 Python의 Selenium
을 활용한 동적 크롤링으로 좌표를 추출했다(코드).
추출한 좌표 및 시간에 맞게, 미리 수집한 다른 데이터셋들을 전처리하여 분석이 가능하게끔 하나의 데이터프레임으로 변형하였다. 이를 바탕으로 분석과제를 수행하였다.
분석에 사용한 모델은 Ordinal Probit Regression(순서형 프로빗 모형)으로, 종속변수인 사고심각도가 총 4단계(부상신고, 경상, 중상, 사망사고)로 구성되어 순서성을 가지기에 이를 채택했다.
Ordered probit Model은 다음과 같은 모형을 의미한다.
이때 probit function 는 표준정규분포의 cdf 의 역함수이다.
Ordinal Probit Regression의 경우, Least Square 기반의 최적화가 존재하지 않아 MLE 기반의 추정량을 사용한다. 이때, MLE를 구하는 과정에서 Hessian Matrix Problem이 발생했는데, 본 프로젝트의 분석과정에서 시간대(0-23)과 같이 다양한 변수를 더미변수화하였기에 Hessian Matrix 계산에 문제가 종종 발생했다. 따라서 이를 극복하기 위해 LASSO, 즉 L1 규제항을 이용하였다.
(자세한 분석 결과는 깃헙 코드를 참고) 분석 결과 SDoT 데이터셋(대회의 주요 데이터셋)인 유동인구 및 환경변수가 통계적으로 유의미한 회귀계수를 갖지 않는 것으로 나타났는데, 대신 특정 시간대(더미변수)와 요일 더미변수(평일/주말 여부)가 유의미한 회귀계수를 갖는 것으로 분석되었다.
데이콘이나 캐글 같이 이미 주어진 데이터셋에 대해 전처리를 진행하고 분석하는 작업은, 실제 데이터셋을 구축하고 전처리하는 작업에 비해 새발의 피라는 것을 절실히 느낀 대회였다. 사실상 대회 시작 후 12시간 이상을 전처리에만 몰두했으며, 이마저도 시간관계상 급히 주제를 선회했기 때문에 분석에 충분한 시간을 쏟지 못한 아쉬움이 크다. Raw Data 수집부터, 목적에 맞는 데이터셋 구성까지 소위 ‘데이터사이언스의 80% 이상은 전처리이다’라는 말을 피부로 느낀 경험이었다.
앞으로는 데이터 엔지니어링 부분, 특히 RDBMS를 서버에 구축하고 SQL을 이용해 추출하는 프로세스를 실제로 구현할 수 있도록 공부해야겠다는 생각이 들었다. 또한, 데이터셋의 크기가 매우 커질수록 전처리 단계의 개별 알고리즘의 속도, 즉 시간복잡도가 매우 중요하다는 것을 깊이 체감하고 평소 코딩을 할 때 이러한 부분에도 신경을 쓰도록 노력해야겠다고 다짐했다😂.