서울시 고령보행자 교통사고 위험도 분석을 위한 데이터 수집 및 결합 작업 공간입니다. 도로명주소 도로구간 데이터에서 서울시 도로 포인트를 만들고, 각 포인트별 위험도와 앞으로 필요할 feature 들을 결합합니다.
- 팀원안내서.md 꼭 읽어주세요!!!!!!!
git clone <REPOSITORY_URL>
cd <REPOSITORY_NAME>cd <PROJECT_DIR>Data 폴더에 데이터들을 넣어주십쇼 압축 푸시고 안에 내용물들을 Data 폴더에 복사붙여넣기 해주세요
Data/
├── (도로명주소)도로구간_서울
├── ITS_node_link
├── 소상공인시장진흥공단_상가(상권)정보_서울_202603.csv
├── 서울시_노인의료복지시설현황_geocoded.csv
├── 전통시장여부
├── 버스정류장개수
├── 과속방지턱개수
├── 교차로개수
├── 횡단보도개수
├── 횡단보도예고표시
├── 신호등설치여부
└── 국토통계_고령인구수
Windows PowerShell:
python -m venv .venv
.\.venv\Scripts\Activate.ps1macOS/Linux:
python -m venv .venv
source .venv/bin/activatepip install -r requirements.txt데이터결합.ipynb는 Data/서울시_노인의료복지시설현황_geocoded.csv를 읽어 사회복지시설개수를 계산합니다.
이 파일은 test.ipynb에서 VWorld Geocoder API로 미리 생성합니다.
먼저 실행할 노트북:
노인보행사고데이터.ipynb
실행하면 Data 폴더에 csv 파일이 생성됩니다.
Data/seoul_old_pedestrian_individual_accidents_2020_2025.csv
이 노트북은 TAAS 웹 내부 요청을 사용하므로 인터넷 연결이 필요합니다.
다음으로 실행할 노트북:
데이터결합.ipynb
실행하면 Data 폴더에 csv 파일이 생성됩니다.
Data/seoul_road_points.csv
이미 Data/seoul_road_points.csv가 있으면 기존 CSV를 읽어서 없는 feature 컬럼만 추가합니다.
도로 shapefile 로드, 25m 포인트 재생성, 이미 계산된 feature 결합은 건너뜁니다.
이 노트북은 다음 feature를 결합합니다.
| feature | 생성 방식 |
|---|---|
POINT_ID |
서울시 도로 라인 위 25m 간격 포인트 |
위도, 경도 |
POINT_ID 위치를 EPSG:4326으로 변환 |
위험도 |
50m 버퍼 내 고령보행자 사고 기반 계산 |
제한속도 |
ITS 표준노드링크 최근접 링크의 MAX_SPD |
고령인구수 |
300m 반경 내 65세 이상 거주인구 |
사회복지시설개수 |
노인의료복지시설 지오코딩 CSV 기준 300m 반경 내 시설 개수 |
전통시장여부 |
50m 반경 내 전통시장 polygon 포함 여부 |
버스정류장개수 |
300m 반경 내 버스정류장 수, 가상정류장 제외 |
과속방지턱개수 |
50m 반경 내 과속방지턱 수 |
교차로개수 |
50m 반경 내 교차로 수 |
횡단보도개수 |
50m 반경 내 횡단보도 수 |
횡단보도예고표시여부 |
50m 반경 내 횡단보도예고표시 설치 여부 |
신호등설치여부 |
50m 반경 내 보행자신호등 설치 여부 |
| 상가 업종별 개수 | 300m 반경 내 서울시 상가 업종별 개수 |
1. 원천 데이터 파일을 Data/ 하위에 배치
2. pip install -r requirements.txt
3. test.ipynb로 Data/서울시_노인의료복지시설현황_geocoded.csv 준비
4. 노인보행사고데이터.ipynb 실행
5. 데이터결합.ipynb 실행
6. Data/seoul_road_points.csv 확인
최종 산출 파일:
Data/seoul_road_points.csv
현재 최종 CSV 컬럼:
POINT_ID, 위도, 경도, 제한속도, 위험도, 고령인구수, 사회복지시설개수, 전통시장여부, 버스정류장개수, 과속방지턱개수, 교차로개수, 횡단보도개수, 횡단보도예고표시여부, 신호등설치여부, 상가 업종별 개수 85개
컬럼 설명:
| 컬럼 | 설명 |
|---|---|
POINT_ID |
서울시 도로구간 라인 위에 25m 간격으로 생성한 포인트 ID |
위도 |
POINT_ID 위치의 위도, EPSG:4326 |
경도 |
POINT_ID 위치의 경도, EPSG:4326 |
제한속도 |
ITS 표준노드링크에서 가장 가까운 링크의 MAX_SPD 값 |
위험도 |
50m 버퍼 내 고령보행자 사고 기반 위험도 |
고령인구수 |
국토정보플랫폼 250m 격자 인구 데이터 기준 300m 반경 내 65세 이상 거주인구 |
사회복지시설개수 |
노인의료복지시설 지오코딩 CSV 기준 300m 반경 내 시설 개수 |
전통시장여부 |
50m 반경 안에 전통시장 polygon이 닿으면 1, 아니면 0 |
버스정류장개수 |
300m 반경 안에 있는 실제 버스정류장 수, 정류소타입 == "가상정류장" 제외 |
과속방지턱개수 |
50m 반경 안에 있는 과속방지턱 polygon 수 |
교차로개수 |
50m 반경 안에 있는 교차로 point 수 |
횡단보도개수 |
50m 반경 안에 있는 횡단보도 polygon 수 |
횡단보도예고표시여부 |
50m 반경 안에 횡단보도예고표시 point가 있으면 1, 아니면 0 |
신호등설치여부 |
50m 반경 안에 보행자신호등 point가 있으면 1, 아니면 0 |
| 상가 업종 컬럼 | 300m 반경 내 해당 업종 상가 수 |
위험도 계산식:
위험도 = 10 × 사고건수 × (사망자수 + 0.1168 × 중상자수 + 0.0068 × 경상자수)
.
├── README.md
├── requirements.txt
├── 노인보행사고데이터.ipynb
├── 데이터결합.ipynb
├── src/
│ └── silverwalk/
│ ├── config.py
│ ├── roads.py
│ ├── features.py
│ ├── accidents.py
│ ├── speed.py
│ ├── business.py
│ ├── population.py
│ └── social_welfare.py
├── Data/
│ ├── (도로명주소)도로구간_서울/
│ │ └── TL_SPRD_MANAGE_11_202605.shp 외 부속 파일
│ ├── ITS_node_link/
│ │ └── MOCT_LINK.shp 외 부속 파일
│ ├── seoul_old_pedestrian_individual_accidents_2020_2025.csv
│ ├── 서울시_노인의료복지시설현황_geocoded.csv
│ ├── 전통시장여부/
│ ├── 버스정류장개수/
│ ├── 과속방지턱개수/
│ ├── 교차로개수/
│ ├── 횡단보도개수/
│ ├── 횡단보도예고표시/
│ ├── 신호등설치여부/
│ ├── 국토통계_고령인구수/
│ └── seoul_road_points.csv
└── example/
핵심 처리 함수는 src/silverwalk/로 분리되어 있고, 데이터결합.ipynb는 전체 결합 순서를 실행하는 파이프라인 역할을 합니다.
| 파일 | 역할 |
|---|---|
src/silverwalk/config.py |
데이터 경로, 거리 기준, 최종 컬럼 목록 |
src/silverwalk/roads.py |
도로 데이터 로드, 서울시 필터링, 25m 포인트, 50m 버퍼 생성 |
src/silverwalk/features.py |
기본 좌표 feature 생성 |
src/silverwalk/accidents.py |
사고 데이터 결합 및 위험도 계산 |
src/silverwalk/speed.py |
ITS 표준노드링크 제한속도 결합 |
src/silverwalk/business.py |
300m 반경 상가 업종별 개수 결합 |
src/silverwalk/population.py |
300m 반경 65세 이상 거주인구 결합 |
src/silverwalk/social_welfare.py |
300m 반경 노인의료복지시설 개수 결합 |
src/silverwalk/traditional_market.py |
50m 반경 전통시장 포함 여부 결합 |
src/silverwalk/bus_stops.py |
300m 반경 버스정류장 개수 결합 |
src/silverwalk/speed_bumps.py |
50m 반경 과속방지턱 개수 결합 |
src/silverwalk/intersections.py |
50m 반경 교차로 개수 결합 |
src/silverwalk/crosswalks.py |
50m 반경 횡단보도 개수 결합 |
src/silverwalk/crosswalk_warnings.py |
50m 반경 횡단보도예고표시 여부 결합 |
src/silverwalk/traffic_signals.py |
50m 반경 보행자신호등 설치 여부 결합 |
Data/(도로명주소)도로구간_서울/TL_SPRD_MANAGE_11_202605.shp
사용 내용:
- 서울시 필터:
SIG_CD가"11"로 시작 - 도로 클래스 필터:
ROA_CLS_SE in {"3", "4"}3: 로4: 길
- 고속도로/대로는 제외합니다.
- 원본 좌표계: EPSG:5179
처리 결과:
- 서울시 도로 라인 위에 25m 간격 포인트 생성
- 각 포인트 주변 50m 버퍼 생성
생성 파일:
Data/seoul_old_pedestrian_individual_accidents_2020_2025.csv
생성 노트북:
노인보행사고데이터.ipynb
수집 방식:
- 공공데이터포털 다발지역 API가 아니라 TAAS GIS 웹페이지 내부 Ajax 요청을 재현합니다.
- TAAS 초기 페이지에서 CSRF 토큰과 세션 쿠키를 받은 뒤
selectAccidentInfo.do에 POST 요청합니다. - 조회 조건:
- 지역: 서울시
11% - 기간:
2020~2022,2023~2025를 각각 조회 후 결합 - 간편조건 코드
42: 고령보행자 사고
- 지역: 서울시
주의:
- 이 방식은 공식 OpenAPI가 아니라 TAAS 웹앱 내부 JSON 요청 재현입니다.
- TAAS 웹사이트 구조나 요청 파라미터가 바뀌면 코드 수정이 필요할 수 있습니다.
Data/ITS_node_link/MOCT_LINK.shp
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
LINK_ID |
표준 링크 ID |
ROAD_NAME |
도로명 |
MAX_SPD |
제한속도 |
geometry |
링크 라인 geometry |
처리 방식:
- 전국 링크 전체를 직접 최근접 결합하면 무거우므로, 서울시 도로 포인트 범위 주변 bbox로 먼저 자릅니다.
- 링크를 도로 포인트 좌표계인 EPSG:5179로 변환합니다.
- 각
POINT_ID에서 가장 가까운 링크 1개를 선택해MAX_SPD를제한속도로 부여합니다. - 동거리 링크가 여러 개 잡히는 경우
POINT_ID, 거리,LINK_ID기준으로 하나만 남깁니다.
Data/소상공인시장진흥공단_상가(상권)정보_서울_202603.csv
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
시도명 |
서울특별시 필터링 |
상권업종대분류명 |
상가 업종 대분류 |
상권업종중분류명 |
상가 업종 중분류 |
경도, 위도 |
상가 위치, EPSG:4326 |
처리 방식:
시도명 == "서울특별시"만 사용합니다.- 상가 좌표를 EPSG:4326에서 도로 포인트 좌표계로 변환합니다.
- 각
POINT_ID기준 300m 반경 안에 있는 상가를 업종별로 집계합니다. - 대분류 컬럼과
대분류_중분류컬럼을 최종 CSV에 추가합니다.
입력 폴더:
Data/국토통계_고령인구수/
사용 내용:
- 국토정보플랫폼에서 서울시 구별 250m 격자 고령 인구 수 데이터를 내려받습니다.
- 현재 코드의 기본 입력은
Data/국토통계_고령인구수/하위의 구별nlsp_031001010.shp파일들입니다. - 국토통계 고령 인구 수 데이터의 기본 인구수 컬럼은
val입니다.
처리 방식:
- 데이터를 도로 포인트 좌표계로 변환합니다.
- 격자 polygon 데이터는 격자 대표점 기준으로 300m 버퍼 안 포함 여부를 판단합니다.
- 각
POINT_ID기준 300m 반경 안에 포함된 격자의val을 합산해고령인구수컬럼으로 추가합니다.
입력 파일:
Data/서울시_노인의료복지시설현황_geocoded.csv
처리 방식:
test.ipynb에서 VWorld Geocoder API로 생성한 지오코딩 CSV를 사용합니다.지오코딩상태 == "OK"이고경도,위도가 있는 시설만 사용합니다.- 지오코딩 실패 시설은
사회복지시설개수계산에서 제외합니다. - 각
POINT_ID기준 300m 반경 안에 있는 시설 수를사회복지시설개수컬럼으로 추가합니다.
입력 파일:
Data/전통시장여부/서울시 상권분석서비스(영역-상권)_전통시장.shp
처리 방식:
- 서울시 상권분석서비스 영역 데이터 중
TRDAR_SE_1 == "전통시장"인 polygon을 사용합니다. - 전통시장 polygon을 도로 포인트 좌표계로 변환합니다.
- 각
POINT_ID기준 50m 버퍼가 전통시장 polygon과 닿으면전통시장여부를 1로 둡니다. - 반경 50m 안에 전통시장이 없으면
전통시장여부를 0으로 둡니다.
입력 파일:
Data/버스정류장개수/서울시버스정류소위치정보(20241002).xlsx
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
NODE_ID |
정류장 ID |
X좌표 |
정류장 경도, EPSG:4326 |
Y좌표 |
정류장 위도, EPSG:4326 |
정류소타입 |
정류장 유형 |
처리 방식:
정류소타입 == "가상정류장"인 행은 제외합니다.- 정류장 좌표를 도로 포인트 좌표계로 변환합니다.
- 각
POINT_ID기준 300m 반경 안에 있는 정류장의NODE_ID개수를버스정류장개수컬럼으로 추가합니다.
입력 파일:
Data/과속방지턱개수/A067_A.shp
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
MGRNU |
과속방지턱 객체 ID |
geometry |
과속방지턱 polygon geometry |
처리 방식:
- 과속방지턱 polygon 데이터를 도로 포인트 좌표계로 변환합니다.
- 일부 polygon의 닫히지 않은 링은 읽는 과정에서 보정합니다.
- 각
POINT_ID기준 50m 버퍼와 과속방지턱 polygon이 닿으면 해당 과속방지턱을 집계합니다. - 각
POINT_ID별 고유MGRNU개수를과속방지턱개수컬럼으로 추가합니다.
입력 파일:
Data/교차로개수/A008_P_20250814/A008_P/A008_P.shp
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
MGRNU |
교차로 객체 ID |
geometry |
교차로 point geometry |
처리 방식:
- 교차로 point 데이터를 도로 포인트 좌표계로 변환합니다.
- 각
POINT_ID기준 50m 버퍼 안에 포함된 교차로 point를 집계합니다. - 각
POINT_ID별 고유MGRNU개수를교차로개수컬럼으로 추가합니다.
입력 파일:
Data/횡단보도개수/횡단보도 위치 및 부착대 정보/A004_A_횡단보도/A004_A.shp
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
MGRNU |
횡단보도 객체 ID |
geometry |
횡단보도 polygon geometry |
처리 방식:
- 횡단보도 polygon 데이터를 도로 포인트 좌표계로 변환합니다.
- 일부 polygon의 닫히지 않은 링은 읽는 과정에서 보정합니다.
- 각
POINT_ID기준 50m 버퍼와 횡단보도 polygon이 닿으면 해당 횡단보도를 집계합니다. - 각
POINT_ID별 고유MGRNU개수를횡단보도개수컬럼으로 추가합니다.
입력 파일:
Data/횡단보도예고표시/A068_P(20250417)/A068_P.shp
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
MGRNU |
횡단보도예고표시 객체 ID |
geometry |
횡단보도예고표시 point geometry |
처리 방식:
- 횡단보도예고표시 point 데이터를 도로 포인트 좌표계로 변환합니다.
- 각
POINT_ID기준 50m 버퍼 안에 포함된 횡단보도예고표시 point를 확인합니다. - 50m 안에 하나 이상 있으면
횡단보도예고표시여부를 1로 둡니다. - 50m 안에 없으면
횡단보도예고표시여부를 0으로 둡니다.
입력 파일:
Data/신호등설치여부/서울특별시_보행자 신호등 분포도.csv
사용 컬럼:
| 컬럼 | 설명 |
|---|---|
X좌표 |
보행자신호등 X 좌표 |
Y좌표 |
보행자신호등 Y 좌표 |
종류 |
신호등 종류 |
주소 |
설치 주소 |
처리 방식:
- CSV 인코딩은
cp949입니다. X좌표,Y좌표는 EPSG:5186 좌표계로 읽습니다.- 보행자신호등 point를 도로 포인트 좌표계로 변환합니다.
- 각
POINT_ID기준 50m 버퍼 안에 보행자신호등 point가 하나 이상 있으면신호등설치여부를 1로 둡니다. - 50m 안에 없으면
신호등설치여부를 0으로 둡니다.
노인보행사고데이터.ipynb
이 노트북을 실행하면 아래 파일이 생성됩니다.
Data/seoul_old_pedestrian_individual_accidents_2020_2025.csv
서울시 기준 수집 건수는 노트북 실행 후 출력되는 연도별 요약에서 확인합니다.
데이터결합.ipynb
처리 흐름:
- 서울시 도로구간 로드
- 도로 클래스
3,4만 필터링 - 도로 라인 위에 25m 간격 포인트 생성
- 각 포인트의 50m 버퍼 생성
- 사고 포인트가 버퍼 안에 들어오면 사고 피해 규모 집계
- 위험도 계산
- ITS 표준노드링크에서 최근접 링크 제한속도 결합
- 300m 반경 내 상가 업종별 개수 결합
- 300m 반경 내 65세 이상 거주인구 결합
- 300m 반경 내 노인의료복지시설 개수 결합
- 최종 CSV 저장
최종 저장 파일:
Data/seoul_road_points.csv
서울시 기준 행 수는 데이터결합.ipynb 실행 후 출력되는 최종 저장 행 수에서 확인합니다.