Editor's Note
kosis-stats
국가데이터처가 운영하는 KOSIS(국가통계포털, kosis.kr) Open API로 한국 공식 통계표를 검색하고 메타데이터·데이터·대용량 자료를 조회한다. Use when the user asks for 한국 공식 통계 (인구, 가구, 물가, 고용 등) 수치 조회, not for analysis or visualization.
Install
npx skills add https://github.com/NomaDamas/k-skill --skill kosis-statsKOSIS Stats
What this skill does
국가데이터처(구 통계청)가 운영하는 KOSIS(국가통계포털) Open API https://kosis.kr/openapi/ 로 한국 공식 통계 자료를 조회 자동화한다.
이 스킬은 조회 전용이다. 통계 작성, 데이터 변경, 대시보드 등록, 사용자별 통계 자료 등록은 범위에 포함하지 않는다.
지원 endpoint:
statisticsSearch.do— 키워드로 통계표 검색statisticsData.do?method=getMeta— 통계표 메타데이터 (분류·항목·단위)statisticsParameterData.do— 통계표 데이터 셀 조회 (기간/분류 필터)statisticsBigData.do— 대용량 자료 (사전 등록한userStatsId필요)
When to use
- "1인 가구 비율 통계 찾아줘"
- "KOSIS에서 고령인구 비율 시도별 데이터 가져와"
- "DT_1IN0001 표 메타데이터 보여줘"
- "최근 5년치 소비자물가지수 KOSIS에서 뽑아줘"
When not to use
- 실시간 시세나 거래소 데이터를 원하는 경우 (KOSIS는 공식 통계용)
- 데이터 시각화·분석·보고서 작성이 주 목적인 경우 (이 스킬은 raw 데이터 조회만)
- 통계 작성·등록·수정이 필요한 경우
- 대용량 자료를 받기 위해 사용자별 자료(
userStatsId)를 새로 등록해야 하는 경우 (KOSIS 웹에서 직접 등록)
Prerequisites
- Python 3.9+ (stdlib only, 외부 패키지 없음)
- 일반
search/meta/data:k-skill-proxy의 KOSIS route가 있는 hosted/self-host 프록시에 접근 가능할 것 bigdata또는--direct: KOSIS Open API 인증키 (무료, https://kosis.kr/openapi/ 에서 회원가입 후 활용신청)
python3 kosis-stats/scripts/run_kosis_stats.py --help
Required environment variables
- 일반
search/meta/data: 없음. 기본 hostedhttps://k-skill-proxy.nomadamas.org를 사용한다. KSKILL_PROXY_BASE_URL— self-host·별도 프록시를 쓸 때만 설정. 비우면 기본 hosted proxy를 사용한다.KSKILL_KOSIS_API_KEY—bigdata또는--direct로 KOSIS를 직접 호출할 때만 필요하다.
발급 절차와 호출 한도, 에러 코드 등 자세한 내용은 references/kosis-openapi-guide.md 참고.
Credential resolution order (bigdata 또는 --direct 전용)
- 이미 환경변수에 있으면 그대로 사용한다.
- 에이전트가 자체 secret vault(1Password CLI, Bitwarden CLI, macOS Keychain 등)를 사용 중이면 거기서 꺼내 환경변수로 주입해도 된다.
~/.config/k-skill/secrets.env(기본 fallback) — plain dotenv 파일, 퍼미션0600.- 아무것도 없으면 유저에게 물어서 2 또는 3에 저장한다.
기본 경로에 저장하는 것은 fallback일 뿐, 강제가 아니다.
일반 조회 helper는 proxy URL만 읽고, KOSIS 인증키는 proxy 서버에서만 주입한다. bigdata/--direct 호출만 KSKILL_KOSIS_API_KEY 환경변수와 위 secrets 파일을 읽는다.
Inputs
서브커맨드: search, meta, data, bigdata.
공통 옵션:
--text: 사람용 요약--json: 구조화 결과 (기본값)--dry-run: 인증키 없이 요청 URL/파라미터만 출력--timeout N: HTTP 타임아웃 초 단위 (기본 30)--proxy-base-url URL: 기본 hosted proxy 대신 self-host/alternate proxy 사용--direct: proxy를 우회하고KSKILL_KOSIS_API_KEY로 KOSIS 직접 호출
서브커맨드별 입력:
search--query "키워드"--result-count N(1-5000, 기본 20)--start-count N(페이징 시작, 기본 1)
meta--org-id 101(기본 101=통계청)--table-id DT_1IN0001--meta-type TBL|ITM|OBJ(기본 TBL)
data--org-id 101--table-id DT_1IN0001--prd-se M|Q|S|Y|F|IR(수록 주기)--start YYYY[MM|QQ|HH],--end YYYY[MM|QQ|HH]--itm-id ALL(항목 ID, 기본 ALL)--obj-l 1=ALL --obj-l 2=00(분류 필터, 반복 가능)
bigdata--user-stats-id <KOSIS 등록 ID>--format json|sdmx|csv(xls는 바이너리라 helper 미지원 — 필요 시 KOSIS 웹에서 직접 다운로드)--prd-se,--new-est-prd-cnt(선택)
Workflow
1. Ensure proxy access is available
일반 search/meta/data 는 기본 hosted k-skill-proxy를 사용하므로 사용자 KOSIS 키가 필요 없다. self-host를 쓰면 KSKILL_PROXY_BASE_URL을 설정한다.
bigdata 또는 --direct가 필요할 때만 KSKILL_KOSIS_API_KEY 를 credential resolution order에 따라 확보한다. 시크릿이 없다는 이유로 다른 통계 사이트나 비공식 경로를 찾지 않는다.
2. Search for candidate tables
질문을 먼저 한국어 키워드로 좁히고 search 로 후보 통계표를 본다.
python3 kosis-stats/scripts/run_kosis_stats.py search --query "1인 가구" --text
출력에서 [ORG_ID/TBL_ID]를 골라 다음 단계에 사용한다.
3. Inspect the table meta before fetching data
데이터를 받기 전에 분류/단위/주기를 확인한다.
python3 kosis-stats/scripts/run_kosis_stats.py meta --table-id DT_1JC1501 --text
4. Fetch a small bounded slice first
--prd-se, --start, --end, --obj-l 으로 범위를 좁혀 작은 슬라이스를 먼저 조회한다.
python3 kosis-stats/scripts/run_kosis_stats.py data \
--table-id DT_1JC1501 --prd-se Y --start 2020 --end 2022 \
--obj-l 1=ALL --json
표마다 필수 분류 차원 수가 다르다. default --obj-l 1=ALL 만으로는 부족한 표가 많다. KOSIS가 코드 20 (필수요청변수값 누락 objL)을 돌려주면, meta --table-id <ID> --meta-type ITM --json 으로 ITM 안에 들어 있는 OBJ_ID(분류 차원)와 코드를 확인한 뒤 --obj-l 1=<코드> --obj-l 2=<코드> 형태로 필요한 차원을 모두 지정한다. (많은 표가 OBJ 메타는 비어 있고 분류가 ITM 안에 들어 있음.)
40,000셀을 초과하면 KOSIS는 에러 코드 31 또는 41 을 반환한다. 기간을 좁히거나(예: 5년→1년) 분류 필터의 ALL 을 특정 코드로 바꿔(예: --obj-l 1=11 서울만) 호출을 분할한다. 그래도 부족하면 사용자별 통계자료(userStatsId)를 등록해 bigdata 서브커맨드를 사용한다.
행정구역 코드 관례: C1 코드는 보통 시도가 2자리(11 서울, 26 부산 등), 시군구가 5자리다. data --json 응답의 C1 필드를 확인해 원하는 단위만 후속 처리에서 필터한다.
5. (Optional) Use bigdata for large datasets
bigdata 는 KOSIS 웹에서 미리 등록한 userStatsId 가 필요하다. 미등록 상태면 사용자에게 등록 안내만 하고 멈춘다.
python3 kosis-stats/scripts/run_kosis_stats.py bigdata \
--user-stats-id "openapisample/101/DT_1IN1502/2/1/20191106094026_1" \
--format json --new-est-prd-cnt 5
6. Cite the source
응답을 요약할 때는 org_id, tbl_id, 기간, 단위(UNIT_NM), 그리고 endpoint URL을 함께 적는다.
Done when
- 사용자 질문에 대응하는 통계표 ID(
org_id/tbl_id)가 명확하다. - 메타데이터를 1회 이상 조회해 분류·단위·주기를 확인했다.
- 작은 슬라이스부터 단계적으로 데이터를 받았다.
- 결과에 출처(table id, 기간, 단위, endpoint)를 명시했다.
- 한도 초과 시 분할 또는
bigdata안내로 처리했다.
Failure modes
KSKILL_KOSIS_API_KEY누락:bigdata또는--direct호출에서만 발급 안내 메시지와 함께 종료(exit 1)- KOSIS 에러 코드
10/11: 인증키 누락/만료 → 키 점검.bigdata에서11이 나오면userStatsId가 본인 KOSIS 계정에 등록된 것이 아닐 가능성이 크다. - 코드
20: 필수 분류 누락 →meta --meta-type OBJ(또는 비어 있으면ITM) 으로 필요한 차원 수와 코드를 확인하고--obj-l 1=... --obj-l 2=...모두 지정 후 재시도 - 코드
21: 잘못된 요청 변수 →org_id/tbl_id/기간 형식 재확인. tblId 의심 시search로 정확한 ID 다시 찾기 - 코드
30: 결과 없음 → 키워드를 더 짧게 또는 다른 표현으로 바꾸거나 기간/분류 완화. meta 호출에서 30 이 나오면 표가 해당 메타 타입을 지원하지 않는 경우이므로 다른--meta-type시도 - 코드
31/41: 한도 초과 → 기간 좁히기, 분류 ALL 을 특정 코드로 바꾸기, 또는bigdata사용 - 코드
40: 분당 1,000건 호출 한도 → 잠시 대기 - 코드
50: KOSIS 서버 오류 → 1~2초 후 재시도 - 비표준 JSON: KOSIS는 따옴표 없는 키를 가끔 반환한다. helper는 자동 보정한다.
- 응답에
UNIT_NM누락: 일부 표는 KOSIS 응답에 단위가 비어 있다. helper text 출력의[summary]라인에unit=(KOSIS 응답에 UNIT_NM 미포함)으로 명시되며, 단위는meta응답이나 KOSIS 웹 화면에서 별도 확인한다. - HTTPS 전용 (2026-03-05 이후): URL은 항상
https://. HTTP 요청은 차단된다.
회복 시나리오 예시
- 코드 20 회복:
data --table-id DT_1J22001 --prd-se M --start 202401 --end 202401→ 코드 20 →meta --table-id DT_1J22001 --meta-type ITM --json으로 차원 확인 →data ... --obj-l 1=T10 --obj-l 2=0재호출 → 성공 - 코드 31 회복:
data --table-id DT_1B26001 --prd-se Y --start 2020 --end 2024 --obj-l 1=ALL --obj-l 2=ALL --obj-l 3=ALL→ 코드 31 →... --start 2024 --end 2024 --obj-l 1=11 --obj-l 2=ALL --obj-l 3=ALL(서울만) 재호출 → 성공
Maintainer review notes
메인테이너가 이 스킬을 검토하기 위해 KOSIS 인증키를 새로 발급받을 필요는 없다.
일반 조회는 k-skill-proxy가 KOSIS 인증키를 서버 쪽에서 주입한다. bigdata 와 --direct만 개인 KOSIS 키가 필요하다.
키 없이 가능한 검증:
./scripts/validate-skills.shpython3 -m py_compile kosis-stats/scripts/run_kosis_stats.py kosis-stats/tests/test_run_kosis_stats.pypython3 kosis-stats/scripts/run_kosis_stats.py --helppython3 kosis-stats/scripts/run_kosis_stats.py search --query 인구 --dry-run(URL/파라미터 출력만)PYTHONPATH=kosis-stats/scripts python3 -m unittest discover -s kosis-stats/tests -p 'test_*.py' -vnpm run ci
실제 direct live smoke는 기여자 또는 이미 KOSIS 키가 있는 사용자가 선택적으로 수행한다. Proxy live smoke는 배포 proxy에 KOSIS_API_KEY가 설정된 뒤 수행한다. PR에는 호출 endpoint, 파라미터, 응답 행 수 같은 비민감 요약만 남기고 인증키와 개인 조회 세부 내역은 공유하지 않는다.
Safety notes
- 조회 전용 스킬이다.
- 사용자별 통계자료(
userStatsId) 등록, 데이터 수정, KOSIS 웹 자동화는 하지 않는다. - 일반 조회 인증키는 proxy 서버에서만 다룬다. direct/bigdata 인증키는 환경변수 또는
~/.config/k-skill/secrets.env로만 다룬다. - 응답 JSON에 인증키가 echo 되지 않도록 helper는
--dry-run시에도 키를<DRY-RUN>으로 대체한다.