URBAN SAFETY NETWORK
▮ DATA & METHODOLOGY

데이터

이 서비스가 사용하는 데이터의 출처와 업데이트 일자, Safety Index 산식, 데이터 모델과 운영 원칙을 공개합니다.

▮ 01 · DATA SOURCES

데이터 출처

Active ProviderFIRESTOREFirebase Firestore에 적재된 테스트 데이터 · NEXT_PUBLIC_DATA_SOURCE=firestore
NOTICE현재 표시되는 모든 수치는 개발·시연용 테스트 데이터입니다. 규모와 추세는 공개 통계와 비슷하게 설계되었지만 실제 통계가 아니며, 아래 출처 목록은 실데이터 연동 시 사용할 원천을 나타냅니다.
LOADING SOURCES
▮ 02 · SAFETY INDEX METHODOLOGY

Safety Index 산식

Components & Weights

같은 레벨(시도끼리 / 시군구끼리)의 지역을 대상으로 계산

  1. 5대 범죄
    MAJOR 5
    살인·강도·성범죄·절도·폭력, 인구 10만 명당
    30%
  2. 강력범죄
    VIOLENT
    살인·강도·성범죄, 인구 10만 명당
    25%
  3. 최근 증가율
    GROWTH
    전체 범죄 전년 대비 증가율
    20%
  4. 인구 대비
    PER CAPITA
    전체 범죄, 인구 10만 명당
    15%
  5. 기타 범죄
    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_at

Firestore 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
  1. 01
    PUBLIC DATA
    공공데이터
    공공데이터포털 · TAAS
    →
  2. 02
    COLLECTOR
    수집기
    Cloud Run (예정)
    →
  3. 03
    NORMALIZE
    정규화
    공통 스키마 변환·지역 코드 매핑
    →
  4. 04
    FIRESTORE
    저장소
    읽기 전용 컬렉션
    →
  5. 05
    CDN
    배포
    Firebase Hosting · 정적 export
    →
  6. 06
    USER
    사용자
    브라우저에서 Repository 조회

수집기는 공공데이터포털 API와 TAAS 파일을 주기적으로 가져와 공통 스키마로 정규화한 뒤 Firestore에 적재하고, 정적 사이트는 CDN을 통해 배포됩니다. 갱신 일자는 meta/sources에 기록되어 모든 화면 하단의 SOURCE 푸터에 표시됩니다.

Source—Data Updated—※ 현재 표시되는 수치는 개발용 테스트 데이터입니다.SOURCE ↗