기초의회 의장단 업무추진비 취재 기록과 구체적인 회고
지난 글 : 업무추진비, 지난 두 달간의 기록 ①
참고기사 : 탈탈 털어보자 우리 동네 의회 살림
지난 글은 전국 기초의회 업무추진비 내역을 받아내는 과정을 남겼다. 이번에는 제각기 다른 데이터 포맷을 어떻게 관리하고 정제했었는지를 뒤돌아봤다. 디테일한 기술적인 내용은 거의 제외했는데 글은 여전히 길다...
보편적으로 정보공개 청구를 하면 결정통지문에 첨부파일(xls, hwp, pdf, jpeg 등)을 올려준다. 226개 의회 첨부파일을 한 번에 다운로드할 수 있다면 좋겠지만 아쉽게 정보공개포털에 그런 기능은 없다. 포털 기능이 앞으로 좋아질 거라고 들었는데 청구 목록 한 번에 받기 이런 기능이 생겼으면 좋겠다. 아무튼 이런 이유로 226개 의회 결정통지문을 하나씩 열어가며 다운로드 받아야한다. 매일 각 의회에서 공개했는지 확인하고 만약에 공개했으면 다운로드 후에 시트에 체크해갔다.
전국 범위로 데이터 관리할 때는 INDEX를 확실히 주는 게 좋다. 예를 들어 '중구의회'는 서울, 부산 등 많은 광역자치단체의 흔한 이름이기 때문에 나중에 헷갈릴 수 있다. 그리고 수수료를 청구한 의회들이 종종 있는데 반드시 10일 이내에 시스템에서 수수료를 결제해야 한다. 10일 이후에도 수수료를 내지 않으면 결정통지문에서 데이터가 없어진다. 다시 받을 수는 있는데 양쪽 모두 상당히 귀찮아진다.
최종적으로 공개하지 않은 곳을 제외하면 내역들을 어느 정도 확보했다. 일단 PDF, JPEG로 공개한 곳은 제외하고 엑셀로 공개한 곳 위주로 보면, 애초에 청구할 때 집행일자(시간 포함), 인원, 금액, 집행내역(목적), 사용장소, 사용자, 결제방법 등 8개 변수를 공개해달라고 했다. 청구한 대로 맞춰줬다면 8개의 칼럼으로 구성된 엑셀이 왔었어야 했는데 그렇게 준 곳은 거의 없었다. (설마설마했는데!)
예를 들어 경상북도 A의회는 4개의 칼럼, 전라남도 B의회는 7개 칼럼, 서울특별시 C의회는 8개 칼럼 등 형식이 제 맘대로 다. 원래 의도는(지금 생각하면 심각하게 이상적이었지만) '8개 요구한 칼럼명으로 226개 의회에서 공개해주면 쉽게 코드를 짜서 행을 쌓으면(row_bind) 한 번에 끝나겠는데! 은근 쉽겠는데?'라고 생각했었다. 하지만 그 소망은 가장 처음 공개한 곳 데이터를 보자마자 버렸고 이 프로젝트 심각하게 손 많이 가겠구나 라며 한숨 쉬었던 게 기억난다. 서울시만 했다면 25개 구 하는 거야 뭐 하루면 되겠지만 226개 의회가 대상이라고 생각하니 불가능에 가까웠다
정리하면, 폴더별로 데이터 관리는 어느 정도 됐는데 어떻게 형태가 다른 수많은 파일을 하나의 엑셀로 만들 것인지 방법이 없는 게 문제였다. 코드로 자동화해서 정리하기엔 패턴이 없고 예외처리 범위도 엄청났기 때문에 얼마 전에 했던 고위공직자 PDF 변환하는 코드 수준이 아니었다. 결국 의회마다 직접 정리하는 수밖에 없었다. 노가다가 답이었다.
노가다 포인트는 2가지다. 구조에 대한 부분이 첫 번째 그리고 상이한 데이터 값 포맷이 두 번째다. 두 번째는 구글시트나 R언어로 해결된다고 하지만 첫 번째 구조 통일 부분은 어쩔 수 없이 하나씩 의회마다 정제해줬다. 심한 경우는 반나절씩 정제한 경우도 있는데 쉬운 이해를 위해서 정제 레벨 하위권(?!)인 나름 괜찮았던 데이터인 서울시 강동구의회 내역을 보자. 총 9개의 열로 구성된 업무추진비 내역을 공개했다. 그냥 공개만 했을 뿐 원하는 대로 공개해주진 않았다. 뭐가 다를까?
구분, 부서명, 주소는 청구하지 않았는데 포함시켰다 (자세한 주소도 아니다)
집행 일시에서 시간을 하나의 셀 안에 포함시켜 공개 및 인원 데이터가 없다
각 의회에서 관리하는 열 이름
의장과 부의장 내역은 다른 시트로 따로 관리했다
그래서 구분, 부서명, 주소 칼럼은 삭제했으며, 사용자 구분은 다른 시트에 있는 걸 붙여넣기 했으며 인원은 제출하지 않아 제출안함이라고 해줬다. 집행 일시에서 시간 데이터는 구글시트의 REGEXEXTRACT 함수를 통해 별도 추출하여 시간 칼럼에 옮겨줬다. 정규표현식에 대한 기본적인 이해만 있다면 구글시트에서도 충분히 데이터 정제가 쉽다. 226개 의회 모든 내역의 상이한 구조를 아래 오른쪽 칼럼 기준으로 통일해서 정제해준 게 거의 한 달 걸렸다. 그 밖에 날짜 포맷, 금액의 숫자 포맷 역시 정제 대상이다.
=REGEXEXTRACT(A1, "[0-9]{1,2}:[0-9]{1,2}") // 시간을 추출하는 정규표현식
기술적으로 해결하기 힘든 정제도 있다. 나중에 분석을 하면서 발견한 황당했던 사례다. 식당별 사용 금액을 분석하다가 경기도 ㅎ의회에서 가장 많이 쓴 식당이 'OO정육식당'과 'OO정육점식당'이란 걸 찾아냈다. 정육식당과 정육점식당은 프로그램에서 다르게 인식한다. 혹시나 싶어서 직접 의회에 전화로 두 식당은 다른 곳이냐고 물어봤더니 같은 곳이라고 답하며 미안하다고 했다. 사실 카드 내역서를 그대로 뽑았다면 혹은 e호조에서 다운 받았다면 다를 리가 없다. 수고스럽지만 이런 경우는 직접 확인해가며 수정할 수밖에 없다.
R언어를 다루지만 개인적으로 데이터가 크지 않다면 구글스프레드시트로 작업하는 걸 선호한다. 많은 장점이 있지만 R과 같이 쓸 때는 협업과 CSV를 웹에 게시해서 URL을 R로 바로 들고 올 수 있기 때문에 좋다. 시트에서 수정하면 바로 저장 및 반영된다. 위에 정제한다고 고생을 한 달 하고 나니깐 형태가 통일된 226개 CSV URL이 나왔다. 물론 각 의회마다 작업하면서 각 변수 공개 여부도 체크했기 때문에 시간 및 장소 공개율이 30% 수준인 것도 기사에 녹여낼 수 있었다. (이건 데이터를 쌓고 나서도 체크할 수 있다)
근데 저걸 또 하나씩 226번 클릭해서 CSV를 다운로드한다면 또다시 일이 많아진다. CSV링크를 별도 관리한 이유가 몇 개 있었는데 그중 하나가 R언어랑 같이 쓰려는 목적이다. 최종적으로 R에서 226개 CSV를 자동으로 다운로드하여 행을 쌓는 코드를 만들었고 10분 만에 37만 2331건의 전국 기초의회 업무추진비 내역은 내가 애초에 원했던 형태로 제작됐다.
3월에 시작했음에도 두 달이 걸렸다. 보람이 있었냐고? 아쉽지만 기사에 언급한 두 명의 의원은 업무추진비를 엉망으로 사용하고도 다시 당선됐다. 그들을 제재할 수 있는 제도적 뒷받침은 없다. 법을 만들면 되지 않냐고? 각 의회에서 조례를 만드는 것도 그들이다. 귄익위에서 각 지자체 의회 업무추진비 사용 규칙을 법으로 만들라고 한지도 벌써 4년이 넘었지만 여전히 제자리걸음이다. 바뀔까?
결국 그들을 감시하는 건 국민과 언론이다. 이번에 처음 기초의회 업무추진비를 감시했지만 이게 끝은 아니다. 많이 보고 들은 걸 토대로 다시 시작할 것이고, 더 꼼꼼하게 풀뿌리 의회의 사각지대를 지켜보려 한다.
그게 내가 소소하게나마 할 수 있는 역할이란 걸 그들이 깨우쳐줬다.
기초의회 관련 기사 보기
동래구의장단 1000만원 긁은 '대궐집'…동료 식당이었다
[탈탈 토크]기초의회 예산...당신의 세금은 이렇게 쓰였다
[풀뿌리 가계부]가평군의장 해외출장 3번 더 간 비결은?
[풀뿌리 가계부]난 순금만 써…함평군의회 배지값 60만원
[풀뿌리 가계부] '패션왕' 양평군의회, 1년 옷값 3000만원
[풀뿌리 가계부] 금산군 의회, 1인당 해외출장비 538만원
[잉탐]"개 혀?" 4년간 1억원, 지방의회 의장단 보신 맛집