SBS 데이터저널리즘팀 [마부작침] 인턴을 1/4 남긴 시점에서
어느덧 인턴으로 일한 지 4.5개월이 지났다. 올해 가장 잘한 일이 [마부작침] 인턴 생활인데ㅜㅜ 끝이 다가온다니 너무 아쉽다. [마부작침]이 탐사보도부 소속인 만큼 한 아이템을 오랜 기간 동안 공들여 취재한다. 나는 인턴으로서 작고 귀여운(?) 일들을 맡았다.
내가 참여했던 프로젝트 중에 특히 즐겁고 어려웠던 일은 기초의회 시리즈였다. 226개 기초의회 데이터를 받고 정리하는 일은 전 인턴분들이 거의 다 끝낸 상태였고, 내가 처음으로 담당한 일은 ‘업종 분류’였다. 도대체 무슨 업종을 분류하냐고? 의원님들이 업무추진비로 방문하셨던 식당들 이름을 분류하는 일이었다. 업무추진비 데이터에서는 상호명까지만 나오기 때문에 업종은 따로 정리해야 한다. 여운 선배가 중앙일보에서 근무하셨을 때 만들었던 ‘의슐랭 가이드’와 같은 인터랙티브 페이지 제작을 위해 필요한 과정이다.
여운 선배는 mutate랑 str_detect를 쓰면 된다는 힌트를 주셨다. 나는 R언어는 살짝 공부해봤으나 tidyverse라는 좋은 세계관은 인턴이 되고 나서야 알게 된 사람이었다. R 코드를 효율적으로 짜는 데에 부족함이 많았다. “한우”라는 단어가 있으면 업종 “고기”로 분류하는 코드를 계속 적었다. 키워드 하나하나씩 매칭하려면 비슷한 코드를 반복적으로 적어야 하니까 귀찮았다. 나는 당시에 R보다 python이 익숙해서, 스프레드시트에 키워드와 업종을 쭉 적고, ‘이 csv 데이터로 R코드를 짜주는’ python 코드를 짰다. 뭐… 대충 나의 잔머리를 총동원했다는 뜻이다.
잔머리가 쓸모 있기는 했지만, 금방 더 좋은 방법을 깨달았다. (하지만 수정을 하기엔 이미 너무 많이 키워드를 추출했기 때문에 코드를 갈아엎지는 않았다.) 스프레드시트에 정리하지 않고, 업종별 키워드를 벡터로 정리해서 OR기호로 붙여버리는 방법도 있다. 키워드 분류를 스프레스 시트에 정리하고 그걸 R코드를 이용해서 mutate 기능에 활용 가능한 형식으로 바꾸는 코드도 이제 바로 짤 수 있다. (뿌듯)
선배들이 과제를 주고(또는 스스로 과제를 만들고), 나는 그걸 풀고, 선배들의 피드백을 받는 과정은 너무 재밌었다. 과제를 풀 시간이 충분하면 고민+구글링으로 풀었고, 내가 짰지만 너무 이상하면 선배들에게 여쭤보면서 배웠다.
업무추진비 분석, 8시 뉴스, 웹 기사 출고까지 끝나고 나서 기초의원 재산 분석을 진행했다. 민언련 자료를 참고해서 통계를 내보기도 했다. 통계 코드 짜는 건 정말 쉬운 일이고, 디테일하게 분석 기준을 정할 때 더 많은 공부가 필요함을 배웠다.
재산 분석 취재에서는 농지법 위반 사례를 찾아내고자 재산 데이터에서 지번을 추출했다. 1차 조사로 네이버 로드뷰나 위성사진을 보고 쫙 확인했다. (검색의 늪...) 내가 '노가다' 검색에 숙련되는 것을 즐기며 검색했다. 수상한 토지들은 토지대장 확인하고 리스트업해서 선배들에게 전달했다. (온라인으로 토지대장은 하루에 최대 15건까지만 확인할 수 있다는 꿀팁도 깨달았다… 내가 15건 다 쓰면 인턴 동기 기은이가 확인하거나 여운 선배가 확인했다.)
이 외에도 이해충돌 사례를 찾기 위해 저마다의 분석을 토대로 의원을 특정해서 회의록을 계-속 읽거나, 이계옥 의원이 자기 땅 얘기 몇 번 했는지 체크하거나, 땅 면적 추출해서 계산하는 등 다양한 일을 수행했다. 8시 뉴스에도 쓰인 분석도 있고, 내가 지금 기억이 나지 않을 정도로 스쳐 지나간 분석도 있다. 이렇게 2주 넘게 재산 데이터를 만지면서, 재산 데이터 자체에 관심을 가지게 됐다. 관보는 pdf이고 이런 형식도 아닌데, 어떻게 csv 형태로 바꿀 수 있는 걸까.
여운 선배가 공직자 재산 변환하는 코드를 공들여 짜신 걸 알아서, 대놓고 코드 보여달라고 할 수는 없었다. 슬쩍 여쭤봤는데 ‘헐ㅋㅋㅋㅋㅋ’라고 하시면서 다음 주 월요일 데이터 저널리즘 온라인 밋업에서 슬쩍 공개하니까 그때 보라고 하셨다. 5일을 기다리면 힌트는 얻겠지만, 선배가 처음으로 보여주지 않는 코드라니 괜한 오기가 생겨서 무작정 짜 봤다.
우선 이 pdf를 엑셀 파일로 변환했다. 무료 프로그램을 사용해서 그랬던 걸까. 위와 같은 관보를 엑셀로 변환하면 엄청 깨져버려서 쓸 수가 없었다. 대신 헌법재판소 재산 데이터를 이용해서 실습했다. 이건 안 깨지고 잘 바뀌더라.
헌법재판소 예시 파일로 코드를 짜는 건 금요일에 40분 정도 걸렸지만, 알고리즘은 목요일 퇴근길부터 생각했다. 1,2,3과 같은 위치에 적힌 정보들만 필요하고, 1-2-3의 순서로 한 줄씩 데이터 프레임으로 들어와야 한다. tidyverse에 익숙해지다 보니 어떻게 grouping 해야 하는지 고민하기도 했다. grouping해서 join함수를 쓰면 되는 걸까...? grouping은 답이 아니었다. tidyverse 세계관에서 조금 벗어나야 했다. 한 줄씩 체크하면서 rbind와 cbind를 적절히 활용하면 되겠구나 깨달았고, 금요일 남는 시간에 코드를 완성할 수 있었다. 여운 선배의 코드를 보기 전에 스스로 짜서 어찌나 뿌듯하던지.
알고리즘은 간단하다. 1번(소속, 직위, 이름) 데이터가 있는 행이면 1번 데이터를 읽고, 정보가 없는 행들은 지나치고, 2번(대분류) 데이터가 있으면, 1번 데이터에 cbind한다. 이후에 3번 데이터가 나오면 한 줄씩 읽고 cbind한다. 이렇게 만들어진 소속부터 변동 사유까지의 데이터를 rbind한다. 만약 1번 또는 2번 정보가 새로 나타나면 데이터를 업데이트한다. 여러 개의 임시 데이터 프레임을 헷갈리지 않게 설정하고 초기화, 저장, 갱신하는 것이 포인트.
하지만 나는 핵심 알고리즘만 구현했을 뿐, 실제 관보 pdf를 데이터 프레임으로 변환하려면 파일 변환 단계에서 아이디어가 더 필요했다. 이건 여운 선배가 알려주셨다. Acrobat pro를 이용해서 pdf를 html로 변환해서 크롤링하는 것! 그러면 html_table로 크롤링하는 단계만 추가하면 된다. 근데 아직 돈 주고 써야 하는 Adobe Acrobat pro 프로그램이 없으니 마지막 관문은 직장인이 되고, 내 돈 주고 Adobe 결제하고 나서 해결하도록 하겠다…
사실 위와 같이 코드를 짜는 것보다 중요한 건 꼼꼼한 데이터 정리다. 초반에는 진짜 실수 많이 했는데… 내가 어떤 실수를 했는지 직접 깨닫고 고치면서, 실수를 반복하지 않는 방법들을 알아가고 있다. 이 과정에서 제일 많이 배우고, 더 큰 뿌듯함을 느낀다.
(실수는 끝이 없다… 긴장하자…)