Home KOSIS(국가통계포털) 자료 스마트 검색 만들기
Post
Cancel

KOSIS(국가통계포털) 자료 스마트 검색 만들기

국가데이터처(전 통계청)에서 만든 국가통계포털 이란 사이트가 있다. 가서 찾아보면 굉장히 방대한 양의 국가 통계 자료를 보유하고 있으며, 심지어 이런 데이터가 다 공개되어있다(데이터를 API로 받으려면 추가 승인이 필요하지만 승인도 대개 된다). 하지만 이 데이터가 그다지 잘 활용되고 있다는 생각은 들지 않는다. 심지어는 나도 그렇게까지 잘 활용하는 편은 아니다.

무엇보다, 데이터를 찾기가 너무 피곤하다. 가뜩이나 많은데, 조사 주체와 범주가 다른데 비슷한 자료 이름을 가진 경우(예: 서울시의 ‘취업 현황’, 국가 전체 ‘취업 현황’, 전라북도 ‘취업 현황’ 이 모두 최종 표 이름이 ‘취업 현황’이다) 도 왕왕 있고, 자료 분류도 헷갈리게 되어 있고, 자료 목록이라도 받을라치면 거대한 엑셀 파일이 떨어진다(그리고 그걸 여는 사이에 뭘 찾으려고 했는지 잊어버린다). 데이터가 집계 기준이 중간에 바뀌어서 기간이 끊겨있다거나, pdf로 되어 있는 게 있다거나, 옛날 BI 형식의 표를 다루기가 힘들다거나 하는 것은 그 다음의 문제다.

그래서, 일단 자료를 좀 더 빠르고 찾기 쉬운 형태의 인덱싱을 해봐야겠다고 생각했다. 이 생각은 아주 오래 전부터 하고 있었다. 일로써 데이터를 다루기도 해왔고, 사회의 다양한 문제로부터 문제 정의를 시작할 때 국가통계자료만큼 명확하고 공신력이 있는데이터는 없다. 그만큼 활용하면 정말 좋은 데이터인데, 접근성이 떨어지면 다 소용없는 일이다. 하지만 그 생각만 간간히 한 지가 몇 년이다. 자료들이 너무 많고, 그걸 다 수집해서 인덱싱을 하고,

그러다 며칠 전에 AI 해커톤에서 멘토링을 할 기회가 있었다. 이제 프로그래밍의 상당수는 AI가 해주는 만큼, 많은 분들의 질문은 주제를 명료하게 만드는 것과 문제 정의에 대한 것이었다. 그러다 KOSIS가 다시 생각이 났다. 아 여기서 근거 자료 찾아서 문제 다듬으면 딱 좋겠는데…! 하지만 시간이 빡빡한 해커톤에서 근거 자료 찾기 위해 여기까지 소개해주는 것은 너무 오버하는 것 같다는 생각이 들었다. 이 사이트가 만약 자료 찾기가 더 쉬웠다면…!

그래서 다시 떠오른 생각을 이번에는 실행에 옮겨보았다.


구현 내용

KOSIS 데이터 항목 파악

우선 KOSIS 데이터의 자료 항목을 다운받아야 한다. 해당 내용은 KOSIS 공유서비스에서 확인할 수 있다. 지금 만들 것은 통계 목록 중에서 쓸 내용을 찾는 것이니 이 때 필요한 것은 ‘통계 목록’이다. 메인 화면의 ‘통계 목록’을 확인한 후 여기에서 필요한 국내통계에 대한 목록, 이슈별, 주제별 목록 등 4가지를 다운받았다. 그러면 각각 거대한 엑셀파일이 다운로드된다.

그럼 다운로드받은 엑셀 파일을 열어서 살펴보자.

…대부분 파일이 커서 노트북에서 굉장한 굉음이 들리기 시작한다….그만 살펴보자.

카테고리는 옆의 레벨 단계로 구분되어 있고, 바로 상위의 숫자 순서대로 이어지는 형태다. 순서를 잘 맞춰야 한다. 가장 마지막 레벨의 ‘통계표 보기’를 누르면 각 항목의 KOSIS 링크가 열리는 구조다.

개발 환경

LLM의 힘을 빌린다. 나는 Antigravity와 Gemini 3.1 Pro 를 사용해서 작업했다. Antigravity 의 Implementation Plan과 Task 아티팩트를 마음에 들어서 (약간의 크래시에도 불구하고) 주로 이걸 쓰게 되는 것 같다.

보통 Antigravity 개발할 때 Implementation Plan과 Task를 주로 검토하고 넘기는 편인데 데이터 파싱할 때는 중간 제어도 좀 하고 Plan 수정도 꽤 했지만 그 이후에는 거의 이 부분도 손을 대지 않았다. 이게 아는 만큼 보여서 그러는 건지 아니면 역시 데이터는 잔 손이 많이 가서 그런 건지는 정확하지 않다.

목차 JSON 파싱

우선 이 내용을 JSON으로 파싱하는 작업부터 했다. 엑셀 내부 구조를 간단히 설명하고, 해당 폴더의 데이터와 통계표 링크를 뽑아서 JSON으로 표현하는 식으로 옮겼다. 처음에는 [통계표 보기]가 붙어있는 가장 마지막의 레벨명과 링크만 연결시키려고 했지만, 앞서 말한 유사한 이름 문제가 나오는 걸 발견해서 전체 레벨명의 구조를 명시하고 해당 구조를 인식해서 데이터를 파싱하는 형태로 변경했다. 물론 모두 한글인만큼 유니코드 처리도 프롬프트에 명시해주었다. (예나 지금이나 엑셀 파싱은 힘들고… 작년에 산 내 노트북 나름 어디 가서 안 꿀릴 사양으로 샀는데도 중간에 한 번 폭사했다.)

Gemini 스마트 서치 (개인용)

로컬 RAG 방식으로 이 데이터를 LLM에 연결한 후 필요한 내용을 해당 JSON을 활용해서 찾은 후 관련 데이터 페이지의 링크와 설명을 전달하는 페이지를 만들었다. 해당 내용이 꽤 많았기 때문에 모두 API에 쏘는 것은 무리이므로, 이 중 최상위 30개 데이터만 전달한 후 이를 Gemini가 잘 정리해서 전달해주는 식이었다. 다만 메뉴명에서 추가로 추론하는 부분에서는 다소 어색하기도 하고, 여러 데이터를 엮는다든가 하는 식으로 좀 더 개선하고 싶은 부분이 있었다. 그러면서도 좀 더 쉬운 방법을 고민을 했다.

이 데이터로 무엇을 할 수 있을까? 를 문장으로 써보자

그 중 한 가지 방법으로, 각각의 통계표에 대해 해당 통계표를 사용할 만한 질문을 연결해두면 검색도 용이하고 좀 더 추론도 쉽지 않을까? 하는 생각이 들었다. 그래서 각각의 표에 대한 질문 형태를 자동으로 생성하고 이와 관련된 검색을 했을 때 해당 표의 이름(이것도 모든 레벨에 대해서 보여줘야 한다. 안 그러면 표에 대한 정확한 정보를 알 수 없다)과 함께 링크를 보여주는 형태로 만들기로 했다. 표에 대한 질문 문장 생성…이거야말로 LLM 본연의 일이 아닌가!
통계표별로 전체 레벨명을 활용해서 각각의 내용이 필요한 질문을 1~2개씩 만들고, 질문이 겹치는 경우에는 새로 생성한 다음에 해당 질문 역시 json 데이터에 추가했다. 이렇게 한 후 테스트를 하니 실제로 Gemini도 좀 더 잘 검색하는 것 같았다(정확한 테스트 케이스를 깊이있게 만든 것은 아니어서 기분 탓일 수 있다)

만들고 나니 혼자 쓰기 아깝다

혹시나 공개해두면 한 명이라도 더 KOSIS를 잘 쓰고 데이터를 잘 활용할 수 있을 지도 모르는데! 하는 쟈근 희망을 가지고 외부 공개용을 만들기로 했다. 그러면 전략을 바꿔야 했다. 일단 프로그램 자체에서는 LLM을 쓸 수 없다(이건 내 개인의 것이라 API 사용료가 어떻게 될 지 모른다. 처음에는 API Key를 외부입력으로 받아서 돌리는 방식도 고민했지만 어차피 공개할 거면 사람들마다 사용하는 LLM이 다 다를 거고 API Key를 안 사용하는 사람도 상당수일 것 아닌가.). 그리고 상당수의 사용자는 나보다 KOSIS에 대한 이해가 부족하다. 그러면 일단 자연어 검색이 가장 접근하기 좋은 방법이었다. 어차피 표 별 질문도 만들어놨겠다 어렵지 않을 것 같았다.

그래서 자연어 검색을 통해서 해당 질문을 기반으로 데이터를 찾아서 화면에 띄우는 웹페이지를 만들었다. (프론트엔드 부분에 대해서는 사실 내가 아는 지식이 극히 적어 Gemini에게 거의 완전히 의존했다. 디자인 역시…웬만해서 나보다 못 할 리 없기 때문에 역시 맡겼다(…).)

일단 로컬 웹서버를 띄우고 돌려봤을 때 결과는 꽤 괜찮았다. 역시나 또 폭사하지 않을까 싶어 몇 가지 테스트도 돌려봤지만 나쁘지 않았다.

질문을 통한 데이터 훑어보기

이걸 만들고 나니, 열심히 만들어 둔 질문 리스트가 눈에 밟혔다. 이걸 검색용으로만 쓰면 너무 심심한데, 이걸 추가로 볼 수 있는 화면이 있으면 이걸 읽으면서 뭔가 새로운 아이디어나 호기심이 더 생길 수 있지 않을까? 하는 생각이 들었다. 그래서 추가로 이 질문 목록과 데이터 링크가 랜덤으로 나열되는 페이지를 메뉴에 추가했다. 이것도 결과 테스트만 하고 전반적인 구성은 AI에게 맡겼다. 프론트엔드에서 내가 한 것이라고는 테스트와 GA 코드 심는 일 뿐이군…

나머지는 Github에 올리고 vercel.app에 deploy 하니 끝났다.

그 후

만드는 데는 대략 KOSIS 뜯어보는 것까지 포함해서 하루 정도…라지만 사실 AI에게 일시키고 딴짓하다 검토하고 이런 시간이 많았기 때문에 이걸 이렇게 걸렸다고 하게 맞는지 좀 애매하다. 어쨌든 신경은 계속 쓰고 있었으니 그렇다고 하자.

(SNS에 공유 후 타이핑하다보니 느려져서 debounce 넣어달라는 요청이 와서(입력과 동시에 검색이 들어가다보니 발생한 현상이다) debounce 0.5초로 넣고 큰 검색은 한 번만 돌도록 수정했다. )

결과

그래서 만들어진 공개용 KOSIS 스마트 검색 페이지는 다음과 같다.

https://kosis.vercel.app/

(다들 들어가서 구경하세요. 기본 검색 페이지가 있고, 왼쪽의 햄버거 메뉴를 누르면 질문 리스트 페이지도 구경하실 수 있습니다.)


우리가 흔히 ‘요즘 화재가 더 많이 나는 것 같지 않아?’ 같은 이야기를 할 때부터 시작해서, ‘이런 현상이 있기 때문에 이런 것을 만들려고 합니다’ 같은 발제를 하는 데까지, 모든 곳에 있어서 근거 자료가 있는 것과 없는 것은 비교할 수 없는 차이가 난다. 이럴 때 근거 자료를 손쉽게 찾을 수 있다면 얼마나 좋을까? 그리고 숫자 표와는 여전히 어색한 사람들이 많으니 이 숫자로 이런 질문에 대답할 수 있다는 걸 좀 더 빠르게 안다면 좋지 않을까? 하는 생각에서 만들어서 공개한 사이트다. 이를 통해서 사람들이 공개된 데이터 중에도 유용한 것이 많다는 것을 알고, 괜한 말에 속지 말고 알고 싶은 것을 또렷이 찾아볼 수 있었으면 좋겠다. 이런 데에 이게 0.01%라도 기여한다면 얼마나 좋을까.

소프트웨어 개발 속도가 가속화될수록, 데이터 아키텍처나 모델링 같은 데이터의 본질은 많은 경우 뒤로 밀려난다. 그러다보니 여전히 간단한 ‘딸깍’ 만으로는 놓치는 게 너무 많다. 다들 편하게 나중에 AI로 정리하면 되지-라고 하지만 모든 개발에서 그랬듯 그 나중이란 없다. 속도가 빨라질 수록 더욱 그렇다. 하지만 데이터의 형태를 이해하고 내용의 맥락을 짚어낼 수 있다면, LLM은 더욱 강력한 가속기가 될 것이고, 데이터 쪽에도 더 많은 것을 기여할 수 있을 것이다. 그렇게 되길 기대한다.


데이터와 AI로 할 수 있는 일들은 굉장히 많을 것이고, 이와 관련해서 다양한 일을 하고 있습니다. 흥미로운 이야기를 나누거나, 같이 협업할 수 있는 일이 궁금하시면 언제든 이메일, SNS 등으로 편하게 연락을 주세요.

    This post is licensed under CC BY 4.0 by the author.

    새로이 명명된 경력 (feat.프랙셔널 리더십)

    -