▮ DATA & METHODOLOGY
데이터
이 서비스가 사용하는 데이터의 출처와 업데이트 일자, Safety Index 산식, 데이터 모델과 운영 원칙을 공개합니다.
▮ 01 · DATA SOURCES
데이터 출처
Active ProviderFIRESTOREFirebase Firestore에 적재된 테스트 데이터 ·
NEXT_PUBLIC_DATA_SOURCE=firestoreNOTICE현재 표시되는 모든 수치는 개발·시연용 테스트 데이터입니다. 규모와 추세는 공개 통계와 비슷하게 설계되었지만 실제 통계가 아니며, 아래 출처 목록은 실데이터 연동 시 사용할 원천을 나타냅니다.
LOADING SOURCES
▮ 02 · SAFETY INDEX METHODOLOGY
Safety Index 산식
Components & Weights
같은 레벨(시도끼리 / 시군구끼리)의 지역을 대상으로 계산
- 5대 범죄MAJOR 5살인·강도·성범죄·절도·폭력, 인구 10만 명당30%
- 강력범죄VIOLENT살인·강도·성범죄, 인구 10만 명당25%
- 최근 증가율GROWTH전체 범죄 전년 대비 증가율20%
- 인구 대비PER CAPITA전체 범죄, 인구 10만 명당15%
- 기타 범죄OTHER사이버·보이스피싱, 인구 10만 명당10%
Formula
정규화와 합산
risk_k = minmax(value_k) ∈ [0, 1] // 같은 레벨 내, 높을수록 발생 통계 높음 RISK = Σ_k weight_k × risk_k SAFETY = 100 − RISK × 100 // 높을수록 통계상 안전 CRIME IDX = 100 − SAFETY
- min-max 정규화는 비교 대상 지역 집합의 최소값을 0, 최대값을 1로 두는 상대 척도입니다. 모든 지역의 값이 같으면 0.5로 처리합니다.
- 최근 증가율은 전체 범죄 건수의 전년 대비 변화율이며, 전년도 데이터가 없는 2018년에는 지수를 계산하지 않습니다.
- 인구 대비 항목은 주민등록 인구를 분모로 합니다. 관광객·출퇴근 유동 인구가 많은 지역은 체류 인구 기준보다 발생률이 높게 계산될 수 있으므로, 지수는 절대 안전도가 아닌 통계상 상대 비교로 해석해야 합니다.
▮ 03 · DATA MODEL
데이터 모델
Common Schema
TypeScript 타입 · src/lib/data/types.ts
// 공통 정규화 스키마 (기획서 §20)
Region { code, name, shortName, nameEng, level: 'sido' | 'sigungu', parentCode?, population, centroid: [lng, lat], areaKm2 }
CrimeStat { regionCode, level, year, crimeType, count, ratePer100k }
TimeProfile { regionCode, year, crimeType, byHour[24], byDay[7], byDayHour[7][8] } // 8 = 3시간 구간, 값은 비중(합 = 1)
TrafficStat { regionCode, level, year, accidents, deaths, injuries, byType: { carToCar, carToPerson, carAlone }, ratePer100k }
PoliceFacility{ id, name, type: 'station' | 'district' | 'substation', regionCode, lng, lat }
DataSource { id, title, publisher, url, updatedAt, usedFor[] }
// 모든 통계 레코드의 공통 축
region · year · crimeType · count · ratePer100k · source · updated_atFirestore Collections
읽기 전용 · 쓰기는 Admin SDK(시드/ETL)만 허용
- regions/{code}시도(2자리)·시군구(5자리) 행정구역, 인구·중심점·면적
- crime_series/{code}지역 1개의 전 연도 × 범죄 유형 [발생 건수, 10만 명당 발생률] 묶음
- crime_time/{code}_{year}지역·연도별 7개 범죄 유형의 시간대·요일 프로필 (7×8 행렬은 56개로 평탄화)
- traffic_series/{code}지역 1개의 전 연도 교통사고 건수·사망·부상·유형 묶음
- police_facilities/{sigunguCode}시군구 1개의 경찰서·지구대·파출소 목록 (sidoCode 필드로 시도 단위 조회)
- meta/sources데이터 출처 목록(items)과 생성 시각(generatedAt)
연도 범위 2018–2024 · 범죄 유형 murder, robbery, sexual, theft, violence, cyber, voicePhishing (+ 파생 total, major5, violent, property, financial) · 지역 코드는 통계청 행정구역 코드(시도 2자리, 시군구 5자리, parentCode = 앞 2자리).
▮ 04 · PRINCIPLES
운영 원칙
No Prediction
기획서 §29 · 예측이 아닌 통계 패턴 분석
- 서비스의 모든 수치·순위·지수는 과거 기록의 통계 패턴이며 미래의 사건 발생을 예측하지 않습니다.
- 표현 분류는 HISTORICAL RISK(과거 발생 통계)와 STATISTICAL PATTERN(시간·요일·유형 분포) 두 가지만 사용합니다.
- “범죄가 일어날 것”, “위험이 예상됨”과 같은 예측 어휘를 사용하지 않고, “발생 통계가 높은 지역”, “증가세가 나타난 지역”처럼 기록에 근거한 표현만 사용합니다.
- 데이터 스토리와 지수 설명에는 항상 출처·기준 연도·산식을 함께 표기합니다.
Privacy & Fairness
기획서 §30 · 개인정보 없음, 지역 단위만
- 개인 식별이 가능한 정보(사건 당사자, 주소, 차량 등)는 어떤 형태로도 수집·표시하지 않습니다.
- 모든 통계는 시도·시군구 단위로만 집계·표시하며, 그보다 세밀한 위치 정보는 경찰시설의 공개 주소 외에 제공하지 않습니다.
- 특정 지역을 “위험 지역”으로 낙인찍는 라벨·색상·문구를 사용하지 않습니다. 순위와 지수는 통계상 상대 비교이며 거주·방문 판단의 근거로 제시되지 않습니다.
- 인구 대비 지표의 한계(유동 인구, 신고율 차이, 집계 기준 변경)를 명시합니다.
▮ 05 · UPDATE PIPELINE
데이터 갱신 파이프라인
Flow
기획서 §19–22 · 현재는 시드 스크립트로 적재, 자동 수집은 후속 단계
PLANNED
- 01PUBLIC DATA공공데이터공공데이터포털 · TAAS→
- 02COLLECTOR수집기Cloud Run (예정)→
- 03NORMALIZE정규화공통 스키마 변환·지역 코드 매핑→
- 04FIRESTORE저장소읽기 전용 컬렉션→
- 05CDN배포Firebase Hosting · 정적 export→
- 06USER사용자브라우저에서 Repository 조회
수집기는 공공데이터포털 API와 TAAS 파일을 주기적으로 가져와 공통 스키마로 정규화한 뒤 Firestore에 적재하고, 정적 사이트는 CDN을 통해 배포됩니다. 갱신 일자는 meta/sources에 기록되어 모든 화면 하단의 SOURCE 푸터에 표시됩니다.