Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions cases/YoungjaeKang-retail-hours/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
|---|---|
| 처치 | 동대문구, 분석상 시작 분기 2024Q2 |
| 비교 | 서울 내 20개 자치구 후보 — 정책 이력 추가 확인 필요 |
| 기간 | 2021Q1~2024Q4, 2023Q4·2024Q1 제외 |
| 기간 | 2021Q1~2024Q4, 2024Q1만 추정에서 제외 (원자료·전체 분기 집계에는 보관) |
| 지표 | 골목상권 육류·수산물·청과·반찬 판매 추정매출 합계의 자연로그 |
| 방법 | 이벤트스터디, 가짜 시행일 검정 |

공개 자료로 정책 근거·집계·검사·추정 과정을 재현할 수 있는 사례를 만드는 데 초점을 둔다. 효과의 유의성보다 근거와 해석 범위를 분명히 남기는 것을 완료 기준으로 삼는다.

분석 범위와 일정은 [plan.md](plan.md), 실행 설정은 [plan.yaml](plan.yaml)에서 볼 수 있다. 자치구별로 찾아본 근거와 더 확인할 내용은 [정책 확인표](policy-verification.md)에 모았다.

현재는 계획을 작성한 상태로, 매출 원자료는 아직 수집하거나 분석하지 않았다. 계획을 커밋하고 PR을 올린 뒤 수집 코드(`fetch.py`)와 이 사례에 필요한 검사를 작성할 예정이다. 비교 지역의 휴업일 변경 이력과 연도별 상권 자료를 같은 기준으로 비교할 수 있는지 확인하기 전에는 정책 효과를 판단하지 않는다.
서울 25개 구의 [공통 조사표](comparison-survey.md)와 [자료원·지표 정의](data-notes.md)를 마련했다. [특성자료 수집·검사 계획](collection-plan.md)에 2022년 자료의 조회 조건·누락 처리·보류 조건·로컬 산출물을 정했다. 특성 값과 최종 비교군은 아직 확정하지 않았다. [구별 공개 자료 확인 공백](verification-gaps.md)에 다음에 확보할 문서를 특정했다.

선행연구의 질문·방법·한계와 사례에 적용할 내용은 [연구 노트](research-notes.md)에 정리했다.

초기 계획은 [PR #9](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/pull/9)로 main에 병합됐고, 선행연구·분기 처리 보완 [PR #10](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/pull/10)과 비교군 조사 [PR #11](https://github.com/CausalInferenceLab/policy-effect-analytics-agent/pull/11)은 2026-10-13 확인 시 열려 있다. 매출 원자료는 아직 수집하거나 분석하지 않았다. 비교군 정책 이력, 동시기 지원사업, 자료 기준을 확인하고 필요한 계획 보완을 커밋·PR에 반영한 뒤 수집 코드(`fetch.py`)와 이 사례에 필요한 검사를 작성할 예정이다. 비교 지역의 휴업일 변경 이력과 연도별 상권 자료를 같은 기준으로 비교할 수 있는지 확인하기 전에는 정책 효과를 판단하지 않는다.

다음 구현은 특성자료 수집·검사이며, 매출 수집보다 먼저 진행한다. 가구·면적·점포·시장 자료는 제공 페이지의 공공누리 1유형을 확인했고, 행안부 인구 다운로드의 이용 조건은 추가 확인이 필요하다. 실제 자료 취득과 품질 검증은 후속 작업이다. 원자료·가공 값·검사 기록은 Git에 포함하지 않는다.
68 changes: 68 additions & 0 deletions cases/YoungjaeKang-retail-hours/collection-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# 정책 전 특성자료 수집·검사 계획

작성일: 2026-10-13. 서울 25개 자치구의 정책 전 특성을 같은 기준으로 설명하기 위한 사전 계획이다. 출처와 확인 이력은 [자료 노트](data-notes.md), 비교군 선정 원칙은 [분석 계획](plan.md)을 따른다. 특성 수치와 매출 원자료는 아직 수집하지 않았다.

## 범위와 시작 조건

공개 자료로 재현할 수 있는 수집·검사를 작업 범위로 삼는다. 기관 직접 문의·정보공개청구·회신 대기는 포함하지 않는다. 공개 자료에서 해결되지 않는 정책·자료 공백은 미확인으로 기록하고 해당 판단·산출을 보류하되, 독립적인 코드 구현과 자료 검사는 진행한다.

처치·비교 후보·제외·보류 여부와 관계없이 서울 25개 구 모두를 수집 대상으로 둔다. 2022년을 목표 연도로 고정하되 아래 항목별 기준시점은 그대로 보존한다. 특성값은 비교 가능성을 설명하는 용도이며 회귀 통제변수, 유사도 점수 또는 자동 편입·탈락 기준으로 사용하지 않는다.

이번 계획을 커밋·PR한 뒤 후속 PR에서 특성자료 수집·검사 코드를 구현한다. 수집 전에 자료별 이용 조건을 확인하고, 내려받은 파일의 시점·정의·공간 버전 검사를 통과한 항목만 특성표의 검증된 값으로 사용한다. 원자료를 열어야 확인할 수 있는 항목은 아래의 조건부 절차에 따라 처리한다. 다른 연도·정의로 바꿔야 한다면 대체 자료를 수집하기 전에 계획 변경과 이유를 커밋·PR한다.

## 자료별 수집 범위와 보류 조건

| 항목·출처 | 고정할 조회·집계 기준 | 취득 후 검사 및 보류 조건 |
|---|---|---|
| 인구·고령인구 — [행안부 연령별 인구](https://jumin.mois.go.kr/ageStatMonth.do) | 2022-12 월간, 서울 자치구, 등록구분 전체, 남녀 합계. 전체 인구와 65세 이상 인구. 외국인 제외 | 65세 경계를 구분하는 연령 단위와 최상위 연령의 포함 여부 확인. 전체 인구와 연령 합계 대조. 해당 통계 다운로드에 적용되는 이용 조건 확인 전 실제 취득 보류 |
| 가구 — [DT201004B010004](https://data.seoul.go.kr/dataList/DT201004B010004/S/2/datasetView.do) | 2022년, 11월 1일 0시, 일반가구 합계와 1인 일반가구, 가구 수 | 주민등록 세대와 구분. 분자·분모가 같은 모집단인지 확인. 제공기관의 5 미만 비공개 표기 `x`를 0이나 임의 값으로 변환하지 않음 |
| 면적 — [DT201004O010001](https://data.seoul.go.kr/dataList/DT201004O010001/S/2/datasetView.do) | 2022년 자치구 전체 행정면적, km²로 통일 | 기준일·단위 확인. 기준일을 확인하지 못하면 임의로 12월 31일을 붙이지 않고 밀도 산출 보류. 면적 통계로 경계 도형의 버전을 대신하지 않음 |
| 식품판매 점포 — [OA-15577](https://data.seoul.go.kr/dataList/OA-15577/A/1/datasetView.do) | 2022년 ZIP에서 2022Q4, 골목상권, CS300007·CS300008·CS300009·CS300010. 전체 점포 수 `SIMILR_INDUTY_STOR_CO` | 명세와 실제 열 대조. 전체=일반(`STOR_CO`)+프랜차이즈(`FRC_STOR_CO`) 확인. 분기×상권×업종 중복, 영역 연결 누락·복수 연결이 있으면 해당 집계 보류 |
| 상권·구 연결 — [OA-15560](https://data.seoul.go.kr/dataList/OA-15560/S/1/datasetView.do) | 2022Q4 점포 자료와 호환되는 골목상권 코드의 구별 고유 개수 | 2023년 작성 공간 파일과 점포 자료의 버전 호환성을 별도 검증. 코드 일치만으로 당시 경계·상권 모집단이 같다고 간주하지 않음. 같은 버전의 상권 모집단을 확인하지 못하면 상권 수 보류 |
| 전통시장 — [OA-1176](https://data.seoul.go.kr/dataList/OA-1176/F/1/datasetView.do) | 목록에 있는 2022년 상반기 XLSX, 자치구별 전통시장 고유 개수·존재 여부 | 파일 내부 기준일·시장 유형·전체 목록 여부 확인. 전통시장과 일반 상점가를 구분할 수 없으면 시장 수 보류. 정확한 일자가 없으면 ‘2022년 상반기’만 기록하고 연말 값으로 표현하지 않음 |

가구·면적은 연결 통계표에서 2022년을 지정한 내보내기를 우선 사용하고, 점포·시장은 위의 과거 파일을 우선 사용한다. 공개 다운로드가 수동으로만 가능하면 조회 조건과 공식 취득 절차를 README에 남기고, 후속 코드는 로컬 원본에서 정제·검사를 재현하도록 한다. 파일 취득까지 자동화됐다고 설명하지 않는다. API로 전환할 때는 같은 시점·정의·버전인지 먼저 대조하고 필요한 키 설정을 별도로 안내한다.

대형마트·SSM의 2022년 말 영업 수, 규제 제외 점포 수, 공식 경계 기반 인접성은 아직 자료 확보 경로가 충분하지 않다. [정책 확인 공백](verification-gaps.md)과 함께 계속 조사하되 이번 수집의 완료 항목으로 계산하지 않는다. 최신 인허가 파일의 현재 영업 상태나 등록일만으로 과거 영업·휴업 규칙을 복원하지 않는다. OA-23058의 현재 전통시장 API도 2022년 파일의 대체 자료로 사용하지 않는다.

## 정제·파생 지표

원본 지역 코드와 코드 체계를 보존하고, 공식 자료의 구명·코드 대응을 확인해 `gu_code`로 연결한다. 서울 합계·동 단위 행은 자치구 행에 더하지 않는다. 출처별 대응표는 25개 구 각각에 유일한 연결이 있어야 하며, 불명확한 이름이나 코드를 추측해서 채우지 않는다.

- 고령인구 비율: 같은 시점의 65세 이상 인구 / 전체 주민등록인구 × 100.
- 인구밀도: 2022년 12월 말 주민등록인구 / 기준일을 확인한 2022년 행정면적(km²). 두 자료의 실제 기준일을 함께 표시한다.
- 1인 가구 비율: 2022년 1인 일반가구 / 전체 일반가구 × 100.
- 식품판매 점포 수: 골목상권의 전체 점포 수를 구×업종별 합산. 네 업종 합계와 각 업종 / 네 업종 합계 × 100을 함께 기록한다.
- 시장 수·존재 여부: 자료의 공식 식별자가 있으면 이를 사용한다. 없으면 구·시장명·주소로 중복 후보를 찾되, 서로 다른 시장인지 원문으로 해결하기 전에는 자동 병합하지 않는다. 포함할 시장 유형을 구별로 달리 적용하지 않는다.

점포 수는 한 시점의 재고이므로 4개 분기를 합산하지 않는다. 네 업종 중 일부가 누락되면 부분합을 전체 합계로 표시하지 않는다. 분모가 0이거나 결측이면 비율은 정의 불가로 남긴다. 공간 연결이 불명확한 상권은 임의 배분하지 않는다.

## 누락·오류 처리와 완료 기준

| 검사 | 처리 |
|---|---|
| 구 범위 | 출력에는 25개 구를 모두 유지하고 구×지표×기준시점은 유일해야 함. 자료가 없는 구도 상태와 사유를 가진 행으로 보존 |
| 응답·파일 | HTML 오류·로그인 응답을 CSV/XLSX/ZIP 취득 성공으로 기록하지 않음. 빈 파일, 필요한 시트·열·분기 부재는 실패 기록 |
| 시점·정의 | 목표 연도·분기, 가구 모집단, 시장 유형, 공간 버전을 대조. 기준이 다르면 해당 지표의 산출 중단 |
| 수치 | 인구·가구·점포·시장 수는 비음수 정수, 면적은 양수. 비율 0~100, 분자≤분모, 전체와 부분 합계 확인. 반올림된 값은 출처의 표시 정밀도로 허용 오차를 정하고 기록 |
| 비공개·결측 | 빈칸·`x`·기타 기호의 원문과 정의를 보존. 미수집·비공개·연결 실패를 0으로 채우지 않음. 보간·인접 연도 대체 없음 |
| 중복·연결 | 원본 키 중복과 상권→구 복수 연결을 보고하고 집계 중단. 원인 확인 없이 첫 행 선택·중복 제거 금지 |
| 0의 인정 | 공식 자료의 명시적인 0 또는 완전한 대상 목록과 부재 근거를 확인한 경우만 허용. 목록에 행이 없다는 이유만으로 0을 생성하지 않음 |

항목의 오류는 그 항목과 이를 사용하는 파생 지표를 보류하며, 독립적인 다른 자료의 검사까지 막지는 않는다. 특성자료가 부족하다는 이유만으로 비교 후보를 자동 탈락시키지 않는다. 최종 비교군은 별도 PR에서 정책 이력·확인 수준과 함께 판단한다.

수집·검사 PR의 완료 기준은 **실제 취득 가능한 항목을 재현하고, 25개 구의 모든 계획 지표에 값 또는 보류 사유가 남으며, 해결되지 않은 오류가 성공으로 표시되지 않는 것**이다. 일부 값이 보류되면 전체 특성표를 완성했다고 보고하지 않는다. 정책 이력 전체 확인과 효과 추정 완료는 별개다.

## 저장·실행 계약

후속 코드의 산출 위치는 사례 폴더 아래 `data/characteristics/`로 정한다. 원본은 `data/raw/characteristics/<자료원>/<수집일>/`에 보관하며 기존 파일을 조용히 덮어쓰지 않는다. 원본·가공 값·검사 기록은 Git에서 제외한다.

| 산출물 | 내용 |
|---|---|
| `data/characteristics/values.csv` | 구×지표×기준시점별 값·단위·분자·분모, `status`, `reason`, `source_id`. 값이 보류되면 숫자 칸은 비움 |
| `data/characteristics/sources.json` | `source_id`, 공식 URL, 조회 조건, 원파일명·로컬 경로·SHA-256, 취득 시각, 이용 조건, 시점·공간·업종 정의, 변환 코드의 커밋 |
| `data/characteristics/quality.json` | 검사명·자료원·대상 구·통과/보류/실패·사유·문제 건수. 취득 오류도 기록 |

값의 `status`는 `verified`(정의·품질 확인), `not_collected`(미수집), `suppressed`(비공개), `unresolved`(정의·연결 등 미해결), `undefined`(분모 0 등)로 구분한다. 이 상태값과 정책 적격성은 서로 다른 항목이다.

이 단계는 매출 패널 `data/panel.csv`를 만들지 않으며 `make flow`로 실행하지 않는다. 공통 `collect`는 첫 번째 `data_sources`의 패널을 사용하고, 공통 `quality_checks`는 추정 패널의 열·시간·집단·중복 등을 검사한다. 여러 특성자료를 자동 수집하거나 위의 특성 검사를 대신하지 않는다. 후속 PR에서 별도 진입점과 사례별 검사를 구현한다. `plan.yaml`에는 실제 스키마의 `data_sources`·`notes`로 이 계획을 연결하고, 미구현 어댑터 이름이나 자동 검사 필드를 만들어 넣지 않는다.
Loading
Loading