Code Sprint 2013 round 2를 마치며

시작

SK planet 코드스프린트 행사의 문제 출제를 처음 맡게 된 당시에는 이렇게 길고 힘든 여정이 될 지 예상하지 못했습니다. 그 당시 이미 교통예측이라는 문제의 틀이 정해져 있었고 이를 구체화 시키는 것이 저의 역할이었습니다. 쉽게 문제를 출제하고 아무 탈없이 진행될 것이라는 처음 예상과 달리 난관이 많았습니다. 정말 채점 당일까지 긴장의 끈을 놓지 못했습니다.

예측

Round2 기획 초기 문제는 실제 출제된 문제와 상당히 달랐습니다. 엄밀히 말해 실제 미래 교통정보를 예측하는 것이 아니라, 주어진 데이터에서 30분 후를 예측하는 문제였습니다. 문제에 대한 정답이 이미 존재하는 문제였습니다. T map 서비스 혹은 타사의 교통정보 서비스 관련자라면 문제의 답을 구할 가능성이 있었습니다. 그래서 아예 실시간 교통예측 서버 시스템을 구축하는 문제를 생각해 보기도 했습니다. (참여자들에게 서버 장비 제공/실 시간 예측 서버 시스템을 구축/Open API 통하여 실시간 채점) 하지만 이 문제는 특정 분야 개발자들에게 유리할 수 있고 난이도가 높아 다양한 개발자들이 참여하지 못 할 우려가 있어 선정되지 못했습니다. 많은 고민 끝에 30분 후의 교통예측 대신에 10일 후의 교통예측 문제로 바꾸게 되었습니다. 문제의 성향이 많이 바뀌게 되었지만 개인적으로는 더 흥미롭게 바뀐 것 같아 기뻤습니다. 문제 출제자인 저도 정답을 모르기 때문에 한 명의 개발자로서 행사에 참여하고 싶었지만 행사 규정상 그러지 못했습니다. 하지만 참여 못한 것이 다행이다 싶습니다. 이제와 고백하는데 비 공식적으로 채점한 저의 답안은 상위권에 들지 못했습니다.

준비

문제의 구체적인 방향을 잡고 난 후, 과연 이 문제가 개발자의 다양한 아이디어, 노력 그리고 실력을 변별할 수 있을지 검증해 보아야 했습니다. 실제 교통데이터를 받아보니 난감해졌습니다. 경부고속도로의 하루 데이터 정보는 7만2천건. 받아온 6개월치 경부고속도로 교통 데이터는 총 1300만 건. 엑셀이나 단순 통계계산으로는 이를 분석하기 힘들겠다는 생각이 들어 그 즉시 DB를 구축하고 다양한 형상의 그래프로 분석할 수 있도록 어플리케이션을 작성했습니다. 개발기간 2주 포함 총 2개월 걸쳐 개발 후 데이터 분석하고 다양한 방법으로 문제를 풀 수 있는지 검증해 갔습니다. 시간/요일/공휴일/지역/날씨 등의 다양한 변수에 의해 그래프의 양상이 달라지는 것을 확인하고 이 문제가 개발자들의 실력을 겨뤄보는데 충분할 것으로 판단했습니다. 그리고 여러 알고리즘으로 풀어보면서 문제가 다양한 해법을 가질 수 있다고 확신하였습니다. 다른 개발자들은 과연 이 문제를 어떻게 풀까? 너무나 기대가 되어 가슴이 두근두근 했습니다. 실제로 참여자들이 올리는 알고리즘을 보면서 감탄했습니다. 너무나 멋진 알고리즘들이 많았습니다.

그림 1. Code Sprint 채점용 교통 정보 분석 프로그램 화면

성과

코드스프린트 Round2 행사의 가장 큰 성과는 단 몇 개의 우수한 알고리즘을 선별하는 것이 아닌 개발자들의 사용한 각종 알고리즘을 서로 비교해보는 것이었습니다. 7월16일 예측 당일의 결과는 좋지 못했더라도 예측 일이 달랐다면 좋은 성적을 거둘 수 있는 알고리즘이 있었고 분석데이터를 더 많이 제공했다면 좋은 성적을 거둘 수 있는 알고리즘도 있습니다. 비록 수상하지 못한 알고리즘일지라도 전체 176건의 알고리즘 중에는 상황에 따라 결과가 좋아질 수 있는 알고리즘들이 많이 있었습니다. 단순 과거 교통량 데이터만 활용하는 것이 아니라 날씨와 그 외의 데이터를 활용해서 교통정보를 예측할 수 있다는 가능성도 엿볼 수 있었습니다. 행사의 여건상 실시간 예측 문제를 출제하지 못한 것이 못내 아쉽지만 실시간 예측은 어느 알고리즘이 가장 빠르고 정확하게 예측을 할 수 있었을까 나름 고민해보았습니다.  다양한 조건에 따라 달리 활용되는 알고리즘과 상황에 따라 조합해서 사용될 수 있는 알고리즘들이 있을 수 있다는 것을 확인하였습니다.

1. 빠른 예측이 필요할 경우

실시간으로 빠른 교통 예측이 필요할 경우, 중앙값을 계산하는 것이 성능 대비 정확도에서 가장 우수한 것으로 판단되었습니다. 알고리즘이 단순하지만 비슷하게 단순한 평균값 계산보다 월등히 우수한 예측을 합니다.

2. 패턴 예측 데이터의 양이 적을 경우요일 별 데이터 분석 vs. 주말/주중 데이터 분석

Round2에서 제공한 3개월 동안의 교통 정보는 분석 및 예측을 하기에는 다소 부족합니다. 요일 별 예측을 하기 위해서는 최소 1년 이상의 데이터를 사용하는 것이 좋으며 1년 이하의 데이터를 분석한다면 요일 별로 나누지 않고 주말 주중으로만 나누어서 분석하는 것이 더 좋은 결과를 예측합니다.

3. 공휴일 예측방식연휴의 길이 분석

단순 휴일인가 아닌가로 구분하는 것은 연휴 기간 교통 예측 시 큰 오차를 보일 수 있다. 때문에 연휴의 길이와 연휴 전날 연휴 마지막 날의 데이터를 구분하여 데이터 예측을 하는 것이 좋습니다. 예를 들어 월/금요일이 공휴일일 때의 토/일요일의 교통은 평소보다 다릅니다.  예측하려는 날이 연휴 중 하루라면 전체 연휴 중 몇 번째 휴일인지(첫날, 마지막 날)를 판단해야 하며 이를 기반으로 과거데이터를 분석하는 것이 좋습니다. 예측하려는 날이 연휴 바로 전날 혹은 바로 다음날일 경우도 연휴의 길이에 따라 구분해 주는 것이 좋은 결과를 보입니다.

4. 동적예측

교통 예측의 항목 중 가장 중요한 요소 중 하나는 몇 시부터 정체가 시작되는가? 몇 시부터 정체가 풀리는가? 입니다. 단순 요일/휴일 교통 패턴 예측으로는 이 타이밍을 적확히 판단하기 힘듭니다. 교통 패턴 예측 데이터를 기반으로 실시간 교통량을 비교하며 패턴 데이터를 보정해가는 알고리즘을 적절하게 혼용하고 돌발상황 여부와 이전 도로 구간의 교통량도 실시간으로 분석하는 것이 좋습니다.

5. 날씨 예측

우천 시 차량 속도를 10~15% 감속하는 것이 원칙이지만 이는 실제 교통 흐름에 맞지 않습니다. 폭우가 쏟아지지 않는 한 차량 속도에는 큰 영향을 미치지 않습니다. 오히려 안개의 양이 차량 속도에 영향을 더 미칩니다. 그렇다고 우천시가 영향을 주지 않는 것은 아닙니다. 주말에 나들이를 나간다고 생각한다면 그 전날의 일기예보와 이전 며칠 간의 날씨는 영향을 미칩니다. 날씨는 다양한 fact(최고/최저/평균기온, 강우량, 강수향, 운량, 안개, 전날 기상예보)로 구성되어 있기 때문에 단순 산술 계산이 아닌 기계학습 알고리즘이 필요합니다. 기계학습 알고리즘을 통한 적절한 날씨 분석은 어느 정도 정확한 교통예측에 도움이 됩니다.

6. 대용량 데이터 처리

하루 교통정보 데이터 양은 기가(G) 단위입니다. 그렇기 때문에 교통예측은 대용량 데이터 처리가 필수적으로 들어갑니다. 빠르고 정확한 예측을 위해서는 Big Data 솔루션의 도움이 꼭 필요합니다.

돌발

Round 2 행사 시작 열흘 전 경부고속도로에 폭우로 산사태가 발생하였습니다. 고속도로 완전 복구까지 24시간 넘게 걸렸습니다.

이미 문제 출제 시 이런 돌발 상황을 고려하긴 했지만 실제로 닥치고 나니 내색은 못했지만 다소 불안했습니다. 경부고속도로는 차선이 넓고 사고복구가 빨라 돌발상황이 길어지지는 않을 것이라 생각했고 이러한 돌발 상황은 모든 행사 참여자들에게 동일한 조건이 이므로 형평성에 어긋나지 않을 것으로 기대를 했습니다. 그러면서도 다른 한편으로는 전혀 엉뚱한 답안이 수상하지 않을까 걱정이 컸습니다. 7월16일 채점 당일 가슴 졸이며 채점했고 다행이 그런 사태는 벌어지지 않았습니다. 아마도 참여자들보다 문제 출제자의 스트레스가 더 컸지 않았을까 생각합니다.

수상자

정답이 없는 예측 문제와 언제든지 발생할 수 있는 돌발상황들이 계속 걱정스러웠습니다. 고민 끝에 기발한 알고리즘을 제출한 개발자에 대한 특별상을 부여하자고 제안을 했습니다. 고맙게도 운영진들도 공감하고 이례적으로 round 2에 특별상을 추가해주었습니다. 실제로도 많은 기발한 아이디어들이 많았고 더 많은 개발자들에게 그들의 아이디어와 노력에 대한 보상을 하지 못한 것에 대한 너무 큰 아쉬움이 남았습니다.

이번 round 에서는 1위 Sungjoo Ha 님, 2위 박수찬 님, 3위 신진철 님께서 차지하셨습니다. 2위에 오른 박수찬 님은 중학생이라 더 화제가 되었습니다. 특별상은 Taihyun Hwang 님이 선정되셨습니다.   이번 round에서 우승하신 분의 후기 참고하세요~  두 편에 나누어서 써주셨습니다.

마무리

얼마 전 수상자들과의 만남의 자리를 가졌습니다. 지난 4개월 간의 일들이 모두 그들을 만나기 위한 준비였다는 느낌이 들었습니다. 그들의 열정에 나 자신을 돌아볼 수 있었고 큰 배움을 얻었습니다. 바쁘고 힘들었던 그 간의 고생이 이제는 즐거운 경험이 되었습니다. 이런 즐거운 경험과 자극을 다른 많은 개발자들과 나눌 수 있도록 Code Sprint가 더욱 활성화 되기를 바랍니다. 내년엔 어떤 문제가 출제되고 어떤 개발자들이 참여할지 벌써부터 설렙니다.

SK planet Code Sprint에 관심을 가져주신 모든 분들께 감사의 말씀 드립니다.
감사합니다.

박헌규 LBS기술개발팀

SK planet (2013~ ) LBS Tech dev. team – S/W eng.
SK comm. (2012) Nate Map team – S/W eng.
IBM Koare (2007~2012) Healthcare/Bio Solution dev. team – S/W eng.
Handy Soft (2005~2007) Framework/BIP Solution dev. team – S/W eng.
K4M(2002~2004) eAI solution dev. team – S/W eng.
Raycom Korea (2000~2001) S/W eng.

공유하기