프로젝트 개요
서울 25개 자치구 898,800개 필지를 개별공시지가 대비 사업성으로 평가하고, 사용자가 파라미터를 직접 조정하며 임대형기숙사 건설 후보지를 탐색할 수 있는 인터랙티브 웹 지도입니다. 성북구 단독 분석으로 시작해 서울 전역으로 확장했습니다.
웹 지도: cho-woojin.github.io/dormitory-site-selection GitHub: github.com/Cho-Woojin/dormitory-site-selection
상세 정보
- 기간: 26.08 - 26.09
- 역할: 데이터 분석·알고리즘 개발
- 상태: 완료
문제 정의
임대형기숙사 입지 선정은 단순 순위 결정 문제가 아닙니다. 사업성이 높은 필지는 외곽에 몰려있고, 역세권은 땅값이 비싸며, 개방된 필지는 일조환경이 좋지만 밀도가 낮습니다. 실제로 수익률과 일조 개방도의 상관계수는 r=-0.16으로 약해, 각 지표가 서로 독립적인 정보를 담고 있었습니다. (역세권 A등급 필지의 수익률 중위값 3.23% vs E등급 3.65% — 오히려 역세권이 나쁠수록 수익률이 높은 역전 현상도 관찰)
핵심 알고리즘 — 오차범위 계층 정렬
가중합 방식 대신, 지표 간 우선순위와 "동급으로 볼 오차범위"를 사용자가 직접 조정할 수 있는 3단계 계층 정렬 알고리즘을 설계했습니다.
- 1순위 사업성 — 오차범위(tol₁) 내에서는 동급으로 처리
- 2순위 일조환경 — 오차범위(tol₂) 내에서는 동급으로 처리
- 3순위 역세권 등급 — 동급일 경우 사업성 원값으로 최종 정렬
오차범위 자체가 조정 가능한 파라미터라, tol₁=0이면 순수 사업성 순위가 되고 tol₁=20이면 사업성이 거의 무의미해지는 식으로 결과가 부드럽게 바뀝니다.
지표 정의
- S₁ 사업성 지수: 토지비(공시지가×면적×실거래배율)와 공사비·철거비로 총사업비를 산정하고, 보증금을 무이자 조달로 차감한 순투자금 대비 NOI로 계산. 서울시 도시계획 조례상 용적률과 한시완화 규정, 필지 실현계수(정방형~자루형, 평지~급경사)까지 반영
- S₂ 일조환경 지수: 동지 정오 태양고도(28.97°) 기준으로 필지 남측 15° 섹터별 최대 앙각을 계산해 개방도를 지수화, 도로에 면한 방향은 접도 보너스 부여
- S₃ 역세권 등급: 인근 역까지 직선거리 기준 250m/500m/750m/1km 임계값으로 A~E 5단계 등급화 (임계값도 웹에서 조정 가능)
서울 전역 확장 — 필터링 결과
| 단계 | 필지 수 | 비율 |
|---|---|---|
| 전체 | 898,800 | 100% |
| 지목 적격 | 667,954 | 74.3% |
| 공동주택 가능 | 649,612 | 72.3% |
| 토지이용 적격 | 590,953 | 65.7% |
| 접도·공시지가 적격 | 495,445 | 55.1% |
| 최종 후보(20실 이상) | 133,304 | 14.8% |
20실 규모 필터에서만 전체의 73%가 제거되는데, 서울 저층주거지 특성이 그대로 드러나는 지점입니다. 자치구별로는 강남구가 후보 수 1위(13,996개)지만 수익률은 최저(2.26%), 반대로 금천구는 후보 4,119개에 수익률 최고(4.85%)로 자치구 간 편차가 컸습니다.
임대료 지수 시스템
전월세 실거래 107만 건으로 법정동별 임대료 지수를 산출해 자치구 간 임대료 차이를 정규화했습니다(기준 성북구=1.00, 범위 0.51~2.12). 영등포구는 당산·양평동 준공업지역에 상위 후보가 집중됐고(용적률 400%×임대료 지수 1.33 시너지), 성동구는 성수동 준공업지역이 전체 후보의 43%를 차지했습니다.
합필 & 거점 네트워크
지도에서 인접 필지를 선택하면 합필(병합) 후 지표를 실시간으로 재계산합니다. 규모 미달로 탈락했던 33,584개 필지가 합필을 통해 후보로 전환됐지만, 수익률 개선 폭은 크지 않았습니다(중위 +0.12%p) — 오히려 공유 거점 모델의 공용 커뮤니티 공간 확보 측면에서 의미가 있습니다. 여러 필지를 하나의 사업으로 묶는 거점 네트워크는 단순히 상위 순위를 나열하지 않고 최소 이격거리 제약(기본 1,000m)을 적용해 자동 선정합니다.
기술 스택
Python(GeoPandas)으로 공간분석 파이프라인을 구축하고, 원시 지표값만 정규화해 저장한 뒤 브라우저(JavaScript)에서 최종 점수를 실시간 계산하는 구조로 설계했습니다. 서울 전역 확장으로 용량이 커지면서 수치 데이터를 JSON 대신 바이너리 포맷(scoring.bin, 23.6MB)으로 전환해 파싱 비용을 사실상 0으로 줄였고, 벡터타일도 3개 파일(75/75/81MB)로 분할해 git 100MB 제한을 회피하면서 Range 요청으로 필요한 타일만 받도록 했습니다. MapLibre GL JS로 토큰·API 키 없이 지도를 렌더링하고, GitHub Pages에 완전 정적으로 배포합니다.
검증 체계
Python(07_verify_tiles.py)에서는 적격 필지 481,335개의 타일 존재·조인 무결성·계층 정렬 상위 200 순서 일치를 확인하고, JavaScript(verify_ui.mjs)에서는 JS·Python 엔진 간 순위 동일성뿐 아니라 합필 도형 정확도(상대오차 ≤2%), 거점 이격거리 준수, 32개 레이아웃 조합(상태 8×화면폭 4), 부팅 예산(600ms 이내)까지 검증합니다. 검증 항목이 하나라도 실패하면 배포가 차단되는 구조입니다.
한계 & 진행 상태
일조분석은 기하학적 차폐만 반영해 법적 사선제한 심의는 포함하지 않았고, 건물의 21.6%는 높이·층수 데이터가 없어 바닥면적으로 추정했습니다. 단위공사비·전용률·공실률 등 일부 지표는 아직 가정값이라 실제 투자 판단에는 사용할 수 없으며(웹 상단에 "가정 포함" 배지 표시), 상업지역 의무 비주거 비율·1종일반주거 층수제한 반영, 그리고 2027년 개통 예정인 동북선 경전철 반영이 향후 과제로 남아있습니다.